openapi: 3.0.0 info: version: 2.0.0 termsOfService: https://exoscale.com/terms contact: email: support@exoscale.com name: Exoscale Support url: https://portal.exoscale.com/tickets title: Exoscale ai-api-key security-group API description: Infrastructure automation API, allowing programmatic access to all Exoscale products and services. servers: - url: https://api-{zone}.exoscale.com/v2 variables: zone: default: ch-gva-2 enum: - ch-gva-2 - ch-dk-2 - de-fra-1 - de-muc-1 - at-vie-1 - at-vie-2 - bg-sof-1 - hr-zag-1 tags: - description: "Security Groups are groups of firewall rules that regulate\n network traffic to and from your Compute instances." parent: compute externalDocs: description: Read more url: https://community.exoscale.com/documentation/compute/security-groups/ name: security-group x-display-name: Security Group x-weight: 150 x-icon: exo-vpc paths: /security-group/{id}/rules/{rule-id}: delete: tags: - security-group responses: '200': description: '200' content: application/json: schema: $ref: '#/components/schemas/operation' description: '' parameters: - in: path required: true name: id schema: type: string format: uuid - in: path required: true name: rule-id schema: type: string format: uuid summary: Delete a Security Group rule operationId: delete-rule-from-security-group /security-group: post: tags: - security-group responses: '200': description: '200' content: application/json: schema: $ref: '#/components/schemas/operation' description: '' parameters: [] summary: Create a Security Group requestBody: required: true content: application/json: schema: type: object properties: name: type: string maxLength: 255 minLength: 1 description: Security Group name description: type: string maxLength: 255 description: Security Group description required: - name operationId: create-security-group get: tags: - security-group responses: '200': description: '200' content: application/json: schema: type: object properties: security-groups: type: array items: $ref: '#/components/schemas/security-group' description: 'Lists security groups. When visibility is set to public, lists public security groups. Public security groups are objects maintained by Exoscale which contain source addresses for relevant services hosted by Exoscale. They can be used a source in ingress rules and as a destination in egress rules.' parameters: - in: query required: false name: visibility schema: type: string enum: - private - public summary: List Security Groups. operationId: list-security-groups /security-group/{id}: get: tags: - security-group responses: '200': description: '200' content: application/json: schema: $ref: '#/components/schemas/security-group' description: '' parameters: - in: path required: true name: id schema: type: string format: uuid summary: Retrieve Security Group details operationId: get-security-group delete: tags: - security-group responses: '200': description: '200' content: application/json: schema: $ref: '#/components/schemas/operation' description: '' parameters: - in: path required: true name: id schema: type: string format: uuid summary: Delete a Security Group operationId: delete-security-group /security-group/{id}:attach: put: tags: - security-group responses: '200': description: '200' content: application/json: schema: $ref: '#/components/schemas/operation' description: '' parameters: - in: path required: true name: id schema: type: string format: uuid summary: Attach a Compute instance to a Security Group requestBody: required: true content: application/json: schema: type: object properties: instance: $ref: '#/components/schemas/instance' description: Compute instance required: - instance operationId: attach-instance-to-security-group /security-group/{id}/rules: post: tags: - security-group responses: '200': description: '200' content: application/json: schema: $ref: '#/components/schemas/operation' description: '' parameters: - in: path required: true name: id schema: type: string format: uuid summary: Create a Security Group rule requestBody: required: true content: application/json: schema: type: object properties: flow-direction: type: string enum: - ingress - egress description: Network flow direction to match description: type: string maxLength: 255 description: Security Group rule description network: type: string description: CIDR-formatted network allowed security-group: $ref: '#/components/schemas/security-group-resource' description: Security Group allowed protocol: type: string enum: - tcp - esp - icmp - udp - gre - ah - ipip - icmpv6 description: Network protocol icmp: type: object properties: code: type: integer format: int64 minimum: -1 maximum: 254 exclusiveMinimum: false exclusiveMaximum: false nullable: true type: type: integer format: int64 minimum: -1 maximum: 254 exclusiveMinimum: false exclusiveMaximum: false nullable: true description: 'ICMP details (default: -1 (ANY))' start-port: type: integer format: int64 minimum: 1 maximum: 65535 exclusiveMinimum: false exclusiveMaximum: false description: Start port of the range end-port: type: integer format: int64 minimum: 1 maximum: 65535 exclusiveMinimum: false exclusiveMaximum: false description: End port of the range required: - flow-direction - protocol operationId: add-rule-to-security-group /security-group/{id}:remove-source: put: tags: - security-group responses: '200': description: '200' content: application/json: schema: $ref: '#/components/schemas/operation' description: '' parameters: - in: path required: true name: id schema: type: string format: uuid summary: Remove an external source from a Security Group requestBody: required: true content: application/json: schema: type: object properties: cidr: type: string description: CIDR-formatted network to remove required: - cidr operationId: remove-external-source-from-security-group /security-group/{id}:detach: put: tags: - security-group responses: '200': description: '200' content: application/json: schema: $ref: '#/components/schemas/operation' description: '' parameters: - in: path required: true name: id schema: type: string format: uuid summary: Detach a Compute instance from a Security Group requestBody: required: true content: application/json: schema: type: object properties: instance: $ref: '#/components/schemas/instance' description: Compute instance required: - instance operationId: detach-instance-from-security-group /security-group/{id}:add-source: put: tags: - security-group responses: '200': description: '200' content: application/json: schema: $ref: '#/components/schemas/operation' description: '' parameters: - in: path required: true name: id schema: type: string format: uuid summary: Add an external source as a member of a Security Group requestBody: required: true content: application/json: schema: type: object properties: cidr: type: string description: CIDR-formatted network to add required: - cidr operationId: add-external-source-to-security-group components: schemas: instance-type: type: object properties: id: type: string format: uuid readOnly: true description: Instance type ID size: type: string enum: - large - huge - jumbo - medium - mega - small - extra-large - titan48c - titan - micro - colossus - tiny readOnly: true description: Instance type size family: type: string enum: - gpu3 - gpua30 - gpu3080ti - gpu2 - gpu - memory - gpua5000 - gpurtx6000pro - storage - standard - colossus - cpu readOnly: true description: Instance type family cpus: type: integer format: int64 minimum: 0 exclusiveMinimum: true readOnly: true description: CPU count gpus: type: integer format: int64 minimum: 0 exclusiveMinimum: true readOnly: true description: GPU count authorized: type: boolean readOnly: true description: Requires authorization or publicly available memory: type: integer format: int64 minimum: 0 exclusiveMinimum: true readOnly: true description: Available memory zones: type: array items: $ref: '#/components/schemas/zone-name' readOnly: true description: Instance Type available zones description: Compute instance type ssh-key: type: object properties: name: type: string maxLength: 255 minLength: 1 x-go-findable: '1' description: SSH key name fingerprint: type: string readOnly: true x-go-findable: '2' description: SSH key fingerprint description: SSH key labels: type: object additionalProperties: type: string deploy-target-ref: type: object properties: id: type: string format: uuid description: Deploy target ID description: Deploy target reference security-group-ref: type: object properties: id: type: string format: uuid description: Security group ID description: Security group reference anti-affinity-group-ref: type: object properties: id: type: string format: uuid description: Anti-affinity group ID description: Anti-affinity group reference security-group-rule: type: object properties: description: type: string maxLength: 255 description: Security Group rule description start-port: type: integer format: int64 minimum: 1 maximum: 65535 exclusiveMinimum: false exclusiveMaximum: false description: Start port of the range protocol: type: string enum: - tcp - esp - icmp - udp - gre - ah - ipip - icmpv6 description: Network protocol icmp: type: object properties: code: type: integer format: int64 minimum: -1 maximum: 254 exclusiveMinimum: false exclusiveMaximum: false type: type: integer format: int64 minimum: -1 maximum: 254 exclusiveMinimum: false exclusiveMaximum: false description: ICMP details end-port: type: integer format: int64 minimum: 1 maximum: 65535 exclusiveMinimum: false exclusiveMaximum: false description: End port of the range security-group: $ref: '#/components/schemas/security-group-resource' description: Security Group allowed id: type: string format: uuid readOnly: true description: Security Group rule ID network: type: string description: CIDR-formatted network allowed flow-direction: type: string enum: - ingress - egress description: Network flow direction to match description: Security Group rule template: type: object properties: application-consistent-snapshot-enabled: type: boolean description: Template with Qemu Guest Agent installed for application consistent snapshot maintainer: type: string readOnly: true description: Template maintainer description: type: string maxLength: 255 description: Template description ssh-key-enabled: type: boolean description: Enable SSH key-based login family: type: string readOnly: true description: Template family name: type: string maxLength: 255 minLength: 1 description: Template name default-user: type: string maxLength: 255 minLength: 1 description: Template default user size: type: integer format: int64 minimum: 0 exclusiveMinimum: true description: Template size password-enabled: type: boolean description: Enable password-based login build: type: string readOnly: true description: Template build checksum: type: string description: Template MD5 checksum boot-mode: type: string enum: - legacy - uefi description: 'Boot mode (default: legacy)' id: type: string format: uuid readOnly: true description: Template ID zones: type: array items: $ref: '#/components/schemas/zone-name' description: Zones availability url: type: string description: Template source URL version: type: string readOnly: true description: Template version created-at: type: string format: date-time readOnly: true description: Template creation date visibility: type: string enum: - private - public readOnly: true description: Template visibility description: Instance template zone-name: type: string enum: - ch-dk-2 - de-muc-1 - ch-gva-2 - at-vie-1 - de-fra-1 - bg-sof-1 - at-vie-2 - hr-zag-1 elastic-ip-ref: type: object properties: id: type: string format: uuid description: Elastic IP ID description: Elastic IP reference manager: type: object properties: id: type: string format: uuid description: Manager ID type: type: string enum: - sks-nodepool - instance-pool description: Manager type description: Resource manager security-group: type: object properties: id: type: string format: uuid readOnly: true description: Security Group ID name: type: string maxLength: 255 minLength: 1 description: Security Group name description: type: string maxLength: 255 description: Security Group description external-sources: type: array items: type: string uniqueItems: true description: Security Group external sources rules: type: array items: $ref: '#/components/schemas/security-group-rule' uniqueItems: true writeOnly: true description: Security Group rules description: Security Group public-ip-assignment: type: string enum: - inet4 - dual - none instance-state: type: string enum: - expunging - starting - destroying - running - stopping - stopped - migrating - error - destroyed instance: type: object properties: application-consistent-snapshot-enabled: type: boolean description: Indicates if the instance will take application-consistent snapshots anti-affinity-groups: type: array items: $ref: '#/components/schemas/anti-affinity-group-ref' description: Instance Anti-affinity Groups public-ip-assignment: $ref: '#/components/schemas/public-ip-assignment' description: Instance public IP assignment labels: $ref: '#/components/schemas/labels' description: Resource labels security-groups: type: array items: $ref: '#/components/schemas/security-group-ref' description: Instance Security Groups elastic-ips: type: array items: $ref: '#/components/schemas/elastic-ip-ref' description: Instance Elastic IPs name: type: string maxLength: 255 minLength: 1 description: Instance name instance-type: $ref: '#/components/schemas/instance-type' description: Instance Type private-networks: type: array items: type: object properties: id: type: string format: uuid description: Private Network ID mac-address: type: string description: Private Network MAC address description: Private Network description: Instance Private Networks template: $ref: '#/components/schemas/template' description: Instance Template state: $ref: '#/components/schemas/instance-state' readOnly: true description: Instance state secureboot-enabled: type: boolean description: Indicates if the instance has secure boot enabled ssh-key: $ref: '#/components/schemas/ssh-key' description: Instance SSH Key user-data: type: string minLength: 1 description: Instance Cloud-init user-data (base64 encoded) mac-address: type: string readOnly: true description: Instance MAC address manager: $ref: '#/components/schemas/manager' readOnly: true description: Instance manager tpm-enabled: type: boolean description: Indicates if the instance has tpm enabled deploy-target: $ref: '#/components/schemas/deploy-target-ref' description: Instance Deploy Target ipv6-address: type: string readOnly: true description: Instance IPv6 address id: type: string format: uuid readOnly: true description: Instance ID snapshots: type: array items: $ref: '#/components/schemas/snapshot-ref' description: Instance Snapshots disk-size: type: integer format: int64 minimum: 10 maximum: 51200 exclusiveMinimum: false exclusiveMaximum: false description: Instance disk size in GiB ssh-keys: type: array items: $ref: '#/components/schemas/ssh-key' description: Instance SSH Keys created-at: type: string format: date-time readOnly: true description: Instance creation date public-ip: type: string format: ipv4 readOnly: true description: Instance public IPv4 address description: Instance snapshot-ref: type: object properties: id: type: string format: uuid description: Snapshot ID description: Snapshot reference operation: type: object properties: id: type: string format: uuid readOnly: true description: Operation ID reason: type: string enum: - incorrect - unknown - unavailable - forbidden - busy - fault - partial - not-found - interrupted - unsupported - conflict readOnly: true description: Operation failure reason reference: type: object properties: id: type: string format: uuid description: Reference ID link: type: string readOnly: true description: Link to the referenced resource command: type: string description: Command name description: Related resource reference readOnly: true message: type: string readOnly: true description: Operation message state: type: string enum: - failure - pending - success - timeout readOnly: true description: Operation status description: Operation security-group-resource: type: object properties: id: type: string format: uuid readOnly: true description: Security Group ID name: type: string maxLength: 255 minLength: 1 description: Security Group name visibility: type: string enum: - private - public description: "Whether this points to a public security group. This is only valid when in the context of\n a rule addition which uses a public security group as a source or destination." description: Security Group x-topics: - title: API Request Signature content: ' In order to authenticate legitimate users, the Exoscale API requires incoming requests to be signed using valid Exoscale API account credentials with the following mechanism. ## Signature Mechanism The *message* (i.e. content) to sign contains several segments concatenated using a line return character (`\n`). All segments must be included and in the described order. For cases where a segment doesn''t fit the context of the request (e.g. no request body) **an empty line must be used instead**. * Request method and request URL (path only), separated by a space character * Request body * Request URL parameters (Query String) values, concatenated without separator. The matching parameter names have to be specified in the resulting signature header `signed-query-args=` pragma, separated by semicolons (e.g. `p1;p2;pN`). * Request header values, concatenated without separator (none at the moment, leave empty) * Request expiration date in UNIX timestamp format Example *message* to sign for `GET /v2/resource/a02baf5a-a3e4-49a0-857b-8a08d276c1c0?p1=v1&p2=v2`: ``` GET /v2/resource/a02baf5a-a3e4-49a0-857b-8a08d276c1c0 v1v2 1599140767 ``` The two blank lines above are due to the absence of a request body and signed headers. Example *message* to [create a security group](https://community.exoscale.com/reference/api/compute/security-group/#create-security-group) ``` POST /v2/security-group {"name": "my-security-group"} 1599140767 ``` The two blank lines above are due to the absence of query parameters and signed headers. The request signature consists of the base64-encoded [HMAC](https://en.wikipedia.org/wiki/HMAC) hash of the UTF-8 encoded *message* and the Exoscale API secret using the SHA265 function: ``` signature = BASE64_ENCODE(HMAC_SHA256(Exoscale API secret, message)) ``` Finally, the computed signature must be added to the API request in a `Authorization` header such as: ``` Authorization: EXO2-HMAC-SHA256 credential=,expires=,signature= ``` Example API query: ``` GET /v2/resource/a02baf5a-a3e4-49a0-857b-8a08d276c1c0?p1=v1&p2=v2 HTTP/1.1 Host: api-ch-gva-2.exoscale.com Authorization: EXO2-HMAC-SHA256 credential=EXO29147e9f89102b7ac1e88514,signed-query-args=p1;p2,expires=1599140767,signature=2AOBQsbElQb4FpKT/FM/9T4NobjlmZkSGvvdUth/xlY= ``` ## Reference Implementations You can look up the following existing reference implementations: * Go: [github.com/exoscale/egoscale/api/v2 > `SecurityProviderExoscale.signRequest`](https://github.com/exoscale/egoscale/blob/master/v2/api/security.go) * Python: [requests-exoscale-auth > `ExoscaleV2Auth`](https://github.com/exoscale/requests-exoscale-auth/blob/master/exoscale_auth.py) ' - title: Zone local resources content: ' The API is deployed across all Exoscale zones. When performing a compute call, you should use the relevant zone for your resource. For example: https://api-de-fra-1.exoscale.com/v2/instance would return only the instances from `de-fra-1`, https://api-ch-gva-2.exoscale.com/v2/instance from `ch-gva-2`. To obtain a list of all instances across all zones, you would need to do the corresponding request for each zone. '