From a2e4df9729d865c63170a085a00461655a87504f Mon Sep 17 00:00:00 2001 From: engineerakki Date: Sat, 7 Oct 2023 21:19:19 +0200 Subject: [PATCH] Add swagger for digitalocean api --- .../digitalocean.com-metadata.json | 3 +- .../digitalocean.com-swagger.json | 45299 ++++++++++++++++ .../digitalocean.com/index.md | 1 + 3 files changed, 45302 insertions(+), 1 deletion(-) create mode 100644 api/D/digitalocean.com/digitalocean.com/digitalocean.com-swagger.json diff --git a/api/D/digitalocean.com/digitalocean.com/digitalocean.com-metadata.json b/api/D/digitalocean.com/digitalocean.com/digitalocean.com-metadata.json index c788f7122..e3fb54f3f 100644 --- a/api/D/digitalocean.com/digitalocean.com/digitalocean.com-metadata.json +++ b/api/D/digitalocean.com/digitalocean.com/digitalocean.com-metadata.json @@ -6,5 +6,6 @@ "tags" : [ { "name" : "cloud" } ], - "stubs" : "digitalocean.com-stubs.json" + "stubs" : "digitalocean.com-stubs.json", + "swagger": "digitalocean.com-swagger.json" } \ No newline at end of file diff --git a/api/D/digitalocean.com/digitalocean.com/digitalocean.com-swagger.json b/api/D/digitalocean.com/digitalocean.com/digitalocean.com-swagger.json new file mode 100644 index 000000000..65f63f9fb --- /dev/null +++ b/api/D/digitalocean.com/digitalocean.com/digitalocean.com-swagger.json @@ -0,0 +1,45299 @@ +{ + "openapi": "3.0.0", + "info": { + "title": "DigitalOcean API", + "version": "2.0", + "description": "# Introduction\n\nThe DigitalOcean API allows you to manage Droplets and resources within the\nDigitalOcean cloud in a simple, programmatic way using conventional HTTP requests.\n\nAll of the functionality that you are familiar with in the DigitalOcean\ncontrol panel is also available through the API, allowing you to script the\ncomplex actions that your situation requires.\n\nThe API documentation will start with a general overview about the design\nand technology that has been implemented, followed by reference information\nabout specific endpoints.\n\n## Requests\n\nAny tool that is fluent in HTTP can communicate with the API simply by\nrequesting the correct URI. Requests should be made using the HTTPS protocol\nso that traffic is encrypted. The interface responds to different methods\ndepending on the action required.\n\n|Method|Usage|\n|--- |--- |\n|GET|For simple retrieval of information about your account, Droplets, or environment, you should use the GET method. The information you request will be returned to you as a JSON object. The attributes defined by the JSON object can be used to form additional requests. Any request using the GET method is read-only and will not affect any of the objects you are querying.|\n|DELETE|To destroy a resource and remove it from your account and environment, the DELETE method should be used. This will remove the specified object if it is found. If it is not found, the operation will return a response indicating that the object was not found. This idempotency means that you do not have to check for a resource's availability prior to issuing a delete command, the final state will be the same regardless of its existence.|\n|PUT|To update the information about a resource in your account, the PUT method is available. Like the DELETE Method, the PUT method is idempotent. It sets the state of the target using the provided values, regardless of their current values. Requests using the PUT method do not need to check the current attributes of the object.|\n|PATCH|Some resources support partial modification. In these cases, the PATCH method is available. Unlike PUT which generally requires a complete representation of a resource, a PATCH request is is a set of instructions on how to modify a resource updating only specific attributes.|\n|POST|To create a new object, your request should specify the POST method. The POST request includes all of the attributes necessary to create a new object. When you wish to create a new object, send a POST request to the target endpoint.|\n|HEAD|Finally, to retrieve metadata information, you should use the HEAD method to get the headers. This returns only the header of what would be returned with an associated GET request. Response headers contain some useful information about your API access and the results that are available for your request. For instance, the headers contain your current rate-limit value and the amount of time available until the limit resets. It also contains metrics about the total number of objects found, pagination information, and the total content length.|\n\n\n## HTTP Statuses\n\nAlong with the HTTP methods that the API responds to, it will also return\nstandard HTTP statuses, including error codes.\n\nIn the event of a problem, the status will contain the error code, while the\nbody of the response will usually contain additional information about the\nproblem that was encountered.\n\nIn general, if the status returned is in the 200 range, it indicates that\nthe request was fulfilled successfully and that no error was encountered.\n\nReturn codes in the 400 range typically indicate that there was an issue\nwith the request that was sent. Among other things, this could mean that you\ndid not authenticate correctly, that you are requesting an action that you\ndo not have authorization for, that the object you are requesting does not\nexist, or that your request is malformed.\n\nIf you receive a status in the 500 range, this generally indicates a\nserver-side problem. This means that we are having an issue on our end and\ncannot fulfill your request currently.\n\n400 and 500 level error responses will include a JSON object in their body,\nincluding the following attributes:\n\n|Name|Type|Description|\n|--- |--- |--- |\n|id|string|A short identifier corresponding to the HTTP status code returned. For example, the ID for a response returning a 404 status code would be \"not_found.\"|\n|message|string|A message providing additional information about the error, including details to help resolve it when possible.|\n|request_id|string|Optionally, some endpoints may include a request ID that should be provided when reporting bugs or opening support tickets to help identify the issue.|\n\n### Example Error Response\n\n```\n HTTP/1.1 403 Forbidden\n {\n \"id\": \"forbidden\",\n \"message\": \"You do not have access for the attempted action.\"\n }\n```\n\n## Responses\n\nWhen a request is successful, a response body will typically be sent back in\nthe form of a JSON object. An exception to this is when a DELETE request is\nprocessed, which will result in a successful HTTP 204 status and an empty\nresponse body.\n\nInside of this JSON object, the resource root that was the target of the\nrequest will be set as the key. This will be the singular form of the word\nif the request operated on a single object, and the plural form of the word\nif a collection was processed.\n\nFor example, if you send a GET request to `/v2/droplets/$DROPLET_ID` you\nwill get back an object with a key called \"`droplet`\". However, if you send\nthe GET request to the general collection at `/v2/droplets`, you will get\nback an object with a key called \"`droplets`\".\n\nThe value of these keys will generally be a JSON object for a request on a\nsingle object and an array of objects for a request on a collection of\nobjects.\n\n### Response for a Single Object\n\n```\n {\n \"droplet\": {\n \"name\": \"example.com\"\n . . .\n }\n }\n```\n\n### Response for an Object Collection\n\n```\n {\n \"droplets\": [\n {\n \"name\": \"example.com\"\n . . .\n },\n {\n \"name\": \"second.com\"\n . . .\n }\n ]\n }\n```\n\n## Meta\n\nIn addition to the main resource root, the response may also contain a\n`meta` object. This object contains information about the response itself.\n\nThe `meta` object contains a `total` key that is set to the total number of\nobjects returned by the request. This has implications on the `links` object\nand pagination.\n\nThe `meta` object will only be displayed when it has a value. Currently, the\n`meta` object will have a value when a request is made on a collection (like\n`droplets` or `domains`).\n\n\n### Sample Meta Object\n\n```\n {\n . . .\n \"meta\": {\n \"total\": 43\n }\n . . .\n }\n```\n\n## Links & Pagination\n\nThe `links` object is returned as part of the response body when pagination\nis enabled. By default, 20 objects are returned per page. If the response\ncontains 20 objects or fewer, no `links` object will be returned. If the\nresponse contains more than 20 objects, the first 20 will be returned along\nwith the `links` object.\n\nYou can request a different pagination limit or force pagination by\nappending `?per_page=` to the request with the number of items you would\nlike per page. For instance, to show only two results per page, you could\nadd `?per_page=2` to the end of your query. The maximum number of results\nper page is 200.\n\nThe `links` object contains a `pages` object. The `pages` object, in turn,\ncontains keys indicating the relationship of additional pages. The values of\nthese are the URLs of the associated pages. The keys will be one of the\nfollowing:\n\n* **first**: The URI of the first page of results.\n* **prev**: The URI of the previous sequential page of results.\n* **next**: The URI of the next sequential page of results.\n* **last**: The URI of the last page of results.\n\nThe `pages` object will only include the links that make sense. So for the\nfirst page of results, no `first` or `prev` links will ever be set. This\nconvention holds true in other situations where a link would not make sense.\n\n### Sample Links Object\n\n```\n {\n . . .\n \"links\": {\n \"pages\": {\n \"last\": \"https://api.digitalocean.com/v2/images?page=2\",\n \"next\": \"https://api.digitalocean.com/v2/images?page=2\"\n }\n }\n . . .\n }\n```\n\n## Rate Limit\n\nRequests through the API are rate limited per OAuth token. Current rate limits:\n\n* 5,000 requests per hour\n* 250 requests per minute (5% of the hourly total)\n\nOnce you exceed either limit, you will be rate limited until the next cycle\nstarts. Space out any requests that you would otherwise issue in bursts for\nthe best results.\n\nThe rate limiting information is contained within the response headers of\neach request. The relevant headers are:\n\n* **ratelimit-limit**: The number of requests that can be made per hour.\n* **ratelimit-remaining**: The number of requests that remain before you hit your request limit. See the information below for how the request limits expire.\n* **ratelimit-reset**: This represents the time when the oldest request will expire. The value is given in [Unix epoch time](http://en.wikipedia.org/wiki/Unix_time). See below for more information about how request limits expire.\n\nMore rate limiting information is returned only within burst limit error response headers:\n* **retry-after**: The number of seconds to wait before making another request when rate limited.\n\nAs long as the `ratelimit-remaining` count is above zero, you will be able\nto make additional requests.\n\nThe way that a request expires and is removed from the current limit count\nis important to understand. Rather than counting all of the requests for an\nhour and resetting the `ratelimit-remaining` value at the end of the hour,\neach request instead has its own timer.\n\nThis means that each request contributes toward the `ratelimit-remaining`\ncount for one complete hour after the request is made. When that request's\ntimer runs out, it is no longer counted towards the request limit.\n\nThis has implications on the meaning of the `ratelimit-reset` header as\nwell. Because the entire rate limit is not reset at one time, the value of\nthis header is set to the time when the _oldest_ request will expire.\n\nKeep this in mind if you see your `ratelimit-reset` value change, but not\nmove an entire hour into the future.\n\nIf the `ratelimit-remaining` reaches zero, subsequent requests will receive\na 429 error code until the request reset has been reached. \n\n`ratelimit-remaining` reaching zero can also indicate that the \"burst limit\" of 250 \nrequests per minute limit was met, even if the 5,000 requests per hour limit was not. \nIn this case, the 429 error response will include a retry-after header to indicate how \nlong to wait (in seconds) until the request may be retried.\n\nYou can see the format of the response in the examples. \n\n**Note:** The following endpoints have special rate limit requirements that\nare independent of the limits defined above.\n\n* Only 12 `POST` requests to the `/v2/floating_ips` endpoint to create Floating IPs can be made per 60 seconds.\n* Only 10 `GET` requests to the `/v2/account/keys` endpoint to list SSH keys can be made per 60 seconds.\n* Only 5 requests to any and all `v2/cdn/endpoints` can be made per 10 seconds. This includes `v2/cdn/endpoints`, \n `v2/cdn/endpoints/$ENDPOINT_ID`, and `v2/cdn/endpoints/$ENDPOINT_ID/cache`.\n* Only 50 strings within the `files` json struct in the `v2/cdn/endpoints/$ENDPOINT_ID/cache` [payload](https://docs.digitalocean.com/reference/api/api-reference/#operation/cdn_purge_cache) \n can be requested every 20 seconds.\n\n### Sample Rate Limit Headers\n\n```\n . . .\n ratelimit-limit: 1200\n ratelimit-remaining: 1193\n rateLimit-reset: 1402425459\n . . .\n```\n\n ### Sample Rate Limit Headers When Burst Limit is Reached:\n\n```\n . . .\n ratelimit-limit: 5000\n ratelimit-remaining: 0\n rateLimit-reset: 1402425459\n retry-after: 29\n . . .\n```\n\n### Sample Rate Exceeded Response\n\n```\n 429 Too Many Requests\n {\n id: \"too_many_requests\",\n message: \"API Rate limit exceeded.\"\n }\n```\n\n## Curl Examples\n\nThroughout this document, some example API requests will be given using the\n`curl` command. This will allow us to demonstrate the various endpoints in a\nsimple, textual format.\n \n These examples assume that you are using a Linux or macOS command line. To run\nthese commands on a Windows machine, you can either use cmd.exe, PowerShell, or WSL:\n\n* For cmd.exe, use the `set VAR=VALUE` [syntax](https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/set_1)\nto define environment variables, call them with `%VAR%`, then replace all backslashes (`\\`) in the examples with carets (`^`).\n\n* For PowerShell, use the `$Env:VAR = \"VALUE\"` [syntax](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_environment_variables?view=powershell-7.2)\nto define environment variables, call them with `$Env:VAR`, then replace `curl` with `curl.exe` and all backslashes (`\\`) in the examples with backticks (`` ` ``).\n\n* WSL is a compatibility layer that allows you to emulate a Linux terminal on a Windows machine.\nInstall WSL with our [community tutorial](https://www.digitalocean.com/community/tutorials/how-to-install-the-windows-subsystem-for-linux-2-on-microsoft-windows-10), \nthen follow this API documentation normally.\n\nThe names of account-specific references (like Droplet IDs, for instance)\nwill be represented by variables. For instance, a Droplet ID may be\nrepresented by a variable called `$DROPLET_ID`. You can set the associated\nvariables in your environment if you wish to use the examples without\nmodification.\n\nThe first variable that you should set to get started is your OAuth\nauthorization token. The next section will go over the details of this, but\nyou can set an environmental variable for it now.\n\nGenerate a token by going to the [Apps & API](https://cloud.digitalocean.com/settings/applications)\nsection of the DigitalOcean control panel. Use an existing token if you have\nsaved one, or generate a new token with the \"Generate new token\" button.\nCopy the generated token and use it to set and export the TOKEN variable in\nyour environment as the example shows.\n\nYou may also wish to set some other variables now or as you go along. For\nexample, you may wish to set the `DROPLET_ID` variable to one of your\nDroplet IDs since this will be used frequently in the API.\n\nIf you are following along, make sure you use a Droplet ID that you control\nso that your commands will execute correctly.\n\nIf you need access to the headers of a response through `curl`, you can pass\nthe `-i` flag to display the header information along with the body. If you\nare only interested in the header, you can instead pass the `-I` flag, which\nwill exclude the response body entirely.\n\n\n### Set and Export your OAuth Token\n\n```\nexport DIGITALOCEAN_TOKEN=your_token_here\n```\n\n### Set and Export a Variable\n\n```\nexport DROPLET_ID=1111111\n```\n\n## Parameters\n\nThere are two different ways to pass parameters in a request with the API.\n\nWhen passing parameters to create or update an object, parameters should be\npassed as a JSON object containing the appropriate attribute names and\nvalues as key-value pairs. When you use this format, you should specify that\nyou are sending a JSON object in the header. This is done by setting the\n`Content-Type` header to `application/json`. This ensures that your request\nis interpreted correctly.\n\nWhen passing parameters to filter a response on GET requests, parameters can\nbe passed using standard query attributes. In this case, the parameters\nwould be embedded into the URI itself by appending a `?` to the end of the\nURI and then setting each attribute with an equal sign. Attributes can be\nseparated with a `&`. Tools like `curl` can create the appropriate URI when\ngiven parameters and values; this can also be done using the `-F` flag and\nthen passing the key and value as an argument. The argument should take the\nform of a quoted string with the attribute being set to a value with an\nequal sign.\n\n### Pass Parameters as a JSON Object\n\n```\n curl -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\"name\": \"example.com\", \"ip_address\": \"127.0.0.1\"}' \\\n -X POST \"https://api.digitalocean.com/v2/domains\"\n```\n\n### Pass Filter Parameters as a Query String\n\n```\n curl -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -X GET \\\n \"https://api.digitalocean.com/v2/images?private=true\"\n```\n\n## Cross Origin Resource Sharing\n\nIn order to make requests to the API from other domains, the API implements\nCross Origin Resource Sharing (CORS) support.\n\nCORS support is generally used to create AJAX requests outside of the domain\nthat the request originated from. This is necessary to implement projects\nlike control panels utilizing the API. This tells the browser that it can\nsend requests to an outside domain.\n\nThe procedure that the browser initiates in order to perform these actions\n(other than GET requests) begins by sending a \"preflight\" request. This sets\nthe `Origin` header and uses the `OPTIONS` method. The server will reply\nback with the methods it allows and some of the limits it imposes. The\nclient then sends the actual request if it falls within the allowed\nconstraints.\n\nThis process is usually done in the background by the browser, but you can\nuse curl to emulate this process using the example provided. The headers\nthat will be set to show the constraints are:\n\n* **Access-Control-Allow-Origin**: This is the domain that is sent by the client or browser as the origin of the request. It is set through an `Origin` header.\n* **Access-Control-Allow-Methods**: This specifies the allowed options for requests from that domain. This will generally be all available methods.\n* **Access-Control-Expose-Headers**: This will contain the headers that will be available to requests from the origin domain.\n* **Access-Control-Max-Age**: This is the length of time that the access is considered valid. After this expires, a new preflight should be sent.\n* **Access-Control-Allow-Credentials**: This will be set to `true`. It basically allows you to send your OAuth token for authentication.\n\nYou should not need to be concerned with the details of these headers,\nbecause the browser will typically do all of the work for you.\n", + "license": { + "name": "Apache 2.0", + "url": "https://www.apache.org/licenses/LICENSE-2.0.html" + }, + "contact": { + "name": "DigitalOcean API Team", + "email": "api-engineering@digitalocean.com" + }, + "termsOfService": "https://www.digitalocean.com/legal/terms-of-service-agreement/" + }, + "servers": [ + { + "url": "https://api.digitalocean.com", + "description": "production" + } + ], + "tags": [ + { + "name": "1-Click Applications", + "description": "1-Click applications are pre-built Droplet images or Kubernetes apps with software,\nfeatures, and configuration details already set up for you. They can be found in the\n[DigitalOcean Marketplace](https://www.digitalocean.com/docs/marketplace)." + }, + { + "name": "Account", + "description": "Provides information about your current account." + }, + { + "name": "Actions", + "description": "Actions are records of events that have occurred on the resources in your account.\nThese can be things like rebooting a Droplet, or transferring an image to a new region.\n\nAn action object is created every time one of these actions is initiated. The action\nobject contains information about the current status of the action, start and complete\ntimestamps, and the associated resource type and ID.\n\nEvery action that creates an action object is available through this endpoint. Completed\nactions are not removed from this list and are always available for querying.\n\n**Note:** You can pass the following HTTP header with the request to have the API return\nthe `reserved_ips` stanza instead of the `floating_ips` stanza:\n\n- `Accept: application/vnd.digitalocean.reserveip+json`" + }, + { + "name": "Apps", + "description": "App Platform is a Platform-as-a-Service (PaaS) offering from DigitalOcean that allows\ndevelopers to publish code directly to DigitalOcean servers without worrying about the\nunderlying infrastructure.\n\nMost API operations are centered around a few core object types. Following are the\ndefinitions of these types. These definitions will be omitted from the operation-specific\ndocumentation.\n\nFor documentation on app specifications (`AppSpec` objects), please refer to the\n[product documentation](https://docs.digitalocean.com/products/app-platform/reference/app-spec/))." + }, + { + "name": "Billing", + "description": "The billing endpoints allow you to retrieve your account balance, invoices\nand billing history.\n\n**Balance:** By sending requests to the `/v2/customers/my/balance` endpoint, you can\nretrieve the balance information for the requested customer account.\n\n**Invoices:** [Invoices](https://www.digitalocean.com/docs/accounts/billing/invoices/)\nare generated on the first of each month for every DigitalOcean\ncustomer. An invoice preview is generated daily, which can be accessed\nwith the `preview` keyword in place of `$INVOICE_UUID`. To interact with\ninvoices, you will generally send requests to the invoices endpoint at\n`/v2/customers/my/invoices`.\n\n**Billing History:** Billing history is a record of billing events for your account.\nFor example, entries may include events like payments made, invoices\nissued, or credits granted. To interact with invoices, you\nwill generally send requests to the invoices endpoint at\n`/v2/customers/my/billing_history`." + }, + { + "name": "Block Storage", + "description": "[DigitalOcean Block Storage Volumes](https://www.digitalocean.com/docs/volumes/)\nprovide expanded storage capacity for your Droplets and can be moved\nbetween Droplets within a specific region.\n\nVolumes function as raw block devices, meaning they appear to the\noperating system as locally attached storage which can be formatted using\nany file system supported by the OS. They may be created in sizes from\n1GiB to 16TiB.\n\nBy sending requests to the `/v2/volumes` endpoint, you can list, create, or\ndelete volumes as well as attach and detach them from Droplets" + }, + { + "name": "Block Storage Actions", + "description": "Block storage actions are commands that can be given to a DigitalOcean\nBlock Storage Volume. An example would be detaching or attaching a volume\nfrom a Droplet. These requests are made on the\n`/v2/volumes/$VOLUME_ID/actions` endpoint.\n\nAn action object is returned. These objects hold the current status of the\nrequested action." + }, + { + "name": "CDN Endpoints", + "description": "Content hosted in DigitalOcean's object storage solution,\n[Spaces](https://www.digitalocean.com/docs/spaces/overview/),\ncan optionally be served by our globally distributed Content Delivery\nNetwork (CDN). By sending requests to `/v2/cdn/endpoints`, you can list,\ncreate, or delete CDN Endpoints as well as purge cached content. To use a\ncustom subdomain to access the CDN Endpoint, provide the ID of a\nDigitalOcean managed TLS certificate and the fully qualified domain name\nfor the custom subdomain." + }, + { + "name": "Certificates", + "description": "In order to perform SSL termination on load balancers, DigitalOcean offers\ntwo types of [SSL certificate management](https://www.digitalocean.com/docs/accounts/security/#certificates):\n\n* **Custom**: User-generated certificates may be uploaded to DigitalOcean\nwhere they will be placed in a fully encrypted and isolated storage system.\n\n* **Let's Encrypt**: Certificates may be automatically generated by\nDigitalOcean utilizing an integration with Let's Encrypt, the free and\nopen certificate authority. These certificates will also be automatically\nrenewed as required." + }, + { + "name": "Container Registry", + "description": "DigitalOcean offers the ability for you to create a\n[private container registry](https://www.digitalocean.com/docs/images/container-registry/quickstart/)\nto store your Docker images for use with your Kubernetes clusters. This\ncontainer registry runs inside the same datacenters as your cluster,\nensuring reliable and performant rollout of image deployments.\n\nYou can only create one registry per DigitalOcean account, but you can use\nthat registry to create as many repositories as you wish." + }, + { + "name": "Databases", + "description": "DigitalOcean's [managed database service](https://www.digitalocean.com/docs/databases)\nsimplifies the creation and management of highly available database clusters. Currently, it\noffers support for [PostgreSQL](http://www.digitalocean.com/docs/databases/postgresql/),\n[Redis](https://www.digitalocean.com/docs/databases/redis/),\n[MySQL](https://www.digitalocean.com/docs/databases/mysql/), and\n[MongoDB](https://www.digitalocean.com/docs/databases/mongodb/).\n\nBy sending requests to the `/v2/databases` endpoint, you can list, create, or delete\ndatabase clusters as well as scale the size of a cluster, add or remove read-only replicas,\nand manage other configuration details.\n\nDatabase clusters may be deployed in a multi-node, high-availability configuration.\nIf your machine type is above the basic nodes, your node plan is above the smallest option,\nor you are running MongoDB, you may additionally include up to two standby nodes in your cluster.\n\nThe size of individual nodes in a database cluster is represented by a human-readable slug,\nwhich is used in some of the following requests. Each slug denotes the node's identifier,\nCPU count, and amount of RAM, in that order.\n\nFor **Basic nodes**, reference the following table for its slug:\n\nSlug | CPU | RAM\n-------------------|---------|---------\ndb-s-1vcpu-1gb | 1 vCPU | 1 GB\ndb-s-1vcpu-2gb | 1 vCPU | 2 GB\ndb-s-2vcpu-4gb | 2 vCPU | 4 GB\ndb-s-4vcpu-8gb | 4 vCPU | 8 GB\ndb-s-6vcpu-16gb | 6 vCPU | 16 GB\ndb-s-8vcpu-32gb | 8 vCPU | 32 GB\ndb-s-16vcpu-64gb | 16 vCPU | 64 GB\n\nFor **General Purpose nodes**, reference the following table for its slug:\n\nSlug | CPU | RAM\n-------------------|---------|---------\ngd-2vcpu-8gb | 2 vCPU | 8 GB\ngd-4vcpu-16gb | 4 vCPU | 16 GB\ngd-8vcpu-32gb | 8 vCPU | 32 GB\ngd-16vcpu-64gb | 16 vCPU | 64 GB\ngd-32vcpu-128gb | 32 vCPU | 128 GB\ngd-40vcpu-160gb | 40 vCPU | 160 GB\n\nFor **Storage-Optimized nodes**, reference the following table for its slug:\n\nSlug | CPU | RAM\n-------------------|---------|---------\nso1_5-2vcpu-16gb | 2 vCPU | 16 GB\nso1_5-4vcpu-32gb | 4 vCPU | 32 GB\nso1_5-8vcpu-64gb | 8 vCPU | 64 GB\nso1_5-16vcpu-128gb | 16 vCPU | 128 GB\nso1_5-24vcpu-192gb | 24 vCPU | 192 GB\nso1_5-32vcpu-256gb | 32 vCPU | 256 GB\n\nFor **Memory-Optimized nodes**, reference the following table for its slug:\n\nSlug | CPU | RAM\n-------------------|---------|---------\nm-2vcpu-16gb | 2 vCPU | 16 GB\nm-4vcpu-32gb | 4 vCPU | 32 GB\nm-8vcpu-64gb | 8 vCPU | 64 GB\nm-16vcpu-128gb | 16 vCPU | 128 GB\nm-24vcpu-192gb | 24 vCPU | 192 GB\nm-32vcpu-256gb | 32 vCPU | 256 GB" + }, + { + "name": "Domain Records", + "description": "Domain record resources are used to set or retrieve information about the\nindividual DNS records configured for a domain. This allows you to build\nand manage DNS zone files by adding and modifying individual records for a\ndomain.\n\nThe [DigitalOcean DNS management interface](https://www.digitalocean.com/docs/networking/dns/)\nallows you to configure the following DNS records:\n\nName | Description |\n------|----------------------------------------------------------------------------------------------------------------------------------------------------|\nA | This record type is used to map an IPv4 address to a hostname. |\nAAAA | This record type is used to map an IPv6 address to a hostname. |\nCAA | As specified in RFC-6844, this record type can be used to restrict which certificate authorities are permitted to issue certificates for a domain. |\nCNAME | This record type defines an alias for your canonical hostname (the one defined by an A or AAAA record). |\nMX | This record type is used to define the mail exchanges used for the domain. |\nNS | This record type defines the name servers that are used for this zone. |\nTXT | This record type is used to associate a string of text with a hostname, primarily used for verification. |\nSRV | This record type specifies the location (hostname and port number) of servers for specific services. |\nSOA | This record type defines administrative information about the zone. Can only have ttl changed, cannot be deleted |" + }, + { + "name": "Domains", + "description": "Domain resources are domain names that you have purchased from a domain\nname registrar that you are managing through the\n[DigitalOcean DNS interface](https://www.digitalocean.com/docs/networking/dns/).\n\nThis resource establishes top-level control over each domain. Actions that\naffect individual domain records should be taken on the\n[Domain Records](#tag/Domain-Records) resource." + }, + { + "name": "Droplet Actions", + "description": "Droplet actions are tasks that can be executed on a Droplet. These can be\nthings like rebooting, resizing, snapshotting, etc.\n\nDroplet action requests are generally targeted at one of the \"actions\"\nendpoints for a specific Droplet. The specific actions are usually\ninitiated by sending a POST request with the action and arguments as\nparameters.\n\nDroplet action requests create a Droplet actions object, which can be used\nto get information about the status of an action. Creating a Droplet\naction is asynchronous: the HTTP call will return the action object before\nthe action has finished processing on the Droplet. The current status of\nan action can be retrieved from either the Droplet actions endpoint or the\nglobal actions endpoint. If a Droplet action is uncompleted it may block\nthe creation of a subsequent action for that Droplet, the locked attribute\nof the Droplet will be true and attempts to create a Droplet action will\nfail with a status of 422." + }, + { + "name": "Droplets", + "description": "A [Droplet](https://www.digitalocean.com/docs/droplets/) is a DigitalOcean\nvirtual machine. By sending requests to the Droplet endpoint, you can\nlist, create, or delete Droplets.\n\nSome of the attributes will have an object value. The `region` and `image`\nobjects will all contain the standard attributes of their associated\ntypes. Find more information about each of these objects in their\nrespective sections." + }, + { + "name": "Firewalls", + "description": "[DigitalOcean Cloud Firewalls](https://www.digitalocean.com/docs/networking/firewalls/)\nprovide the ability to restrict network access to and from a Droplet\nallowing you to define which ports will accept inbound or outbound\nconnections. By sending requests to the `/v2/firewalls` endpoint, you can\nlist, create, or delete firewalls as well as modify access rules." + }, + { + "name": "Floating IP Actions", + "description": "As of 16 June 2022, we have renamed the Floating IP product to [Reserved IPs](https://docs.digitalocean.com/reference/api/api-reference/#tag/Reserved-IPs).\nThe Reserved IP product's endpoints function the exact same way as Floating IPs.\nThe only difference is the name change throughout the URLs and fields.\nFor example, the `floating_ips` field is now the `reserved_ips` field.\nThe Floating IP endpoints will remain active until fall 2023 before being\npermanently deprecated.\n\nWith the exception of the [Projects API](https://docs.digitalocean.com/reference/api/api-reference/#tag/Projects),\nwe will reflect this change as an additional field in the responses across the API\nwhere the `floating_ip` field is used. For example, the Droplet metadata response\nwill contain the field `reserved_ips` in addition to the `floating_ips` field.\nFloating IPs retrieved using the Projects API will retain the original name.\n\nFloating IP actions are commands that can be given to a DigitalOcean\nfloating IP. These requests are made on the actions endpoint of a specific\nfloating IP.\n\nAn action object is returned. These objects hold the current status of the\nrequested action." + }, + { + "name": "Floating IPs", + "description": "As of 16 June 2022, we have renamed the Floating IP product to [Reserved IPs](https://docs.digitalocean.com/reference/api/api-reference/#tag/Reserved-IPs).\nThe Reserved IP product's endpoints function the exact same way as Floating IPs.\nThe only difference is the name change throughout the URLs and fields.\nFor example, the `floating_ips` field is now the `reserved_ips` field.\nThe Floating IP endpoints will remain active until fall 2023 before being\npermanently deprecated.\n\nWith the exception of the [Projects API](https://docs.digitalocean.com/reference/api/api-reference/#tag/Projects),\nwe will reflect this change as an additional field in the responses across the API\nwhere the `floating_ip` field is used. For example, the Droplet metadata response\nwill contain the field `reserved_ips` in addition to the `floating_ips` field.\nFloating IPs retrieved using the Projects API will retain the original name.\n\n[DigitalOcean Floating IPs](https://www.digitalocean.com/docs/networking/floating-ips/)\nare publicly-accessible static IP addresses that can be mapped to one of\nyour Droplets. They can be used to create highly available setups or other\nconfigurations requiring movable addresses.\n\nFloating IPs are bound to a specific region." + }, + { + "name": "Functions", + "description": "[Serverless functions](https://docs.digitalocean.com/products/functions) are blocks of code that run on demand without the need to manage any infrastructure.\nYou can develop functions on your local machine and then deploy them to a namespace using `doctl`, the [official DigitalOcean CLI tool](https://docs.digitalocean.com/reference/doctl).\n\nThe Serverless Functions API currently only supports creating and managing namespaces." + }, + { + "name": "Image Actions", + "description": "Image actions are commands that can be given to a DigitalOcean image. In\ngeneral, these requests are made on the actions endpoint of a specific\nimage.\n\nAn image action object is returned. These objects hold the current status\nof the requested action." + }, + { + "name": "Images", + "description": "A DigitalOcean [image](https://www.digitalocean.com/docs/images/) can be\nused to create a Droplet and may come in a number of flavors. Currently,\nthere are five types of images: snapshots, backups, applications,\ndistributions, and custom images.\n\n* [Snapshots](https://www.digitalocean.com/docs/images/snapshots/) provide\na full copy of an existing Droplet instance taken on demand.\n\n* [Backups](https://www.digitalocean.com/docs/images/backups/) are similar\nto snapshots but are created automatically at regular intervals when\nenabled for a Droplet.\n\n* [Custom images](https://www.digitalocean.com/docs/images/custom-images/)\nare Linux-based virtual machine images (raw, qcow2, vhdx, vdi, and vmdk\nformats are supported) that you may upload for use on DigitalOcean.\n\n* Distributions are the public Linux distributions that are available to\nbe used as a base to create Droplets.\n\n* Applications, or [1-Click Apps](https://www.digitalocean.com/docs/one-clicks/),\nare distributions pre-configured with additional software.\n\nTo interact with images, you will generally send requests to the images\nendpoint at /v2/images." + }, + { + "name": "Kubernetes", + "description": "[DigitalOcean Kubernetes](https://www.digitalocean.com/docs/kubernetes/)\nallows you to quickly deploy scalable and secure Kubernetes clusters. By\nsending requests to the `/v2/kubernetes/clusters` endpoint, you can list,\ncreate, or delete clusters as well as scale node pools up and down,\nrecycle individual nodes, and retrieve the kubeconfig file for use with\na cluster." + }, + { + "name": "Load Balancers", + "description": "[DigitalOcean Load Balancers](https://www.digitalocean.com/docs/networking/load-balancers/)\nprovide a way to distribute traffic across multiple Droplets. By sending\nrequests to the `/v2/load_balancers` endpoint, you can list, create, or\ndelete load balancers as well as add or remove Droplets, forwarding rules,\nand other configuration details." + }, + { + "name": "Monitoring", + "description": "The DigitalOcean Monitoring API makes it possible to programmatically retrieve metrics as well as configure alert\npolicies based on these metrics. The Monitoring API can help you gain insight into how your apps are performing\nand consuming resources." + }, + { + "name": "Project Resources", + "description": "Project Resources are resources that can be grouped into your projects.\nYou can group resources (like Droplets, Spaces, load balancers, domains,\nand floating IPs) in ways that align with the applications you host on\nDigitalOcean.\n\n### Supported Resource Types Examples\n\nProjects resources are identified by uniform resource names or URNs. A\nvalid URN has the following format: `do:resource_type:resource_id`. The\nfollowing resource types are supported:\n\nResource Type | Example URN\n-------------------|------------\nApp Platform App | `do:app:be5aab85-851b-4cab-b2ed-98d5a63ba4e8`\nDatabase | `do:dbaas:83c7a55f-0d84-4760-9245-aba076ec2fb2`\nDomain | `do:domain:example.com`\nDroplet | `do:droplet:4126873`\nFloating IP | `do:floatingip:192.168.99.100`\nKubernetes Cluster | `do:kubernetes:bd5f5959-5e1e-4205-a714-a914373942af`\nLoad Balancer | `do:loadbalancer:39052d89-8dd4-4d49-8d5a-3c3b6b365b5b`\nSpace | `do:space:my-website-assets`\nVolume | `do:volume:6fc4c277-ea5c-448a-93cd-dd496cfef71f`\n\n### Resource Status Codes\n\nWhen assigning and retrieving resources in projects, a `status` attribute\nis returned that indicates if a resource was successfully retrieved or\nassigned. The status codes can be one of the following:\n\nStatus Code | Explanation\n-------------------|------------\n`ok` | There was no problem retrieving or assigning a resource.\n`not_found` | The resource was not found.\n`assigned` | The resource was successfully assigned.\n`already_assigned` | The resource was already assigned.\n`service_down` | There was a problem retrieving or assigning a resource. Please try again." + }, + { + "name": "Projects", + "description": "Projects allow you to organize your resources into groups that fit the way\nyou work. You can group resources (like Droplets, Spaces, load balancers,\ndomains, and floating IPs) in ways that align with the applications\nyou host on DigitalOcean." + }, + { + "name": "Regions", + "description": "Provides information about DigitalOcean data center regions." + }, + { + "name": "Reserved IP Actions", + "description": "As of 16 June 2022, we have renamed the [Floating IP](https://docs.digitalocean.com/reference/api/api-reference/#tag/Floating-IPs)\nproduct to Reserved IPs. The Reserved IP product's endpoints function the exact\nsame way as Floating IPs. The only difference is the name change throughout the\nURLs and fields. For example, the `floating_ips` field is now the `reserved_ips` field.\nThe Floating IP endpoints will remain active until fall 2023 before being\npermanently deprecated.\n\nWith the exception of the [Projects API](https://docs.digitalocean.com/reference/api/api-reference/#tag/Projects),\nwe will reflect this change as an additional field in the responses across the API\nwhere the `floating_ip` field is used. For example, the Droplet metadata response\nwill contain the field `reserved_ips` in addition to the `floating_ips` field.\nFloating IPs retrieved using the Projects API will retain the original name.\n\nReserved IP actions are commands that can be given to a DigitalOcean\nreserved IP. These requests are made on the actions endpoint of a specific\nreserved IP.\n\nAn action object is returned. These objects hold the current status of the\nrequested action." + }, + { + "name": "Reserved IPs", + "description": "As of 16 June 2022, we have renamed the [Floating IP](https://docs.digitalocean.com/reference/api/api-reference/#tag/Floating-IPs)\nproduct to Reserved IPs. The Reserved IP product's endpoints function the exact\nsame way as Floating IPs. The only difference is the name change throughout the\nURLs and fields. For example, the `floating_ips` field is now the `reserved_ips` field.\nThe Floating IP endpoints will remain active until fall 2023 before being\npermanently deprecated.\n\nWith the exception of the [Projects API](https://docs.digitalocean.com/reference/api/api-reference/#tag/Projects),\nwe will reflect this change as an additional field in the responses across the API\nwhere the `floating_ip` field is used. For example, the Droplet metadata response\nwill contain the field `reserved_ips` in addition to the `floating_ips` field.\nFloating IPs retrieved using the Projects API will retain the original name.\n\nDigitalOcean Reserved IPs are publicly-accessible static IP addresses that can be\nmapped to one of your Droplets. They can be used to create highly available\nsetups or other configurations requiring movable addresses.\n\nReserved IPs are bound to a specific region." + }, + { + "name": "Sizes", + "description": "The sizes objects represent different packages of hardware resources that\ncan be used for Droplets. When a Droplet is created, a size must be\nselected so that the correct resources can be allocated.\n\nEach size represents a plan that bundles together specific sets of\nresources. This includes the amount of RAM, the number of virtual CPUs,\ndisk space, and transfer. The size object also includes the pricing\ndetails and the regions that the size is available in." + }, + { + "name": "Snapshots", + "description": "[Snapshots](https://www.digitalocean.com/docs/images/snapshots/) are saved\ninstances of a Droplet or a block storage volume, which is reflected in\nthe `resource_type` attribute. In order to avoid problems with compressing\nfilesystems, each defines a `min_disk_size` attribute which is the minimum\nsize of the Droplet or volume disk when creating a new resource from the\nsaved snapshot.\n\nTo interact with snapshots, you will generally send requests to the\nsnapshots endpoint at `/v2/snapshots`." + }, + { + "name": "SSH Keys", + "description": "Manage SSH keys available on your account." + }, + { + "name": "Tags", + "description": "A tag is a label that can be applied to a resource (currently Droplets,\nImages, Volumes, Volume Snapshots, and Database clusters) in order to\nbetter organize or facilitate the lookups and actions on it.\n\nTags have two attributes: a user defined `name` attribute and an embedded\n`resources` attribute with information about resources that have been tagged." + }, + { + "name": "Uptime", + "description": "[DigitalOcean Uptime Checks](https://docs.digitalocean.com/products/uptime/) provide the ability to monitor your endpoints from around the world, and alert you when they're slow, unavailable, or SSL certificates are expiring.\nTo interact with Uptime, you will generally send requests to the Uptime endpoint at `/v2/uptime/`." + }, + { + "name": "VPCs", + "description": "[VPCs (virtual private clouds)](https://www.digitalocean.com/docs/networking/vpc/)\nallow you to create virtual networks containing resources that can\ncommunicate with each other in full isolation using private IP addresses.\n\nBy sending requests to the `/v2/vpcs` endpoint, you can create, configure,\nlist, and delete custom VPCs as well as retrieve information about the\nresources assigned to them." + } + ], + "paths": { + "/v2/1-clicks": { + "get": { + "operationId": "oneClicks_list", + "summary": "List 1-Click Applications", + "description": "To list all available 1-Click applications, send a GET request to `/v2/1-clicks`. The `type` may\nbe provided as query paramater in order to restrict results to a certain type of 1-Click, for\nexample: `/v2/1-clicks?type=droplet`. Current supported types are `kubernetes` and `droplet`.\n\nThe response will be a JSON object with a key called `1_clicks`. This will be set to an array of\n1-Click application data, each of which will contain the the slug and type for the 1-Click.\n", + "tags": [ + "1-Click Applications" + ], + "parameters": [ + { + "$ref": "#/components/parameters/oneClicks_type" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/oneClicks_all" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/1-clicks\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.getenv(\"$DIGITALOCEAN_TOKEN\"))\n\none_click_apps = client.one_clicks.list()" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/1-clicks/kubernetes": { + "post": { + "operationId": "oneClicks_install_kubernetes", + "summary": "Install Kubernetes 1-Click Applications", + "description": "To install a Kubernetes 1-Click application on a cluster, send a POST request to\n`/v2/1-clicks/kubernetes`. The `addon_slugs` and `cluster_uuid` must be provided as body\nparameter in order to specify which 1-Click application(s) to install. To list all available\n1-Click Kubernetes applications, send a request to `/v2/1-clicks?type=kubernetes`.\n", + "tags": [ + "1-Click Applications" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/oneClicks_create" + } + } + } + }, + "responses": { + "200": { + "$ref": "#/components/responses/oneClicks_create" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"addon_slugs\": [\"kube-state-metrics\", \"loki\"], \"cluster_uuid\": \"50a994b6-c303-438f-9495-7e896cfe6b08\"}'' \\\n \"https://api.digitalocean.com/v2/1-clicks/kubernetes\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\ninstall_req = {\n \"addon_slugs\": [\"kube-state-metrics\", \"loki\"],\n \"cluster_uuid\": \"50a994b6-c303-438f-9495-7e896cfe6b08\",\n}\ninstall_resp = client.one_clicks.install_kubernetes(install_req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/account": { + "get": { + "operationId": "account_get", + "summary": "Get User Information", + "description": "To show information about the current user account, send a GET request to `/v2/account`.", + "tags": [ + "Account" + ], + "responses": { + "200": { + "$ref": "#/components/responses/account" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/account\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.getenv(\"$DIGITALOCEAN_TOKEN\"))\n\naccount_info = client.account.get()" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/account/keys": { + "get": { + "operationId": "sshKeys_list", + "summary": "List All SSH Keys", + "description": "To list all of the keys in your account, send a GET request to `/v2/account/keys`. The response will be a JSON object with a key set to `ssh_keys`. The value of this will be an array of ssh_key objects, each of which contains the standard ssh_key attributes.", + "tags": [ + "SSH Keys" + ], + "parameters": [ + { + "$ref": "#/components/parameters/per_page" + }, + { + "$ref": "#/components/parameters/page" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/sshKeys_all" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/account/keys\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n opt := &godo.ListOptions{\n Page: 1,\n PerPage: 200,\n }\n\n keys, _, err := client.Keys.List(ctx, opt)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nssh_keys = client.ssh_keys.all\nssh_keys.each" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.ssh_keys.list()" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "post": { + "operationId": "sshKeys_create", + "summary": "Create a New SSH Key", + "description": "To add a new SSH public key to your DigitalOcean account, send a POST request to `/v2/account/keys`. Set the `name` attribute to the name you wish to use and the `public_key` attribute to the full public key you are adding.", + "tags": [ + "SSH Keys" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/sshKeys" + } + } + } + }, + "responses": { + "201": { + "$ref": "#/components/responses/sshKeys_new" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"name\":\"My SSH Public Key\",\"public_key\":\"ssh-rsa AEXAMPLEaC1yc2EAAAADAQABAAAAQQDDHr/jh2Jy4yALcK4JyWbVkPRaWmhck3IgCoeOO3z1e2dBowLh64QAM+Qb72pxekALga2oi4GvT+TlWNhzPH4V example\"}' \\\n \"https://api.digitalocean.com/v2/account/keys\" " + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n createRequest := &godo.KeyCreateRequest{\n Name: \"My SSH Public Key\",\n PublicKey: \"ssh-rsa AEXAMPLEaC1yc2EAAAADAQABAAAAQQDDHr/jh2Jy4yALcK4JyWbVkPRaWmhck3IgCoeOO3z1e2dBowLh64QAM+Qb72pxekALga2oi4GvT+TlWNhzPH4V example\",\n }\n\n transfer, _, err := client.Keys.Create(ctx, createRequest)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nssh_key = DropletKit::SSHKey.new(\n name: 'My SSH Public Key',\n public_key: 'ssh-rsa AEXAMPLEaC1yc2EAAAADAQABAAAAQQDDHr/jh2Jy4yALcK4JyWbVkPRaWmhck3IgCoeOO3z1e2dBowLh64QAM+Qb72pxekALga2oi4GvT+TlWNhzPH4V example'\n)\nclient.ssh_keys.create(ssh_key)" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"public_key\": \"ssh-rsa AEXAMPLEaC1yc2EAAAADAQABAAAAQQDDHr/jh2Jy4yALcK4JyWbVkPRaWmhck3IgCoeOO3z1e2dBowLh64QAM+Qb72pxekALga2oi4GvT+TlWNhzPH4V example\",\n \"name\": \"My SSH Public Key\"\n}\n\nresp = client.ssh_keys.create(body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/account/keys/{ssh_key_identifier}": { + "get": { + "operationId": "sshKeys_get", + "summary": "Retrieve an Existing SSH Key", + "description": "To get information about a key, send a GET request to `/v2/account/keys/$KEY_ID` or `/v2/account/keys/$KEY_FINGERPRINT`.\nThe response will be a JSON object with the key `ssh_key` and value an ssh_key object which contains the standard ssh_key attributes.", + "tags": [ + "SSH Keys" + ], + "parameters": [ + { + "$ref": "#/components/parameters/ssh_key_identifier" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/sshKeys_existing" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/account/keys/512190\" " + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n key, _, err := client.Keys.GetByID(ctx, 512190)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.ssh_keys.find(id: 512190) " + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.ssh_keys.get(ssh_key_identifier=512190)" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "put": { + "operationId": "sshKeys_update", + "summary": "Update an SSH Key's Name", + "description": "To update the name of an SSH key, send a PUT request to either `/v2/account/keys/$SSH_KEY_ID` or `/v2/account/keys/$SSH_KEY_FINGERPRINT`. Set the `name` attribute to the new name you want to use.", + "tags": [ + "SSH Keys" + ], + "parameters": [ + { + "$ref": "#/components/parameters/ssh_key_identifier" + } + ], + "requestBody": { + "description": "Set the `name` attribute to the new name you want to use.", + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": { + "$ref": "#/components/schemas/ssh_key_name" + } + } + } + } + } + }, + "responses": { + "200": { + "$ref": "#/components/responses/sshKeys_existing" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X PUT \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"name\":\"Renamed SSH Key\"}' \\\n \"https://api.digitalocean.com/v2/account/keys/512190\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n updateRequest := &godo.KeyUpdateRequest{\n Name: \"Renamed SSH Key\",\n }\n\n key, _, err := client.Keys.UpdateByID(ctx, 512190, updateRequest)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nssh_key = DropletKit::SSHKey.new(name: 'Renamed SSH Key')\nclient.ssh_keys.update(ssh_key, id: 512190)" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"name\": \"My SSH Public Key\"\n}\n\nresp = client.ssh_keys.update(ssh_key_identifier=512190, body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + }, + "delete": { + "operationId": "sshKeys_delete", + "summary": "Delete an SSH Key", + "description": "To destroy a public SSH key that you have in your account, send a DELETE request to `/v2/account/keys/$KEY_ID` or `/v2/account/keys/$KEY_FINGERPRINT`.\nA 204 status will be returned, indicating that the action was successful and that the response body is empty.", + "tags": [ + "SSH Keys" + ], + "parameters": [ + { + "$ref": "#/components/parameters/ssh_key_identifier" + } + ], + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/account/keys/512190\" " + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n _, err := client.Keys.DeleteByID(ctx, 512190)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.ssh_keys.delete(id: 512190)" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.ssh_keys.delete(ssh_key_identifier=512190)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/actions": { + "get": { + "operationId": "actions_list", + "summary": "List All Actions", + "description": "This will be the entire list of actions taken on your account, so it will be quite large. As with any large collection returned by the API, the results will be paginated with only 20 on each page by default.", + "tags": [ + "Actions" + ], + "parameters": [ + { + "$ref": "#/components/parameters/per_page" + }, + { + "$ref": "#/components/parameters/page" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/actions" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/actions?page=1&per_page=1\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n )\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n opt := &godo.ListOptions{\n Page: 1,\n PerPage: 200,\n }\n actions, _, err := client.Actions.List(ctx, opt)\n }" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nactions = client.actions.all\nactions.each" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.getenv(\"$DIGITALOCEAN_TOKEN\"))\n\nlist_resp = client.actions.list()" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/actions/{action_id}": { + "get": { + "operationId": "actions_get", + "summary": "Retrieve an Existing Action", + "description": "To retrieve a specific action object, send a GET request to `/v2/actions/$ACTION_ID`.", + "tags": [ + "Actions" + ], + "parameters": [ + { + "$ref": "#/components/parameters/action_id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/action" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/actions/36804636\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n action, _, err := client.Actions.Get(ctx, 36804636)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.actions.find(id: 36804636)" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.getenv(\"$DIGITALOCEAN_TOKEN\"))\n\nget_resp = client.actions.get(action_id=36804636)" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/apps": { + "get": { + "operationId": "apps_list", + "summary": "List All Apps", + "description": "List all apps on your account. Information about the current active deployment as well as any in progress ones will also be included for each app.", + "tags": [ + "Apps" + ], + "parameters": [ + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/per_page" + }, + { + "$ref": "#/components/parameters/with_projects" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/list_apps" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/apps\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nget_resp = client.apps.list()" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "post": { + "operationId": "apps_create", + "summary": "Create a New App", + "description": "Create a new app by submitting an app specification. For documentation on app specifications (`AppSpec` objects), please refer to [the product documentation](https://docs.digitalocean.com/products/app-platform/reference/app-spec/).", + "tags": [ + "Apps" + ], + "parameters": [ + { + "$ref": "#/components/parameters/accept" + }, + { + "$ref": "#/components/parameters/content-type" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/apps_create_app_request" + }, + "example": { + "spec": { + "name": "web-app", + "region": "nyc", + "services": [ + { + "name": "api", + "github": { + "branch": "main", + "deploy_on_push": true, + "repo": "digitalocean/sample-golang" + }, + "run_command": "bin/api", + "environment_slug": "node-js", + "instance_count": 2, + "instance_size_slug": "basic-xxs", + "routes": [ + { + "path": "/api" + } + ] + } + ] + } + } + } + }, + "required": true + }, + "responses": { + "200": { + "$ref": "#/components/responses/new_app" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/apps\"\n -d '{\"spec\":{\"name\":\"web-app\",\"region\":\"nyc\", \\\n \"services\":[{\"name\":\"api\",\"github\":{\"branch\":\"main\",\\\n \"deploy_on_push\":true,\"repo\":\"digitalocean/sample-golang\"}, \\\n \"run_command\":\"bin/api\",\"environment_slug\":\"node-js\", \\\n \"instance_count\":2,\"instance_size_slug\":\"basic-xxs\", \\\n \"routes\":[{\"path\":\"/api\"}]}]}}'" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\ncreate_resp = client.apps.create(\n {\n \"spec\": {\n \"name\": \"web-app\",\n \"region\": \"nyc\",\n \"services\": [\n {\n \"name\": \"api\",\n \"github\": {},\n \"run_command\": \"bin/api\",\n \"environment_slug\": \"node-js\",\n \"instance_count\": 2,\n \"instance_size_slug\": \"basic-xxs\",\n \"routes\": [],\n }\n ],\n }\n }\n)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/apps/{id}": { + "delete": { + "operationId": "apps_delete", + "summary": "Delete an App", + "description": "Delete an existing app. Once deleted, all active deployments will be permanently shut down and the app deleted. If needed, be sure to back up your app specification so that you may re-create it at a later time.", + "tags": [ + "Apps" + ], + "parameters": [ + { + "$ref": "#/components/parameters/id_app" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/delete_app" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/apps/{id}\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\ndelete_resp = client.apps.delete(id=\"b7d64052\")" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + }, + "get": { + "operationId": "apps_get", + "summary": "Retrieve an Existing App", + "description": "Retrieve details about an existing app by either its ID or name. To retrieve an app by its name, do not include an ID in the request path. Information about the current active deployment as well as any in progress ones will also be included in the response.", + "tags": [ + "Apps" + ], + "parameters": [ + { + "$ref": "#/components/parameters/id_app" + }, + { + "$ref": "#/components/parameters/app_name" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/apps_get" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/apps/{id}\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\ncreate_resp = client.apps.get(id=\"4f6c71e2\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "put": { + "operationId": "apps_update", + "summary": "Update an App", + "description": "Update an existing app by submitting a new app specification. For documentation on app specifications (`AppSpec` objects), please refer to [the product documentation](https://docs.digitalocean.com/products/app-platform/reference/app-spec/).", + "tags": [ + "Apps" + ], + "parameters": [ + { + "$ref": "#/components/parameters/id_app" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/apps_update_app_request" + } + } + }, + "required": true + }, + "responses": { + "200": { + "$ref": "#/components/responses/update_app" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X PUT \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/apps/{id}\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\nreq = {\n\"spec\": {\n \"name\": \"web-app-01\",\n \"region\": \"nyc\",\n \"domains\": [\n {\n \"domain\": \"app.example.com\",\n \"type\": \"DEFAULT\",\n \"wildcard\": True,\n \"zone\": \"example.com\",\n \"minimum_tls_version\": \"1.3\",\n }\n ],\n \"services\": [],\n \"static_sites\": [\n {\n \"cors\": {\n \"allow_origins\": [\n {\"exact\": \"https://www.example.com\"},\n {\"regex\": \"^.*example.com\"},\n ],\n \"allow_methods\": [\n \"GET\",\n \"OPTIONS\",\n \"POST\",\n \"PUT\",\n \"PATCH\",\n \"DELETE\",\n ],\n \"allow_headers\": [\"Content-Type\", \"X-Custom-Header\"],\n \"expose_headers\": [\"Content-Encoding\", \"X-Custom-Header\"],\n \"max_age\": \"5h30m\",\n \"allow_credentials\": False,\n },\n \"routes\": [{\"path\": \"/api\", \"preserve_path_prefix\": True}],\n }\n ],\n \"jobs\": [\n {\n \"name\": \"api\",\n \"gitlab\": {\n \"branch\": \"main\",\n \"deploy_on_push\": True,\n \"repo\": \"digitalocean/sample-golang\",\n },\n \"image\": {\n \"registry\": \"registry.hub.docker.com\",\n \"registry_type\": \"DOCR\",\n \"repository\": \"origin/master\",\n \"tag\": \"latest\",\n },\n \"dockerfile_path\": \"path/to/Dockerfile\",\n \"build_command\": \"npm run build\",\n \"run_command\": \"bin/api\",\n \"source_dir\": \"path/to/dir\",\n \"envs\": [\n {\n \"key\": \"BASE_URL\",\n \"scope\": \"BUILD_TIME\",\n \"type\": \"GENERAL\",\n \"value\": \"http://example.com\",\n }\n ],\n \"environment_slug\": \"node-js\",\n \"log_destinations\": {\n \"name\": \"my_log_destination\",\n \"papertrail\": {\n \"endpoint\": \"https://mypapertrailendpoint.com\"\n },\n \"datadog\": {\n \"endpoint\": \"https://mydatadogendpoint.com\",\n \"api_key\": \"abcdefghijklmnopqrstuvwxyz0123456789\",\n },\n \"logtail\": {\n \"token\": \"abcdefghijklmnopqrstuvwxyz0123456789\"\n },\n },\n \"instance_count\": 2,\n \"instance_size_slug\": \"basic-xxs\",\n \"kind\": \"PRE_DEPLOY\",\n }\n ],\n \"workers\": [\n {\n \"name\": \"api\",\n \"gitlab\": {\n \"branch\": \"main\",\n \"deploy_on_push\": True,\n \"repo\": \"digitalocean/sample-golang\",\n },\n \"image\": {\n \"registry\": \"registry.hub.docker.com\",\n \"registry_type\": \"DOCR\",\n \"repository\": \"origin/master\",\n \"tag\": \"latest\",\n },\n \"dockerfile_path\": \"path/to/Dockerfile\",\n \"build_command\": \"npm run build\",\n \"run_command\": \"bin/api\",\n \"source_dir\": \"path/to/dir\",\n \"envs\": [\n {\n \"key\": \"BASE_URL\",\n \"scope\": \"BUILD_TIME\",\n \"type\": \"GENERAL\",\n \"value\": \"http://example.com\",\n }\n ],\n \"environment_slug\": \"node-js\",\n \"log_destinations\": {\n \"name\": \"my_log_destination\",\n \"papertrail\": {\n \"endpoint\": \"https://mypapertrailendpoint.com\"\n },\n \"datadog\": {\n \"endpoint\": \"https://mydatadogendpoint.com\",\n \"api_key\": \"abcdefghijklmnopqrstuvwxyz0123456789\",\n },\n \"logtail\": {\n \"token\": \"abcdefghijklmnopqrstuvwxyz0123456789\"\n },\n },\n \"instance_count\": 2,\n \"instance_size_slug\": \"basic-xxs\",\n }\n ],\n \"functions\": [\n {\n \"cors\": {\n \"allow_origins\": [\n {\"exact\": \"https://www.example.com\"},\n {\"regex\": \"^.*example.com\"},\n ],\n \"allow_methods\": [\n \"GET\",\n \"OPTIONS\",\n \"POST\",\n \"PUT\",\n \"PATCH\",\n \"DELETE\",\n ],\n \"allow_headers\": [\"Content-Type\", \"X-Custom-Header\"],\n \"expose_headers\": [\"Content-Encoding\", \"X-Custom-Header\"],\n \"max_age\": \"5h30m\",\n \"allow_credentials\": False,\n },\n \"routes\": [{\"path\": \"/api\", \"preserve_path_prefix\": True}],\n \"name\": \"api\",\n \"source_dir\": \"path/to/dir\",\n \"alerts\": [\n {\n \"rule\": \"CPU_UTILIZATION\",\n \"disabled\": False,\n \"operator\": \"GREATER_THAN\",\n \"value\": 2.32,\n \"window\": \"FIVE_MINUTES\",\n }\n ],\n \"envs\": [\n {\n \"key\": \"BASE_URL\",\n \"scope\": \"BUILD_TIME\",\n \"type\": \"GENERAL\",\n \"value\": \"http://example.com\",\n }\n ],\n \"gitlab\": {\n \"branch\": \"main\",\n \"deploy_on_push\": True,\n \"repo\": \"digitalocean/sample-golang\",\n },\n \"log_destinations\": {\n \"name\": \"my_log_destination\",\n \"papertrail\": {\n \"endpoint\": \"https://mypapertrailendpoint.com\"\n },\n \"datadog\": {\n \"endpoint\": \"https://mydatadogendpoint.com\",\n \"api_key\": \"abcdefghijklmnopqrstuvwxyz0123456789\",\n },\n \"logtail\": {\n \"token\": \"abcdefghijklmnopqrstuvwxyz0123456789\"\n },\n },\n }\n ],\n \"databases\": [\n {\n \"cluster_name\": \"cluster_name\",\n \"db_name\": \"my_db\",\n \"db_user\": \"superuser\",\n \"engine\": \"PG\",\n \"name\": \"prod-db\",\n \"production\": True,\n \"version\": \"12\",\n }\n ],\n}\n}\nupdate_resp = client.apps.update(id=\"bb245ba\", body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/apps/{app_id}/components/{component_name}/logs": { + "get": { + "operationId": "apps_get_logs_active_deployment", + "summary": "Retrieve Active Deployment Logs", + "description": "Retrieve the logs of the active deployment if one exists. The response will include links to either real-time logs of an in-progress or active deployment or archived logs of a past deployment. Note log_type=BUILD logs will return logs associated with the current active deployment (being served). To view build logs associated with in-progress build, the query must explicitly reference the deployment id.", + "tags": [ + "Apps" + ], + "parameters": [ + { + "$ref": "#/components/parameters/app_id" + }, + { + "$ref": "#/components/parameters/component" + }, + { + "$ref": "#/components/parameters/live_updates" + }, + { + "$ref": "#/components/parameters/log_type" + }, + { + "$ref": "#/components/parameters/time_wait" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/list_logs" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/apps/{app_id}/components/{component_name}/logs\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nget_resp = client.apps.get_logs_active_deployment(app_id=\"a6adf840\", component_name=\"component\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/apps/{app_id}/deployments": { + "get": { + "operationId": "apps_list_deployments", + "summary": "List App Deployments", + "description": "List all deployments of an app.", + "tags": [ + "Apps" + ], + "parameters": [ + { + "$ref": "#/components/parameters/app_id" + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/per_page" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/existing_deployments" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/apps/{app_id}/deployments\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nget_resp = client.apps.list_deployments(app_id=\"4f6c71e2\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "post": { + "operationId": "apps_create_deployment", + "summary": "Create an App Deployment", + "description": "Creating an app deployment will pull the latest changes from your repository and schedule a new deployment for your app.", + "tags": [ + "Apps" + ], + "parameters": [ + { + "$ref": "#/components/parameters/app_id" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/apps_create_deployment_request" + } + } + }, + "required": true + }, + "responses": { + "200": { + "$ref": "#/components/responses/new_app_deployment" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/apps/{app_id}/deployments\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\ncreate_resp = client.apps.create_deployment(app_id=\"b6bdf840\", body={\"force_build\": True})" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/apps/{app_id}/deployments/{deployment_id}": { + "get": { + "operationId": "apps_get_deployment", + "summary": "Retrieve an App Deployment", + "description": "Retrieve information about an app deployment.", + "tags": [ + "Apps" + ], + "parameters": [ + { + "$ref": "#/components/parameters/app_id" + }, + { + "$ref": "#/components/parameters/deployment_id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/list_deployment" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/apps/{app_id}/deployments/{deployment_id}\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nget_resp = client.apps.get_deployment(app_id=\"a6adf840\", deployment_id=\"b6bdf840\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/apps/{app_id}/deployments/{deployment_id}/cancel": { + "post": { + "operationId": "apps_cancel_deployment", + "summary": "Cancel a Deployment", + "description": "Immediately cancel an in-progress deployment.", + "tags": [ + "Apps" + ], + "parameters": [ + { + "$ref": "#/components/parameters/app_id" + }, + { + "$ref": "#/components/parameters/deployment_id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/cancel_deployment" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/apps/{app_id}/deployments/{deployment_id}/cancel\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\ncancel_resp = client.apps.cancel_deployment(\"12345\", \"24556\")" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/apps/{app_id}/deployments/{deployment_id}/components/{component_name}/logs": { + "get": { + "operationId": "apps_get_logs", + "summary": "Retrieve Deployment Logs", + "description": "Retrieve the logs of a past, in-progress, or active deployment. The response will include links to either real-time logs of an in-progress or active deployment or archived logs of a past deployment.", + "tags": [ + "Apps" + ], + "parameters": [ + { + "$ref": "#/components/parameters/app_id" + }, + { + "$ref": "#/components/parameters/deployment_id" + }, + { + "$ref": "#/components/parameters/component" + }, + { + "$ref": "#/components/parameters/live_updates" + }, + { + "$ref": "#/components/parameters/log_type" + }, + { + "$ref": "#/components/parameters/time_wait" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/list_logs" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/apps/{app_id}/deployments/{deployment_id}/components/{component_name}/logs\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nget_resp = client.apps.get_logs(app_id=\"4f6c71e2\", deployment_id=\"3aa4d20e\", component_name=\"component\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/apps/{app_id}/deployments/{deployment_id}/logs": { + "get": { + "operationId": "apps_get_logs_aggregate", + "summary": "Retrieve Aggregate Deployment Logs", + "description": "Retrieve the logs of a past, in-progress, or active deployment. If a component name is specified, the logs will be limited to only that component. The response will include links to either real-time logs of an in-progress or active deployment or archived logs of a past deployment.", + "tags": [ + "Apps" + ], + "parameters": [ + { + "$ref": "#/components/parameters/app_id" + }, + { + "$ref": "#/components/parameters/deployment_id" + }, + { + "$ref": "#/components/parameters/live_updates" + }, + { + "$ref": "#/components/parameters/log_type" + }, + { + "$ref": "#/components/parameters/time_wait" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/list_logs" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/apps/{app_id}/deployments/{deployment_id}/logs\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nget_resp = client.apps.get_logs_aggregate(app_id=\"b6bdf840\", deployment_id=\"a6adf840\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/apps/{app_id}/logs": { + "get": { + "operationId": "apps_get_logs_active_deployment_aggregate", + "summary": "Retrieve Active Deployment Aggregate Logs", + "description": "Retrieve the logs of the active deployment if one exists. The response will include links to either real-time logs of an in-progress or active deployment or archived logs of a past deployment. Note log_type=BUILD logs will return logs associated with the current active deployment (being served). To view build logs associated with in-progress build, the query must explicitly reference the deployment id.", + "tags": [ + "Apps" + ], + "parameters": [ + { + "$ref": "#/components/parameters/app_id" + }, + { + "$ref": "#/components/parameters/live_updates" + }, + { + "$ref": "#/components/parameters/log_type" + }, + { + "$ref": "#/components/parameters/time_wait" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/list_logs" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/apps/{app_id}/logs\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nget_resp = client.apps.get_logs_active_deployment_aggregate(app_id=\"a6adf840\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/apps/tiers": { + "get": { + "operationId": "apps_list_tiers", + "summary": "List App Tiers", + "description": "List all app tiers.", + "tags": [ + "Apps" + ], + "responses": { + "200": { + "$ref": "#/components/responses/all_tiers" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/apps/tiers\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nget_resp = client.apps.list_tiers()" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/apps/tiers/{slug}": { + "get": { + "operationId": "apps_get_tier", + "summary": "Retrieve an App Tier", + "description": "Retrieve information about a specific app tier.", + "tags": [ + "Apps" + ], + "parameters": [ + { + "$ref": "#/components/parameters/slug_tier" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/get_tier" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/apps/tiers/{slug}\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\ncreate_resp = client.apps.get_tier(slug=\"basic\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/apps/tiers/instance_sizes": { + "get": { + "operationId": "apps_list_instanceSizes", + "summary": "List Instance Sizes", + "description": "List all instance sizes for `service`, `worker`, and `job` components.", + "tags": [ + "Apps" + ], + "responses": { + "200": { + "$ref": "#/components/responses/list_instance" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/apps/tiers/instance_sizes\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nget_resp = client.apps.list_instance_sizes()" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/apps/tiers/instance_sizes/{slug}": { + "get": { + "operationId": "apps_get_instanceSize", + "summary": "Retrieve an Instance Size", + "description": "Retrieve information about a specific instance size for `service`, `worker`, and `job` components.", + "tags": [ + "Apps" + ], + "parameters": [ + { + "$ref": "#/components/parameters/slug_size" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/get_instance" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/apps/tiers/instance_sizes/{slug}\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nget_resp = client.apps.get_instance_size(slug=\"basic-xxs\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/apps/regions": { + "get": { + "operationId": "apps_list_regions", + "summary": "List App Regions", + "description": "List all regions supported by App Platform.", + "tags": [ + "Apps" + ], + "responses": { + "200": { + "$ref": "#/components/responses/list_regions" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/apps/regions\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nget_resp = client.apps.list_regions()" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/apps/propose": { + "post": { + "operationId": "apps_validate_appSpec", + "summary": "Propose an App Spec", + "description": "To propose and validate a spec for a new or existing app, send a POST request to the `/v2/apps/propose` endpoint. The request returns some information about the proposed app, including app cost and upgrade cost. If an existing app ID is specified, the app spec is treated as a proposed update to the existing app.", + "tags": [ + "Apps" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/app_propose" + }, + "example": { + "spec": { + "name": "web-app", + "region": "nyc", + "services": [ + { + "name": "api", + "github": { + "branch": "main", + "deploy_on_push": true, + "repo": "digitalocean/sample-golang" + }, + "run_command": "bin/api", + "environment_slug": "node-js", + "instance_count": 2, + "instance_size_slug": "basic-xxs", + "routes": [ + { + "path": "/api" + } + ] + } + ] + }, + "app_id": "b6bdf840-2854-4f87-a36c-5f231c617c84" + } + } + }, + "required": true + }, + "responses": { + "200": { + "$ref": "#/components/responses/propose_app" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/apps/{app_id}/alerts": { + "get": { + "operationId": "apps_list_alerts", + "summary": "List all app alerts", + "description": "List alerts associated to the app and any components. This includes configuration information about the alerts including emails, slack webhooks, and triggering events or conditions.", + "tags": [ + "Apps" + ], + "parameters": [ + { + "$ref": "#/components/parameters/app_id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/list_alerts" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/apps/{app_id}/alerts\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nget_resp = client.apps.list_alerts(app_id=\"4f6c71e2\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/apps/{app_id}/alerts/{alert_id}/destinations": { + "post": { + "operationId": "apps_assign_alertDestinations", + "summary": "Update destinations for alerts", + "description": "Updates the emails and slack webhook destinations for app alerts. Emails must be associated to a user with access to the app.", + "tags": [ + "Apps" + ], + "parameters": [ + { + "$ref": "#/components/parameters/app_id" + }, + { + "$ref": "#/components/parameters/alert_id" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/apps_assign_app_alert_destinations_request" + } + } + }, + "required": true + }, + "responses": { + "200": { + "$ref": "#/components/responses/assign_alert_destinations" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X PUT \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/apps/{id}/alerts/{alert_id}/destinations\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"emails\": [\"sammy@digitalocean.com\"],\n \"slack_webhooks\": [\n {\n \"url\": \"https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX\",\n \"channel\": \"Channel Name\",\n }\n ],\n}\n\npost_resp = client.apps.assign_alert_destinations(\"12345\", \"24556\", req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/apps/{app_id}/rollback": { + "post": { + "operationId": "apps_create_rollback", + "summary": "Rollback App", + "description": "Rollback an app to a previous deployment. A new deployment will be created to perform the rollback.\nThe app will be pinned to the rollback deployment preventing any new deployments from being created,\neither manually or through Auto Deploy on Push webhooks. To resume deployments, the rollback must be\neither committed or reverted.\n\nIt is recommended to use the Validate App Rollback endpoint to double check if the rollback is\nvalid and if there are any warnings.\n", + "tags": [ + "Apps" + ], + "parameters": [ + { + "$ref": "#/components/parameters/app_id" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/apps_rollback_app_request" + } + } + }, + "required": true + }, + "responses": { + "200": { + "$ref": "#/components/responses/new_app_deployment" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{ \"deployment_id\": \"3aa4d20e-5527-4c00-b496-601fbd22520a\" }' \\\n \"https://api.digitalocean.com/v2/apps/{app_id}/rollback\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\ncreate_resp = client.apps.create_rollback(app_id=\"b6bdf840\")" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/apps/{app_id}/rollback/validate": { + "post": { + "operationId": "apps_validate_rollback", + "summary": "Validate App Rollback", + "description": "Check whether an app can be rolled back to a specific deployment. This endpoint can also be used\nto check if there are any warnings or validation conditions that will cause the rollback to proceed\nunder unideal circumstances. For example, if a component must be rebuilt as part of the rollback\ncausing it to take longer than usual.\n", + "tags": [ + "Apps" + ], + "parameters": [ + { + "$ref": "#/components/parameters/app_id" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/apps_rollback_app_request" + } + } + }, + "required": true + }, + "responses": { + "200": { + "$ref": "#/components/responses/apps_validate_rollback" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{ \"deployment_id\": \"3aa4d20e-5527-4c00-b496-601fbd22520a\" }' \\\n \"https://api.digitalocean.com/v2/apps/{app_id}/rollback/validate\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nvalidate_req = {\"deployment_id\": \"2\", \"skip_pin\": False}\n\nvalidate_resp = client.apps.validate_rollback(\"1\", validate_req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/apps/{app_id}/rollback/commit": { + "post": { + "operationId": "apps_commit_rollback", + "summary": "Commit App Rollback", + "description": "Commit an app rollback. This action permanently applies the rollback and unpins the app to resume new deployments.\n", + "tags": [ + "Apps" + ], + "parameters": [ + { + "$ref": "#/components/parameters/app_id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/no_content" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/apps/{app_id}/rollback/commit\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\ncommit_resp = client.apps.commit_rollback(\"1\")" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/apps/{app_id}/rollback/revert": { + "post": { + "operationId": "apps_revert_rollback", + "summary": "Revert App Rollback", + "description": "Revert an app rollback. This action reverts the active rollback by creating a new deployment from the\nlatest app spec prior to the rollback and unpins the app to resume new deployments.\n", + "tags": [ + "Apps" + ], + "parameters": [ + { + "$ref": "#/components/parameters/app_id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/new_app_deployment" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/apps/{app_id}/rollback/revert\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nrevert_resp = client.apps.revert_rollback(\"1\")" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/apps/{app_id}/metrics/bandwidth_daily": { + "get": { + "operationId": "apps_get_metrics_bandwidth_daily", + "summary": "Retrieve App Daily Bandwidth Metrics", + "description": "Retrieve daily bandwidth usage metrics for a single app.", + "tags": [ + "Apps" + ], + "parameters": [ + { + "$ref": "#/components/parameters/app_id" + }, + { + "name": "date", + "description": "Optional day to query. Only the date component of the timestamp will be considered. Default: yesterday.", + "in": "query", + "schema": { + "type": "string", + "format": "date-time" + }, + "example": "2023-01-17T00:00:00Z" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/get_metrics_bandwidth_usage" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/apps/{id}/metrics/bandwidth_daily\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nget_resp = client.apps.get_metrics_bandwidth_daily(app_id=\"4f6c71e2\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/apps/metrics/bandwidth_daily": { + "post": { + "operationId": "apps_list_metrics_bandwidth_daily", + "summary": "Retrieve Multiple Apps' Daily Bandwidth Metrics", + "description": "Retrieve daily bandwidth usage metrics for multiple apps.", + "tags": [ + "Apps" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/app_metrics_bandwidth_usage_request" + }, + "example": { + "app_ids": [ + "4f6c71e2-1e90-4762-9fee-6cc4a0a9f2cf", + "c2a93513-8d9b-4223-9d61-5e7272c81cf5" + ], + "date": "2023-01-17T00:00:00Z" + } + } + }, + "required": true + }, + "responses": { + "200": { + "$ref": "#/components/responses/list_metrics_bandwidth_usage" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/apps/metrics/bandwidth_daily\" \\\n -d '{ \"app_ids\": [\"4f6c71e2-1e90-4762-9fee-6cc4a0a9f2cf\"] }'" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"app_ids\": [\n \"4f6c71e2-1e90-4762-9fee-6cc4a0a9f2cf\",\n \"c2a93513-8d9b-4223-9d61-5e7272c81cf5\",\n ],\n \"date\": \"2023-01-17T00:00:00Z\",\n}\n\nget_resp = client.apps.list_metrics_bandwidth_daily(body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/cdn/endpoints": { + "get": { + "operationId": "cdn_list_endpoints", + "summary": "List All CDN Endpoints", + "description": "To list all of the CDN endpoints available on your account, send a GET request to `/v2/cdn/endpoints`.", + "tags": [ + "CDN Endpoints" + ], + "parameters": [ + { + "$ref": "#/components/parameters/per_page" + }, + { + "$ref": "#/components/parameters/page" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/all_cdn_endpoints" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/cdn/endpoints\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n opt := &godo.ListOptions{\n Page: 1,\n PerPage: 200,\n }\n\n cdns, _, err := client.CDNs.List(ctx, opt)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\ncdns = client.cdns.all\ncdns.each" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nget_resp = client.cdn.list_endpoints()" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "post": { + "operationId": "cdn_create_endpoint", + "summary": "Create a New CDN Endpoint", + "description": "To create a new CDN endpoint, send a POST request to `/v2/cdn/endpoints`. The\norigin attribute must be set to the fully qualified domain name (FQDN) of a\nDigitalOcean Space. Optionally, the TTL may be configured by setting the `ttl`\nattribute.\n\nA custom subdomain may be configured by specifying the `custom_domain` and\n`certificate_id` attributes.\n", + "tags": [ + "CDN Endpoints" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cdn_endpoint" + }, + "examples": { + "CDN Endpoint": { + "value": { + "origin": "static-images.nyc3.digitaloceanspaces.com", + "ttl": 3600 + } + }, + "CDN Endpoint With Custom Domain": { + "value": { + "origin": "static-images.nyc3.digitaloceanspaces.com", + "certificate_id": "892071a0-bb95-49bc-8021-3afd67a210bf", + "custom_domain": "static.example.com", + "ttl": 3600 + } + } + } + } + } + }, + "responses": { + "201": { + "$ref": "#/components/responses/existing_endpoint" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"origin\": \"static-images.nyc3.digitaloceanspaces.com\",\"certificate_id\": \"892071a0-bb95-49bc-8021-3afd67a210bf\",\"custom_domain\": \"static.example.com\",\"ttl\": 3600}' \\\n \"https://api.digitalocean.com/v2/cdn/endpoints\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n createRequest := &godo.CDNCreateRequest{\n Origin: \"static-images.nyc3.digitaloceanspaces.com\",\n TTL: 3600,\n CustomDomain: \"static.example.com\",\n CertificateID: \"892071a0-bb95-49bc-8021-3afd67a210b\",\n }\n\n cdn, _, err := client.CDNs.Create(ctx, createRequest)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\ncdn = DropletKit::CDN.new(\n origin: 'static-images.nyc3.digitaloceanspaces.com',\n custom_domain: 'static.example.com',\n certificate_id: '892071a0-bb95-49bc-8021-3afd67a210bf',\n ttl: 3600\n)\n\nclient.cdns.create(cdn)" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\ncreate_req = {\"origin\": \"static-images.nyc3.digitaloceanspaces.com\", \"ttl\": 3600}\ncreate_resp = client.cdn.create_endpoint(create_req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/cdn/endpoints/{cdn_id}": { + "get": { + "operationId": "cdn_get_endpoint", + "summary": "Retrieve an Existing CDN Endpoint", + "description": "To show information about an existing CDN endpoint, send a GET request to `/v2/cdn/endpoints/$ENDPOINT_ID`.", + "tags": [ + "CDN Endpoints" + ], + "parameters": [ + { + "$ref": "#/components/parameters/cdn_endpoint_id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/existing_endpoint" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/cdn/endpoints/19f06b6a-3ace-4315-b086-499a0e521b76\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n cdn, _, err := client.CDNs.Get(ctx, \"19f06b6a-3ace-4315-b086-499a0e521b76\")\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.cdns.find(id: '19f06b6a-3ace-4315-b086-499a0e521b76')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nget_resp = client.cdn.get_endpoint(cdn_id=\"aa34ba1\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "put": { + "operationId": "cdn_update_endpoints", + "summary": "Update a CDN Endpoint", + "description": "To update the TTL, certificate ID, or the FQDN of the custom subdomain for\nan existing CDN endpoint, send a PUT request to\n`/v2/cdn/endpoints/$ENDPOINT_ID`.\n", + "tags": [ + "CDN Endpoints" + ], + "parameters": [ + { + "$ref": "#/components/parameters/cdn_endpoint_id" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/update_endpoint" + } + } + } + }, + "responses": { + "200": { + "$ref": "#/components/responses/existing_endpoint" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X PUT \\\n-H \"Content-Type: application/json\" \\\n-H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n-d '{\"ttl\": 1800}' \\\n\"https://api.digitalocean.com/v2/cdn/endpoints/19f06b6a-3ace-4315-b086-499a0e521b76\" " + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n pat := \"mytoken\"\n\n client := godo.NewFromToken(pat)\n ctx := context.TODO()\n\n updateRequest := &godo.CDNUpdateTTLRequest{TTL: 1800}\n cdn, _, err := client.CDNs.UpdateTTL(ctx, \"19f06b6a-3ace-4315-b086-499a0e521b76\", updateRequest)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = '16f79fc8cd5adcfe528a0994311fa63cc877737b385b6ff7d12ed6684ba4fef5'\nclient = DropletKit::Client.new(access_token: token)\n\nclient.cdns.update_ttl(id: '19f06b6a-3ace-4315-b086-499a0e521b76', ttl: 1800)" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nupdate_req = {\n \"ttl\": 3600,\n \"certificate_id\": \"892071a0-bb95-49bc-8021-3afd67a210bf\",\n \"custom_domain\": \"static.example.com\",\n}\n\nupdate_resp = client.cdn.update_endpoints(\"19f06b6a\", update_req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + }, + "delete": { + "operationId": "cdn_delete_endpoint", + "summary": "Delete a CDN Endpoint", + "description": "To delete a specific CDN endpoint, send a DELETE request to\n`/v2/cdn/endpoints/$ENDPOINT_ID`.\n\nA status of 204 will be given. This indicates that the request was processed\nsuccessfully, but that no response body is needed.\n", + "tags": [ + "CDN Endpoints" + ], + "parameters": [ + { + "$ref": "#/components/parameters/cdn_endpoint_id" + } + ], + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/cdn/endpoints/19f06b6a-3ace-4315-b086-499a0e521b76\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n _, err := client.CDNs.Delete(ctx, \"19f06b6a-3ace-4315-b086-499a0e521b76\")\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.cdns.delete(id: '19f06b6a-3ace-4315-b086-499a0e521b76')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\ndelete_resp = client.cdn.delete_endpoint(cdn_id=\"bba23af\")" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/cdn/endpoints/{cdn_id}/cache": { + "delete": { + "operationId": "cdn_purge_cache", + "summary": "Purge the Cache for an Existing CDN Endpoint", + "description": "To purge cached content from a CDN endpoint, send a DELETE request to\n`/v2/cdn/endpoints/$ENDPOINT_ID/cache`. The body of the request should include\na `files` attribute containing a list of cached file paths to be purged. A\npath may be for a single file or may contain a wildcard (`*`) to recursively\npurge all files under a directory. When only a wildcard is provided, all\ncached files will be purged. There is a rate limit of 50 files per 20 seconds \nthat can be purged.\n", + "tags": [ + "CDN Endpoints" + ], + "parameters": [ + { + "$ref": "#/components/parameters/cdn_endpoint_id" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/purge_cache" + } + } + } + }, + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"files\": [\"assets/img/hero.png\",\"assets/css/*\"]}' \\\n \"https://api.digitalocean.com/v2/cdn/endpoints/19f06b6a-3ace-4315-b086-499a0e521b76/cache\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n flushRequest := &godo.CDNFlushCacheRequest{\n Files: []string{\"assets/img/hero.png\",\"assets/css/*\"},\n }\n\n _, err := client.CDNs.FlushCache(ctx, \"19f06b6a-3ace-4315-b086-499a0e521b76\", flushRequest)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.cdns.flush_cache(\n id: '19f06b6a-3ace-4315-b086-499a0e521b76',\n files: ['assets/img/hero.png','assets/css/*']\n)" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\npurge_req = {\"files\": [\"path/to/image.png\", \"path/to/css/*\"]}\n\npurge_resp = client.cdn.purge_cache(\"19f06b6a\", purge_req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/certificates": { + "get": { + "operationId": "certificates_list", + "summary": "List All Certificates", + "description": "To list all of the certificates available on your account, send a GET request to `/v2/certificates`.", + "parameters": [ + { + "$ref": "#/components/parameters/per_page" + }, + { + "$ref": "#/components/parameters/page" + } + ], + "tags": [ + "Certificates" + ], + "responses": { + "200": { + "$ref": "#/components/responses/all_certificates" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/certificates\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n opt := &godo.ListOptions{\n Page: 1,\n PerPage: 200,\n }\n\n certs, _, err := client.Certificates.List(ctx, opt)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\ncertificates = client.certificates.all\ncertificates.each" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nget_resp = client.certificates.list()" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "post": { + "operationId": "certificates_create", + "summary": "Create a New Certificate", + "description": "To upload new SSL certificate which you have previously generated, send a POST\nrequest to `/v2/certificates`.\n\nWhen uploading a user-generated certificate, the `private_key`,\n`leaf_certificate`, and optionally the `certificate_chain` attributes should\nbe provided. The type must be set to `custom`.\n\nWhen using Let's Encrypt to create a certificate, the `dns_names` attribute\nmust be provided, and the type must be set to `lets_encrypt`.\n", + "tags": [ + "Certificates" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/certificate_request_lets_encrypt" + }, + { + "$ref": "#/components/schemas/certificate_request_custom" + } + ] + } + } + } + }, + "responses": { + "201": { + "$ref": "#/components/responses/new_certificate" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"name\": \"web-cert-01\", \"type\": \"custom\", \"private_key\": \"'\"$(`enable_backups` | Enables backups for a Droplet |\n| `disable_backups` | Disables backups for a Droplet |\n| `reboot` | Reboots a Droplet. A `reboot` action is an attempt to reboot the Droplet in a graceful way, similar to using the `reboot` command from the console. |\n| `power_cycle` | Power cycles a Droplet. A `powercycle` action is similar to pushing the reset button on a physical machine, it's similar to booting from scratch. |\n| `shutdown` | Shutsdown a Droplet. A shutdown action is an attempt to shutdown the Droplet in a graceful way, similar to using the `shutdown` command from the console. Since a `shutdown` command can fail, this action guarantees that the command is issued, not that it succeeds. The preferred way to turn off a Droplet is to attempt a shutdown, with a reasonable timeout, followed by a `power_off` action to ensure the Droplet is off. |\n| `power_off` | Powers off a Droplet. A `power_off` event is a hard shutdown and should only be used if the `shutdown` action is not successful. It is similar to cutting the power on a server and could lead to complications. |\n| `power_on` | Powers on a Droplet. |\n| `restore` | Restore a Droplet using a backup image. The image ID that is passed in must be a backup of the current Droplet instance. The operation will leave any embedded SSH keys intact. |\n| `password_reset` | Resets the root password for a Droplet. A new password will be provided via email. It must be changed after first use. |\n| `resize` | Resizes a Droplet. Set the `size` attribute to a size slug. If a permanent resize with disk changes included is desired, set the `disk` attribute to `true`. |\n| `rebuild` | Rebuilds a Droplet from a new base image. Set the `image` attribute to an image ID or slug. |\n| `rename` | Renames a Droplet. |\n| `change_kernel` | Changes a Droplet's kernel. Only applies to Droplets with externally managed kernels. All Droplets created after March 2017 use internal kernels by default. |\n| `enable_ipv6` | Enables IPv6 for a Droplet. |\n| `snapshot` | Takes a snapshot of a Droplet. |\n", + "tags": [ + "Droplet Actions" + ], + "parameters": [ + { + "$ref": "#/components/parameters/droplet_id" + } + ], + "requestBody": { + "description": "The `type` attribute set in the request body will specify the action that\nwill be taken on the Droplet. Some actions will require additional\nattributes to be set as well.\n", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/droplet_action" + }, + { + "$ref": "#/components/schemas/droplet_action_restore" + }, + { + "$ref": "#/components/schemas/droplet_action_resize" + }, + { + "$ref": "#/components/schemas/droplet_action_rebuild" + }, + { + "$ref": "#/components/schemas/droplet_action_rename" + }, + { + "$ref": "#/components/schemas/droplet_action_change_kernel" + }, + { + "$ref": "#/components/schemas/droplet_action_snapshot" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "enable_backups": "#/components/schemas/droplet_action", + "disable_backups": "#/components/schemas/droplet_action", + "reboot": "#/components/schemas/droplet_action", + "power_cycle": "#/components/schemas/droplet_action", + "shutdown": "#/components/schemas/droplet_action", + "power_off": "#/components/schemas/droplet_action", + "power_on": "#/components/schemas/droplet_action", + "password_reset": "#/components/schemas/droplet_action", + "restore": "#/components/schemas/droplet_action_restore", + "resize": "#/components/schemas/droplet_action_resize", + "rebuild": "#/components/schemas/droplet_action_rebuild", + "rename": "#/components/schemas/droplet_action_rename", + "change_kernel": "#/components/schemas/droplet_action_change_kernel", + "enable_ipv6": "#/components/schemas/droplet_action", + "snapshot": "#/components/schemas/droplet_action_snapshot" + } + } + } + } + } + }, + "responses": { + "201": { + "$ref": "#/components/responses/droplet_action" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "# Enable Backups\ncurl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"type\":\"enable_backups\"}' \\\n \"https://api.digitalocean.com/v2/droplets/3164450/actions\"\n\n# Disable Backups\ncurl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"type\":\"disable_backups\"}' \\\n \"https://api.digitalocean.com/v2/droplets/3164450/actions\"\n\n# Reboot a Droplet\ncurl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"type\":\"reboot\"}' \\\n \"https://api.digitalocean.com/v2/droplets/3164450/actions\"\n\n# Power cycle a Droplet\ncurl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"type\":\"power_cycle\"}' \\\n \"https://api.digitalocean.com/v2/droplets/3164450/actions\"\n\n# Shutdown and Droplet\ncurl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"type\":\"shutdown\"}' \\\n \"https://api.digitalocean.com/v2/droplets/3067649/actions\"\n\n# Power off a Droplet\ncurl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"type\":\"power_off\"}' \\\n \"https://api.digitalocean.com/v2/droplets/3164450/actions\"\n\n# Power on a Droplet\ncurl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"type\":\"power_on\"}' \\\n \"https://api.digitalocean.com/v2/droplets/3164450/actions\"\n\n# Restore a Droplet\ncurl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"type\":\"restore\", \"image\": 12389723 }' \\\n \"https://api.digitalocean.com/v2/droplets/3067649/actions\"\n\n# Password Reset a Droplet\ncurl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"type\":\"password_reset\"}' \\\n \"https://api.digitalocean.com/v2/droplets/3164450/actions\"\n\n# Resize a Droplet\ncurl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"type\":\"resize\",\"size\":\"1gb\"}' \\\n \"https://api.digitalocean.com/v2/droplets/3164450/actions\"\n\n# Rebuild a Droplet\ncurl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"type\":\"rebuild\",\"image\":\"ubuntu-16-04-x64\"}' \\\n \"https://api.digitalocean.com/v2/droplets/3164450/actions\"\n\n# Rename a Droplet\ncurl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"type\":\"rename\",\"name\":\"nifty-new-name\"}' \\\n \"https://api.digitalocean.com/v2/droplets/3164450/actions\"\n\n# Change the Kernel\ncurl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"type\":\"change_kernel\",\"kernel\":991}' \\\n \"https://api.digitalocean.com/v2/droplets/3164450/actions\"\n\n# Enable IPv6\ncurl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"type\":\"enable_ipv6\"}' \\\n \"https://api.digitalocean.com/v2/droplets/3164450/actions\"\n\n# Enable Private Networking\ncurl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"type\":\"enable_private_networking\"}' \\\n \"https://api.digitalocean.com/v2/droplets/3164450/actions\"\n\n# Snapshot a Droplet\ncurl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"type\":\"snapshot\",\"name\":\"Nifty New Snapshot\"}' \\\n \"https://api.digitalocean.com/v2/droplets/3164450/actions\"\n\n# Acting on Tagged Droplets\ncurl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"type\":\"enable_backups\"}' \\\n \"https://api.digitalocean.com/v2/droplets/actions?tag_name=awesome\"\n\n# Retrieve a Droplet Action\ncurl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/droplets/3164444/actions/36804807\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n// Enable Backups\n action, _, err := client.DropletActions.EnableBackups(ctx, 3164450)\n\n// Disable Backups\n// action, _, err := client.DropletActions.DisableBackups(ctx, 3164450)\n\n// Reboot a Droplet\n// action, _, err := client.DropletActions.Reboot(ctx, 3164450)\n\n// Power Cycle a Droplet\n// action, _, err := client.DropletActions.PowerCycle(ctx, 3164450)\n\n// Shutdown a Droplet\n// action, _, err := client.DropletActions.Shutdown(ctx, 3067649)\n\n// Power Off a Droplet\n// action, _, err := client.DropletActions.PowerOff(ctx, 3164450)\n\n// Power On a Droplet\n// action, _, err := client.DropletActions.PowerOn(ctx, 3164450)\n\n// Restore a Droplet\n// action, _, err := client.DropletActions.Restore(ctx, 3164449, 12389723)\n\n// Password Reset a Droplet\n// action, _, err := client.DropletActions.PasswordReset(ctx, 3164450)\n\n// Resize a Droplet\n// action, _, err := client.DropletActions.Resize(ctx, 3164450, \"1gb\", true)\n\n// Rebuild a Droplet\n// action, _, err := client.DropletActions.RebuildByImageSlug(ctx, 3164450, \"ubuntu-16-04-x64\")\n\n// Rename a Droplet\n// action, _, err := client.DropletActions.Rename(ctx, 3164450, \"nifty-new-name\")\n\n// Change the Kernel\n// action, _, err := client.DropletActions.ChangeKernel(ctx, 3164450, 991)\n\n// Enable IPv6\n// action, _, err := client.DropletActions.EnableIPv6(ctx, 3164450)\n\n// Enable Private Networking\n// action, _, err := client.DropletActions.EnablePrivateNetworking(ctx, 3164450)\n\n// Snapshot a Droplet\n// action, _, err := client.DropletActions.Snapshot(ctx, 3164450, \"Nifty New Snapshot\")\n\n// Retrieve a Droplet Action\n// action, _, err := client.DropletActions.Get(ctx, 3164450, 36804807)\n\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\n# Enable Backups\nclient.droplet_actions.enable_backups(droplet_id: 3164450)\n\n# Disable Backups\n# client.droplet_actions.disable_backups(droplet_id: 3164450)\n\n# Reboot a Droplet\n# client.droplet_actions.reboot(droplet_id: 3164450)\n\n# Power Cycle a Droplet\n# client.droplet_actions.power_cycle(droplet_id: 3164450)\n\n# Shutdown a Droplet\n# client.droplet_actions.shutdown(droplet_id: 3067649)\n\n# Power Off a Droplet\n# client.droplet_actions.power_off(droplet_id: 3164450)\n\n# Power On a Droplet\n# client.droplet_actions.power_on(droplet_id: 3164450)\n\n# Restore a Droplet\n# client.droplet_actions.restore(droplet_id: 3067649, image: 12389723)\n\n# Password Reset a Droplet\n# client.droplet_actions.password_reset(droplet_id: 3164450)\n\n# Resize a Droplet\n# client.droplet_actions.resize(droplet_id: 3164450, size: '1gb')\n\n# Rebuild a Droplet\n# client.droplet_actions.rebuild(droplet_id: 3164450, image: 'ubuntu-16-04-x64')\n\n# Rename a Droplet\n# client.droplet_actions.rename(droplet_id: 3164450, name: 'nifty-new-name')\n\n# Change the Kernel\n# client.droplet_actions.change_kernel(droplet_id: 3164450, kernel: 991)\n\n# Enable IPv6\n# client.droplet_actions.enable_ipv6(droplet_id: 3164450)\n\n# Enable Private Networking\n# client.droplet_actions.enable_private_networking(droplet_id: 3164450)\n\n# Snapshot a Droplet\n# client.droplet_actions.snapshot(droplet_id: 3164450, name: 'Nifty New Snapshot')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\n# enable back ups example\nreq = {\n \"type\": \"enable_backups\"\n}\n\nresp = client.droplet_actions.post(droplet_id=346652, body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/droplets/actions": { + "post": { + "operationId": "dropletActions_post_byTag", + "summary": "Acting on Tagged Droplets", + "description": "Some actions can be performed in bulk on tagged Droplets. The actions can be\ninitiated by sending a POST to `/v2/droplets/actions?tag_name=$TAG_NAME` with\nthe action arguments.\n\nOnly a sub-set of action types are supported:\n\n- `power_cycle`\n- `power_on`\n- `power_off`\n- `shutdown`\n- `enable_ipv6`\n- `enable_backups`\n- `disable_backups`\n- `snapshot`\n", + "tags": [ + "Droplet Actions" + ], + "parameters": [ + { + "$ref": "#/components/parameters/droplet_tag_name" + } + ], + "requestBody": { + "description": "The `type` attribute set in the request body will specify the action that\nwill be taken on the Droplet. Some actions will require additional\nattributes to be set as well.\n", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/droplet_action" + }, + { + "$ref": "#/components/schemas/droplet_action_snapshot" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "enable_backups": "#/components/schemas/droplet_action", + "disable_backups": "#/components/schemas/droplet_action", + "power_cycle": "#/components/schemas/droplet_action", + "shutdown": "#/components/schemas/droplet_action", + "power_off": "#/components/schemas/droplet_action", + "power_on": "#/components/schemas/droplet_action", + "enable_ipv6": "#/components/schemas/droplet_action", + "snapshot": "#/components/schemas/droplet_action_snapshot" + } + } + } + } + } + }, + "responses": { + "201": { + "$ref": "#/components/responses/droplet_actions_response" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"type\":\"enable_backups\"}' \\\n \"https://api.digitalocean.com/v2/droplets/actions?tag_name=awesome\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n action, _, err := client.DropletActions.PowerOffByTag(ctx, \"awesome\")\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.droplet_actions.power_off_for_tag(tag: 'awesome')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n\"type\": \"enable_backups\"\n}\n\nresp = client.droplet_actions.post_by_tag(tag_name=\"production\",body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/droplets/{droplet_id}/actions/{action_id}": { + "get": { + "operationId": "dropletActions_get", + "summary": "Retrieve a Droplet Action", + "description": "To retrieve a Droplet action, send a GET request to\n`/v2/droplets/$DROPLET_ID/actions/$ACTION_ID`.\n\nThe response will be a JSON object with a key called `action`. The value will\nbe a Droplet action object.\n", + "tags": [ + "Droplet Actions" + ], + "parameters": [ + { + "$ref": "#/components/parameters/droplet_id" + }, + { + "$ref": "#/components/parameters/action_id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/action" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/droplets/3164444/actions/36804807\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n action, _, err := client.DropletActions.Get(ctx, 3164450, 36804807)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.droplet_actions.find(droplet_id: 3164444, id: 36804807)" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.droplet_actions.get(droplet_id=3934132, action_id=2432342)" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/droplets/{droplet_id}/kernels": { + "get": { + "operationId": "droplets_list_kernels", + "summary": "List All Available Kernels for a Droplet", + "description": "To retrieve a list of all kernels available to a Droplet, send a GET request\nto `/v2/droplets/$DROPLET_ID/kernels`\n\nThe response will be a JSON object that has a key called `kernels`. This will\nbe set to an array of `kernel` objects, each of which contain the standard\n`kernel` attributes.\n", + "tags": [ + "Droplets" + ], + "parameters": [ + { + "$ref": "#/components/parameters/droplet_id" + }, + { + "$ref": "#/components/parameters/per_page" + }, + { + "$ref": "#/components/parameters/page" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/all_kernels" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/droplets/3164494/kernels?page=1&per_page=1\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n opt := &godo.ListOptions{\n Page: 1,\n PerPage: 200,\n }\n\n kernels, _, err := client.Droplets.Kernels(ctx, 3164494, opt) \n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nkernels = client.droplets.kernels(id: 3164494)\nkernels.each" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.droplets.list_kernels(droplet_id=594828)" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/droplets/{droplet_id}/firewalls": { + "get": { + "operationId": "droplets_list_firewalls", + "summary": "List all Firewalls Applied to a Droplet", + "description": "To retrieve a list of all firewalls available to a Droplet, send a GET request\nto `/v2/droplets/$DROPLET_ID/firewalls`\n\nThe response will be a JSON object that has a key called `firewalls`. This will\nbe set to an array of `firewall` objects, each of which contain the standard\n`firewall` attributes.\n", + "tags": [ + "Droplets" + ], + "parameters": [ + { + "$ref": "#/components/parameters/droplet_id" + }, + { + "$ref": "#/components/parameters/per_page" + }, + { + "$ref": "#/components/parameters/page" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/all_firewalls" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/droplets/{droplet_id}/neighbors": { + "get": { + "operationId": "droplets_list_neighbors", + "summary": "List Neighbors for a Droplet", + "description": "To retrieve a list of any \"neighbors\" (i.e. Droplets that are co-located on\nthe same physical hardware) for a specific Droplet, send a GET request to\n`/v2/droplets/$DROPLET_ID/neighbors`.\n\nThe results will be returned as a JSON object with a key of `droplets`. This\nwill be set to an array containing objects representing any other Droplets\nthat share the same physical hardware. An empty array indicates that the\nDroplet is not co-located any other Droplets associated with your account.\n", + "tags": [ + "Droplets" + ], + "parameters": [ + { + "$ref": "#/components/parameters/droplet_id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/neighbor_droplets" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/droplets/3164494/neighbors\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.droplets.list_neighbors(droplet_id=594828)" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/droplets/{droplet_id}/destroy_with_associated_resources": { + "get": { + "operationId": "droplets_list_associatedResources", + "summary": "List Associated Resources for a Droplet", + "description": "To list the associated billable resources that can be destroyed along with a\nDroplet, send a GET request to the\n`/v2/droplets/$DROPLET_ID/destroy_with_associated_resources` endpoint.\n\nThe response will be a JSON object containing `snapshots`, `volumes`, and\n`volume_snapshots` keys. Each will be set to an array of objects containing\ninformation about the associated resources.\n", + "tags": [ + "Droplets" + ], + "parameters": [ + { + "$ref": "#/components/parameters/droplet_id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/associated_resources_list" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/droplets/3164494/destroy_with_associated_resources\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.droplets.list_associated_resources(droplet_id=594828)" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/droplets/{droplet_id}/destroy_with_associated_resources/selective": { + "delete": { + "operationId": "droplets_destroy_withAssociatedResourcesSelective", + "summary": "Selectively Destroy a Droplet and its Associated Resources", + "description": "To destroy a Droplet along with a sub-set of its associated resources, send a\nDELETE request to the `/v2/droplets/$DROPLET_ID/destroy_with_associated_resources/selective`\nendpoint. The JSON body of the request should include `reserved_ips`, `snapshots`, `volumes`,\nor `volume_snapshots` keys each set to an array of IDs for the associated\nresources to be destroyed. The IDs can be found by querying the Droplet's\nassociated resources. Any associated resource not included in the request\nwill remain and continue to accrue changes on your account.\n\nA successful response will include a 202 response code and no content. Use\nthe status endpoint to check on the success or failure of the destruction of\nthe individual resources.\n", + "tags": [ + "Droplets" + ], + "parameters": [ + { + "$ref": "#/components/parameters/droplet_id" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/selective_destroy_associated_resource" + } + } + } + }, + "responses": { + "202": { + "$ref": "#/components/responses/accepted" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"reserved_ips\":[\"6186916\"],\"snapshots\": [\"61486916\"],\"volumes\": [\"ba49449a-7435-11ea-b89e-0a58ac14480f\"],\"volume_snapshots\": [\"edb0478d-7436-11ea-86e6-0a58ac144b91\"]}' \\\n \"https://api.digitalocean.com/v2/droplets/187000742/destroy_with_associated_resources/selective\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.droplets.destroy_with_associated_resources_selective(droplet_id=524512)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/droplets/{droplet_id}/destroy_with_associated_resources/dangerous": { + "delete": { + "operationId": "droplets_destroy_withAssociatedResourcesDangerous", + "summary": "Destroy a Droplet and All of its Associated Resources (Dangerous)", + "description": "To destroy a Droplet along with all of its associated resources, send a DELETE\nrequest to the `/v2/droplets/$DROPLET_ID/destroy_with_associated_resources/dangerous`\nendpoint. The headers of this request must include an `X-Dangerous` key set to\n`true`. To preview which resources will be destroyed, first query the\nDroplet's associated resources. This operation _can not_ be reverse and should\nbe used with caution.\n\nA successful response will include a 202 response code and no content. Use the\nstatus endpoint to check on the success or failure of the destruction of the\nindividual resources.\n", + "tags": [ + "Droplets" + ], + "parameters": [ + { + "$ref": "#/components/parameters/droplet_id" + }, + { + "$ref": "#/components/parameters/x_dangerous" + } + ], + "responses": { + "202": { + "$ref": "#/components/responses/accepted" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE -H \"X-Dangerous: true\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/droplets/187000742/destroy_with_associated_resources/dangerous\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.droplets.destroy_with_associated_resources_dangerous(droplet_id=524512)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/droplets/{droplet_id}/destroy_with_associated_resources/status": { + "get": { + "operationId": "droplets_get_DestroyAssociatedResourcesStatus", + "summary": "Check Status of a Droplet Destroy with Associated Resources Request", + "description": "To check on the status of a request to destroy a Droplet with its associated\nresources, send a GET request to the\n`/v2/droplets/$DROPLET_ID/destroy_with_associated_resources/status` endpoint.\n", + "tags": [ + "Droplets" + ], + "parameters": [ + { + "$ref": "#/components/parameters/droplet_id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/associated_resources_status" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/droplets/3164494/destroy_with_associated_resources/status\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.droplets.get_destroy_associated_resources_status(droplet_id=5624512)" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/droplets/{droplet_id}/destroy_with_associated_resources/retry": { + "post": { + "operationId": "droplets_destroy_retryWithAssociatedResources", + "summary": "Retry a Droplet Destroy with Associated Resources Request", + "description": "If the status of a request to destroy a Droplet with its associated resources\nreported any errors, it can be retried by sending a POST request to the\n`/v2/droplets/$DROPLET_ID/destroy_with_associated_resources/retry` endpoint.\n\nOnly one destroy can be active at a time per Droplet. If a retry is issued\nwhile another destroy is in progress for the Droplet a 409 status code will\nbe returned. A successful response will include a 202 response code and no\ncontent.\n", + "tags": [ + "Droplets" + ], + "parameters": [ + { + "$ref": "#/components/parameters/droplet_id" + } + ], + "responses": { + "202": { + "$ref": "#/components/responses/accepted" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "409": { + "$ref": "#/components/responses/conflict" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/droplets/3164494/destroy_with_associated_resources/retry\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.droplets.destroy_retry_with_associated_resources(droplet_id=524512)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/firewalls": { + "get": { + "operationId": "firewalls_list", + "summary": "List All Firewalls", + "description": "To list all of the firewalls available on your account, send a GET request to `/v2/firewalls`.", + "tags": [ + "Firewalls" + ], + "parameters": [ + { + "$ref": "#/components/parameters/per_page" + }, + { + "$ref": "#/components/parameters/page" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/list_firewalls_response" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/firewalls\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n opt := &godo.ListOptions{\n Page: 1,\n PerPage: 200,\n }\n\n firewalls, _, err := client.Firewalls.List(ctx, opt)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nfirewalls = client.firewalls.all\nfirewalls.each" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.firewalls.list()" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "post": { + "operationId": "firewalls_create", + "summary": "Create a New Firewall", + "description": "To create a new firewall, send a POST request to `/v2/firewalls`. The request\nmust contain at least one inbound or outbound access rule.\n", + "tags": [ + "Firewalls" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/firewall" + }, + { + "required": [ + "name" + ] + }, + { + "anyOf": [ + { + "title": "Inbound Rules", + "required": [ + "inbound_rules" + ] + }, + { + "title": "Outbound Rules", + "required": [ + "outbound_rules" + ] + } + ] + } + ] + }, + "example": { + "name": "firewall", + "inbound_rules": [ + { + "protocol": "tcp", + "ports": "80", + "sources": { + "load_balancer_uids": [ + "4de7ac8b-495b-4884-9a69-1050c6793cd6" + ] + } + }, + { + "protocol": "tcp", + "ports": "22", + "sources": { + "tags": [ + "gateway" + ], + "addresses": [ + "18.0.0.0/8" + ] + } + } + ], + "outbound_rules": [ + { + "protocol": "tcp", + "ports": "80", + "destinations": { + "addresses": [ + "0.0.0.0/0", + "::/0" + ] + } + } + ], + "droplet_ids": [ + 8043964 + ] + } + } + } + }, + "responses": { + "202": { + "$ref": "#/components/responses/create_firewall_response" + }, + "400": { + "$ref": "#/components/responses/bad_request" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"name\":\"firewall\",\"inbound_rules\":[{\"protocol\":\"tcp\",\"ports\":\"80\",\"sources\":{\"load_balancer_uids\": [\"4de7ac8b-495b-4884-9a69-1050c6793cd6\"]}},{\"protocol\": \"tcp\",\"ports\": \"22\",\"sources\":{\"tags\": [\"gateway\"],\"addresses\": [\"18.0.0.0/8\"]}}],\"outbound_rules\":[{\"protocol\":\"tcp\",\"ports\":\"80\",\"destinations\":{\"addresses\":[\"0.0.0.0/0\",\"::/0\"]}}],\"droplet_ids\":[8043964]}' \\\n \"https://api.digitalocean.com/v2/firewalls\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n createRequest := &godo.FirewallRequest{\n Name: 'firewall',\n InboundRules: []godo.InboundRule{\n {\n Protocol: 'tcp',\n PortRange: '80',\n Sources: &godo.Sources{\n LoadBalancerUIDs: []string{'4de7ac8b-495b-4884-9a69-1050c6793cd6'},\n },\n },\n {\n Protocol: 'tcp',\n PortRange: '22',\n Sources: &godo.Sources{\n Addresses: []string{'18.0.0.0/8'},\n Tags: []string{'gateway'},\n },\n },\n },\n OutboundRules: []godo.OutboundRule{\n {\n Protocol: 'tcp',\n PortRange: '80',\n Destinations: &godo.Destinations{\n Addresses: []string{'0.0.0.0/0', '::/0'},\n },\n },\n },\n DropletIDs: []int{8043964},\n }\n\n firewall, req, err := client.Firewalls.Create(ctx, createRequest)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nfirewall = DropletKit::Firewall.new(\n name: 'firewall',\n inbound_rules: [\n DropletKit::FirewallInboundRule.new(\n protocol: 'tcp',\n ports: '80',\n sources: {\n load_balancer_uids: ['4de7ac8b-495b-4884-9a69-1050c6793cd6']\n }\n ),\n DropletKit::FirewallInboundRule.new(\n protocol: 'tcp',\n ports: '22',\n sources: {\n tags: ['gateway'],\n addresses: ['18.0.0.0/8']\n }\n )\n ],\n outbound_rules: [\n DropletKit::FirewallOutboundRule.new(\n protocol: 'tcp',\n ports: '80',\n destinations: {\n addresses: ['0.0.0.0/0', '::/0'],\n }\n )\n ],\n droplet_ids: [8043964]\n)\n\nclient.firewalls.create(firewall)" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"name\": \"firewall\",\n \"inbound_rules\": [\n {\n \"protocol\": \"tcp\",\n \"ports\": \"80\",\n \"sources\": {\n \"load_balancer_uids\": [\n \"4de7ac8b-495b-4884-9a69-1050c6793cd6\"\n ]\n }\n },\n {\n \"protocol\": \"tcp\",\n \"ports\": \"22\",\n \"sources\": {\n \"tags\": [\n \"gateway\"\n ],\n \"addresses\": [\n \"18.0.0.0/8\"\n ]\n }\n }\n ],\n \"outbound_rules\": [\n {\n \"protocol\": \"tcp\",\n \"ports\": \"80\",\n \"destinations\": {\n \"addresses\": [\n \"0.0.0.0/0\",\n \"::/0\"\n ]\n }\n }\n ],\n \"droplet_ids\": [\n 8043964\n ]\n}\n\nresp = client.firewalls.create(body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/firewalls/{firewall_id}": { + "get": { + "operationId": "firewalls_get", + "summary": "Retrieve an Existing Firewall", + "description": "To show information about an existing firewall, send a GET request to `/v2/firewalls/$FIREWALL_ID`.", + "tags": [ + "Firewalls" + ], + "parameters": [ + { + "$ref": "#/components/parameters/firewall_id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/get_firewall_response" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/firewalls/bb4b2611-3d72-467b-8602-280330ecd65c\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n firewall, _, err := client.Firewalls.Get(ctx, 'bb4b2611-3d72-467b-8602-280330ecd65c')\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.firewalls.find(id: 'bb4b2611-3d72-467b-8602-280330ecd65c')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.firewalls.get(firewall_id= \"as9di9d\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "put": { + "operationId": "firewalls_update", + "summary": "Update a Firewall", + "description": "To update the configuration of an existing firewall, send a PUT request to\n`/v2/firewalls/$FIREWALL_ID`. The request should contain a full representation\nof the firewall including existing attributes. **Note that any attributes that\nare not provided will be reset to their default values.**\n", + "tags": [ + "Firewalls" + ], + "parameters": [ + { + "$ref": "#/components/parameters/firewall_id" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "required": [ + "name" + ], + "allOf": [ + { + "$ref": "#/components/schemas/firewall" + }, + { + "anyOf": [ + { + "title": "Inbound Rules", + "required": [ + "inbound_rules" + ] + }, + { + "title": "Outbound Rules", + "required": [ + "outbound_rules" + ] + } + ] + } + ] + }, + "example": { + "name": "frontend-firewall", + "inbound_rules": [ + { + "protocol": "tcp", + "ports": "8080", + "sources": { + "load_balancer_uids": [ + "4de7ac8b-495b-4884-9a69-1050c6793cd6" + ] + } + }, + { + "protocol": "tcp", + "ports": "22", + "sources": { + "tags": [ + "gateway" + ], + "addresses": [ + "18.0.0.0/8" + ] + } + } + ], + "outbound_rules": [ + { + "protocol": "tcp", + "ports": "8080", + "destinations": { + "addresses": [ + "0.0.0.0/0", + "::/0" + ] + } + } + ], + "droplet_ids": [ + 8043964 + ], + "tags": [ + "frontend" + ] + } + } + } + }, + "responses": { + "200": { + "$ref": "#/components/responses/put_firewall_response" + }, + "400": { + "$ref": "#/components/responses/bad_request" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X PUT \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"name\":\"firewall\",\"inbound_rules\":[{\"protocol\":\"tcp\",\"ports\":\"8080\",\"sources\":{\"load_balancer_uids\": [\"4de7ac8b-495b-4884-9a69-1050c6793cd6\"]}},{\"protocol\": \"tcp\",\"ports\": \"22\",\"sources\":{\"tags\": [\"gateway\"],\"addresses\": [\"18.0.0.0/8\"]}}],\"outbound_rules\":[{\"protocol\":\"tcp\",\"ports\":\"8080\",\"destinations\":{\"addresses\":[\"0.0.0.0/0\",\"::/0\"]}}],\"droplet_ids\":[8043964],\"tags\":[\"frontend\"]}' \\\n \"https://api.digitalocean.com/v2/firewalls/bb4b2611-3d72-467b-8602-280330ecd65c\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n updateRequest := &godo.FirewallRequest{\n Name: 'firewall',\n InboundRules: []godo.InboundRule{\n {\n Protocol: 'tcp',\n PortRange: '8080',\n Sources: &godo.Sources{\n LoadBalancerUIDs: []string{'4de7ac8b-495b-4884-9a69-1050c6793cd6'},\n },\n },\n {\n Protocol: 'tcp',\n PortRange: '22',\n Sources: &godo.Sources{\n Addresses: []string{'18.0.0.0/8'},\n Tags: []string{'gateway'},\n },\n },\n },\n OutboundRules: []godo.OutboundRule{\n {\n Protocol: 'tcp',\n PortRange: '8080',\n Destinations: &godo.Destinations{\n Addresses: []string{'0.0.0.0/0', '::/0'},\n },\n },\n },\n DropletIDs: []int{8043964},\n Tags: []string{'frontend'}\n }\n\n firewall, req, err := client.Firewalls.Create(ctx, 'bb4b2611-3d72-467b-8602-280330ecd65c', updateRequest)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nfirewall = DropletKit::Firewall.new(\n name: 'firewall',\n inbound_rules: [\n DropletKit::FirewallInboundRule.new(\n protocol: 'tcp',\n ports: '8080',\n sources: {\n load_balancer_uids: ['4de7ac8b-495b-4884-9a69-1050c6793cd6']\n }\n ),\n DropletKit::FirewallInboundRule.new(\n protocol: 'tcp',\n ports: '22',\n sources: {\n tags: ['gateway'],\n addresses: ['18.0.0.0/8']\n }\n )\n ],\n outbound_rules: [\n DropletKit::FirewallOutboundRule.new(\n protocol: 'tcp',\n ports: '8080',\n destinations: {\n addresses: ['0.0.0.0/0', '::/0'],\n }\n )\n ],\n droplet_ids: [8043964],\n tags: ['frontend']\n)\n\nclient.firewalls.update(firewall, id: 'bb4b2611-3d72-467b-8602-280330ecd65c')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"name\": \"frontend-firewall\",\n \"inbound_rules\": [\n {\n \"protocol\": \"tcp\",\n \"ports\": \"8080\",\n \"sources\": {\n \"load_balancer_uids\": [\n \"4de7ac8b-495b-4884-9a69-1050c6793cd6\"\n ]\n }\n },\n {\n \"protocol\": \"tcp\",\n \"ports\": \"22\",\n \"sources\": {\n \"tags\": [\n \"gateway\"\n ],\n \"addresses\": [\n \"18.0.0.0/8\"\n ]\n }\n }\n ],\n \"outbound_rules\": [\n {\n \"protocol\": \"tcp\",\n \"ports\": \"8080\",\n \"destinations\": {\n \"addresses\": [\n \"0.0.0.0/0\",\n \"::/0\"\n ]\n }\n }\n ],\n \"droplet_ids\": [\n 8043964\n ],\n \"tags\": [\n \"frontend\"\n ]\n}\n\nresp = client.firewalls.update(firewall_id=\"3afda9\", body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + }, + "delete": { + "operationId": "firewalls_delete", + "summary": "Delete a Firewall", + "description": "To delete a firewall send a DELETE request to `/v2/firewalls/$FIREWALL_ID`.\n\nNo response body will be sent back, but the response code will indicate\nsuccess. Specifically, the response code will be a 204, which means that the\naction was successful with no returned body data.\n", + "tags": [ + "Firewalls" + ], + "parameters": [ + { + "$ref": "#/components/parameters/firewall_id" + } + ], + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/firewalls/bb4b2611-3d72-467b-8602-280330ecd65c\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n _, err := client.Firewalls.Delete(ctx, 'bb4b2611-3d72-467b-8602-280330ecd65c')\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.firewalls.delete(id: 'bb4b2611-3d72-467b-8602-280330ecd65c')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.firewalls.delete(firewall_id= \"as9di9d\")" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/firewalls/{firewall_id}/droplets": { + "post": { + "operationId": "firewalls_assign_droplets", + "summary": "Add Droplets to a Firewall", + "description": "To assign a Droplet to a firewall, send a POST request to\n`/v2/firewalls/$FIREWALL_ID/droplets`. In the body of the request, there\nshould be a `droplet_ids` attribute containing a list of Droplet IDs.\n\nNo response body will be sent back, but the response code will indicate\nsuccess. Specifically, the response code will be a 204, which means that the\naction was successful with no returned body data.\n", + "tags": [ + "Firewalls" + ], + "parameters": [ + { + "$ref": "#/components/parameters/firewall_id" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "droplet_ids": { + "type": "array", + "description": "An array containing the IDs of the Droplets to be assigned to the firewall.", + "items": { + "type": "integer" + }, + "example": [ + 49696269 + ] + } + }, + "required": [ + "droplet_ids" + ] + }, + "example": { + "droplet_ids": [ + 49696269 + ] + } + } + } + }, + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "400": { + "$ref": "#/components/responses/bad_request" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"droplet_ids\":[49696269]}' \\\n \"https://api.digitalocean.com/v2/firewalls/bb4b2611-3d72-467b-8602-280330ecd65c/droplets\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n _, err := client.Firewalls.AddDroplets(ctx, 'bb4b2611-3d72-467b-8602-280330ecd65c', 49696269) \n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.firewalls.add_droplets([49696269], id: 'bb4b2611-3d72-467b-8602-280330ecd65c')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"droplet_ids\": [\n 49696269\n ]\n}\n\nresp = client.firewalls.assign_droplets(firewall_id=\"39fa4gz\", body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + }, + "delete": { + "operationId": "firewalls_delete_droplets", + "summary": "Remove Droplets from a Firewall", + "description": "To remove a Droplet from a firewall, send a DELETE request to\n`/v2/firewalls/$FIREWALL_ID/droplets`. In the body of the request, there should\nbe a `droplet_ids` attribute containing a list of Droplet IDs.\n\nNo response body will be sent back, but the response code will indicate\nsuccess. Specifically, the response code will be a 204, which means that the\naction was successful with no returned body data.\n", + "tags": [ + "Firewalls" + ], + "parameters": [ + { + "$ref": "#/components/parameters/firewall_id" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "droplet_ids": { + "type": "array", + "description": "An array containing the IDs of the Droplets to be removed from the firewall.", + "items": { + "type": "integer" + }, + "example": [ + 49696269 + ] + } + }, + "required": [ + "droplet_ids" + ] + }, + "example": { + "droplet_ids": [ + 49696269 + ] + } + } + } + }, + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "400": { + "$ref": "#/components/responses/bad_request" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"droplet_ids\":[49696269]}' \\\n \"https://api.digitalocean.com/v2/firewalls/bb4b2611-3d72-467b-8602-280330ecd65c/droplets\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n _, err := client.Firewalls.RemoveDroplets(ctx, 'bb4b2611-3d72-467b-8602-280330ecd65c', 49696269)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.firewalls.remove_droplets([49696269], id: 'bb4b2611-3d72-467b-8602-280330ecd65c')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"droplet_ids\": [\n 49696269\n ]\n}\n\nresp = client.firewalls.delete_droplets(firewall_id=\"39fa4gz\", body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/firewalls/{firewall_id}/tags": { + "post": { + "operationId": "firewalls_add_tags", + "summary": "Add Tags to a Firewall", + "description": "To assign a tag representing a group of Droplets to a firewall, send a POST\nrequest to `/v2/firewalls/$FIREWALL_ID/tags`. In the body of the request,\nthere should be a `tags` attribute containing a list of tag names.\n\nNo response body will be sent back, but the response code will indicate\nsuccess. Specifically, the response code will be a 204, which means that the\naction was successful with no returned body data.\n", + "tags": [ + "Firewalls" + ], + "parameters": [ + { + "$ref": "#/components/parameters/firewall_id" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "tags": { + "allOf": [ + { + "$ref": "#/components/schemas/tags_array" + }, + { + "description": "An array containing the names of the Tags to be assigned to the firewall." + } + ] + } + }, + "required": [ + "tags" + ] + }, + "example": { + "tags": [ + "frontend" + ] + } + } + } + }, + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "400": { + "$ref": "#/components/responses/bad_request" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"tags\":[\"frontend\"]}' \\\n \"https://api.digitalocean.com/v2/firewalls/bb4b2611-3d72-467b-8602-280330ecd65c/tags\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n _, err := client.Firewalls.AddTags(ctx, 'bb4b2611-3d72-467b-8602-280330ecd65c', 'frontend') \n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.firewalls.add_tags(['frontend'], id: 'bb4b2611-3d72-467b-8602-280330ecd65c')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"tags\": [\n \"frontend\"\n ]\n}\n\nresp = client.firewalls.add_tags(firewall_id=\"39fa4gz\", body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + }, + "delete": { + "operationId": "firewalls_delete_tags", + "summary": "Remove Tags from a Firewall", + "description": "To remove a tag representing a group of Droplets from a firewall, send a\nDELETE request to `/v2/firewalls/$FIREWALL_ID/tags`. In the body of the\nrequest, there should be a `tags` attribute containing a list of tag names.\n\nNo response body will be sent back, but the response code will indicate\nsuccess. Specifically, the response code will be a 204, which means that the\naction was successful with no returned body data.\n", + "tags": [ + "Firewalls" + ], + "parameters": [ + { + "$ref": "#/components/parameters/firewall_id" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "tags": { + "allOf": [ + { + "$ref": "#/components/schemas/tags_array" + }, + { + "description": "An array containing the names of the Tags to be removed from the firewall." + } + ] + } + }, + "required": [ + "tags" + ] + }, + "example": { + "tags": [ + "frontend" + ] + } + } + } + }, + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "400": { + "$ref": "#/components/responses/bad_request" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"tags\":[\"frontend\"]}' \\\n \"https://api.digitalocean.com/v2/firewalls/bb4b2611-3d72-467b-8602-280330ecd65c/tags\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n _, err := client.Firewalls.RemoveTags(ctx, 'bb4b2611-3d72-467b-8602-280330ecd65c', 'frontend')\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.firewalls.remove_tags(['frontend'], id: 'bb4b2611-3d72-467b-8602-280330ecd65c')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"tags\": [\n \"frontend\"\n ]\n}\n\nresp = client.firewalls.delete_tags(firewall_id=\"39fa4gz\", body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/firewalls/{firewall_id}/rules": { + "post": { + "operationId": "firewalls_add_rules", + "summary": "Add Rules to a Firewall", + "description": "To add additional access rules to a firewall, send a POST request to\n`/v2/firewalls/$FIREWALL_ID/rules`. The body of the request may include an\ninbound_rules and/or outbound_rules attribute containing an array of rules to\nbe added.\n\nNo response body will be sent back, but the response code will indicate\nsuccess. Specifically, the response code will be a 204, which means that the\naction was successful with no returned body data.\n", + "tags": [ + "Firewalls" + ], + "parameters": [ + { + "$ref": "#/components/parameters/firewall_id" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/firewall_rules" + }, + { + "anyOf": [ + { + "title": "Inbound Rules", + "required": [ + "inbound_rules" + ] + }, + { + "title": "Outbound Rules", + "required": [ + "outbound_rules" + ] + } + ] + } + ] + }, + "example": { + "inbound_rules": [ + { + "protocol": "tcp", + "ports": "3306", + "sources": { + "droplet_ids": [ + 49696269 + ] + } + } + ], + "outbound_rules": [ + { + "protocol": "tcp", + "ports": "3306", + "destinations": { + "droplet_ids": [ + 49696269 + ] + } + } + ] + } + } + } + }, + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "400": { + "$ref": "#/components/responses/bad_request" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"inbound_rules\":[{\"protocol\":\"tcp\",\"ports\":\"3306\",\"sources\":{\"droplet_ids\":[49696269]}}],\"outbound_rules\":[{\"protocol\":\"tcp\",\"ports\":\"3306\",\"destinations\":{\"droplet_ids\":[49696269]}}]}' \\\n \"https://api.digitalocean.com/v2/firewalls/bb4b2611-3d72-467b-8602-280330ecd65c/rules\" " + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\nruleRequest := &godo.FirewallRulesRequest{\n InboundRules: []godo.InboundRule{\n {\n Protocol: 'tcp',\n PortRange: '3306',\n Sources: &godo.Sources{\n DropletIDs: []int{49696269},\n },\n },\n },\n OutboundRules: []godo.OutboundRule{\n {\n Protocol: 'tcp',\n PortRange: '3306',\n Destinations: &godo.Destinations{\n DropletIDs: []int{49696269},\n },\n },\n },\n}\n\n_, err := c.Firewalls.AddRules(ctx, 'bb4b2611-3d72-467b-8602-280330ecd65c', ruleRequest)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\ninbound_rule = DropletKit::FirewallInboundRule.new(\n protocol: 'tcp',\n ports: '3306',\n sources: {\n droplet_ids: [49696269]\n }\n)\n\noutbound_rule = DropletKit::FirewallOutboundRule.new(\n protocol: 'tcp',\n ports: '3306',\n destinations: {\n droplet_ids: [49696269]\n }\n)\n\nclient.firewalls.add_rules(inbound_rules: [inbound_rule], outbound_rules: [outbound_rule], id: 'bb4b2611-3d72-467b-8602-280330ecd65c')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"inbound_rules\": [\n {\n \"protocol\": \"tcp\",\n \"ports\": \"3306\",\n \"sources\": {\n \"droplet_ids\": [\n 49696269\n ]\n }\n }\n ],\n \"outbound_rules\": [\n {\n \"protocol\": \"tcp\",\n \"ports\": \"3306\",\n \"destinations\": {\n \"droplet_ids\": [\n 49696269\n ]\n }\n }\n ]\n}\n\nresp = client.firewalls.add_rules(firewall_id=\"39fa4gz\", body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + }, + "delete": { + "operationId": "firewalls_delete_rules", + "summary": "Remove Rules from a Firewall", + "description": "To remove access rules from a firewall, send a DELETE request to\n`/v2/firewalls/$FIREWALL_ID/rules`. The body of the request may include an\n`inbound_rules` and/or `outbound_rules` attribute containing an array of rules\nto be removed.\n\nNo response body will be sent back, but the response code will indicate\nsuccess. Specifically, the response code will be a 204, which means that the\naction was successful with no returned body data.\n", + "tags": [ + "Firewalls" + ], + "parameters": [ + { + "$ref": "#/components/parameters/firewall_id" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/firewall_rules" + }, + { + "anyOf": [ + { + "title": "Inbound Rules", + "required": [ + "inbound_rules" + ] + }, + { + "title": "Outbound Rules", + "required": [ + "outbound_rules" + ] + } + ] + } + ] + }, + "example": { + "inbound_rules": [ + { + "protocol": "tcp", + "ports": "3306", + "sources": { + "droplet_ids": [ + 49696269 + ] + } + } + ], + "outbound_rules": [ + { + "protocol": "tcp", + "ports": "3306", + "destinations": { + "droplet_ids": [ + 49696269 + ] + } + } + ] + } + } + } + }, + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "400": { + "$ref": "#/components/responses/bad_request" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"inbound_rules\":[{\"protocol\":\"tcp\",\"ports\":\"3306\",\"sources\":{\"droplet_ids\":[49696269]}}],\"outbound_rules\":[{\"protocol\":\"tcp\",\"ports\":\"3306\",\"destinations\":{\"droplet_ids\":[49696269]}}]}' \\\n \"https://api.digitalocean.com/v2/firewalls/bb4b2611-3d72-467b-8602-280330ecd65c/rules\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n ruleRequest := &godo.FirewallRulesRequest{\n InboundRules: []godo.InboundRule{\n {\n Protocol: 'tcp',\n PortRange: '3306',\n Sources: &godo.Sources{\n DropletIDs: []int{49696269},\n },\n },\n },\n OutboundRules: []godo.OutboundRule{\n {\n Protocol: 'tcp',\n PortRange: '3306',\n Destinations: &godo.Destinations{\n DropletIDs: []int{49696269},\n },\n },\n },\n }\n\n _, err := c.Firewalls.RemoveRules(ctx, 'bb4b2611-3d72-467b-8602-280330ecd65c', ruleRequest)\n\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\ninbound_rule = DropletKit::FirewallInboundRule.new(\n protocol: 'tcp',\n ports: '3306',\n sources: {\n droplet_ids: [49696269]\n }\n)\n\noutbound_rule = DropletKit::FirewallOutboundRule.new(\n protocol: 'tcp',\n ports: '3306',\n destinations: {\n droplet_ids: [49696269]\n }\n)\n\nclient.firewalls.remove_rules(inbound_rules: [inbound_rule], outbound_rules: [outbound_rule], id: 'bb4b2611-3d72-467b-8602-280330ecd65c')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"inbound_rules\": [\n {\n \"protocol\": \"tcp\",\n \"ports\": \"3306\",\n \"sources\": {\n \"droplet_ids\": [\n 49696269\n ]\n }\n }\n ],\n \"outbound_rules\": [\n {\n \"protocol\": \"tcp\",\n \"ports\": \"3306\",\n \"destinations\": {\n \"droplet_ids\": [\n 49696269\n ]\n }\n }\n ]\n}\n\nresp = client.firewalls.delete_rules(firewall_id=\"39fa4gz\", body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/floating_ips": { + "get": { + "operationId": "floatingIPs_list", + "summary": "List All Floating IPs", + "description": "To list all of the floating IPs available on your account, send a GET request to `/v2/floating_ips`.", + "tags": [ + "Floating IPs" + ], + "parameters": [ + { + "$ref": "#/components/parameters/per_page" + }, + { + "$ref": "#/components/parameters/page" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/floating_ip_list" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/floating_ips?page=1&per_page=20\" " + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n opt := &godo.ListOptions{\n Page: 1,\n PerPage: 200,\n }\n\n floatingIPs, _, err := client.FloatingIPs.List(ctx, opt)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nfloating_ips = client.floating_ips.all\nfloating_ips.each" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "post": { + "operationId": "floatingIPs_create", + "summary": "Create a New Floating IP", + "description": "On creation, a floating IP must be either assigned to a Droplet or reserved to a region.\n* To create a new floating IP assigned to a Droplet, send a POST\n request to `/v2/floating_ips` with the `droplet_id` attribute.\n\n* To create a new floating IP reserved to a region, send a POST request to\n `/v2/floating_ips` with the `region` attribute.\n\n**Note**: In addition to the standard rate limiting, only 12 floating IPs may be created per 60 seconds.", + "tags": [ + "Floating IPs" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/floating_ip_create" + } + } + } + }, + "responses": { + "202": { + "$ref": "#/components/responses/floating_ip_created" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"droplet_id\": 123456}' \\\n \"https://api.digitalocean.com/v2/floating_ips\" " + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n createRequest := &godo.FloatingIPCreateRequest{\n DropletID: 123456,\n\n }\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nfloating_ip = DropletKit::FloatingIp.new(droplet_id: 123456)\nclient.floating_ips.create(floating_ip) " + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/floating_ips/{floating_ip}": { + "get": { + "operationId": "floatingIPs_get", + "summary": "Retrieve an Existing Floating IP", + "description": "To show information about a floating IP, send a GET request to `/v2/floating_ips/$FLOATING_IP_ADDR`.", + "tags": [ + "Floating IPs" + ], + "parameters": [ + { + "$ref": "#/components/parameters/floating_ip" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/floating_ip" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/floating_ips/45.55.96.47\" " + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n floatingIP, _, err := client.FloatingIPs.Get(ctx, \"45.55.96.47\")\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.floating_ips.find(ip: '45.55.96.47')" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "delete": { + "operationId": "floatingIPs_delete", + "summary": "Delete a Floating IP", + "description": "To delete a floating IP and remove it from your account, send a DELETE request\nto `/v2/floating_ips/$FLOATING_IP_ADDR`.\n\nA successful request will receive a 204 status code with no body in response.\nThis indicates that the request was processed successfully.\n", + "tags": [ + "Floating IPs" + ], + "parameters": [ + { + "$ref": "#/components/parameters/floating_ip" + } + ], + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/floating_ips/45.55.96.47\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n _, err := client.FloatingIPs.Delete(ctx, \"45.55.96.34\")\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.floating_ips.delete(ip: '45.55.96.47') " + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/floating_ips/{floating_ip}/actions": { + "get": { + "operationId": "floatingIPsAction_list", + "summary": "List All Actions for a Floating IP", + "description": "To retrieve all actions that have been executed on a floating IP, send a GET request to `/v2/floating_ips/$FLOATING_IP/actions`.", + "tags": [ + "Floating IP Actions" + ], + "parameters": [ + { + "$ref": "#/components/parameters/floating_ip" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/floating_ip_actions" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/floating_ips/45.55.96.47/actions?page=1&per_page=1\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n opt := &godo.ListOptions{\n Page: 1,\n PerPage: 200,\n }\n\n actions, _, err := client.FloatingIPActions.List(ctx, '45.55.96.47', opt)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nactions = client.floating_ip_actions.all(ip: '45.55.96.47')\nactions.each" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "post": { + "operationId": "floatingIPsAction_post", + "summary": "Initiate a Floating IP Action", + "description": "To initiate an action on a floating IP send a POST request to\n`/v2/floating_ips/$FLOATING_IP/actions`. In the JSON body to the request,\nset the `type` attribute to on of the supported action types:\n\n| Action | Details\n|------------|--------\n| `assign` | Assigns a floating IP to a Droplet\n| `unassign` | Unassign a floating IP from a Droplet\n", + "tags": [ + "Floating IP Actions" + ], + "parameters": [ + { + "$ref": "#/components/parameters/floating_ip" + } + ], + "requestBody": { + "description": "The `type` attribute set in the request body will specify the action that\nwill be taken on the floating IP.\n", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/floating_ip_action_unassign" + }, + { + "$ref": "#/components/schemas/floating_ip_action_assign" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "unassign": "#/components/schemas/floating_ip_action_unassign", + "assign": "#/components/schemas/floating_ip_action_assign" + } + } + } + } + } + }, + "responses": { + "201": { + "$ref": "#/components/responses/floating_ip_action" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "# Assign a Floating IP to a Droplet\ncurl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"type\":\"assign\",\"droplet_id\":8219222}' \\\n \"https://api.digitalocean.com/v2/floating_ips/45.55.96.47/actions\"\n\n# Unassign a Floating IP\n# curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"type\":\"unassign\"}' \\\n \"https://api.digitalocean.com/v2/floating_ips/45.55.96.47/actions\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n // Assign a Floating IP to a Droplet\n action, _, err := client.FloatingIPActions.Assign(ctx, \"45.55.96.47\", 8219222)\n\n // Unassign a Floating IP\n // action, _, err := client.FloatingIPActions.Unassign(ctx, \"45.55.96.47\") \n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\n# Assign a Floating IP to a Droplet\nclient.floating_ip_actions.assign(ip: '45.55.96.47', droplet_id: 8219222)\n\n# Unassign a Floating IP\n# client.floating_ip_actions.unassign(ip: '45.55.96.47')" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/floating_ips/{floating_ip}/actions/{action_id}": { + "get": { + "operationId": "floatingIPsAction_get", + "summary": "Retrieve an Existing Floating IP Action", + "description": "To retrieve the status of a floating IP action, send a GET request to `/v2/floating_ips/$FLOATING_IP/actions/$ACTION_ID`.", + "tags": [ + "Floating IP Actions" + ], + "parameters": [ + { + "$ref": "#/components/parameters/floating_ip" + }, + { + "$ref": "#/components/parameters/action_id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/floating_ip_action" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/floating_ips/45.55.96.47/actions/72531856\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n action, _, err := client.FloatingIPActions.Get(ctx, \"45.55.96.47\", 72531856)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.floating_ip_actions.find(ip: '45.55.96.47', id: 72531856)" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/functions/namespaces": { + "get": { + "operationId": "functions_list_namespaces", + "summary": "List Namespaces", + "description": "Returns a list of namespaces associated with the current user. To get all namespaces, send a GET request to `/v2/functions/namespaces`.", + "tags": [ + "Functions" + ], + "responses": { + "200": { + "$ref": "#/components/responses/list_namespaces" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/functions/namespaces\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.functions.list_namespaces()" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "post": { + "operationId": "functions_create_namespace", + "summary": "Create Namespace", + "description": "Creates a new serverless functions namespace in the desired region and associates it with the provided label. A namespace is a collection of functions and their associated packages, triggers, and project specifications. To create a namespace, send a POST request to `/v2/functions/namespaces` with the `region` and `label` properties.", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/create_namespace" + } + } + } + }, + "tags": [ + "Functions" + ], + "responses": { + "200": { + "$ref": "#/components/responses/namespace_created" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/namespace_bad_request" + }, + "422": { + "$ref": "#/components/responses/namespace_limit_reached" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"region\": \"nyc1\", \"label\": \"my namespace label\"}' \\\n \"https://api.digitalocean.com/v2/functions/namespaces\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"region\": \"nyc1\",\n \"label\": \"my namespace\"\n}\n\nresp = client.functions.create_namespace(body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/functions/namespaces/{namespace_id}": { + "get": { + "operationId": "functions_get_namespace", + "summary": "Get Namespace", + "description": "Gets the namespace details for the given namespace UUID. To get namespace details, send a GET request to `/v2/functions/namespaces/$NAMESPACE_ID` with no parameters.", + "tags": [ + "Functions" + ], + "parameters": [ + { + "$ref": "#/components/parameters/namespace_id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/namespace_created" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "403": { + "$ref": "#/components/responses/namespace_not_allowed" + }, + "404": { + "$ref": "#/components/responses/namespace_not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/functions/namespaces/{{namespace_id}}\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.functions.get_namespace(namespace_id=\"aff93af3\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "delete": { + "operationId": "functions_delete_namespace", + "summary": "Delete Namespace", + "description": "Deletes the given namespace. When a namespace is deleted all assets, in the namespace are deleted, this includes packages, functions and triggers. Deleting a namespace is a destructive operation and assets in the namespace are not recoverable after deletion. Some metadata is retained, such as activations, or soft deleted for reporting purposes.\nTo delete namespace, send a DELETE request to `/v2/functions/namespaces/$NAMESPACE_ID`.\nA successful deletion returns a 204 response.", + "tags": [ + "Functions" + ], + "parameters": [ + { + "$ref": "#/components/parameters/namespace_id" + } + ], + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/namespace_not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/functions/namespaces/{{namespace_id}}\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.functions.delete_namespace(namespace_id=\"aff93af3\")" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/functions/namespaces/{namespace_id}/triggers": { + "get": { + "operationId": "functions_list_triggers", + "summary": "List Triggers", + "description": "Returns a list of triggers associated with the current user and namespace. To get all triggers, send a GET request to `/v2/functions/namespaces/$NAMESPACE_ID/triggers`.", + "parameters": [ + { + "$ref": "#/components/parameters/namespace_id" + } + ], + "tags": [ + "Functions" + ], + "responses": { + "200": { + "$ref": "#/components/responses/list_triggers" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/namespace_not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/functions/namespaces/{{namespace_id}}/triggers\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.functions.list_triggers(namespace_id=\"39f3ca\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "post": { + "operationId": "functions_create_trigger", + "summary": "Create Trigger", + "description": "Creates a new trigger for a given function in a namespace. To create a trigger, send a POST request to `/v2/functions/namespaces/$NAMESPACE_ID/triggers` with the `name`, `function`, `type`, `is_enabled` and `scheduled_details` properties.", + "parameters": [ + { + "$ref": "#/components/parameters/namespace_id" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/create_trigger" + } + } + } + }, + "tags": [ + "Functions" + ], + "responses": { + "200": { + "$ref": "#/components/responses/trigger_response" + }, + "400": { + "$ref": "#/components/responses/trigger_bad_request" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/namespace_not_found" + }, + "422": { + "$ref": "#/components/responses/trigger_limit_reached" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"name\": \"my trigger\", \"function\": \"hello\", \"type\": \"SCHEDULED\", \"is_enabled\": true, \"scheduled_details\": {\"cron\": \"* * * * *\", \"body\": {\"name\": \"Welcome to DO!\"}}}' \\\n \"https://api.digitalocean.com/v2/functions/namespaces/{{namespace_id}}/triggers\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"name\": \"my trigger\",\n \"function\": \"hello\",\n \"type\": \"SCHEDULED\",\n \"is_enabled\": True,\n \"scheduled_details\": {\n \"cron\": \"* * * * *\",\n \"body\": {\n \"name\": \"Welcome to DO!\"\n }\n}\n}\n\nresp = client.functions.create_trigger(namespace_id=\"aff93af3\", body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/functions/namespaces/{namespace_id}/triggers/{trigger_name}": { + "get": { + "operationId": "functions_get_trigger", + "summary": "Get Trigger", + "description": "Gets the trigger details. To get the trigger details, send a GET request to `/v2/functions/namespaces/$NAMESPACE_ID/triggers/$TRIGGER_NAME`.", + "parameters": [ + { + "$ref": "#/components/parameters/namespace_id" + }, + { + "$ref": "#/components/parameters/trigger_name" + } + ], + "tags": [ + "Functions" + ], + "responses": { + "200": { + "$ref": "#/components/responses/trigger_response" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/trigger_not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/functions/namespaces/{{namespace_id}}/triggers/{{trigger_name}}\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.functions.get_trigger(namespace_id=\"aff93af3\", trigger_name=\"trig_name\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "put": { + "operationId": "functions_update_trigger", + "summary": "Update Trigger", + "description": "Updates the details of the given trigger. To update a trigger, send a PUT request to `/v2/functions/namespaces/$NAMESPACE_ID/triggers/$TRIGGER_NAME` with new values for the `is_enabled ` or `scheduled_details` properties.", + "parameters": [ + { + "$ref": "#/components/parameters/namespace_id" + }, + { + "$ref": "#/components/parameters/trigger_name" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/update_trigger" + } + } + } + }, + "tags": [ + "Functions" + ], + "responses": { + "200": { + "$ref": "#/components/responses/trigger_response" + }, + "400": { + "$ref": "#/components/responses/trigger_bad_request" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/trigger_not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X PUT \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"is_enabled\": true, \"scheduled_details\": {\"cron\": \"* * * * *\", \"body\": {\"name\": \"Welcome to DO!\"}}}' \\\n \"https://api.digitalocean.com/v2/functions/namespaces/{{namespace_id}}/triggers/{{trigger_name}}\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"is_enabled\": true,\n \"scheduled_details\": {\n \"cron\": \"* * * * *\",\n \"body\": {\n \"name\": \"Welcome to DO!\"\n }\n }\n}\n\nresp = client.functions.update_trigger(namespace_id=\"39f3ca\", trigger_name=\"trig_name\", body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + }, + "delete": { + "operationId": "functions_delete_trigger", + "summary": "Delete Trigger", + "description": "Deletes the given trigger.\nTo delete trigger, send a DELETE request to `/v2/functions/namespaces/$NAMESPACE_ID/triggers/$TRIGGER_NAME`.\nA successful deletion returns a 204 response.", + "tags": [ + "Functions" + ], + "parameters": [ + { + "$ref": "#/components/parameters/namespace_id" + }, + { + "$ref": "#/components/parameters/trigger_name" + } + ], + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/trigger_not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/functions/namespaces/{{namespace_id}}/triggers/{{trigger_name}}\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.functions.delete_trigger(namespace_id=\"aff93af3\", trigger_name=\"trig_name\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/images": { + "get": { + "operationId": "images_list", + "summary": "List All Images", + "description": "To list all of the images available on your account, send a GET request to /v2/images.\n\n## Filtering Results\n-----\n\nIt's possible to request filtered results by including certain query parameters.\n\n**Image Type**\n\nEither 1-Click Application or OS Distribution images can be filtered by using the `type` query parameter.\n\n> Important: The `type` query parameter does not directly relate to the `type` attribute.\n\nTo retrieve only ***distribution*** images, include the `type` query parameter set to distribution, `/v2/images?type=distribution`.\n\nTo retrieve only ***application*** images, include the `type` query parameter set to application, `/v2/images?type=application`.\n\n**User Images**\n\nTo retrieve only the private images of a user, include the `private` query parameter set to true, `/v2/images?private=true`.\n\n**Tags**\n\nTo list all images assigned to a specific tag, include the `tag_name` query parameter set to the name of the tag in your GET request. For example, `/v2/images?tag_name=$TAG_NAME`.\n", + "tags": [ + "Images" + ], + "parameters": [ + { + "$ref": "#/components/parameters/type" + }, + { + "$ref": "#/components/parameters/private" + }, + { + "$ref": "#/components/parameters/tag" + }, + { + "$ref": "#/components/parameters/per_page" + }, + { + "$ref": "#/components/parameters/page" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/all_images" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/images?page=1&per_page=1\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n opt := &godo.ListOptions{\n Page: 1,\n PerPage: 200,\n }\n\n // List all images\n images, _, err := client.Images.List(ctx, opt)\n\n // List all application images\n opt := &godo.ListOptions{\n Page: 1,\n PerPage: 200,\n }\n\n images, _, err := client.Images.ListApplication(ctx, opt) \n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\n# List all images\nimages = client.images.all\nimages.each\n\n# List all application images\nimages = client.images.all(type: 'application')\nimages.each" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.images.list()" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "post": { + "operationId": "images_create_custom", + "summary": "Create a Custom Image", + "description": "To create a new custom image, send a POST request to /v2/images.\nThe body must contain a url attribute pointing to a Linux virtual machine\nimage to be imported into DigitalOcean.\nThe image must be in the raw, qcow2, vhdx, vdi, or vmdk format.\nIt may be compressed using gzip or bzip2 and must be smaller than 100 GB after\n being decompressed.\n", + "tags": [ + "Images" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/image_new_custom" + } + } + } + }, + "responses": { + "202": { + "$ref": "#/components/responses/new_custom_image" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"name\": \"ubuntu-18.04-minimal\", \"url\": \"http://cloud-images.ubuntu.com/minimal/releases/bionic/release/ubuntu-18.04-minimal-cloudimg-amd64.img\", \"distribution\": \"Ubuntu\", \"region\": \"nyc3\", \"description\": \"Cloud-optimized image w/ small footprint\", \"tags\":[\"base-image\", \"prod\"]}' \\\n \"https://api.digitalocean.com/v2/images\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"name\": \"ubuntu-18.04-minimal\",\n \"url\": \"http://cloud-images.ubuntu.com/minimal/releases/bionic/release/ubuntu-18.04-minimal-cloudimg-amd64.img\",\n \"distribution\": \"Ubuntu\",\n \"region\": \"nyc3\",\n \"description\": \"Cloud-optimized image w/ small footprint\",\n \"tags\": [\n \"base-image\",\n \"prod\"\n ]\n}\n\nresp = client.images.create_custom(body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/images/{image_id}": { + "get": { + "operationId": "images_get", + "summary": "Retrieve an Existing Image", + "description": "To retrieve information about an image, send a `GET` request to\n`/v2/images/$IDENTIFIER`.\n", + "tags": [ + "Images" + ], + "parameters": [ + { + "in": "path", + "name": "image_id", + "description": "A unique number (id) or string (slug) used to identify and reference a\nspecific image.\n\n**Public** images can be identified by image `id` or `slug`.\n\n**Private** images *must* be identified by image `id`.\n", + "required": true, + "schema": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "string" + } + ] + }, + "examples": { + "byId": { + "summary": "Retrieve a public or private image by id", + "value": 62137902 + }, + "bySlug": { + "summary": "Retrieve a public image by slug", + "value": "ubuntu-16-04-x64" + } + } + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/existing_image" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "# Get existing image by ID\ncurl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/images/7555620\"\n\n# Get existing image by slug\ncurl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/images/ubuntu-16-04-x64\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n // Get existing image by ID\n image, _, err := client.Images.GetByID(ctx, 7555620)\n\n // Get existing image by slug\n // image, _, err := client.Images.GetBySlug(ctx, \"ubuntu-16-04-x64\") \n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\n# Retrieve image by ID\nclient.images.find(id: '7555620')\n\n# Retrieve image by slug\nclient.images.find(id: 'ubuntu-16-04-x64')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.images.get(image_id=134215)" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "put": { + "operationId": "images_update", + "summary": "Update an Image", + "description": "To update an image, send a `PUT` request to `/v2/images/$IMAGE_ID`.\nSet the `name` attribute to the new value you would like to use.\nFor custom images, the `description` and `distribution` attributes may also be updated.\n", + "tags": [ + "Images" + ], + "parameters": [ + { + "$ref": "#/components/parameters/image_id" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/image_update" + } + } + } + }, + "responses": { + "200": { + "$ref": "#/components/responses/updated_image" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X PUT \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"name\":\"new-image-name\"}' \\\n \"https://api.digitalocean.com/v2/images/7938391\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n updateRequest := &godo.ImageUpdateRequest{\n Name: \"new-image-name\",\n }\n\n image, _, err := client.Images.Update(ctx, id, updateRequest)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nimage = DropletKit::Image.new(name: 'new-image-name')\nclient.images.update(image, id: 7938391)" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"name\": \"Nifty New Snapshot\",\n \"distribution\": \"Ubuntu\",\n \"description\": \" \"\n}\n\nresp = client.images.update(image_id=234532, body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + }, + "delete": { + "operationId": "images_delete", + "summary": "Delete an Image", + "description": "To delete a snapshot or custom image, send a `DELETE` request to `/v2/images/$IMAGE_ID`.\n", + "tags": [ + "Images" + ], + "parameters": [ + { + "$ref": "#/components/parameters/image_id" + } + ], + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/images/7938391\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n _, err := client.Images.Delete(ctx, 7938391)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.images.delete(id: 7938391)" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.images.delete(image_id=134215)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/images/{image_id}/actions": { + "get": { + "operationId": "imageActions_list", + "summary": "List All Actions for an Image", + "description": "To retrieve all actions that have been executed on an image, send a GET request to `/v2/images/$IMAGE_ID/actions`.", + "tags": [ + "Image Actions" + ], + "parameters": [ + { + "$ref": "#/components/parameters/image_id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/get_image_actions_response" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/images/7555620/actions?page=1&per_page=1\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n \n}" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.image_actions.list()" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "post": { + "operationId": "imageActions_post", + "summary": "Initiate an Image Action", + "description": "The following actions are available on an Image.\n\n## Convert an Image to a Snapshot\n\nTo convert an image, for example, a backup to a snapshot, send a POST request\nto `/v2/images/$IMAGE_ID/actions`. Set the `type` attribute to `convert`.\n\n## Transfer an Image\n\nTo transfer an image to another region, send a POST request to\n`/v2/images/$IMAGE_ID/actions`. Set the `type` attribute to `transfer` and set\n`region` attribute to the slug identifier of the region you wish to transfer\nto.\n", + "tags": [ + "Image Actions" + ], + "parameters": [ + { + "$ref": "#/components/parameters/image_id" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/image_action_base" + }, + { + "$ref": "#/components/schemas/image_action_transfer" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "convert": "#/components/schemas/image_action_base", + "transfer": "#/components/schemas/image_action_transfer" + } + } + } + } + } + }, + "responses": { + "201": { + "$ref": "#/components/responses/post_image_action_response" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "# Transfer an Existing Image\ncurl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"type\":\"transfer\",\"region\":\"nyc2\"}' \\\n \"https://api.digitalocean.com/v2/images/7938269/actions\"\n\n# Convert an Image into a Snapshot\ncurl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"type\":\"convert\"}' \\\n \"https://api.digitalocean.com/v2/images/7938291/actions\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n // Transfer an existing image\n transferRequest := &godo.ActionRequest{\n \"type\": \"transfer\",\n \"region\": \"nyc2\",\n }\n # Transfer an Image\n transfer, _, err := client.ImageActions.Transfer(ctx, 7938269, transferRequest)\n\n # Convert an Image to a Snapshot\n # client.image_actions.convert(image_id: 7938269)\n\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\n# Transfer an Image\nclient.image_actions.transfer(image_id: 7938269, region: 'nyc2')\n\n# Convert an Image to a Snapshot\n# client.image_actions.convert(image_id: 7938269)" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"type\": \"convert\"\n}\nresp = client.image_actions.post(image_id=342341, body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/images/{image_id}/actions/{action_id}": { + "get": { + "operationId": "imageActions_get", + "summary": "Retrieve an Existing Action", + "description": "To retrieve the status of an image action, send a GET request to `/v2/images/$IMAGE_ID/actions/$IMAGE_ACTION_ID`.", + "tags": [ + "Image Actions" + ], + "parameters": [ + { + "$ref": "#/components/parameters/image_id" + }, + { + "$ref": "#/components/parameters/action_id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/get_image_action_response" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/images/7938269/actions/36805527\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n action, _, err := client.ImageActions.Get(ctx, 7938269, 36805527)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.image_actions.find(image_id: 7938269, id: 36805527)" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.image_actions.get(image_id=\"fd9391a\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/kubernetes/clusters": { + "get": { + "operationId": "kubernetes_list_clusters", + "summary": "List All Kubernetes Clusters", + "description": "To list all of the Kubernetes clusters on your account, send a GET request\nto `/v2/kubernetes/clusters`.\n", + "tags": [ + "Kubernetes" + ], + "parameters": [ + { + "$ref": "#/components/parameters/per_page" + }, + { + "$ref": "#/components/parameters/page" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/all_clusters" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/kubernetes/clusters\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n opt := &godo.ListOptions{\n Page: 1,\n PerPage: 200,\n }\n\n clusters, _, err := client.Kubernetes.List(ctx, opt)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclusters = client.kubernetes_clusters.all\nclusters.each" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.kubernetes.list_clusters()" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "post": { + "operationId": "kubernetes_create_cluster", + "summary": "Create a New Kubernetes Cluster", + "description": "To create a new Kubernetes cluster, send a POST request to\n`/v2/kubernetes/clusters`. The request must contain at least one node pool\nwith at least one worker.\n\nThe request may contain a maintenance window policy describing a time period\nwhen disruptive maintenance tasks may be carried out. Omitting the policy\nimplies that a window will be chosen automatically. See\n[here](https://www.digitalocean.com/docs/kubernetes/how-to/upgrade-cluster/)\nfor details.\n", + "tags": [ + "Kubernetes" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cluster" + }, + "examples": { + "Kubernetes Cluster Request": { + "$ref": "#/components/examples/kubernetes_clusters_basic_request" + }, + "Kubernetes Cluster with Multiple Node Pools Request": { + "$ref": "#/components/examples/kubernetes_clusters_multi_pool_request" + } + } + } + } + }, + "responses": { + "201": { + "$ref": "#/components/responses/cluster_create" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"name\": \"prod-cluster-01\",\"region\": \"nyc1\",\"version\": \"1.14.1\\\n -do.4\",\"tags\": [\"production\",\"web-team\"],\"node_pools\": [{\"size\": \"s-1vcpu-2gb\",\"count\": 3,\"name\": \"frontend-pool\",\"tags\": [\"frontend\"],\"labels\": {\"service\": \"frontend\", \"priority\": \"high\"}},{\"size\": \"c-4\",\"count\": 2,\"name\": \"backend-pool\"}]}' \\\n \"https://api.digitalocean.com/v2/kubernetes/clusters\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n createRequest := &godo.KubernetesClusterCreateRequest{\n Name: \"prod-cluster-01\",\n RegionSlug: \"nyc1\",\n VersionSlug: \"1.14.1-do.4\",\n Tags: []string{\"production\", \"web-team\"},\n NodePools: []*godo.KubernetesNodePoolCreateRequest{\n &godo.KubernetesNodePoolCreateRequest{\n Name: \"frontend-pool\",\n Size: \"s-2vcpu-2gb\",\n Count: 3,\n Tags: []string{\"frontend\"},\n Labels: map[string]string{\"service\": \"frontend\", \"priority\": \"high\"},\n },\n &godo.KubernetesNodePoolCreateRequest{\n Name: \"backend-pool\",\n Size: \"c-4\",\n Count: 2,\n },\n },\n }\n\n cluster, _, err := client.Kubernetes.Create(ctx, createRequest)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\ncluster = DropletKit::KubernetesCluster.new(\n name: 'prod-cluster-01',\n region: 'nyc1',\n version: '1.14.1-do.4',\n tags: ['production', 'web-team'],\n node_pools: [\n {\n name: 'frontend-pool',\n size: 's-2vcpu-2gb',\n count: 3,\n tags: ['frontend'],\n labels: {service: 'frontend', priority: 'high'}\n },\n {\n name: 'backend-pool',\n size: 'c-4',\n count: 2\n }\n ]\n)\n\nclient.kubernetes_clusters.create(cluster)" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"name\": \"prod-cluster-01\",\n \"region\": \"nyc1\",\n \"version\": \"1.18.6-do.0\",\n \"node_pools\": [\n {\n \"size\": \"s-1vcpu-2gb\",\n \"count\": 3,\n \"name\": \"worker-pool\"\n }\n ]\n}\n\nresp = client.kubernetes.create_cluster(body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/kubernetes/clusters/{cluster_id}": { + "get": { + "operationId": "kubernetes_get_cluster", + "summary": "Retrieve an Existing Kubernetes Cluster", + "description": "To show information about an existing Kubernetes cluster, send a GET request\nto `/v2/kubernetes/clusters/$K8S_CLUSTER_ID`.\n", + "tags": [ + "Kubernetes" + ], + "parameters": [ + { + "$ref": "#/components/parameters/kubernetes_cluster_id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/existing_cluster" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/kubernetes/clusters/bd5f5959-5e1e-4205-a714-a914373942af\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n cluster, _, err := client.Kubernetes.Get(ctx, \"bd5f5959-5e1e-4205-a714-a914373942af\")\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.kubernetes_clusters.find(id: 'bd5f5959-5e1e-4205-a714-a914373942af')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.kubernetes.get_cluster(cluster_id=\"da8fda8\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "put": { + "operationId": "kubernetes_update_cluster", + "summary": "Update a Kubernetes Cluster", + "description": "To update a Kubernetes cluster, send a PUT request to\n`/v2/kubernetes/clusters/$K8S_CLUSTER_ID` and specify one or more of the\nattributes below.\n", + "tags": [ + "Kubernetes" + ], + "parameters": [ + { + "$ref": "#/components/parameters/kubernetes_cluster_id" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cluster_update" + } + } + } + }, + "responses": { + "202": { + "$ref": "#/components/responses/updated_cluster" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X PUT \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"name\": \"stage-cluster-01\", \"tags\":[\"staging\", \"web-team\"]}' \\\n \"https://api.digitalocean.com/v2/kubernetes/clusters/bd5f5959-5e1e-4205-a714-a914373942af\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n updateRequest := &godo.KubernetesClusterUpdateRequest{\n Name: \"stage-cluster-01\",\n Tags: []string{\"staging\", \"web-team\"},\n }\n\n cluster, _, err := client.Kubernetes.Update(ctx, \"bd5f5959-5e1e-4205-a714-a914373942af\", updateRequest)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\ncluster = DropletKit::KubernetesCluster.new(\n name: 'foo',\n tags: ['staging', 'web-team']\n)\n\nclient.kubernetes_clusters.update(cluster, id: 'bd5f5959-5e1e-4205-a714-a914373942af')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"name\": \"prod-cluster-01\",\n \"tags\": [\n \"k8s\",\n \"k8s:bd5f5959-5e1e-4205-a714-a914373942af\",\n \"production\",\n \"web-team\"\n ],\n \"maintenance_policy\": {\n \"start_time\": \"12:00\",\n \"day\": \"any\"\n },\n \"auto_upgrade\": True,\n \"surge_upgrade\": True,\n \"ha\": True\n}\n\nresp = client.kubernetes.update_cluster(cluster_id=\"1fd32a\", body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + }, + "delete": { + "operationId": "kubernetes_delete_cluster", + "summary": "Delete a Kubernetes Cluster", + "description": "To delete a Kubernetes cluster and all services deployed to it, send a DELETE\nrequest to `/v2/kubernetes/clusters/$K8S_CLUSTER_ID`.\n\nA 204 status code with no body will be returned in response to a successful\nrequest.\n", + "tags": [ + "Kubernetes" + ], + "parameters": [ + { + "$ref": "#/components/parameters/kubernetes_cluster_id" + } + ], + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/kubernetes/clusters/bd5f5959-5e1e-4205-a714-a914373942af\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n _, err := client.Kubernetes.Delete(ctx, \"bd5f5959-5e1e-4205-a714-a914373942af\")\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.kubernetes_clusters.delete(id: 'bd5f5959-5e1e-4205-a714-a914373942af')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.kubernetes.delete_cluster(cluster_id=\"da8fda8\")" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/kubernetes/clusters/{cluster_id}/destroy_with_associated_resources": { + "get": { + "operationId": "kubernetes_list_associatedResources", + "summary": "List Associated Resources for Cluster Deletion", + "description": "To list the associated billable resources that can be destroyed along with a cluster, send a GET request to the `/v2/kubernetes/clusters/$K8S_CLUSTER_ID/destroy_with_associated_resources` endpoint.", + "tags": [ + "Kubernetes" + ], + "parameters": [ + { + "$ref": "#/components/parameters/kubernetes_cluster_id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/associated_kubernetes_resources_list" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/kubernetes/clusters/bd5f5959-5e1e-4205-a714-a914373942af/destroy_with_associated_resources\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n _, err := client.Kubernetes.ListAssociatedResourcesForDeletion(ctx, \"bd5f5959-5e1e-4205-a714-a914373942af\")\n\n}" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.kubernetes.list_associated_resources(cluster_id=\"da8fda8\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/kubernetes/clusters/{cluster_id}/destroy_with_associated_resources/selective": { + "delete": { + "operationId": "kubernetes_destroy_associatedResourcesSelective", + "summary": "Selectively Delete a Cluster and its Associated Resources", + "description": "To delete a Kubernetes cluster along with a subset of its associated resources,\nsend a DELETE request to `/v2/kubernetes/clusters/$K8S_CLUSTER_ID/destroy_with_associated_resources/selective`.\n\nThe JSON body of the request should include `load_balancers`, `volumes`, or\n`volume_snapshots` keys each set to an array of IDs for the associated\nresources to be destroyed.\n\nThe IDs can be found by querying the cluster's associated resources endpoint.\nAny associated resource not included in the request will remain and continue\nto accrue changes on your account.\n", + "tags": [ + "Kubernetes" + ], + "parameters": [ + { + "$ref": "#/components/parameters/kubernetes_cluster_id" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/destroy_associated_kubernetes_resources" + } + } + } + }, + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"load_balancers\": [\"4de7ac8b-495b-4884-9a69-1050c6793cd6\"],\"volumes\": [\"ba49449a-7435-11ea-b89e-0a58ac14480f\"],\"volume_snapshots\": [\"edb0478d-7436-11ea-86e6-0a58ac144b91\"]}' \\\n \"https://api.digitalocean.com/v2/kubernetes/clusters/bd5f5959-5e1e-4205-a714-a914373942af/destroy_with_associated_resources/selective\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n deleteReq := &godo.KubernetesClusterDeleteSelectiveRequest{Volumes: []string{\"ba49449a-7435-11ea-b89e-0a58ac14480f\"}}, _, err := client.Kubernetes.DeleteSelective(ctx, \"bd5f5959-5e1e-4205-a714-a914373942af\", deleteReq)\n}" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"load_balancers\": [\n \"4de7ac8b-495b-4884-9a69-1050c6793cd6\"\n ],\n \"volumes\": [\n \"ba49449a-7435-11ea-b89e-0a58ac14480f\"\n ],\n \"volume_snapshots\": [\n \"edb0478d-7436-11ea-86e6-0a58ac144b91\"\n ]\n}\n\nresp = client.kubernetes.destroy_associated_resources_selective(cluster_id=\"da8fda8\", body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/kubernetes/clusters/{cluster_id}/destroy_with_associated_resources/dangerous": { + "delete": { + "operationId": "kubernetes_destroy_associatedResourcesDangerous", + "summary": "Delete a Cluster and All of its Associated Resources (Dangerous)", + "description": "To delete a Kubernetes cluster with all of its associated resources, send a\nDELETE request to `/v2/kubernetes/clusters/$K8S_CLUSTER_ID/destroy_with_associated_resources/dangerous`.\nA 204 status code with no body will be returned in response to a successful request.\n", + "tags": [ + "Kubernetes" + ], + "parameters": [ + { + "$ref": "#/components/parameters/kubernetes_cluster_id" + } + ], + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/kubernetes/clusters/bd5f5959-5e1e-4205-a714-a914373942af/destroy_with_associated_resources/dangerous\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n _, err := client.Kubernetes.DeleteDangerous(ctx, \"bd5f5959-5e1e-4205-a714-a914373942af\")\n}" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.kubernetes.destroy_associated_resources_dangerous(cluster_id=\"da8fda8\")" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/kubernetes/clusters/{cluster_id}/kubeconfig": { + "get": { + "operationId": "kubernetes_get_kubeconfig", + "summary": "Retrieve the kubeconfig for a Kubernetes Cluster", + "description": "This endpoint returns a kubeconfig file in YAML format. It can be used to\nconnect to and administer the cluster using the Kubernetes command line tool,\n`kubectl`, or other programs supporting kubeconfig files (e.g., client libraries).\n\nThe resulting kubeconfig file uses token-based authentication for clusters\nsupporting it, and certificate-based authentication otherwise. For a list of\nsupported versions and more information, see \"[How to Connect to a DigitalOcean\nKubernetes Cluster with kubectl](https://www.digitalocean.com/docs/kubernetes/how-to/connect-with-kubectl/)\".\n\nTo retrieve a kubeconfig file for use with a Kubernetes cluster, send a GET\nrequest to `/v2/kubernetes/clusters/$K8S_CLUSTER_ID/kubeconfig`.\n\nClusters supporting token-based authentication may define an expiration by\npassing a duration in seconds as a query parameter to\n`/v2/kubernetes/clusters/$K8S_CLUSTER_ID/kubeconfig?expiry_seconds=$DURATION_IN_SECONDS`.\nIf not set or 0, then the token will have a 7 day expiry. The query parameter\nhas no impact in certificate-based authentication.\n", + "tags": [ + "Kubernetes" + ], + "parameters": [ + { + "$ref": "#/components/parameters/kubernetes_cluster_id" + }, + { + "$ref": "#/components/parameters/kubernetes_expiry_seconds" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/kubeconfig" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/kubernetes/clusters/bd5f5959-5e1e-4205-a714-a914373942af/kubeconfig\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n config, _, err := client.Kubernetes.GetKubeConfig(ctx, \"bd5f5959-5e1e-4205-a714-a914373942af\")\n\n kubeConfigFile := string(config.KubeconfigYAML)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.kubernetes_clusters.kubeconfig(id: 'bd5f5959-5e1e-4205-a714-a914373942af')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.kubernetes.get_kubeconfig(cluster_id=\"da8fda8\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/kubernetes/clusters/{cluster_id}/credentials": { + "get": { + "operationId": "kubernetes_get_credentials", + "summary": "Retrieve Credentials for a Kubernetes Cluster", + "description": "This endpoint returns a JSON object . It can be used to programmatically\nconstruct Kubernetes clients which cannot parse kubeconfig files.\n\nThe resulting JSON object contains token-based authentication for clusters\nsupporting it, and certificate-based authentication otherwise. For a list of\nsupported versions and more information, see \"[How to Connect to a DigitalOcean\nKubernetes Cluster with kubectl](https://www.digitalocean.com/docs/kubernetes/how-to/connect-with-kubectl/)\".\n\nTo retrieve credentials for accessing a Kubernetes cluster, send a GET\nrequest to `/v2/kubernetes/clusters/$K8S_CLUSTER_ID/credentials`.\n\nClusters supporting token-based authentication may define an expiration by\npassing a duration in seconds as a query parameter to\n`/v2/kubernetes/clusters/$K8S_CLUSTER_ID/credentials?expiry_seconds=$DURATION_IN_SECONDS`.\nIf not set or 0, then the token will have a 7 day expiry. The query parameter\nhas no impact in certificate-based authentication.\n", + "tags": [ + "Kubernetes" + ], + "parameters": [ + { + "$ref": "#/components/parameters/kubernetes_cluster_id" + }, + { + "$ref": "#/components/parameters/kubernetes_expiry_seconds" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/credentials" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/kubernetes/clusters/bd5f5959-5e1e-4205-a714-a914373942af/credentials\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n credentials, _, err := client.Kubernetes.GetCredentials(ctx, \"bd5f5959-5e1e-4205-a714-a914373942af\")\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.kubernetes_clusters.credentials(id: 'bd5f5959-5e1e-4205-a714-a914373942af')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.kubernetes.get_credentials(cluster_id=\"da8fda8\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/kubernetes/clusters/{cluster_id}/upgrades": { + "get": { + "operationId": "kubernetes_get_availableUpgrades", + "summary": "Retrieve Available Upgrades for an Existing Kubernetes Cluster", + "description": "To determine whether a cluster can be upgraded, and the versions to which it\ncan be upgraded, send a GET request to\n`/v2/kubernetes/clusters/$K8S_CLUSTER_ID/upgrades`.\n", + "tags": [ + "Kubernetes" + ], + "parameters": [ + { + "$ref": "#/components/parameters/kubernetes_cluster_id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/available_upgrades" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/kubernetes/clusters/bd5f5959-5e1e-4205-a714-a914373942af/upgrades\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n upgrades, _, err := client.Kubernetes.GetUpgrades(ctx, \"bd5f5959-5e1e-4205-a714-a914373942af\")\n}" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.kubernetes.get_available_upgrades(cluster_id=\"da8fda8\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/kubernetes/clusters/{cluster_id}/upgrade": { + "post": { + "operationId": "kubernetes_upgrade_cluster", + "summary": "Upgrade a Kubernetes Cluster", + "description": "To immediately upgrade a Kubernetes cluster to a newer patch release of\nKubernetes, send a POST request to `/v2/kubernetes/clusters/$K8S_CLUSTER_ID/upgrade`.\nThe body of the request must specify a version attribute.\n\nAvailable upgrade versions for a cluster can be fetched from\n`/v2/kubernetes/clusters/$K8S_CLUSTER_ID/upgrades`.\n", + "tags": [ + "Kubernetes" + ], + "parameters": [ + { + "$ref": "#/components/parameters/kubernetes_cluster_id" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "properties": { + "version": { + "type": "string", + "example": "1.16.13-do.0", + "description": "The slug identifier for the version of Kubernetes that the cluster will be upgraded to." + } + } + } + } + } + }, + "responses": { + "202": { + "$ref": "#/components/responses/accepted" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/kubernetes/clusters/bd5f5959-5e1e-4205-a714-a914373942af/upgrades\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n upgradeRequest := &godo.KubernetesClusterUpgradeRequest{\n \tVersionSlug: \"1.12.3-do.1\",\n }\n}" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"version\": \"1.16.13-do.0\"\n}\n\nresp = client.kubernetes.upgrade_cluster(cluster_id=\"1fd32a\", body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/kubernetes/clusters/{cluster_id}/node_pools": { + "get": { + "operationId": "kubernetes_list_nodePools", + "summary": "List All Node Pools in a Kubernetes Clusters", + "description": "To list all of the node pools in a Kubernetes clusters, send a GET request to\n`/v2/kubernetes/clusters/$K8S_CLUSTER_ID/node_pools`.\n", + "tags": [ + "Kubernetes" + ], + "parameters": [ + { + "$ref": "#/components/parameters/kubernetes_cluster_id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/all_node_pools" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/kubernetes/clusters/bd5f5959-5e1e-4205-a714-a914373942af/node_pools\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n opt := &godo.ListOptions{\n Page: 1,\n PerPage: 200,\n }\n\n nodePools, _, err := client.Kubernetes.ListNodePools(ctx, \"9b729d1c-730c-42e1-b136-59326fb1b3bb\", opt)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nnode_pools = client.kubernetes_clusters.node_pools(id: 'bd5f5959-5e1e-4205-a714-a914373942af')\nnode_pools.each" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.kubernetes.list_node_pools(cluster_id=\"a8fsa8d\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "post": { + "operationId": "kubernetes_add_nodePool", + "summary": "Add a Node Pool to a Kubernetes Cluster", + "description": "To add an additional node pool to a Kubernetes clusters, send a POST request\nto `/v2/kubernetes/clusters/$K8S_CLUSTER_ID/node_pools` with the following\nattributes.\n", + "tags": [ + "Kubernetes" + ], + "parameters": [ + { + "$ref": "#/components/parameters/kubernetes_cluster_id" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/kubernetes_node_pool" + }, + "example": { + "size": "s-1vcpu-2gb", + "count": 3, + "name": "new-pool", + "tags": [ + "frontend" + ], + "auto_scale": true, + "min_nodes": 3, + "max_nodes": 6 + } + } + } + }, + "responses": { + "201": { + "$ref": "#/components/responses/node_pool_create" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"size\": \"s-2vcpu-4gb\",\"count\": 1,\"name\": \"pool-02\",\"tags\": [\"web\"], \"labels\": {\"service\": \"web\", \"priority\": \"high\"}}' \\\n \"https://api.digitalocean.com/v2/kubernetes/clusters/bd5f5959-5e1e-4205-a714-a914373942af/node_pools\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n createRequest := &godo.KubernetesNodePoolCreateRequest{\n Name: \"pool-02\",\n Size: \"s-2vcpu-4gb\",\n Count: 1,\n Tags: []string{\"web\"},\n Labels: map[string]string{\"service\": \"web\", \"priority\": \"high\"},\n }\n\n nodePool, _, err := client.Kubernetes.CreateNodePool(ctx, \"bd5f5959-5e1e-4205-a714-a914373942af\", createRequest)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nnode_pool = DropletKit::KubernetesNodePool.new(\n name: 'pool-02',\n size: 's-2vcpu-4gb',\n count: 1,\n tags: ['web']\n labels: {service: 'web', priority: 'high'}\n)\n\nclient.kubernetes_clusters.create_node_pool(node_pool, id: 'bd5f5959-5e1e-4205-a714-a914373942af')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"size\": \"s-1vcpu-2gb\",\n \"count\": 3,\n \"name\": \"new-pool\",\n \"tags\": [\n \"frontend\"\n ],\n \"auto_scale\": True,\n \"min_nodes\": 3,\n \"max_nodes\": 6\n}\n\nresp = client.kubernetes.add_node_pool(cluster_id=\"ba9d8da\", body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/kubernetes/clusters/{cluster_id}/node_pools/{node_pool_id}": { + "get": { + "operationId": "kubernetes_get_nodePool", + "summary": "Retrieve a Node Pool for a Kubernetes Cluster", + "description": "To show information about a specific node pool in a Kubernetes cluster, send\na GET request to `/v2/kubernetes/clusters/$K8S_CLUSTER_ID/node_pools/$NODE_POOL_ID`.\n", + "tags": [ + "Kubernetes" + ], + "parameters": [ + { + "$ref": "#/components/parameters/kubernetes_cluster_id" + }, + { + "$ref": "#/components/parameters/kubernetes_node_pool_id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/existing_node_pool" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/kubernetes/clusters/bd5f5959-5e1e-4205-a714-a914373942af/credentials\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n nodePool, _, err := client.Kubernetes.GetNodePool(ctx, \"bd5f5959-5e1e-4205-a714-a914373942af\", \"cdda885e-7663-40c8-bc74-3a036c66545d\")\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.kubernetes_clusters.find_node_pool(id: 'bd5f5959-5e1e-4205-a714-a914373942af', pool_id: 'cdda885e-7663-40c8-bc74-3a036c66545d')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.kubernetes.get_node_pool(cluster_id=\"da8fda8\", node_pool_id=\"a8a8fsa\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "put": { + "operationId": "kubernetes_update_nodePool", + "summary": "Update a Node Pool in a Kubernetes Cluster", + "description": "To update the name of a node pool, edit the tags applied to it, or adjust its\nnumber of nodes, send a PUT request to\n`/v2/kubernetes/clusters/$K8S_CLUSTER_ID/node_pools/$NODE_POOL_ID` with the\nfollowing attributes.\n", + "tags": [ + "Kubernetes" + ], + "parameters": [ + { + "$ref": "#/components/parameters/kubernetes_cluster_id" + }, + { + "$ref": "#/components/parameters/kubernetes_node_pool_id" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/kubernetes_node_pool_update" + } + } + } + }, + "responses": { + "202": { + "$ref": "#/components/responses/node_pool_update" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X PUT \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"name\": \"frontend\",\"count\": 1, \"tags\":[\"frontend\"], \"labels\": {\"service\": \"frontend\", \"priority\": \"high\"}}' \\\n \"https://api.digitalocean.com/v2/kubernetes/clusters/bd5f5959-5e1e-4205-a714-a914373942af/node_pools/86c9bc8c-b2c3-4d40-8000-b0c7bee27305\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n updateRequest := &godo.KubernetesNodePoolUpdateRequest{\n Name: \"frontend\",\n Count: 1,\n Tags: []string{\"frontend\"},\n Labels: map[string]string{\"service\": \"frontend\", \"priority\": \"high\"},\n }\n\n nodePool, _, err := client.Kubernetes.UpdateNodePool(ctx, \"9b729d1c-730c-42e1-b136-59326fb1b3bb\", \"e7ed8f7c-6c1e-472f-adfb-4a9a1688b999\", updateRequest)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nnode_pool = DropletKit::KubernetesNodePool.new(\n name: 'frontend',\n count: 1,\n tags: ['frontend']\n labels: {service: 'frontend', priority: 'high'}\n)\n\nclient.kubernetes_clusters.update_node_pool(node_pool, id: 'bd5f5959-5e1e-4205-a714-a914373942af', pool_id: '86c9bc8c-b2c3-4d40-8000-b0c7bee27305')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"name\": \"frontend-pool\",\n \"count\": 3,\n \"tags\": [\n \"k8s\",\n \"k8s:bd5f5959-5e1e-4205-a714-a914373942af\",\n \"k8s-worker\",\n \"production\",\n \"web-team\"\n ],\n \"labels\": None,\n \"taints\": [\n {\n \"key\": \"priority\",\n \"value\": \"high\",\n \"effect\": \"NoSchedule\"\n }\n ],\n \"auto_scale\": True,\n \"min_nodes\": 3,\n \"max_nodes\": 6\n}\n\nresp = client.kubernetes.update_node_pool(cluster_id=\"1fd32a\", node_pool_id=\"392fa3a\", body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + }, + "delete": { + "operationId": "kubernetes_delete_nodePool", + "summary": "Delete a Node Pool in a Kubernetes Cluster", + "description": "To delete a node pool, send a DELETE request to\n`/v2/kubernetes/clusters/$K8S_CLUSTER_ID/node_pools/$NODE_POOL_ID`.\n\nA 204 status code with no body will be returned in response to a successful\nrequest. Nodes in the pool will subsequently be drained and deleted.\n", + "tags": [ + "Kubernetes" + ], + "parameters": [ + { + "$ref": "#/components/parameters/kubernetes_cluster_id" + }, + { + "$ref": "#/components/parameters/kubernetes_node_pool_id" + } + ], + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/kubernetes/clusters/bd5f5959-5e1e-4205-a714-a914373942af/node_pools/86c9bc8c-b2c3-4d40-8000-b0c7bee27305\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n _, err := client.Kubernetes.DeleteNodePool(ctx, \"bd5f5959-5e1e-4205-a714-a914373942af\", \"86c9bc8c-b2c3-4d40-8000-b0c7bee27305\")\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.kubernetes_clusters.delete_node_pool(id: 'bd5f5959-5e1e-4205-a714-a914373942af', pool_id: '86c9bc8c-b2c3-4d40-8000-b0c7bee27305')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.kubernetes.delete_node_pool(cluster_id=\"da8fda8\", node_pool_id=\"a8f3da\")" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/kubernetes/clusters/{cluster_id}/node_pools/{node_pool_id}/nodes/{node_id}": { + "delete": { + "operationId": "kubernetes_delete_node", + "summary": "Delete a Node in a Kubernetes Cluster", + "description": "To delete a single node in a pool, send a DELETE request to\n`/v2/kubernetes/clusters/$K8S_CLUSTER_ID/node_pools/$NODE_POOL_ID/nodes/$NODE_ID`.\n\nAppending the `skip_drain=1` query parameter to the request causes node\ndraining to be skipped. Omitting the query parameter or setting its value to\n`0` carries out draining prior to deletion.\n\nAppending the `replace=1` query parameter to the request causes the node to\nbe replaced by a new one after deletion. Omitting the query parameter or\nsetting its value to `0` deletes without replacement.\n", + "tags": [ + "Kubernetes" + ], + "parameters": [ + { + "$ref": "#/components/parameters/kubernetes_cluster_id" + }, + { + "$ref": "#/components/parameters/kubernetes_node_pool_id" + }, + { + "$ref": "#/components/parameters/kubernetes_node_id" + }, + { + "$ref": "#/components/parameters/kubernetes_node_skip_drain" + }, + { + "$ref": "#/components/parameters/kubernetes_node_replace" + } + ], + "responses": { + "202": { + "$ref": "#/components/responses/accepted" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/kubernetes/clusters/bd5f5959-5e1e-4205-a714-a914373942af/node_pools/86c9bc8c-b2c3-4d40-8000-b0c7bee27305/nodes/478247f8-b1bb-4f7a-8db9-2a5f8d4b8f8f?skip_drain=0&replace=1\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n recycleRequest := &godo.KubernetesNodePoolRecycleNodesRequest{\n Nodes: []string{\"3385619f-8ec3-42ba-bb23-8d21b8ba7518\", \"4b8f60ff-ba06-4523-a6a4-b8148244c7e6\"},\n }\n\n _, err := client.Kubernetes.RecycleNodePoolNodes(ctx, \"bd5f5959-5e1e-4205-a714-a914373942af\", \"86c9bc8c-b2c3-4d40-8000-b0c7bee27305\", recycleRequest)\n}" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.kubernetes.delete_node(cluster_id=\"da8fda8\", node_pool_id=\"a8f3da\", node_id=\"fa09daf\")" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/kubernetes/clusters/{cluster_id}/node_pools/{node_pool_id}/recycle": { + "post": { + "operationId": "kubernetes_recycle_node_pool", + "deprecated": true, + "summary": "Recycle a Kubernetes Node Pool", + "description": "The endpoint has been deprecated. Please use the DELETE\n`/v2/kubernetes/clusters/$K8S_CLUSTER_ID/node_pools/$NODE_POOL_ID/nodes/$NODE_ID`\nmethod instead.\n", + "tags": [ + "Kubernetes" + ], + "parameters": [ + { + "$ref": "#/components/parameters/kubernetes_cluster_id" + }, + { + "$ref": "#/components/parameters/kubernetes_node_pool_id" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "properties": { + "nodes": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "d8db5e1a-6103-43b5-a7b3-8a948210a9fc" + ] + } + } + } + } + } + }, + "responses": { + "202": { + "$ref": "#/components/responses/accepted" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/kubernetes/clusters/{cluster_id}/user": { + "get": { + "operationId": "kubernetes_get_clusterUser", + "summary": "Retrieve User Information for a Kubernetes Cluster", + "description": "To show information the user associated with a Kubernetes cluster, send a GET\nrequest to `/v2/kubernetes/clusters/$K8S_CLUSTER_ID/user`.\n", + "tags": [ + "Kubernetes" + ], + "parameters": [ + { + "$ref": "#/components/parameters/kubernetes_cluster_id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/cluster_user" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/kubernetes/clusters/bd5f5959-5e1e-4205-a714-a914373942af/user\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.kubernetes.get_cluster_user(cluster_id=\"da8fda8\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/kubernetes/options": { + "get": { + "operationId": "kubernetes_list_options", + "summary": "List Available Regions, Node Sizes, and Versions of Kubernetes", + "description": "To list the versions of Kubernetes available for use, the regions that support Kubernetes, and the available node sizes, send a GET request to `/v2/kubernetes/options`.", + "tags": [ + "Kubernetes" + ], + "responses": { + "200": { + "$ref": "#/components/responses/all_options" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/kubernetes/options\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n options, _, err := client.Kubernetes.GetOptions(ctx)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.kubernetes_options.all" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.kubernetes.list_options()" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/kubernetes/clusters/{cluster_id}/clusterlint": { + "post": { + "operationId": "kubernetes_run_clusterLint", + "summary": "Run Clusterlint Checks on a Kubernetes Cluster", + "description": "Clusterlint helps operators conform to Kubernetes best practices around\nresources, security and reliability to avoid common problems while operating\nor upgrading the clusters.\n\nTo request a clusterlint run on your cluster, send a POST request to\n`/v2/kubernetes/clusters/$K8S_CLUSTER_ID/clusterlint`. This will run all\nchecks present in the `doks` group by default, if a request body is not\nspecified. Optionally specify the below attributes.\n\nFor information about the available checks, please refer to\n[the clusterlint check documentation](https://github.com/digitalocean/clusterlint/blob/master/checks.md).\n", + "tags": [ + "Kubernetes" + ], + "parameters": [ + { + "$ref": "#/components/parameters/kubernetes_cluster_id" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/clusterlint_request" + } + } + } + }, + "responses": { + "202": { + "$ref": "#/components/responses/clusterlint_run" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"include_groups\": [\"basic\"], \"include_checks\": [\"bare-pods\"]}' \\\n \"https://api.digitalocean.com/v2/kubernetes/clusters/bd5f5959-5e1e-4205-a714-a914373942af/clusterlint\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"include_groups\": [\n \"basic\",\n \"doks\",\n \"security\"\n ],\n \"include_checks\": [\n \"bare-pods\",\n \"resource-requirements\"\n ],\n \"exclude_groups\": [\n \"workload-health\"\n ],\n \"exclude_checks\": [\n \"default-namespace\"\n ]\n}\n\nresp = client.kubernetes.run_cluster_lint(cluster_id=\"1fd32a\", body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "get": { + "operationId": "kubernetes_get_clusterLintResults", + "summary": "Fetch Clusterlint Diagnostics for a Kubernetes Cluster", + "description": "To request clusterlint diagnostics for your cluster, send a GET request to\n`/v2/kubernetes/clusters/$K8S_CLUSTER_ID/clusterlint`. If the `run_id` query\nparameter is provided, then the diagnostics for the specific run is fetched.\nBy default, the latest results are shown.\n\nTo find out how to address clusterlint feedback, please refer to\n[the clusterlint check documentation](https://github.com/digitalocean/clusterlint/blob/master/checks.md).\n", + "tags": [ + "Kubernetes" + ], + "parameters": [ + { + "$ref": "#/components/parameters/kubernetes_cluster_id" + }, + { + "$ref": "#/components/parameters/clusterlint_run_id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/clusterlint_results" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/kubernetes/clusters/bd5f5959-5e1e-4205-a714-a914373942af/clusterlint\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.kubernetes.get_cluster_lint_results(cluster_id=\"da8fda8\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/kubernetes/registry": { + "post": { + "operationId": "kubernetes_add_registry", + "summary": "Add Container Registry to Kubernetes Clusters", + "description": "To integrate the container registry with Kubernetes clusters, send a POST request to `/v2/kubernetes/registry`.", + "tags": [ + "Kubernetes" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cluster_registries" + } + } + } + }, + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"cluster_uuids\": [\"bd5f5959-5e1e-4205-a714-a914373942af\", \"50c2f44c-011d-493e-aee5-361a4a0d1844\"]}' \\\n \"https://api.digitalocean.com/v2/kubernetes/registry\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n _, err := client.Kubernetes.AddRegistry(ctx, &godo.KubernetesClusterRegistryRequest{ClusterUUIDs: []string{\"bd5f5959-5e1e-4205-a714-a914373942af\"}})\n}" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"cluster_uuids\": [\n \"bd5f5959-5e1e-4205-a714-a914373942af\",\n \"50c2f44c-011d-493e-aee5-361a4a0d1844\"\n ]\n}\n\nresp = client.kubernetes.add_registry(body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + }, + "delete": { + "operationId": "kubernetes_remove_registry", + "summary": "Remove Container Registry from Kubernetes Clusters", + "description": "To remove the container registry from Kubernetes clusters, send a DELETE request to `/v2/kubernetes/registry`.", + "tags": [ + "Kubernetes" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/cluster_registries" + } + } + } + }, + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"cluster_uuids\": [\"bd5f5959-5e1e-4205-a714-a914373942af\", \"50c2f44c-011d-493e-aee5-361a4a0d1844\"]}' \\\n \"https://api.digitalocean.com/v2/kubernetes/registry\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n _, err := client.Kubernetes.RemoveRegistry(ctx, &godo.KubernetesClusterRegistryRequest{ClusterUUIDs: []string{\"bd5f5959-5e1e-4205-a714-a914373942af\"}})\n}" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"cluster_uuids\": [\n \"bd5f5959-5e1e-4205-a714-a914373942af\",\n \"50c2f44c-011d-493e-aee5-361a4a0d1844\"\n ]\n}\n\nresp = client.kubernetes.remove_registry(body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/load_balancers": { + "post": { + "operationId": "loadBalancers_create", + "summary": "Create a New Load Balancer", + "description": "To create a new load balancer instance, send a POST request to\n`/v2/load_balancers`.\n\nYou can specify the Droplets that will sit behind the load balancer using one\nof two methods:\n\n* Set `droplet_ids` to a list of specific Droplet IDs.\n* Set `tag` to the name of a tag. All Droplets with this tag applied will be\n assigned to the load balancer. Additional Droplets will be automatically\n assigned as they are tagged.\n\nThese methods are mutually exclusive.\n", + "tags": [ + "Load Balancers" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/load_balancer_create" + }, + "examples": { + "Basic Create Request": { + "$ref": "#/components/examples/load_balancer_basic_create_request" + }, + "SSL Termination Create Request": { + "$ref": "#/components/examples/load_balancer_ssl_termination_create_request" + }, + "Create Request Using Droplet Tag": { + "$ref": "#/components/examples/load_balancer_using_tag_create_request" + }, + "Sticky Sessions and Custom Health Check": { + "$ref": "#/components/examples/load_balancer_sticky_sessions_and_health_check_create_request" + } + } + } + } + }, + "responses": { + "202": { + "$ref": "#/components/responses/load_balancer_create" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "# Create new load balancer\ncurl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"name\": \"example-lb-01\",\"size_unit\": 1, \"region\": \"nyc3\", \"forwarding_rules\":[{\"entry_protocol\":\"http\",\"entry_port\":80,\"target_protocol\":\"http\",\"target_port\":80,\"certificate_id\":\"\",\"tls_passthrough\":false}, {\"entry_protocol\": \"https\",\"entry_port\": 444,\"target_protocol\": \"https\",\"target_port\": 443,\"tls_passthrough\": true}], \"health_check\":{\"protocol\":\"http\",\"port\":80,\"path\":\"/\",\"check_interval_seconds\":10,\"response_timeout_seconds\":5,\"healthy_threshold\":5,\"unhealthy_threshold\":3}, \"sticky_sessions\":{\"type\":\"none\"}, \"firewall\":{\"deny\":[\"ip:1.2.3.4\",\"cidr:2.3.4.0/24\"],\"allow\":[\"cidr:1.2.0.0/16\",\"ip:2.3.4.5\"]}, \"droplet_ids\": [3164444, 3164445]}' \\\n \"https://api.digitalocean.com/v2/load_balancers\"\n\n# Create new load balancer with Droplet tag\ncurl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"name\": \"example-lb-01\", \"region\": \"nyc3\", \"size_unit\": 1, \"forwarding_rules\":[{\"entry_protocol\":\"http\",\"entry_port\":80,\"target_protocol\":\"http\",\"target_port\":80,\"certificate_id\":\"\",\"tls_passthrough\":false}, {\"entry_protocol\": \"https\",\"entry_port\": 444,\"target_protocol\": \"https\",\"target_port\": 443,\"tls_passthrough\": true}], \"health_check\":{\"protocol\":\"http\",\"port\":80,\"path\":\"/\",\"check_interval_seconds\":10,\"response_timeout_seconds\":5,\"healthy_threshold\":5,\"unhealthy_threshold\":3}, \"sticky_sessions\":{\"type\":\"none\"}, \"firewall\":{\"deny\":[\"ip:1.2.3.4\", \"cidr:2.3.4.0/24\"],\"allow\":[\"cidr:1.2.0.0/16\",\"ip:2.3.4.5\"]}, \"tag\": \"web:prod\"}' \\\n \"https://api.digitalocean.com/v2/load_balancers\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n createRequest := &godo.LoadBalancerRequest{\n Name: \"example-01\",\n SizeUnit: \"1\",\n Algorithm: \"round_robin\",\n Region: \"nyc3\",\n ForwardingRules: []godo.ForwardingRule{\n {\n EntryProtocol: \"http\",\n EntryPort: 80,\n TargetProtocol: \"http\",\n TargetPort: 80,\n },\n {\n EntryProtocol: \"https\",\n EntryPort: 443,\n TargetProtocol: \"https\",\n TargetPort: 443,\n TlsPassthrough: true,\n },\n },\n HealthCheck: &godo.HealthCheck{\n Protocol: \"http\",\n Port: 80,\n Path: \"/\",\n CheckIntervalSeconds: 10,\n ResponseTimeoutSeconds: 5,\n HealthyThreshold: 5,\n UnhealthyThreshold: 3,\n },\n StickySessions: &godo.StickySessions{\n Type: \"none\",\n },\n DropletIDs: []int{3164444, 3164445},\n RedirectHttpToHttps: false,\n Firewall: &godo.LBFirewall{\n Deny: []string{\"ip:1.2.3.4\", \"cidr:2.3.4.0/24\"},\n Allow: []string{\"cidr:1.2.0.0/16\", \"ip:2.3.4.5\"},\n }\n // Create new load balancer with Droplet tag\n // Tag: \"web:prod\",\n // RedirectHttpToHttps: false,\n }\n\n lb, _, err := client.LoadBalancers.Create(ctx, createRequest)" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nload_balancer = DropletKit::LoadBalancer.new(\n name: 'example-lb-01',\n size_unit: '1',\n algorithm: 'round_robin',\n# Create new load balancer with Droplet tag\n# tag: 'web:prod',\n droplet_ids: [ 3164444, 3164445],\n redirect_http_to_https: true,\n region: 'nyc3',\n forwarding_rules: [\n DropletKit::ForwardingRule.new(\n entry_protocol: 'http',\n entry_port: 80,\n target_protocol: 'http',\n target_port: 80,\n certificate_id: '',\n tls_passthrough: false\n ),\n DropletKit::ForwardingRule.new(\n entry_protocol: 'https',\n entry_port: 443,\n target_protocol: 'https',\n target_port: 443,\n certificate_id: '',\n tls_passthrough: true\n )\n ],\n sticky_sessions: DropletKit::StickySession.new(\n type: 'cookies',\n cookie_name: 'DO-LB',\n cookie_ttl_seconds: 5\n ),\n health_check: DropletKit::HealthCheck.new(\n protocol: 'http',\n port: 80,\n path: '/',\n check_interval_seconds: 10,\n response_timeout_seconds: 5,\n healthy_threshold: 5,\n unhealthy_threshold: 3\n )\n)\nclient.load_balancers.create(load_balancer)" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"name\": \"example-lb-01\",\n \"region\": \"nyc3\",\n \"forwarding_rules\": [\n {\n \"entry_protocol\": \"http\",\n \"entry_port\": 80,\n \"target_protocol\": \"http\",\n \"target_port\": 80\n },\n {\n \"entry_protocol\": \"https\",\n \"entry_port\": 443,\n \"target_protocol\": \"https\",\n \"target_port\": 443,\n \"tls_passthrough\": True\n }\n ],\n \"droplet_ids\": [\n 3164444,\n 3164445\n ],\n \"project_id\": \"9cc10173-e9ea-4176-9dbc-a4cee4c4ff30\",\n \"http_idle_timeout_seconds\": 60,\n \"firewall\": {\n \"deny\": [\n \"cidr:1.2.0.0/16\",\n \"ip:2.3.4.5\"\n ],\n \"allow\": [\n \"ip:1.2.3.4\",\n \"cidr:2.3.4.0/24\"\n ]\n }\n}\n\nresp = client.load_balancers.create(body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + }, + "get": { + "operationId": "loadBalancers_list", + "summary": "List All Load Balancers", + "description": "To list all of the load balancer instances on your account, send a GET request\nto `/v2/load_balancers`.\n", + "tags": [ + "Load Balancers" + ], + "parameters": [ + { + "$ref": "#/components/parameters/per_page" + }, + { + "$ref": "#/components/parameters/page" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/all_load_balancers" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/load_balancers\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n opt := &godo.ListOptions{\n Page: 1,\n PerPage: 200,\n }\n\n lbs, _, err := c.LoadBalancers.List(ctx, opt)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nload_balancers = client.load_balancers.all\nload_balancers.each" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.load_balancers.list()" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/load_balancers/{lb_id}": { + "get": { + "operationId": "loadBalancers_get", + "summary": "Retrieve an Existing Load Balancer", + "description": "To show information about a load balancer instance, send a GET request to\n`/v2/load_balancers/$LOAD_BALANCER_ID`.\n", + "tags": [ + "Load Balancers" + ], + "parameters": [ + { + "$ref": "#/components/parameters/load_balancer_id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/existing_load_balancer" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/load_balancers/4de7ac8b-495b-4884-9a69-1050c6793cd6\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n lb, _, err := client.LoadBalancers.Get(ctx, \"4de7ac8b-495b-4884-9a69-1050c6793cd6\")\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.load_balancers.find(id: '4de7ac8b-495b-4884-9a69-1050c6793cd6')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.load_balancers.get(lb_id=\"afda3ad\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "put": { + "operationId": "loadBalancers_update", + "summary": "Update a Load Balancer", + "description": "To update a load balancer's settings, send a PUT request to\n`/v2/load_balancers/$LOAD_BALANCER_ID`. The request should contain a full\nrepresentation of the load balancer including existing attributes. It may\ncontain _one of_ the `droplets_ids` or `tag` attributes as they are mutually\nexclusive. **Note that any attribute that is not provided will be reset to its\ndefault value.**\n", + "tags": [ + "Load Balancers" + ], + "parameters": [ + { + "$ref": "#/components/parameters/load_balancer_id" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/load_balancer_create" + }, + "examples": { + "load_balancer_update_request": { + "$ref": "#/components/examples/load_balancer_update_request" + } + } + } + } + }, + "responses": { + "200": { + "$ref": "#/components/responses/updated_load_balancer" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X PUT \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"name\":\"example-lb-01\",\"size_unit\":\"2\",\"region\":\"nyc3\",\"algorithm\":\"least_connections\",\"forwarding_rules\":[{\"entry_protocol\":\"http\",\"entry_port\":80,\"target_protocol\":\"http\",\"target_port\":80},{\"entry_protocol\":\"https\",\"entry_port\":444,\"target_protocol\":\"https\",\"target_port\":443,\"tls_passthrough\":true}],\"health_check\":{\"protocol\":\"http\",\"port\":80,\"path\":\"/\",\"check_interval_seconds\":10,\"response_timeout_seconds\":5,\"healthy_threshold\":5,\"unhealthy_threshold\":3},\"sticky_sessions\":{\"type\":\"cookies\", \"cookie_name\": \"DO_LB\", \"cookie_ttl_seconds\": 300}, \"firewall\":{\"deny\":[\"ip:1.2.3.4\",\"cidr:2.3.4.0/24\"], \"allow\":[\"cidr:1.2.0.0/16\",\"ip:2.3.4.5\"]}, \"droplet_ids\": [3164444, 3164445]}' \\\n \"https://api.digitalocean.com/v2/load_balancers/4de7ac8b-495b-4884-9a69-1050c6793cd6\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n updateRequest := &godo.LoadBalancerRequest{\n Name: \"example-01\",\n SizeUnit: \"2\",\n Algorithm: \"round_robin\",\n Region: \"nyc3\",\n ForwardingRules: []godo.ForwardingRule{\n {\n EntryProtocol: \"http\",\n EntryPort: 80,\n TargetProtocol: \"http\",\n TargetPort: 80,\n },\n {\n EntryProtocol: \"https\",\n EntryPort: 443,\n TargetProtocol: \"https\",\n TargetPort: 443,\n TlsPassthrough: true,\n },\n },\n HealthCheck: &godo.HealthCheck{\n Protocol: \"http\",\n Port: 80,\n Path: \"/\",\n CheckIntervalSeconds: 10,\n ResponseTimeoutSeconds: 5,\n HealthyThreshold: 5,\n UnhealthyThreshold: 3,\n },\n StickySessions: &godo.StickySessions{\n Type: \"cookies\",\n CookieName: \"DO_LB\",\n CookieTtlSeconds: 300,\n },\n DropletIDs: []int{3164444, 3164445},\n RedirectHttpToHttps: false,\n Firewall: &godo.LBFirewall{\n Deny: []string{\"ip:1.2.3.4\", \"cidr:2.3.4.0/24\"},\n Allow: []string{\"cidr:1.2.0.0/16\", \"ip:2.3.4.5\"},\n }\n }\n\n lb, _, err := c.LoadBalancers.Update(ctx, \"c2c97ca7-6f63-4e23-8909-906fd86efb5e\", updateRequest)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nload_balancer = DropletKit::LoadBalancer.new(\n name: 'example-lb-01',\n size_unit: '2',\n algorithm: 'round_robin',\n droplet_ids: [ 3164444, 3164445],\n redirect_http_to_https: true,\n region: 'nyc3',\n forwarding_rules: [\n DropletKit::ForwardingRule.new(\n entry_protocol: 'http',\n entry_port: 80,\n target_protocol: 'http',\n target_port: 80,\n certificate_id: '',\n tls_passthrough: false\n ),\n DropletKit::ForwardingRule.new(\n entry_protocol: 'https',\n entry_port: 443,\n target_protocol: 'https',\n target_port: 443,\n certificate_id: '',\n tls_passthrough: true\n )\n ],\n sticky_sessions: DropletKit::StickySession.new(\n type: 'cookies',\n cookie_name: 'DO-LB-COOKIE',\n cookie_ttl_seconds: 5\n ),\n health_check: DropletKit::HealthCheck.new(\n protocol: 'http',\n port: 80,\n path: '/',\n check_interval_seconds: 10,\n response_timeout_seconds: 5,\n healthy_threshold: 5,\n unhealthy_threshold: 3\n )\n)\nclient.load_balancers.update(load_balancer, id: '4de7ac8b-495b-4884-9a69-1050c6793cd6')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"name\": \"updated-example-lb-01\",\n \"region\": \"nyc3\",\n \"droplet_ids\": [\n 3164444,\n 3164445\n ],\n \"algorithm\": \"round_robin\",\n \"forwarding_rules\": [\n {\n \"entry_protocol\": \"http\",\n \"entry_port\": 80,\n \"target_protocol\": \"http\",\n \"target_port\": 80,\n \"certificate_id\": \"\",\n \"tls_passthrough\": false\n },\n {\n \"entry_protocol\": \"https\",\n \"entry_port\": 443,\n \"target_protocol\": \"https\",\n \"target_port\": 443,\n \"certificate_id\": \"\",\n \"tls_passthrough\": true\n }\n ],\n \"health_check\": {\n \"protocol\": \"http\",\n \"port\": 80,\n \"path\": \"/\",\n \"check_interval_seconds\": 10,\n \"response_timeout_seconds\": 5,\n \"healthy_threshold\": 5,\n \"unhealthy_threshold\": 3\n },\n \"sticky_sessions\": {\n \"type\": \"none\"\n },\n \"redirect_http_to_https\": False,\n \"enable_proxy_protocol\": True,\n \"enable_backend_keepalive\": True,\n \"vpc_uuid\": \"c33931f2-a26a-4e61-b85c-4e95a2ec431b\",\n \"project_id\": \"9cc10173-e9ea-4176-9dbc-a4cee4c4ff30\",\n \"http_idle_timeout_seconds\": 60,\n \"firewall\": {\n \"deny\": [\n \"cidr:1.2.0.0/16\",\n \"ip:2.3.4.5\"\n ],\n \"allow\": [\n \"ip:1.2.3.4\",\n \"cidr:2.3.4.0/24\"\n ]\n }\n}\nresp = client.load_balancers.update(lb_id=\"fda9fda\", body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + }, + "delete": { + "operationId": "loadBalancers_delete", + "summary": "Delete a Load Balancer", + "description": "To delete a load balancer instance, disassociating any Droplets assigned to it\nand removing it from your account, send a DELETE request to\n`/v2/load_balancers/$LOAD_BALANCER_ID`.\n\nA successful request will receive a 204 status code with no body in response.\nThis indicates that the request was processed successfully.\n", + "tags": [ + "Load Balancers" + ], + "parameters": [ + { + "$ref": "#/components/parameters/load_balancer_id" + } + ], + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/load_balancers/4de7ac8b-495b-4884-9a69-1050c6793cd6\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n _, err := client.LoadBalancers.Delete(ctx, \"4de7ac8b-495b-4884-9a69-1050c6793cd6\")\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.load_balancers.delete(id: '4de7ac8b-495b-4884-9a69-1050c6793cd6')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.load_balancers.delete(lb_id=\"afda3ad\")" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/load_balancers/{lb_id}/droplets": { + "post": { + "operationId": "loadBalancers_add_droplets", + "summary": "Add Droplets to a Load Balancer", + "description": "To assign a Droplet to a load balancer instance, send a POST request to\n`/v2/load_balancers/$LOAD_BALANCER_ID/droplets`. In the body of the request,\nthere should be a `droplet_ids` attribute containing a list of Droplet IDs.\nIndividual Droplets can not be added to a load balancer configured with a\nDroplet tag. Attempting to do so will result in a \"422 Unprocessable Entity\"\nresponse from the API.\n\nNo response body will be sent back, but the response code will indicate\nsuccess. Specifically, the response code will be a 204, which means that the\naction was successful with no returned body data.\n", + "tags": [ + "Load Balancers" + ], + "parameters": [ + { + "$ref": "#/components/parameters/load_balancer_id" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "properties": { + "droplet_ids": { + "type": "array", + "items": { + "type": "integer" + }, + "example": [ + 3164444, + 3164445 + ], + "description": "An array containing the IDs of the Droplets assigned to the load balancer." + } + }, + "required": [ + "droplet_ids" + ] + } + } + } + }, + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"droplet_ids\": [3164446, 3164447]}' \\\n \"https://api.digitalocean.com/v2/load_balancers/4de7ac8b-495b-4884-9a69-1050c6793cd6/droplets\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n droplets := []int{3164446, 3164447}\n _, err := client.LoadBalancers.AddDroplets(ctx, \"4de7ac8b-495b-4884-9a69-1050c6793cd6\", droplets...)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.load_balancers.add_droplets([3164446, 3164447], id: '4de7ac8b-495b-4884-9a69-1050c6793cd6')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"droplet_ids\": [\n 3164444,\n 3164445\n ]\n}\n\nresp = client.load_balancers.add_droplets(lb_id=\"1fd32a\", body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + }, + "delete": { + "operationId": "loadBalancers_remove_droplets", + "summary": "Remove Droplets from a Load Balancer", + "description": "To remove a Droplet from a load balancer instance, send a DELETE request to\n`/v2/load_balancers/$LOAD_BALANCER_ID/droplets`. In the body of the request,\nthere should be a `droplet_ids` attribute containing a list of Droplet IDs.\n\nNo response body will be sent back, but the response code will indicate\nsuccess. Specifically, the response code will be a 204, which means that the\naction was successful with no returned body data.\n", + "tags": [ + "Load Balancers" + ], + "parameters": [ + { + "$ref": "#/components/parameters/load_balancer_id" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "properties": { + "droplet_ids": { + "type": "array", + "items": { + "type": "integer" + }, + "example": [ + 3164444, + 3164445 + ], + "description": "An array containing the IDs of the Droplets assigned to the load balancer." + } + }, + "required": [ + "droplet_ids" + ] + } + } + } + }, + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"droplet_ids\": [3164446, 3164447]}' \\\n \"https://api.digitalocean.com/v2/load_balancers/4de7ac8b-495b-4884-9a69-1050c6793cd6/droplets\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n droplets := []int{3164446, 3164447}\n _, err := client.LoadBalancers.RemoveDroplets(ctx, \"4de7ac8b-495b-4884-9a69-1050c6793cd6\", droplets...)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.load_balancers.remove_droplets([3164446, 3164447], id: '4de7ac8b-495b-4884-9a69-1050c6793cd6')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"droplet_ids\": [\n 3164444,\n 3164445\n ]\n}\n\nresp = client.load_balancers.remove_droplets(lb_id=\"fda9fda\", body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/load_balancers/{lb_id}/forwarding_rules": { + "post": { + "operationId": "loadBalancers_add_forwardingRules", + "summary": "Add Forwarding Rules to a Load Balancer", + "description": "To add an additional forwarding rule to a load balancer instance, send a POST\nrequest to `/v2/load_balancers/$LOAD_BALANCER_ID/forwarding_rules`. In the body\nof the request, there should be a `forwarding_rules` attribute containing an\narray of rules to be added.\n\nNo response body will be sent back, but the response code will indicate\nsuccess. Specifically, the response code will be a 204, which means that the\naction was successful with no returned body data.\n", + "tags": [ + "Load Balancers" + ], + "parameters": [ + { + "$ref": "#/components/parameters/load_balancer_id" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "properties": { + "forwarding_rules": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/components/schemas/forwarding_rule" + } + } + }, + "required": [ + "forwarding_rules" + ] + } + } + } + }, + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"forwarding_rules\": [{\"entry_protocol\": \"tcp\",\"entry_port\": 3306,\"target_protocol\": \"tcp\",\"target_port\": 3306}]}' \\\n \"https://api.digitalocean.com/v2/load_balancers/4de7ac8b-495b-4884-9a69-1050c6793cd6/forwarding_rules\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n forwardingRule := []godo.ForwardingRule{\n {\n EntryProtocol: \"tcp\",\n EntryPort: 3306,\n TargetProtocol: \"tcp\",\n TargetPort: 3306,\n },\n }\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nrule = DropletKit::ForwardingRule.new(\n entry_protocol: 'tcp',\n entry_port: 3306,\n target_protocol: 'tcp',\n target_port: 3306,\n certificate_id: '',\n tls_passthrough: false\n)\nclient.load_balancers.add_forwarding_rules([rule], id: '4de7ac8b-495b-4884-9a69-1050c6793cd6')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"forwarding_rules\": [\n {\n \"entry_protocol\": \"https\",\n \"entry_port\": 443,\n \"target_protocol\": \"http\",\n \"target_port\": 80,\n \"certificate_id\": \"892071a0-bb95-49bc-8021-3afd67a210bf\",\n \"tls_passthrough\": False\n }\n ]\n}\n\nresp = client.load_balancers.add_forwarding_rules(lb_id=\"1fd32a\", body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + }, + "delete": { + "operationId": "loadBalancers_remove_forwardingRules", + "summary": "Remove Forwarding Rules from a Load Balancer", + "description": "To remove forwarding rules from a load balancer instance, send a DELETE\nrequest to `/v2/load_balancers/$LOAD_BALANCER_ID/forwarding_rules`. In the\nbody of the request, there should be a `forwarding_rules` attribute containing\nan array of rules to be removed.\n\nNo response body will be sent back, but the response code will indicate\nsuccess. Specifically, the response code will be a 204, which means that the\naction was successful with no returned body data.\n", + "tags": [ + "Load Balancers" + ], + "parameters": [ + { + "$ref": "#/components/parameters/load_balancer_id" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "properties": { + "forwarding_rules": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/components/schemas/forwarding_rule" + } + } + }, + "required": [ + "forwarding_rules" + ] + } + } + } + }, + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"forwarding_rules\": [{\"entry_protocol\": \"tcp\",\"entry_port\": 3306,\"target_protocol\": \"tcp\",\"target_port\": 3306}]}' \\\n \"https://api.digitalocean.com/v2/load_balancers/4de7ac8b-495b-4884-9a69-1050c6793cd6/forwarding_rules\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n forwardingRule := []godo.ForwardingRule{\n {\n EntryProtocol: \"tcp\",\n EntryPort: 3306,\n TargetProtocol: \"tcp\",\n TargetPort: 3306,\n },\n }\n\n _, err := client.LoadBalancers.RemoveForwardingRules(ctx, \"4de7ac8b-495b-4884-9a69-1050c6793cd6\", forwardingRule...)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nrule = DropletKit::ForwardingRule.new(\n entry_protocol: 'tcp',\n entry_port: 3306,\n target_protocol: 'tcp',\n target_port: 3306,\n certificate_id: '',\n tls_passthrough: false\n)\nclient.load_balancers.remove_forwarding_rules([rule], id: '4de7ac8b-495b-4884-9a69-1050c6793cd6')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"forwarding_rules\": [\n {\n \"entry_protocol\": \"https\",\n \"entry_port\": 443,\n \"target_protocol\": \"http\",\n \"target_port\": 80,\n \"certificate_id\": \"892071a0-bb95-49bc-8021-3afd67a210bf\",\n \"tls_passthrough\": False\n }\n ]\n}\n\nresp = client.load_balancers.remove_forwarding_rules(lb_id=\"fda9fda\", body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/monitoring/alerts": { + "get": { + "operationId": "monitoring_list_alertPolicy", + "summary": "List Alert Policies", + "description": "Returns all alert policies that are configured for the given account. To List all alert policies, send a GET request to `/v2/monitoring/alerts`.", + "tags": [ + "Monitoring" + ], + "parameters": [ + { + "$ref": "#/components/parameters/per_page" + }, + { + "$ref": "#/components/parameters/page" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/list_alert_policy_response" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/monitoring/alerts\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.monitoring.list_alert_policy()" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "post": { + "operationId": "monitoring_create_alertPolicy", + "summary": "Create Alert Policy", + "description": "To create a new alert, send a POST request to `/v2/monitoring/alerts`.", + "tags": [ + "Monitoring" + ], + "responses": { + "200": { + "$ref": "#/components/responses/alert_policy_response" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "requestBody": { + "description": "The `type` field dictates what type of entity that the alert policy applies to and hence what type of entity is passed in the `entities` array. If both the `tags` array and `entities` array are empty the alert policy applies to all entities of the relevant type that are owned by the user account. Otherwise the following table shows the valid entity types for each type of alert policy:\n\nType | Description | Valid Entity Type\n-----|-------------|--------------------\n`v1/insights/droplet/memory_utilization_percent` | alert on the percent of memory utilization | Droplet ID\n`v1/insights/droplet/disk_read` | alert on the rate of disk read I/O in MBps | Droplet ID\n`v1/insights/droplet/load_5` | alert on the 5 minute load average | Droplet ID\n`v1/insights/droplet/load_15` | alert on the 15 minute load average | Droplet ID\n`v1/insights/droplet/disk_utilization_percent` | alert on the percent of disk utilization | Droplet ID\n`v1/insights/droplet/cpu` | alert on the percent of CPU utilization | Droplet ID\n`v1/insights/droplet/disk_write` | alert on the rate of disk write I/O in MBps | Droplet ID\n`v1/insights/droplet/public_outbound_bandwidth` | alert on the rate of public outbound bandwidth in Mbps | Droplet ID\n`v1/insights/droplet/public_inbound_bandwidth` | alert on the rate of public inbound bandwidth in Mbps | Droplet ID\n`v1/insights/droplet/private_outbound_bandwidth` | alert on the rate of private outbound bandwidth in Mbps | Droplet ID\n`v1/insights/droplet/private_inbound_bandwidth` | alert on the rate of private inbound bandwidth in Mbps | Droplet ID\n`v1/insights/droplet/load_1` | alert on the 1 minute load average | Droplet ID\n`v1/insights/lbaas/avg_cpu_utilization_percent`|alert on the percent of CPU utilization|load balancer ID\n`v1/insights/lbaas/connection_utilization_percent`|alert on the percent of connection utilization|load balancer ID\n`v1/insights/lbaas/droplet_health`|alert on Droplet health status changes|load balancer ID\n`v1/insights/lbaas/tls_connections_per_second_utilization_percent`|alert on the percent of TLS connections per second utilization|load balancer ID\n`v1/insights/lbaas/increase_in_http_error_rate_percentage_5xx`|alert on the percent increase of 5xx level http errors over 5m|load balancer ID\n`v1/insights/lbaas/increase_in_http_error_rate_percentage_4xx`|alert on the percent increase of 4xx level http errors over 5m|load balancer ID\n`v1/insights/lbaas/increase_in_http_error_rate_count_5xx`|alert on the count of 5xx level http errors over 5m|load balancer ID\n`v1/insights/lbaas/increase_in_http_error_rate_count_4xx`|alert on the count of 4xx level http errors over 5m|load balancer ID\n`v1/insights/lbaas/high_http_request_response_time`|alert on high average http response time|load balancer ID\n`v1/insights/lbaas/high_http_request_response_time_50p`|alert on high 50th percentile http response time|load balancer ID\n`v1/insights/lbaas/high_http_request_response_time_95p`|alert on high 95th percentile http response time|load balancer ID\n`v1/insights/lbaas/high_http_request_response_time_99p`|alert on high 99th percentile http response time|load balancer ID\n`v1/dbaas/alerts/load_15_alerts` | alert on 15 minute load average across the database cluster | database cluster UUID\n`v1/dbaas/alerts/memory_utilization_alerts` | alert on the percent memory utilization average across the database cluster | database cluster UUID\n`v1/dbaas/alerts/disk_utilization_alerts` | alert on the percent disk utilization average across the database cluster | database cluster UUID\n`v1/dbaas/alerts/cpu_alerts` | alert on the percent CPU usage average across the database cluster | database cluster UUID\n", + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/alert_policy_request" + } + } + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\ \n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/monitoring/alerts\" \\\n --data '{\"alerts\":{\"email\":[\"alerts@example.com\"]},\"compare\":\"GreaterThan\",\"description\":\"CPU Alert\",\"enabled\":true,\"entities\":[\"12345678\"],\"tags\":[\"droplet_tag\"],\"type\":\"v1/insights/droplet/cpu\",\"value\":80,\"window\":\"5m\"}'" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"alerts\": {\n \"email\": [\n \"bob@exmaple.com\"\n ],\n \"slack\": [\n {\n \"channel\": \"Production Alerts\",\n \"url\": \"https://hooks.slack.com/services/T1234567/AAAAAAAA/ZZZZZZ\"\n }\n ]\n },\n \"compare\": \"GreaterThan\",\n \"description\": \"CPU Alert\",\n \"enabled\": True,\n \"entities\": [\n \"192018292\"\n ],\n \"tags\": [\n \"droplet_tag\"\n ],\n \"type\": \"v1/insights/droplet/cpu\",\n \"value\": 80,\n \"window\": \"5m\"\n}\n\nresp = client.monitoring.create_alert_policy(body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/monitoring/alerts/{alert_uuid}": { + "get": { + "operationId": "monitoring_get_alertPolicy", + "summary": "Retrieve an Existing Alert Policy", + "description": "To retrieve a given alert policy, send a GET request to `/v2/monitoring/alerts/{alert_uuid}`", + "tags": [ + "Monitoring" + ], + "responses": { + "200": { + "$ref": "#/components/responses/alert_policy_response" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/alert_uuid" + } + ], + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/monitoring/alerts/78b3da62-27e5-49ba-ac70-5db0b5935c64\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.monitoring.get_alert_policy(alert_uuid=\"dfa8da\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "put": { + "operationId": "monitoring_update_alertPolicy", + "summary": "Update an Alert Policy", + "description": "To update en existing policy, send a PUT request to `v2/monitoring/alerts/{alert_uuid}`.", + "tags": [ + "Monitoring" + ], + "responses": { + "200": { + "$ref": "#/components/responses/alert_policy_response" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/alert_uuid" + } + ], + "requestBody": { + "description": "The `type` field dictates what type of entity that the alert policy applies to and hence what type of entity is passed in the `entities` array. If both the `tags` array and `entities` array are empty the alert policy applies to all entities of the relevant type that are owned by the user account. Otherwise the following table shows the valid entity types for each type of alert policy:\n\nType | Description | Valid Entity Type\n-----|-------------|--------------------\n`v1/insights/droplet/memory_utilization_percent` | alert on the percent of memory utilization | Droplet ID\n`v1/insights/droplet/disk_read` | alert on the rate of disk read I/O in MBps | Droplet ID\n`v1/insights/droplet/load_5` | alert on the 5 minute load average | Droplet ID\n`v1/insights/droplet/load_15` | alert on the 15 minute load average | Droplet ID\n`v1/insights/droplet/disk_utilization_percent` | alert on the percent of disk utilization | Droplet ID\n`v1/insights/droplet/cpu` | alert on the percent of CPU utilization | Droplet ID\n`v1/insights/droplet/disk_write` | alert on the rate of disk write I/O in MBps | Droplet ID\n`v1/insights/droplet/public_outbound_bandwidth` | alert on the rate of public outbound bandwidth in Mbps | Droplet ID\n`v1/insights/droplet/public_inbound_bandwidth` | alert on the rate of public inbound bandwidth in Mbps | Droplet ID\n`v1/insights/droplet/private_outbound_bandwidth` | alert on the rate of private outbound bandwidth in Mbps | Droplet ID\n`v1/insights/droplet/private_inbound_bandwidth` | alert on the rate of private inbound bandwidth in Mbps | Droplet ID\n`v1/insights/droplet/load_1` | alert on the 1 minute load average | Droplet ID\n`v1/insights/lbaas/avg_cpu_utilization_percent`|alert on the percent of CPU utilization|load balancer ID\n`v1/insights/lbaas/connection_utilization_percent`|alert on the percent of connection utilization|load balancer ID\n`v1/insights/lbaas/droplet_health`|alert on Droplet health status changes|load balancer ID\n`v1/insights/lbaas/tls_connections_per_second_utilization_percent`|alert on the percent of TLS connections per second utilization|load balancer ID\n`v1/insights/lbaas/increase_in_http_error_rate_percentage_5xx`|alert on the percent increase of 5xx level http errors over 5m|load balancer ID\n`v1/insights/lbaas/increase_in_http_error_rate_percentage_4xx`|alert on the percent increase of 4xx level http errors over 5m|load balancer ID\n`v1/insights/lbaas/increase_in_http_error_rate_count_5xx`|alert on the count of 5xx level http errors over 5m|load balancer ID\n`v1/insights/lbaas/increase_in_http_error_rate_count_4xx`|alert on the count of 4xx level http errors over 5m|load balancer ID\n`v1/insights/lbaas/high_http_request_response_time`|alert on high average http response time|load balancer ID\n`v1/insights/lbaas/high_http_request_response_time_50p`|alert on high 50th percentile http response time|load balancer ID\n`v1/insights/lbaas/high_http_request_response_time_95p`|alert on high 95th percentile http response time|load balancer ID\n`v1/insights/lbaas/high_http_request_response_time_99p`|alert on high 99th percentile http response time|load balancer ID\n`v1/dbaas/alerts/load_15_alerts` | alert on 15 minute load average across the database cluster | database cluster UUID\n`v1/dbaas/alerts/memory_utilization_alerts` | alert on the percent memory utilization average across the database cluster | database cluster UUID\n`v1/dbaas/alerts/disk_utilization_alerts` | alert on the percent disk utilization average across the database cluster | database cluster UUID\n`v1/dbaas/alerts/cpu_alerts` | alert on the percent CPU usage average across the database cluster | database cluster UUID\n", + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/alert_policy_request" + } + } + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X PUT \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/monitoring/alerts/78b3da62-27e5-49ba-ac70-5db0b5935c64\" \\\n --data '{\"alerts\":{\"email\":[\"alerts@example.com\"]},\"compare\":\"GreaterThan\",\"description\":\"CPU Alert\",\"enabled\":true,\"entities\":[\"12345678\"],\"tags\":[\"droplet_tag\"],\"type\":\"v1/insights/droplet/cpu\",\"value\":80,\"window\":\"5m\"}'" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"alerts\": {\n \"email\": [\n \"bob@exmaple.com\"\n ],\n \"slack\": [\n {\n \"channel\": \"Production Alerts\",\n \"url\": \"https://hooks.slack.com/services/T1234567/AAAAAAAA/ZZZZZZ\"\n }\n ]\n },\n \"compare\": \"GreaterThan\",\n \"description\": \"CPU Alert\",\n \"enabled\": True,\n \"entities\": [\n \"192018292\"\n ],\n \"tags\": [\n \"droplet_tag\"\n ],\n \"type\": \"v1/insights/droplet/cpu\",\n \"value\": 80,\n \"window\": \"5m\"\n}\n\nresp = client.monitoring.update_alert_policy(alert_uuid=\"fda9da\", body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + }, + "delete": { + "operationId": "monitoring_delete_alertPolicy", + "summary": "Delete an Alert Policy", + "description": "To delete an alert policy, send a DELETE request to `/v2/monitoring/alerts/{alert_uuid}`", + "tags": [ + "Monitoring" + ], + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/alert_uuid" + } + ], + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/monitoring/alerts/{alert_uuid}\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.monitoring.delete_alert_policy(alert_uuid=\"dfa8da\")" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/monitoring/metrics/droplet/bandwidth": { + "get": { + "operationId": "monitoring_get_dropletBandwidthMetrics", + "summary": "Get Droplet Bandwidth Metrics", + "description": "To retrieve bandwidth metrics for a given Droplet, send a GET request to `/v2/monitoring/metrics/droplet/bandwidth`. Use the `interface` query parameter to specify if the results should be for the `private` or `public` interface. Use the `direction` query parameter to specify if the results should be for `inbound` or `outbound` traffic.", + "tags": [ + "Monitoring" + ], + "responses": { + "200": { + "$ref": "#/components/responses/droplet_bandwidth_metric_response" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/parameters_droplet_id" + }, + { + "$ref": "#/components/parameters/network_interface" + }, + { + "$ref": "#/components/parameters/network_direction" + }, + { + "$ref": "#/components/parameters/metric_timestamp_start" + }, + { + "$ref": "#/components/parameters/metric_timestamp_end" + } + ], + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/monitoring/metrics/droplet/bandwidth?host_id=222651441&interface=public&direction=outbound&start=1636051668&end=1636051668\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.monitoring.get_droplet_bandwidth_metrics(alert_uuid=\"dfa8da\", host_id=\"17209102\", interface=\"private\", direction=\"inbound\", start=\"1620683817\", end=\"1620705417\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/monitoring/metrics/droplet/cpu": { + "get": { + "operationId": "monitoring_get_DropletCpuMetrics", + "summary": "Get Droplet CPU Metrics", + "description": "To retrieve CPU metrics for a given droplet, send a GET request to `/v2/monitoring/metrics/droplet/cpu`.", + "tags": [ + "Monitoring" + ], + "responses": { + "200": { + "$ref": "#/components/responses/droplet_cpu_metric_response" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/parameters_droplet_id" + }, + { + "$ref": "#/components/parameters/metric_timestamp_start" + }, + { + "$ref": "#/components/parameters/metric_timestamp_end" + } + ], + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/monitoring/metrics/droplet/cpu?host_id=222651441&start=1636051668&end=1636051668\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.monitoring.get_droplet_cpu_metrics(host_id=\"17209102\", start=\"1620683817\", end=\"1620705417\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/monitoring/metrics/droplet/filesystem_free": { + "get": { + "operationId": "monitoring_get_dropletFilesystemFreeMetrics", + "summary": "Get Droplet Filesystem Free Metrics", + "description": "To retrieve filesystem free metrics for a given droplet, send a GET request to `/v2/monitoring/metrics/droplet/filesystem_free`.", + "tags": [ + "Monitoring" + ], + "responses": { + "200": { + "$ref": "#/components/responses/droplet_filesystem_metric_response" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/parameters_droplet_id" + }, + { + "$ref": "#/components/parameters/metric_timestamp_start" + }, + { + "$ref": "#/components/parameters/metric_timestamp_end" + } + ], + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/monitoring/metrics/droplet/filesystem_free?host_id=222651441&start=1636051668&end=1636051668\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.monitoring.get_droplet_filesystem_free_metrics(host_id=\"17209102\", start=\"1620683817\", end=\"1620705417\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/monitoring/metrics/droplet/filesystem_size": { + "get": { + "operationId": "monitoring_get_dropletFilesystemSizeMetrics", + "summary": "Get Droplet Filesystem Size Metrics", + "description": "To retrieve filesystem size metrics for a given droplet, send a GET request to `/v2/monitoring/metrics/droplet/filesystem_size`.", + "tags": [ + "Monitoring" + ], + "responses": { + "200": { + "$ref": "#/components/responses/droplet_filesystem_metric_response" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/parameters_droplet_id" + }, + { + "$ref": "#/components/parameters/metric_timestamp_start" + }, + { + "$ref": "#/components/parameters/metric_timestamp_end" + } + ], + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/monitoring/metrics/droplet/filesystem_size?host_id=222651441&interface=public&direction=outbound&start=1636051668&end=1636051668\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.monitoring.get_droplet_filesystem_size_metrics(host_id=\"17209102\", start=\"1620683817\", end=\"1620705417\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/monitoring/metrics/droplet/load_1": { + "get": { + "operationId": "monitoring_get_dropletLoad1Metrics", + "summary": "Get Droplet Load1 Metrics", + "description": "To retrieve 1 minute load average metrics for a given droplet, send a GET request to `/v2/monitoring/metrics/droplet/load_1`.", + "tags": [ + "Monitoring" + ], + "responses": { + "200": { + "$ref": "#/components/responses/metric_response" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/parameters_droplet_id" + }, + { + "$ref": "#/components/parameters/metric_timestamp_start" + }, + { + "$ref": "#/components/parameters/metric_timestamp_end" + } + ], + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/monitoring/metrics/droplet/load_1?host_id=222651441&start=1636051668&end=1636051668\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.monitoring.get_droplet_load1_metrics(host_id=\"17209102\", start=\"1620683817\", end=\"1620705417\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/monitoring/metrics/droplet/load_5": { + "get": { + "operationId": "monitoring_get_dropletLoad5Metrics", + "summary": "Get Droplet Load5 Metrics", + "description": "To retrieve 5 minute load average metrics for a given droplet, send a GET request to `/v2/monitoring/metrics/droplet/load_5`.", + "tags": [ + "Monitoring" + ], + "responses": { + "200": { + "$ref": "#/components/responses/metric_response" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/parameters_droplet_id" + }, + { + "$ref": "#/components/parameters/metric_timestamp_start" + }, + { + "$ref": "#/components/parameters/metric_timestamp_end" + } + ], + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/monitoring/metrics/droplet/load_5?host_id=222651441&start=1636051668&end=1636051668\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.monitoring.get_droplet_load5_metrics(host_id=\"17209102\", start=\"1620683817\", end=\"1620705417\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/monitoring/metrics/droplet/load_15": { + "get": { + "operationId": "monitoring_get_dropletLoad15Metrics", + "summary": "Get Droplet Load15 Metrics", + "description": "To retrieve 15 minute load average metrics for a given droplet, send a GET request to `/v2/monitoring/metrics/droplet/load_15`.", + "tags": [ + "Monitoring" + ], + "responses": { + "200": { + "$ref": "#/components/responses/metric_response" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/parameters_droplet_id" + }, + { + "$ref": "#/components/parameters/metric_timestamp_start" + }, + { + "$ref": "#/components/parameters/metric_timestamp_end" + } + ], + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/monitoring/metrics/droplet/load_15?host_id=222651441&start=1636051668&end=1636051668\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.monitoring.get_droplet_load15_metrics(host_id=\"17209102\", start=\"1620683817\", end=\"1620705417\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/monitoring/metrics/droplet/memory_cached": { + "get": { + "operationId": "monitoring_get_dropletMemoryCachedMetrics", + "summary": "Get Droplet Cached Memory Metrics", + "description": "To retrieve cached memory metrics for a given droplet, send a GET request to `/v2/monitoring/metrics/droplet/memory_cached`.", + "tags": [ + "Monitoring" + ], + "responses": { + "200": { + "$ref": "#/components/responses/metric_response" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/parameters_droplet_id" + }, + { + "$ref": "#/components/parameters/metric_timestamp_start" + }, + { + "$ref": "#/components/parameters/metric_timestamp_end" + } + ], + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/monitoring/metrics/droplet/memory_cached?host_id=222651441&start=1636051668&end=1636051668\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.monitoring.get_droplet_memory_cached_metrics(host_id=\"17209102\", start=\"1620683817\", end=\"1620705417\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/monitoring/metrics/droplet/memory_free": { + "get": { + "operationId": "monitoring_get_dropletMemoryFreeMetrics", + "summary": "Get Droplet Free Memory Metrics", + "description": "To retrieve free memory metrics for a given droplet, send a GET request to `/v2/monitoring/metrics/droplet/memory_free`.", + "tags": [ + "Monitoring" + ], + "responses": { + "200": { + "$ref": "#/components/responses/metric_response" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/parameters_droplet_id" + }, + { + "$ref": "#/components/parameters/metric_timestamp_start" + }, + { + "$ref": "#/components/parameters/metric_timestamp_end" + } + ], + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/monitoring/metrics/droplet/memory_free?host_id=222651441&start=1636051668&end=1636051668\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.monitoring.get_droplet_memory_free_metrics(host_id=\"17209102\", start=\"1620683817\", end=\"1620705417\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/monitoring/metrics/droplet/memory_total": { + "get": { + "operationId": "monitoring_get_dropletMemoryTotalMetrics", + "summary": "Get Droplet Total Memory Metrics", + "description": "To retrieve total memory metrics for a given droplet, send a GET request to `/v2/monitoring/metrics/droplet/memory_total`.", + "tags": [ + "Monitoring" + ], + "responses": { + "200": { + "$ref": "#/components/responses/metric_response" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/parameters_droplet_id" + }, + { + "$ref": "#/components/parameters/metric_timestamp_start" + }, + { + "$ref": "#/components/parameters/metric_timestamp_end" + } + ], + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/monitoring/metrics/droplet/memory_total?host_id=222651441&start=1636051668&end=1636051668\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.monitoring.get_droplet_memory_total_metrics(host_id=\"17209102\", start=\"1620683817\", end=\"1620705417\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/monitoring/metrics/droplet/memory_available": { + "get": { + "operationId": "monitoring_get_dropletMemoryAvailableMetrics", + "summary": "Get Droplet Available Memory Metrics", + "description": "To retrieve available memory metrics for a given droplet, send a GET request to `/v2/monitoring/metrics/droplet/memory_available`.", + "tags": [ + "Monitoring" + ], + "responses": { + "200": { + "$ref": "#/components/responses/metric_response" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/parameters_droplet_id" + }, + { + "$ref": "#/components/parameters/metric_timestamp_start" + }, + { + "$ref": "#/components/parameters/metric_timestamp_end" + } + ], + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/monitoring/metrics/droplet/memory_available?host_id=222651441&start=1636051668&end=1636051668\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.monitoring.get_droplet_memory_available_metrics(host_id=\"17209102\", start=\"1620683817\", end=\"1620705417\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/projects": { + "get": { + "operationId": "projects_list", + "summary": "List All Projects", + "description": "To list all your projects, send a GET request to `/v2/projects`.", + "tags": [ + "Projects" + ], + "parameters": [ + { + "$ref": "#/components/parameters/per_page" + }, + { + "$ref": "#/components/parameters/page" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/projects_list" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/projects\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n opt := &godo.ListOptions{\n PerPage: 10,\n Page: 1,\n }\n\n client.Projects.List(ctx, opt)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nprojects = client.projects.all\nprojects.each" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.projects.list()" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "post": { + "operationId": "projects_create", + "summary": "Create a Project", + "description": "To create a project, send a POST request to `/v2/projects`.", + "tags": [ + "Projects" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/project_base" + } + ], + "required": [ + "name", + "purpose" + ] + } + } + } + }, + "responses": { + "201": { + "$ref": "#/components/responses/existing_project" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"name\":\"my-web-api\", \"description\": \"My website API\", \"purpose\": \"Service or API\", \"environment\": \"Production\"}' \\\n \"https://api.digitalocean.com/v2/projects\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n createReq := &godo.CreateProjectRequest{\n Name: \"my-web-api\",\n Description: \"My website API\",\n Purpose: \"Service or API\",\n Environment: \"Production\",\n }\n\n client.Projects.Create(ctx, createReq)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nproject = DropletKit::Project.new(\n name: 'my-api',\n description: 'My website API',\n purpose: 'Service or API',\n environment: 'Production'\n)\nclient.projects.create(project)" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"name\": \"my-web-api\",\n \"description\": \"My website API\",\n \"purpose\": \"Service or API\",\n \"environment\": \"Production\"\n}\n\nresp = client.projects.create(body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/projects/default": { + "get": { + "operationId": "projects_get_default", + "summary": "Retrieve the Default Project", + "description": "To get your default project, send a GET request to `/v2/projects/default`.", + "tags": [ + "Projects" + ], + "responses": { + "200": { + "$ref": "#/components/responses/default_project" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/projects/default\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n client.Projects.GetDefault(ctx)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.projects.find_default" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.projects.get_default()" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "put": { + "operationId": "projects_update_default", + "summary": "Update the Default Project", + "description": "To update you default project, send a PUT request to `/v2/projects/default`. All of the following attributes must be sent.", + "tags": [ + "Projects" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/project" + } + ], + "required": [ + "name", + "description", + "purpose", + "environment", + "is_default" + ] + } + } + } + }, + "responses": { + "200": { + "$ref": "#/components/responses/existing_project" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X PUT \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"name\":\"my-web-api\", \"description\": \"My website API\", \"purpose\": \"Service or API\", \"environment\": \"Staging\", \"is_default\": false}' \\\n \"https://api.digitalocean.com/v2/projects/default\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n updateReq := &godo.UpdateProjectRequest{\n Name: \"my-web-api\",\n Description: \"My website API\",\n Purpose: \"Service or API\",\n Environment: \"Staging\",\n IsDefault: false,\n }\n\n client.Projects.Update(ctx, godo.DefaultProject, updateReq)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nproject = client.projects.find_default\nproject.environment = 'Staging'\nclient.projects.update(project, id: 'default')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"name\": \"my-web-api\",\n \"description\": \"My website API\",\n \"purpose\": \"Service or API\",\n \"environment\": \"Production\",\n \"is_default\": False\n}\n\nresp = client.projects.update_default(body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + }, + "patch": { + "operationId": "projects_patch_default", + "summary": "Patch the Default Project", + "description": "To update only specific attributes of your default project, send a PATCH request to `/v2/projects/default`. At least one of the following attributes needs to be sent.", + "tags": [ + "Projects" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/project" + }, + "example": { + "name": "my-web-api" + } + } + } + }, + "responses": { + "200": { + "$ref": "#/components/responses/existing_project" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X PATCH \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"environment\": \"Staging\"}' \\\n \"https://api.digitalocean.com/v2/projects/default\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n updateReq := &godo.UpdateProjectRequest{\n Environment: \"Staging\",\n }\n\n client.Projects.Update(ctx, godo.DefaultProject, updateReq)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nproject = client.projects.find_default\nproject.environment = 'Staging'\nclient.projects.update(project, id: 'default')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"name\": \"my-web-api\"\n}\n\nresp = client.projects.patch_default(body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/projects/{project_id}": { + "get": { + "operationId": "projects_get", + "summary": "Retrieve an Existing Project", + "description": "To get a project, send a GET request to `/v2/projects/$PROJECT_ID`.", + "tags": [ + "Projects" + ], + "parameters": [ + { + "$ref": "#/components/parameters/project_id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/existing_project" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/projects/4e1bfbc3-dc3e-41f2-a18f-1b4d7ba71679\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n client.Projects.Get(ctx, \"4e1bfbc3-dc3e-41f2-a18f-1b4d7ba71679\")\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nproject = client.projects.find(id: '4e1bfbc3-dc3e-41f2-a18f-1b4d7ba71679')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.projects.get(project_id=\"4e1bfbc3\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "put": { + "operationId": "projects_update", + "summary": "Update a Project", + "description": "To update a project, send a PUT request to `/v2/projects/$PROJECT_ID`. All of the following attributes must be sent.", + "tags": [ + "Projects" + ], + "parameters": [ + { + "$ref": "#/components/parameters/project_id" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/project" + } + ], + "required": [ + "name", + "description", + "purpose", + "environment", + "is_default" + ] + } + } + } + }, + "responses": { + "200": { + "$ref": "#/components/responses/existing_project" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X PUT \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"name\":\"my-web-api\", \"description\": \"My website API\", \"purpose\": \"Service or API\", \"environment\": \"Staging\", \"is_default\": false}' \\\n \"https://api.digitalocean.com/v2/projects/4e1bfbc3\\\n -dc3e-41f2-a18f-1b4d7ba71679\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n updateReq := &godo.UpdateProjectRequest{\n Name: \"my-web-api\",\n Description: \"My website API\",\n Purpose: \"Service or API\",\n Environment: \"Staging\",\n IsDefault: false,\n }\n\n client.Projects.Update(ctx, \"4e1bfbc3-dc3e-41f2-a18f-1b4d7ba71679\", updateReq)\n\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nproject = client.projects.find(id: '4e1bfbc3-dc3e-41f2-a18f-1b4d7ba71679')\nproject.environment = 'Staging'\nclient.projects.update(project, id: '4e1bfbc3-dc3e-41f2-a18f-1b4d7ba71679')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"name\": \"my-web-api\",\n \"description\": \"My website API\",\n \"purpose\": \"Service or API\",\n \"environment\": \"Production\",\n \"is_default\": False\n}\n\nresp = client.projects.update_default(body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + }, + "patch": { + "operationId": "projects_patch", + "summary": "Patch a Project", + "description": "To update only specific attributes of a project, send a PATCH request to `/v2/projects/$PROJECT_ID`. At least one of the following attributes needs to be sent.", + "tags": [ + "Projects" + ], + "parameters": [ + { + "$ref": "#/components/parameters/project_id" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/project" + }, + "example": { + "name": "my-web-api" + } + } + } + }, + "responses": { + "200": { + "$ref": "#/components/responses/existing_project" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X PATCH \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"environment\": \"Staging\"}' \\\n \"https://api.digitalocean.com/v2/projects/4e1bfbc3\\\n -dc3e-41f2-a18f-1b4d7ba71679\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n updateReq := &godo.UpdateProjectRequest{\n Environment: \"Staging\",\n }\n\n client.Projects.Update(ctx, \"4e1bfbc3-dc3e-41f2-a18f-1b4d7ba71679\", updateReq)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nproject = client.projects.find(id: '4e1bfbc3-dc3e-41f2-a18f-1b4d7ba71679')\nproject.environment = 'Staging'\nclient.projects.update(project, id: '4e1bfbc3-dc3e-41f2-a18f-1b4d7ba71679')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"name\": \"my-web-api\"\n}\n\nresp = client.projects.patch(project_id=\"4e1bfbc3\", body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + }, + "delete": { + "operationId": "projects_delete", + "summary": "Delete an Existing Project", + "description": "To delete a project, send a DELETE request to `/v2/projects/$PROJECT_ID`. To\nbe deleted, a project must not have any resources assigned to it. Any existing\nresources must first be reassigned or destroyed, or you will receive a 412 error.\n\nA successful request will receive a 204 status code with no body in response.\nThis indicates that the request was processed successfully.\n", + "tags": [ + "Projects" + ], + "parameters": [ + { + "$ref": "#/components/parameters/project_id" + } + ], + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "412": { + "$ref": "#/components/responses/precondition_failed" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE -H 'Content-Type: application/json' -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/projects/4e1bfbc3-dc3e-41f2-a18f-1b4d7ba71679\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n _, err := client.Projects.Delete(ctx, '4e1bfbc3-dc3e-41f2-a18f-1b4d7ba71679')\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.projects.delete(id: '4e1bfbc3-dc3e-41f2-a18f-1b4d7ba71679') " + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.projects.delete(project_id=\"fda9fda\")" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/projects/{project_id}/resources": { + "get": { + "operationId": "projects_list_resources", + "summary": "List Project Resources", + "description": "To list all your resources in a project, send a GET request to `/v2/projects/$PROJECT_ID/resources`.", + "tags": [ + "Project Resources" + ], + "parameters": [ + { + "$ref": "#/components/parameters/project_id" + }, + { + "$ref": "#/components/parameters/per_page" + }, + { + "$ref": "#/components/parameters/page" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/resources_list" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/projects/4e1bfbc3-dc3e-41f2-a18f-1b4d7ba71679/resources\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n opt := &godo.ListOptions{\n PerPage: 10,\n Page: 1,\n }\n\n client.Projects.ListResources(ctx, \"4e1bfbc3-dc3e-41f2-a18f-1b4d7ba71679\", opt)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.projects.list_resources(id: '4e1bfbc3-dc3e-41f2-a18f-1b4d7ba71679')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.projects.list_resources(project_id=\"4e1bfbc3\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "post": { + "operationId": "projects_assign_resources", + "summary": "Assign Resources to a Project", + "description": "To assign resources to a project, send a POST request to `/v2/projects/$PROJECT_ID/resources`.", + "tags": [ + "Project Resources" + ], + "parameters": [ + { + "$ref": "#/components/parameters/project_id" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/project_assignment" + }, + "examples": { + "assign_resources": { + "value": { + "resources": [ + "do:droplet:13457723", + "do:domain:example.com" + ] + } + } + } + } + } + }, + "responses": { + "200": { + "$ref": "#/components/responses/assigned_resources_list" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"resources\": [\"do:droplet:1\", \"do:floatingip:192.168.99.100\"]}' \\\n \"https://api.digitalocean.com/v2/projects/4e1bfbc3-dc3e-41f2-a18f-1b4d7ba71679/resources\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n res := []interface{}{\n &godo.Droplet{ID: 1},\n \"do:droplet:42\",\n &godo.FloatingIP{IP: \"192.168.99.100\"},\n }\n\n client.Projects.AssignResources(ctx, \"4e1bfbc3-dc3e-41f2-a18f-1b4d7ba71679\", res...)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nresource = DropletKit::ProjectAssignment.new(urn: 'do:droplet:1')\nclient.projects.assign_resources([resource], id: '4e1bfbc3-dc3e-41f2-a18f-1b4d7ba71679')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"resources\": [\n \"do:droplet:13457723\",\n \"do:domain:example.com\"\n ]\n}\n\nresp = client.projects.assign_resources(project_id=\"8dafda\", body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/projects/default/resources": { + "get": { + "operationId": "projects_list_resources_default", + "summary": "List Default Project Resources", + "description": "To list all your resources in your default project, send a GET request to `/v2/projects/default/resources`.", + "tags": [ + "Project Resources" + ], + "responses": { + "200": { + "$ref": "#/components/responses/resources_list" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/projects/default/resources\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n opt := &godo.ListOptions{\n PerPage: 10,\n Page: 1,\n }\n\n client.Projects.ListResources(ctx, godo.DefaultProject, opt)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.projects.list_resources(id: 'default')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.projects.list_resources_default()" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "post": { + "operationId": "projects_assign_resources_default", + "summary": "Assign Resources to Default Project", + "description": "To assign resources to your default project, send a POST request to `/v2/projects/default/resources`.", + "tags": [ + "Project Resources" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/project_assignment" + }, + "examples": { + "assign_resources": { + "value": { + "resources": [ + "do:droplet:13457723", + "do:domain:example.com" + ] + } + } + } + } + } + }, + "responses": { + "200": { + "$ref": "#/components/responses/assigned_resources_list" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"resources\": [\"do:droplet:1\", \"do:floatingip:192.168.99.100\"]}' \\\n \"https://api.digitalocean.com/v2/projects/default/resources\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n res := []interface{}{\n &godo.Droplet{ID: 1},\n \"do:droplet:42\",\n &godo.FloatingIP{IP: \"192.168.99.100\"},\n }\n\n client.Projects.AssignResources(ctx, godo.DefaultProject, res...)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nresource = DropletKit::ProjectAssignment.new(urn: 'do:droplet:1')\nclient.projects.assign_resources([resource], id: 'default')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"resources\": [\n \"do:droplet:13457723\",\n \"do:domain:example.com\"\n ]\n}\n\nresp = client.projects.assign_resources_default(body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/regions": { + "get": { + "operationId": "regions_list", + "summary": "List All Data Center Regions", + "description": "To list all of the regions that are available, send a GET request to `/v2/regions`.\nThe response will be a JSON object with a key called `regions`. The value of this will be an array of `region` objects, each of which will contain the standard region attributes.", + "tags": [ + "Regions" + ], + "parameters": [ + { + "$ref": "#/components/parameters/per_page" + }, + { + "$ref": "#/components/parameters/page" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/all_regions" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/regions\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n opt := &godo.ListOptions{\n Page: 1,\n PerPage: 200,\n }\n\n regions, _, err := client.Regions.List(ctx, opt)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nregions = client.regions.all\nregions.each" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.regions.list()" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/registry": { + "get": { + "operationId": "registry_get", + "summary": "Get Container Registry Information", + "description": "To get information about your container registry, send a GET request to `/v2/registry`.", + "tags": [ + "Container Registry" + ], + "responses": { + "200": { + "$ref": "#/components/responses/registry_info" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/registry\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.registry.get()" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "post": { + "operationId": "registry_create", + "summary": "Create Container Registry", + "description": "To create your container registry, send a POST request to `/v2/registry`.\n\nThe `name` becomes part of the URL for images stored in the registry. For\nexample, if your registry is called `example`, an image in it will have the\nURL `registry.digitalocean.com/example/image:tag`.\n", + "tags": [ + "Container Registry" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/registry_create" + } + } + } + }, + "responses": { + "201": { + "$ref": "#/components/responses/registry_info" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"name\": \"example\", \"subscription_tier_slug\": \"basic\", \"region\": \"fra1\"}' \\\n \"https://api.digitalocean.com/v2/registry\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"name\": \"example\",\n \"subscription_tier_slug\": \"basic\",\n \"region\": \"fra1\"\n}\n\nresp = client.registry.create(body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + }, + "delete": { + "operationId": "registry_delete", + "summary": "Delete Container Registry", + "description": "To delete your container registry, destroying all container image data stored in it, send a DELETE request to `/v2/registry`.", + "tags": [ + "Container Registry" + ], + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/registry\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.registry.delete()" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/registry/subscription": { + "get": { + "operationId": "registry_get_subscription", + "summary": "Get Subscription Information", + "description": "A subscription is automatically created when you configure your container registry. To get information about your subscription, send a GET request to `/v2/registry/subscription`.", + "tags": [ + "Container Registry" + ], + "responses": { + "200": { + "$ref": "#/components/responses/subscription_response" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/registry/subscription\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.registry.get_subscription()" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "post": { + "operationId": "registry_update_subscription", + "summary": "Update Subscription Tier", + "description": "After creating your registry, you can switch to a different subscription tier to better suit your needs. To do this, send a POST request to `/v2/registry/subscription`.", + "tags": [ + "Container Registry" + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "tier_slug": { + "type": "string", + "enum": [ + "starter", + "basic", + "professional" + ], + "example": "basic", + "description": "The slug of the subscription tier to sign up for." + } + } + } + } + } + }, + "responses": { + "200": { + "$ref": "#/components/responses/subscription_response" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"tier_slug\": \"professional\"}' \\\n \"https://api.digitalocean.com/v2/registry/subscription\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"tier_slug\": \"basic\"\n}\n\nresp = client.registry.update_subscription(body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/registry/docker-credentials": { + "get": { + "operationId": "registry_get_dockerCredentials", + "summary": "Get Docker Credentials for Container Registry", + "description": "In order to access your container registry with the Docker client or from a\nKubernetes cluster, you will need to configure authentication. The necessary\nJSON configuration can be retrieved by sending a GET request to\n`/v2/registry/docker-credentials`.\n\nThe response will be in the format of a Docker `config.json` file. To use the\nconfig in your Kubernetes cluster, create a Secret with:\n\n kubectl create secret generic docr \\\n --from-file=.dockerconfigjson=config.json \\\n --type=kubernetes.io/dockerconfigjson\n\nBy default, the returned credentials have read-only access to your registry\nand cannot be used to push images. This is appropriate for most Kubernetes\nclusters. To retrieve read/write credentials, suitable for use with the Docker\nclient or in a CI system, read_write may be provided as query parameter. For\nexample: `/v2/registry/docker-credentials?read_write=true`\n\nBy default, the returned credentials will not expire. To retrieve credentials\nwith an expiry set, expiry_seconds may be provided as a query parameter. For\nexample: `/v2/registry/docker-credentials?expiry_seconds=3600` will return\ncredentials that expire after one hour.\n", + "tags": [ + "Container Registry" + ], + "parameters": [ + { + "$ref": "#/components/parameters/registry_expiry_seconds" + }, + { + "$ref": "#/components/parameters/registry_read_write" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/docker_credentials" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/registry/docker-credentials\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.registry.get_docker_credentials()" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/registry/validate-name": { + "post": { + "operationId": "registry_validate_name", + "summary": "Validate a Container Registry Name", + "description": "To validate that a container registry name is available for use, send a POST\nrequest to `/v2/registry/validate-name`.\n\nIf the name is both formatted correctly and available, the response code will\nbe 204 and contain no body. If the name is already in use, the response will\nbe a 409 Conflict.\n", + "tags": [ + "Container Registry" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/validate_registry" + } + } + } + }, + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "409": { + "$ref": "#/components/responses/conflict" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"name\": \"example\"}' \\\n \"https://api.digitalocean.com/v2/registry/validate-name\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"name\": \"example\"\n}\n\nresp = client.registry.validate_name(body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/registry/{registry_name}/repositories": { + "get": { + "operationId": "registry_list_repositories", + "deprecated": true, + "summary": "List All Container Registry Repositories", + "description": "This endpoint has been deprecated in favor of the _List All Container Registry Repositories [V2]_ endpoint.\n\nTo list all repositories in your container registry, send a GET\nrequest to `/v2/registry/$REGISTRY_NAME/repositories`.\n", + "tags": [ + "Container Registry" + ], + "parameters": [ + { + "$ref": "#/components/parameters/per_page" + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/registry_name" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/all_repositories" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/registry/example/repositories\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.registry.list_repositories(registry_name=\"example\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/registry/{registry_name}/repositoriesV2": { + "get": { + "operationId": "registry_list_repositoriesV2", + "summary": "List All Container Registry Repositories (V2)", + "description": "To list all repositories in your container registry, send a GET request to `/v2/registry/$REGISTRY_NAME/repositoriesV2`.", + "tags": [ + "Container Registry" + ], + "parameters": [ + { + "$ref": "#/components/parameters/per_page" + }, + { + "$ref": "#/components/parameters/token_pagination_page" + }, + { + "$ref": "#/components/parameters/token_pagination_page_token" + }, + { + "$ref": "#/components/parameters/registry_name" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/all_repositories_v2" + }, + "400": { + "$ref": "#/components/responses/bad_request" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/registry/example/repositoriesV2?page_size=1\"" + }, + { + "lang": "cURL (next page)", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/registry/example/repositoriesV2?page=2&page_token=JPZmZzZXQiOjB9&per_page=1\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.registry.list_repositories_v2(registry_name=\"example\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/registry/{registry_name}/repositories/{repository_name}/tags": { + "get": { + "operationId": "registry_list_repositoryTags", + "summary": "List All Container Registry Repository Tags", + "description": "To list all tags in your container registry repository, send a GET\nrequest to `/v2/registry/$REGISTRY_NAME/repositories/$REPOSITORY_NAME/tags`.\n\nNote that if your repository name contains `/` characters, it must be\nURL-encoded in the request URL. For example, to list tags for\n`registry.digitalocean.com/example/my/repo`, the path would be\n`/v2/registry/example/repositories/my%2Frepo/tags`.\n", + "tags": [ + "Container Registry" + ], + "parameters": [ + { + "$ref": "#/components/parameters/per_page" + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/registry_name" + }, + { + "$ref": "#/components/parameters/registry_repository_name" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/repository_tags" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/registry/example/repositories/repo-1/tags\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.registry.list_repository_tags(registry_name=\"example\", repository_name=\"repo01\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/registry/{registry_name}/repositories/{repository_name}/tags/{repository_tag}": { + "delete": { + "operationId": "registry_delete_repositoryTag", + "summary": "Delete Container Registry Repository Tag", + "description": "To delete a container repository tag, send a DELETE request to\n`/v2/registry/$REGISTRY_NAME/repositories/$REPOSITORY_NAME/tags/$TAG`.\n\nNote that if your repository name contains `/` characters, it must be\nURL-encoded in the request URL. For example, to delete\n`registry.digitalocean.com/example/my/repo:mytag`, the path would be\n`/v2/registry/example/repositories/my%2Frepo/tags/mytag`.\n\nA successful request will receive a 204 status code with no body in response.\nThis indicates that the request was processed successfully.\n", + "tags": [ + "Container Registry" + ], + "parameters": [ + { + "$ref": "#/components/parameters/registry_name" + }, + { + "$ref": "#/components/parameters/registry_repository_name" + }, + { + "$ref": "#/components/parameters/registry_repository_tag" + } + ], + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/registry/example/repositories/repo-1/tags/mytag\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.registry.delete_repository_tag(registry_name=\"example\", repository_name=\"repo-1\", repository_tag=\"06a447a\")" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/registry/{registry_name}/repositories/{repository_name}/digests": { + "get": { + "operationId": "registry_list_repositoryManifests", + "summary": "List All Container Registry Repository Manifests", + "description": "To list all manifests in your container registry repository, send a GET\nrequest to `/v2/registry/$REGISTRY_NAME/repositories/$REPOSITORY_NAME/digests`.\n\nNote that if your repository name contains `/` characters, it must be\nURL-encoded in the request URL. For example, to list manifests for\n`registry.digitalocean.com/example/my/repo`, the path would be\n`/v2/registry/example/repositories/my%2Frepo/digests`.\n", + "tags": [ + "Container Registry" + ], + "parameters": [ + { + "$ref": "#/components/parameters/per_page" + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/registry_name" + }, + { + "$ref": "#/components/parameters/registry_repository_name" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/repository_manifests" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/registry/example/repositories/repo-1/digests\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.registry.list_repository_manifests(registry_name=\"example\", repository_name=\"repo01\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/registry/{registry_name}/repositories/{repository_name}/digests/{manifest_digest}": { + "delete": { + "operationId": "registry_delete_repositoryManifest", + "summary": "Delete Container Registry Repository Manifest", + "description": "To delete a container repository manifest by digest, send a DELETE request to\n`/v2/registry/$REGISTRY_NAME/repositories/$REPOSITORY_NAME/digests/$MANIFEST_DIGEST`.\n\nNote that if your repository name contains `/` characters, it must be\nURL-encoded in the request URL. For example, to delete\n`registry.digitalocean.com/example/my/repo@sha256:abcd`, the path would be\n`/v2/registry/example/repositories/my%2Frepo/digests/sha256:abcd`.\n\nA successful request will receive a 204 status code with no body in response.\nThis indicates that the request was processed successfully.\n", + "tags": [ + "Container Registry" + ], + "parameters": [ + { + "$ref": "#/components/parameters/registry_name" + }, + { + "$ref": "#/components/parameters/registry_repository_name" + }, + { + "$ref": "#/components/parameters/registry_manifest_digest" + } + ], + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/registry/example/repositories/repo-1/digests/sha256:cb8a924afdf0229ef7515d9e5b3024e23b3eb03ddbba287f4a19c6ac90b8d221\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.registry.delete_repository_manifest(registry_name=\"example\", repository_name=\"repo-1\", manifest_digest=\"sha256:cb8a924afd\")" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/registry/{registry_name}/garbage-collection": { + "post": { + "operationId": "registry_run_garbageCollection", + "summary": "Start Garbage Collection", + "description": "Garbage collection enables users to clear out unreferenced blobs (layer &\nmanifest data) after deleting one or more manifests from a repository. If\nthere are no unreferenced blobs resulting from the deletion of one or more\nmanifests, garbage collection is effectively a noop.\n[See here for more information](https://www.digitalocean.com/docs/container-registry/how-to/clean-up-container-registry/)\nabout how and why you should clean up your container registry periodically.\n\nTo request a garbage collection run on your registry, send a POST request to\n`/v2/registry/$REGISTRY_NAME/garbage-collection`. This will initiate the\nfollowing sequence of events on your registry.\n\n* Set the registry to read-only mode, meaning no further write-scoped\n JWTs will be issued to registry clients. Existing write-scoped JWTs will\n continue to work until they expire which can take up to 15 minutes.\n* Wait until all existing write-scoped JWTs have expired.\n* Scan all registry manifests to determine which blobs are unreferenced.\n* Delete all unreferenced blobs from the registry.\n* Record the number of blobs deleted and bytes freed, mark the garbage\n collection status as `success`.\n* Remove the read-only mode restriction from the registry, meaning write-scoped\n JWTs will once again be issued to registry clients.\n", + "tags": [ + "Container Registry" + ], + "parameters": [ + { + "$ref": "#/components/parameters/registry_name" + } + ], + "responses": { + "201": { + "$ref": "#/components/responses/garbage_collection" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/registry/example/garbage-collection\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.registry.run_garbage_collection(registry_name=\"example\")" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + }, + "get": { + "operationId": "registry_get_garbageCollection", + "summary": "Get Active Garbage Collection", + "description": "To get information about the currently-active garbage collection for a registry, send a GET request to `/v2/registry/$REGISTRY_NAME/garbage-collection`.", + "tags": [ + "Container Registry" + ], + "parameters": [ + { + "$ref": "#/components/parameters/registry_name" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/garbage_collection" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/registry/example/garbage-collection\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.registry.get_garbage_collection(registry_name=\"example\")" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/registry/{registry_name}/garbage-collections": { + "get": { + "operationId": "registry_list_garbageCollections", + "summary": "List Garbage Collections", + "description": "To get information about past garbage collections for a registry, send a GET request to `/v2/registry/$REGISTRY_NAME/garbage-collections`.", + "tags": [ + "Container Registry" + ], + "parameters": [ + { + "$ref": "#/components/parameters/registry_name" + }, + { + "$ref": "#/components/parameters/per_page" + }, + { + "$ref": "#/components/parameters/page" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/garbage_collections" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/registry/example/garbage-collections\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.registry.list_garbage_collections(registry_name=\"example\")" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/registry/{registry_name}/garbage-collection/{garbage_collection_uuid}": { + "put": { + "operationId": "registry_update_garbageCollection", + "summary": "Update Garbage Collection", + "description": "To cancel the currently-active garbage collection for a registry, send a PUT request to `/v2/registry/$REGISTRY_NAME/garbage-collection/$GC_UUID` and specify one or more of the attributes below.", + "tags": [ + "Container Registry" + ], + "parameters": [ + { + "$ref": "#/components/parameters/registry_name" + }, + { + "$ref": "#/components/parameters/garbage_collection_uuid" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/update_registry" + } + } + } + }, + "responses": { + "200": { + "$ref": "#/components/responses/garbage_collection" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X PUT \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/registry/example/garbage-collection/example-gc-uuid\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.registry.run_garbage_collection(registry_name=\"example\")" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/registry/options": { + "get": { + "operationId": "registry_get_options", + "summary": "List Registry Options (Subscription Tiers and Available Regions)", + "description": "This endpoint serves to provide additional information as to which option values are available when creating a container registry.\nThere are multiple subscription tiers available for container registry. Each tier allows a different number of image repositories to be created in your registry, and has a different amount of storage and transfer included.\nThere are multiple regions available for container registry and controls where your data is stored.\nTo list the available options, send a GET request to `/v2/registry/options`.", + "tags": [ + "Container Registry" + ], + "responses": { + "200": { + "$ref": "#/components/responses/registry_options_response" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/registry/options\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.registry.get_options()" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/reports/droplet_neighbors_ids": { + "get": { + "operationId": "droplets_list_neighborsIds", + "summary": "List All Droplet Neighbors", + "description": "To retrieve a list of all Droplets that are co-located on the same physical\nhardware, send a GET request to `/v2/reports/droplet_neighbors_ids`.\n\nThe results will be returned as a JSON object with a key of `neighbor_ids`.\nThis will be set to an array of arrays. Each array will contain a set of\nDroplet IDs for Droplets that share a physical server. An empty array\nindicates that all Droplets associated with your account are located on\nseparate physical hardware.\n", + "tags": [ + "Droplets" + ], + "responses": { + "200": { + "$ref": "#/components/responses/droplet_neighbors_ids" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/reports/droplet_neighbors_ids\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.droplets.list_neighbors_ids()" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/reserved_ips": { + "get": { + "operationId": "reservedIPs_list", + "summary": "List All Reserved IPs", + "description": "To list all of the reserved IPs available on your account, send a GET request to `/v2/reserved_ips`.", + "tags": [ + "Reserved IPs" + ], + "parameters": [ + { + "$ref": "#/components/parameters/per_page" + }, + { + "$ref": "#/components/parameters/page" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/reserved_ip_list" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/reserved_ips?page=1&per_page=20\" " + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n opt := &godo.ListOptions{\n Page: 1,\n PerPage: 200,\n }\n\n reservedIPs, _, err := client.ReservedIPs.List(ctx, opt)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nreserved_ips = client.reserved_ips.all\nreserved_ips.each" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.reserved_ips.list()" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "post": { + "operationId": "reservedIPs_create", + "summary": "Create a New Reserved IP", + "description": "On creation, a reserved IP must be either assigned to a Droplet or reserved to a region.\n* To create a new reserved IP assigned to a Droplet, send a POST\n request to `/v2/reserved_ips` with the `droplet_id` attribute.\n\n* To create a new reserved IP reserved to a region, send a POST request to\n `/v2/reserved_ips` with the `region` attribute.\n\n**Note**: In addition to the standard rate limiting, only 12 reserved IPs may be created per 60 seconds.", + "tags": [ + "Reserved IPs" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/reserved_ip_create" + } + } + } + }, + "responses": { + "202": { + "$ref": "#/components/responses/reserved_ip_created" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"droplet_id\": 123456}' \\\n \"https://api.digitalocean.com/v2/reserved_ips\" " + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n createRequest := &godo.ReservedIPCreateRequest{\n DropletID: 123456,\n\n }\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nreserved_ip = DropletKit::ReservedIp.new(droplet_id: 123456)\nclient.reserved_ips.create(reserved_ip) " + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"droplet_id\": 2457247\n}\n\nresp = client.reserved_ips.create(body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/reserved_ips/{reserved_ip}": { + "get": { + "operationId": "reservedIPs_get", + "summary": "Retrieve an Existing Reserved IP", + "description": "To show information about a reserved IP, send a GET request to `/v2/reserved_ips/$RESERVED_IP_ADDR`.", + "tags": [ + "Reserved IPs" + ], + "parameters": [ + { + "$ref": "#/components/parameters/reserved_ip" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/reserved_ip" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/reserved_ips/45.55.96.47\" " + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n reservedIP, _, err := client.ReservedIPs.Get(ctx, \"45.55.96.47\")\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.reserved_ips.find(ip: '45.55.96.47')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.reserved_ips.get(reserved_ip=\"45.55.96.47\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "delete": { + "operationId": "reservedIPs_delete", + "summary": "Delete a Reserved IP", + "description": "To delete a reserved IP and remove it from your account, send a DELETE request\nto `/v2/reserved_ips/$RESERVED_IP_ADDR`.\n\nA successful request will receive a 204 status code with no body in response.\nThis indicates that the request was processed successfully.\n", + "tags": [ + "Reserved IPs" + ], + "parameters": [ + { + "$ref": "#/components/parameters/reserved_ip" + } + ], + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/reserved_ips/45.55.96.47\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n _, err := client.ReservedIPs.Delete(ctx, \"45.55.96.34\")\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.reserved_ips.delete(ip: '45.55.96.47') " + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.reserved_ips.delete(reserved_ip=\"45.55.96.47\")" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/reserved_ips/{reserved_ip}/actions": { + "get": { + "operationId": "reservedIPsActions_list", + "summary": "List All Actions for a Reserved IP", + "description": "To retrieve all actions that have been executed on a reserved IP, send a GET request to `/v2/reserved_ips/$RESERVED_IP/actions`.", + "tags": [ + "Reserved IP Actions" + ], + "parameters": [ + { + "$ref": "#/components/parameters/reserved_ip" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/reserved_ip_actions" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/reserved_ips/45.55.96.47/actions?page=1&per_page=1\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n opt := &godo.ListOptions{\n Page: 1,\n PerPage: 200,\n }\n\n actions, _, err := client.ReservedIPActions.List(ctx, '45.55.96.47', opt)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nactions = client.reserved_ip_actions.all(ip: '45.55.96.47')\nactions.each" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.reserved_ips_actions.list(reserved_ip=\"45.55.96.47\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "post": { + "operationId": "reservedIPsActions_post", + "summary": "Initiate a Reserved IP Action", + "description": "To initiate an action on a reserved IP send a POST request to\n`/v2/reserved_ips/$RESERVED_IP/actions`. In the JSON body to the request,\nset the `type` attribute to on of the supported action types:\n\n| Action | Details\n|------------|--------\n| `assign` | Assigns a reserved IP to a Droplet\n| `unassign` | Unassign a reserved IP from a Droplet\n", + "tags": [ + "Reserved IP Actions" + ], + "parameters": [ + { + "$ref": "#/components/parameters/reserved_ip" + } + ], + "requestBody": { + "description": "The `type` attribute set in the request body will specify the action that\nwill be taken on the reserved IP.\n", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/reserved_ip_action_unassign" + }, + { + "$ref": "#/components/schemas/reserved_ip_action_assign" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "unassign": "#/components/schemas/reserved_ip_action_unassign", + "assign": "#/components/schemas/reserved_ip_action_assign" + } + } + } + } + } + }, + "responses": { + "201": { + "$ref": "#/components/responses/reserved_ip_action" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "# Assign a Reserved IP to a Droplet\ncurl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"type\":\"assign\",\"droplet_id\":8219222}' \\\n \"https://api.digitalocean.com/v2/reserved_ips/45.55.96.47/actions\"\n\n# Unassign a Reserved IP\n# curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"type\":\"unassign\"}' \\\n \"https://api.digitalocean.com/v2/reserved_ips/45.55.96.47/actions\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n // Assign a Reserved IP to a Droplet\n action, _, err := client.ReservedIPActions.Assign(ctx, \"45.55.96.47\", 8219222)\n\n // Unassign a Reserved IP\n // action, _, err := client.ReservedIPActions.Unassign(ctx, \"45.55.96.47\") \n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\n# Assign a Reserved IP to a Droplet\nclient.reserved_ip_actions.assign(ip: '45.55.96.47', droplet_id: 8219222)\n\n# Unassign a Reserved IP\n# client.reserved_ip_actions.unassign(ip: '45.55.96.47')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq={\n \"type\": \"unassign\"\n}\n\nresp = client.reserved_ips_actions.post(reserved_ip=\"49.32.13.21\", body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/reserved_ips/{reserved_ip}/actions/{action_id}": { + "get": { + "operationId": "reservedIPsActions_get", + "summary": "Retrieve an Existing Reserved IP Action", + "description": "To retrieve the status of a reserved IP action, send a GET request to `/v2/reserved_ips/$RESERVED_IP/actions/$ACTION_ID`.", + "tags": [ + "Reserved IP Actions" + ], + "parameters": [ + { + "$ref": "#/components/parameters/reserved_ip" + }, + { + "$ref": "#/components/parameters/action_id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/reserved_ip_action" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/reserved_ips/45.55.96.47/actions/72531856\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n action, _, err := client.ReservedIPActions.Get(ctx, \"45.55.96.47\", 72531856)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.reserved_ip_actions.find(ip: '45.55.96.47', id: 72531856)" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.reserved_ips_actions.get(reserved_ip=\"45.55.96.47\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/sizes": { + "get": { + "operationId": "sizes_list", + "summary": "List All Droplet Sizes", + "description": "To list all of available Droplet sizes, send a GET request to `/v2/sizes`.\nThe response will be a JSON object with a key called `sizes`. The value of this will be an array of `size` objects each of which contain the standard size attributes.", + "tags": [ + "Sizes" + ], + "parameters": [ + { + "$ref": "#/components/parameters/per_page" + }, + { + "$ref": "#/components/parameters/page" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/all_sizes" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/sizes\" " + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n opt := &godo.ListOptions{\n Page: 1,\n PerPage: 200,\n }\n\n sizes, _, err := client.Sizes.List(ctx, opt)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nsizes = client.sizes.all\nsizes.each" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.sizes.list()" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/snapshots": { + "get": { + "operationId": "snapshots_list", + "summary": "List All Snapshots", + "description": "To list all of the snapshots available on your account, send a GET request to\n`/v2/snapshots`.\n\nThe response will be a JSON object with a key called `snapshots`. This will be\nset to an array of `snapshot` objects, each of which will contain the standard\nsnapshot attributes.\n\n### Filtering Results by Resource Type\n\nIt's possible to request filtered results by including certain query parameters.\n\n#### List Droplet Snapshots\n\nTo retrieve only snapshots based on Droplets, include the `resource_type`\nquery parameter set to `droplet`. For example, `/v2/snapshots?resource_type=droplet`.\n\n#### List Volume Snapshots\n\nTo retrieve only snapshots based on volumes, include the `resource_type`\nquery parameter set to `volume`. For example, `/v2/snapshots?resource_type=volume`.\n", + "tags": [ + "Snapshots" + ], + "parameters": [ + { + "$ref": "#/components/parameters/per_page" + }, + { + "$ref": "#/components/parameters/page" + }, + { + "$ref": "#/components/parameters/snapshot_resource_type" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/snapshots" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "# List all snapshots\ncurl -X GET \\\n -H 'Content-Type: application/json' \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/snapshots?page=1&per_page=1\"\n\n# List all Droplet snapshots\ncurl -X GET \\\n -H 'Content-Type: application/json' \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/snapshots?page=1&per_page=1&resource_type=droplet\"\n\n# List volume snapshots\ncurl -X GET \\\n -H 'Content-Type: application/json' \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/snapshots?page=1&per_page=1&resource_type=volume\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n opt := &godo.ListOptions{\n Page: 1,\n PerPage: 200,\n }\n// List all snapshots\n snapshots, _, err := client.Snapshots.List(ctx, opt)\n\n// List all Droplet snapshots\n// snapshots, _, err := client.Snapshots.ListDroplet(ctx, opt)\n\n// List all volume snapshots\n// snapshots, _, err := client.Snapshots.ListVolume(ctx, opt)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\n# List all snapshots\nsnapshots = client.snapshots.all\nsnapshots.each\n\n# List all Droplet snapshots\n# snapshots = client.snapshots.all(resource_type: 'droplet')\n# snapshots.each\n\n# List volume snapshots\n# snapshots = client.snapshots.all(resource_type: 'volume')\n# snapshots.each" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.snapshots.list()" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/snapshots/{snapshot_id}": { + "get": { + "operationId": "snapshots_get", + "summary": "Retrieve an Existing Snapshot", + "description": "To retrieve information about a snapshot, send a GET request to\n`/v2/snapshots/$SNAPSHOT_ID`.\n\nThe response will be a JSON object with a key called `snapshot`. The value of\nthis will be an snapshot object containing the standard snapshot attributes.\n", + "tags": [ + "Snapshots" + ], + "parameters": [ + { + "$ref": "#/components/parameters/snapshot_id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/snapshots_existing" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H 'Content-Type: application/json' \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/snapshots/fbe805e8-866b-11e6-96bf-000f53315a41\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n snapshot, _, err := client.Snapshots.Get(ctx, 'fbe805e8-866b-11e6-96bf-000f53315a41')\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nsnapshot = client.snapshots.find(id: 'fbe805e8-866b-11e6-96bf-000f53315a41')" + }, + { + "lang": "cURL", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.snapshots.get(snapshot_id=\"fbe805e8\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "delete": { + "operationId": "snapshots_delete", + "summary": "Delete a Snapshot", + "description": "Both Droplet and volume snapshots are managed through the `/v2/snapshots/`\nendpoint. To delete a snapshot, send a DELETE request to\n`/v2/snapshots/$SNAPSHOT_ID`.\n\nA status of 204 will be given. This indicates that the request was processed\nsuccessfully, but that no response body is needed.\n", + "tags": [ + "Snapshots" + ], + "parameters": [ + { + "$ref": "#/components/parameters/snapshot_id" + } + ], + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE \\\n -H 'Content-Type: application/json' \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/snapshots/fbe805e8-866b-11e6-96bf-000f53315a41\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n _, err := client.Snapshots.Delete(ctx, 'fbe805e8-866b-11e6-96bf-000f53315a41')\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.snapshots.delete(id: 'fbe805e8-866b-11e6-96bf-000f53315a41')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.snapshots.delete(snapshot_id=\"fbe805e8\")" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/tags": { + "get": { + "operationId": "tags_list", + "summary": "List All Tags", + "description": "To list all of your tags, you can send a GET request to `/v2/tags`.", + "tags": [ + "Tags" + ], + "parameters": [ + { + "$ref": "#/components/parameters/per_page" + }, + { + "$ref": "#/components/parameters/page" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/tags_all" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/tags\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n opt := &godo.ListOptions{\n Page: 1,\n PerPage: 200,\n }\n tags, _, err := client.Tags.List(ctx, opt)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\ntags = client.tags.all\ntags.each" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.tags.list()" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "post": { + "operationId": "tags_create", + "summary": "Create a New Tag", + "description": "To create a tag you can send a POST request to `/v2/tags` with a `name` attribute.", + "tags": [ + "Tags" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/tags" + } + } + } + }, + "responses": { + "201": { + "$ref": "#/components/responses/tags_new" + }, + "400": { + "$ref": "#/components/responses/tags_bad_request" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"name\":\"awesome\"}' \\\n \"https://api.digitalocean.com/v2/tags\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n createRequest := &TagCreateRequest{\n Name: \"testing-1\",\n }\n client.Tags.Create(ctx, request)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\ntag = DropletKit::Tag.new(name: 'awesome')\nclient.tags.create(tag)" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"tag\": {\n \"name\": \"extra-awesome\",\n \"resources\": {\n \"count\": 0,\n \"droplets\": {\n \"count\": 0\n },\n \"images\": {\n \"count\": 0\n },\n \"volumes\": {\n \"count\": 0\n },\n \"volume_snapshots\": {\n \"count\": 0\n },\n \"databases\": {\n \"count\": 0\n }\n }\n }\n}\n\nresp = client.tags.create(body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/tags/{tag_id}": { + "get": { + "operationId": "tags_get", + "summary": "Retrieve a Tag", + "description": "To retrieve an individual tag, you can send a `GET` request to `/v2/tags/$TAG_NAME`.", + "tags": [ + "Tags" + ], + "parameters": [ + { + "$ref": "#/components/parameters/tag_id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/tags_existing" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/tags/awesome\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n tag, _, err := client.Tags.Get(ctx, \"awesome\")\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.tags.find(name: 'awesome')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.tags.get(tag_id=\"awesome\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "delete": { + "operationId": "tags_delete", + "summary": "Delete a Tag", + "description": "A tag can be deleted by sending a `DELETE` request to `/v2/tags/$TAG_NAME`. Deleting a tag also untags all the resources that have previously been tagged by the Tag", + "tags": [ + "Tags" + ], + "parameters": [ + { + "$ref": "#/components/parameters/tag_id" + } + ], + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/tags/awesome\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n client.Tags.Delete(ctx, \"awesome\")\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.tags.delete(name: 'awesome')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.tags.delete(tag_id=\"awesome\")" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/tags/{tag_id}/resources": { + "post": { + "operationId": "tags_assign_resources", + "summary": "Tag a Resource", + "description": "Resources can be tagged by sending a POST request to `/v2/tags/$TAG_NAME/resources` with an array of json objects containing `resource_id` and `resource_type` attributes.\nCurrently only tagging of Droplets, Databases, Images, Volumes, and Volume Snapshots is supported. `resource_type` is expected to be the string `droplet`, `database`, `image`, `volume` or `volume_snapshot`. `resource_id` is expected to be the ID of the resource as a string.", + "tags": [ + "Tags" + ], + "parameters": [ + { + "$ref": "#/components/parameters/tag_id" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/tags_resource" + } + } + } + }, + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"resources\":[{\"resource_id\":\"9569411\",\"resource_type\":\"droplet\"},{\"resource_id\":\"7555620\",\"resource_type\":\"image\"},{\"resource_id\":\"3d80cb72-342b-4aaa-b92e-4e4abb24a933\",\"resource_type\":\"volume\"}]}' \\\n \"https://api.digitalocean.com/v2/tags/awesome/resources\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n opt := &godo.ListOptions{\n Page: 1,\n PerPage: 200,\n }\n tags, _, err := client.Tags.List(ctx, opt)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.tags.tag_resources(name: 'awesome', resources: [{ resource_id: '9569411', resource_type: 'droplet' },{ resource_id: '7555620', resource_type: 'image' },{ resource_id: '3d80cb72-342b-4aaa-b92e-4e4abb24a933', resource_type: 'volume'}])" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"resources\": [\n {\n \"resource_id\": \"9569411\",\n \"resource_type\": \"droplet\"\n },\n {\n \"resource_id\": \"7555620\",\n \"resource_type\": \"image\"\n },\n {\n \"resource_id\": \"3d80cb72-342b-4aaa-b92e-4e4abb24a933\",\n \"resource_type\": \"volume\"\n }\n ]\n}\n\nresp = client.tags.assign_resources(tag_id=\"awesome\", body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + }, + "delete": { + "operationId": "tags_unassign_resources", + "summary": "Untag a Resource", + "description": "Resources can be untagged by sending a DELETE request to `/v2/tags/$TAG_NAME/resources` with an array of json objects containing `resource_id` and `resource_type` attributes.\nCurrently only untagging of Droplets, Databases, Images, Volumes, and Volume Snapshots is supported. `resource_type` is expected to be the string `droplet`, `database`, `image`, `volume` or `volume_snapshot`. `resource_id` is expected to be the ID of the resource as a string.", + "tags": [ + "Tags" + ], + "parameters": [ + { + "$ref": "#/components/parameters/tag_id" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/tags_resource" + } + } + } + }, + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"resources\":[{\"resource_id\":\"9569411\",\"resource_type\":\"droplet\"},{\"resource_id\":\"7555620\",\"resource_type\":\"image\"},{\"resource_id\":\"3d80cb72-342b-4aaa-b92e-4e4abb24a933\",\"resource_type\":\"volume\"}]}' \\\n \"https://api.digitalocean.com/v2/tags/awesome/resources\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n untagResourcesRequest := &godo.UntagResourcesRequest{\n Resources: []Resource{{ID: \"11457573\", Type: \"droplet\"},{ID: \"7555620\", Type: \"image\"},{ID: \"3d80cb72-342b-4aaa-b92e-4e4abb24a933\", Type: \"volume\"}},\n }\n client.Tags.UntagResources(ctx, \"awesome\", untagResourcesRequest)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.tags.untag_resources(name: 'awesome', resources: [{ resource_id: '9569411', resource_type: 'droplet' },{ resource_id: '7555620', resource_type: 'image' },{ resource_id: '3d80cb72-342b-4aaa-b92e-4e4abb24a933', resource_type: 'volume' }])" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"resources\": [\n {\n \"resource_id\": \"9569411\",\n \"resource_type\": \"droplet\"\n },\n {\n \"resource_id\": \"7555620\",\n \"resource_type\": \"image\"\n },\n {\n \"resource_id\": \"3d80cb72-342b-4aaa-b92e-4e4abb24a933\",\n \"resource_type\": \"volume\"\n }\n ]\n}\n\nresp = client.tags.unassign_resources(tag_id=\"awesome\", body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/volumes": { + "get": { + "operationId": "volumes_list", + "summary": "List All Block Storage Volumes", + "description": "To list all of the block storage volumes available on your account, send a GET request to `/v2/volumes`.\n## Filtering Results\n### By Region\nThe `region` may be provided as query parameter in order to restrict results to volumes available in a specific region. For example: `/v2/volumes?region=nyc1`\n### By Name\nIt is also possible to list volumes on your account that match a specified name. To do so, send a GET request with the volume's name as a query parameter to `/v2/volumes?name=$VOLUME_NAME`.\n**Note:** You can only create one volume per region with the same name.\n### By Name and Region\nIt is also possible to retrieve information about a block storage volume by name. To do so, send a GET request with the volume's name and the region slug for the region it is located in as query parameters to `/v2/volumes?name=$VOLUME_NAME®ion=nyc1`.\n\n\n", + "tags": [ + "Block Storage" + ], + "parameters": [ + { + "$ref": "#/components/parameters/volume_name" + }, + { + "$ref": "#/components/parameters/region" + }, + { + "$ref": "#/components/parameters/per_page" + }, + { + "$ref": "#/components/parameters/page" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/volumes" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "# List all volumes\ncurl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/volumes?region=nyc1\"\n\n# List volumes filtered by name\ncurl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/volumes?name=example\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n opt := &godo.ListOptions{\n Page: 1,\n PerPage: 200,\n }\n\n volumes, _, err := client.Storage.ListVolumes(ctx, opt)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nvolumes = client.volumes.all\nvolumes.each" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.volumes.list(region=\"nyc3\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "post": { + "operationId": "volumes_create", + "summary": "Create a New Block Storage Volume", + "description": "To create a new volume, send a POST request to `/v2/volumes`. Optionally, a `filesystem_type` attribute may be provided in order to automatically format the volume's filesystem. Pre-formatted volumes are automatically mounted when attached to Ubuntu, Debian, Fedora, Fedora Atomic, and CentOS Droplets created on or after April 26, 2018. Attaching pre-formatted volumes to Droplets without support for auto-mounting is not recommended.", + "tags": [ + "Block Storage" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/volumes_ext4" + }, + { + "$ref": "#/components/schemas/volumes_xfs" + } + ] + }, + "examples": { + "ext4 volume": { + "value": { + "size_gigabytes": 10, + "name": "ext4-example", + "description": "Block store for examples", + "region": "nyc1", + "filesystem_type": "ext4", + "filesystem_label": "ext4_volume_01" + } + }, + "xfs volume": { + "value": { + "size_gigabytes": 10, + "name": "xfs_example", + "description": "Block store for examples", + "region": "nyc1", + "filesystem_type": "xfs", + "filesystem_label": "xfs_volume01" + } + }, + "Volume from a snapshot": { + "value": { + "size_gigabytes": 10, + "name": "snapshot_example", + "snapshot_id": "b0798135-fb76-11eb-946a-0a58ac146f33", + "region": "nyc1", + "description": "A new volume based on a snapshot", + "filesystem_type": "ext4", + "filesystem_label": "ext4_volume_01" + } + } + } + } + } + }, + "responses": { + "201": { + "$ref": "#/components/responses/volume" + }, + "400": { + "$ref": "#/components/responses/bad_request" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"size_gigabytes\":10, \"name\": \"example\", \"description\": \"Block store for examples\", \"region\": \"nyc1\", \"filesystem_type\": \"ext4\", \"filesystem_label\": \"example\"}' \\\n \"https://api.digitalocean.com/v2/volumes\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n createRequest := &VolumeCreateRequest{\n Region: \"nyc1\",\n Name: \"example\",\n Description: \"Block store for examples\",\n SizeGigaBytes: 10,\n }\n\n volume, _, err := client.Storage.CreateVolume(ctx, createRequest)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nvolume = DropletKit::Volume.new(\n size_gigabytes: 10,\n name: 'Example',\n description: 'Block store for examples',\n region: 'nyc1'\n)\nclient.volumes.create(volume)" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"size_gigabytes\": 10,\n \"name\": \"ext4-example\",\n \"description\": \"Block store for examples\",\n \"region\": \"nyc1\",\n \"filesystem_type\": \"ext4\",\n \"filesystem_label\": \"ext4_volume_01\"\n}\n\nresp = client.volumes.create(body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + }, + "delete": { + "operationId": "volumes_delete_byName", + "summary": "Delete a Block Storage Volume by Name", + "description": "Block storage volumes may also be deleted by name by sending a DELETE request with the volume's **name** and the **region slug** for the region it is located in as query parameters to `/v2/volumes?name=$VOLUME_NAME®ion=nyc1`.\nNo response body will be sent back, but the response code will indicate success. Specifically, the response code will be a 204, which means that the action was successful with no returned body data.\n\n", + "tags": [ + "Block Storage" + ], + "parameters": [ + { + "$ref": "#/components/parameters/volume_name" + }, + { + "$ref": "#/components/parameters/region" + } + ], + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/volumes?name=example®ion=nyc1\" " + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.volumes.delete_by_name(name=\"ext4-ex\")" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/volumes/actions": { + "post": { + "operationId": "volumeActions_post", + "summary": "Initiate A Block Storage Action By Volume Name", + "description": "To initiate an action on a block storage volume by Name, send a POST request to\n`~/v2/volumes/actions`. The body should contain the appropriate\nattributes for the respective action.\n\n## Attach a Block Storage Volume to a Droplet\n\n| Attribute | Details |\n| ----------- | ------------------------------------------------------------------- |\n| type | This must be `attach` |\n| volume_name | The name of the block storage volume |\n| droplet_id | Set to the Droplet's ID |\n| region | Set to the slug representing the region where the volume is located |\n\nEach volume may only be attached to a single Droplet. However, up to five\nvolumes may be attached to a Droplet at a time. Pre-formatted volumes will be\nautomatically mounted to Ubuntu, Debian, Fedora, Fedora Atomic, and CentOS\nDroplets created on or after April 26, 2018 when attached. On older Droplets,\n[additional configuration](https://www.digitalocean.com/community/tutorials/how-to-partition-and-format-digitalocean-block-storage-volumes-in-linux#mounting-the-filesystems)\nis required.\n\n## Remove a Block Storage Volume from a Droplet\n\n| Attribute | Details |\n| ----------- | ------------------------------------------------------------------- |\n| type | This must be `detach` |\n| volume_name | The name of the block storage volume |\n| droplet_id | Set to the Droplet's ID |\n| region | Set to the slug representing the region where the volume is located |\n", + "tags": [ + "Block Storage Actions" + ], + "parameters": [ + { + "$ref": "#/components/parameters/per_page" + }, + { + "$ref": "#/components/parameters/page" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/volume_action_post_attach" + }, + { + "$ref": "#/components/schemas/volume_action_post_detach" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "attach": "#/components/schemas/volume_action_post_attach", + "detach": "#/components/schemas/volume_action_post_detach" + } + } + }, + "examples": { + "VolumeActionAttach": { + "value": { + "type": "attach", + "volume_name": "example", + "droplet_id": 11612190, + "region": "nyc1", + "tags": [ + "aninterestingtag" + ] + } + }, + "VolumeActionDetach": { + "value": { + "type": "detach", + "volume_name": "example", + "droplet_id": 11612190, + "region": "nyc1" + } + } + } + } + } + }, + "responses": { + "202": { + "$ref": "#/components/responses/volumeAction" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "# Attach a volume to a Droplet by name\ncurl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"type\": \"attach\", \"volume_name\": \"example\", \"region\": \"nyc1\", \"droplet_id\": \"11612190\",\"tags\":[\"aninterestingtag\"] }' \\\n \"https://api.digitalocean.com/v2/volumes/actions\"\n\n# Remove a volume from a Droplet by name\ncurl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"type\": \"detach\", \"droplet_id\": \"11612190\", \"volume_name\": \"example\", \"region\": \"nyc1\"}' \\\n \"https://api.digitalocean.com/v2/volumes/actions\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"type\": \"attach\",\n \"volume_name\": \"example\",\n \"droplet_id\": 11612190,\n \"region\": \"nyc1\",\n \"tags\": [\n \"aninterestingtag\"\n ]\n}\n\nresp = client.volume_actions.post(body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/volumes/snapshots/{snapshot_id}": { + "get": { + "operationId": "volumeSnapshots_get_byId", + "summary": "Retrieve an Existing Volume Snapshot", + "description": "To retrieve the details of a snapshot that has been created from a volume, send a GET request to `/v2/volumes/snapshots/$SNAPSHOT_ID`.\n\n", + "tags": [ + "Block Storage" + ], + "parameters": [ + { + "$ref": "#/components/parameters/snapshot_id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/volumeSnapshot" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H 'Content-Type: application/json' \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/volumes/snapshots/fbe805e8-866b-11e6-96bf-000f53315a41\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"name\": \"big-data-snapshot1475261774\"\n}\n\nresp = client.volume_snapshots.get_by_id(snapshot_id=\"da3aa3a\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "delete": { + "operationId": "volumeSnapshots_delete_byId", + "summary": "Delete a Volume Snapshot", + "description": "To delete a volume snapshot, send a DELETE request to\n`/v2/snapshots/$SNAPSHOT_ID`.\n\nA status of 204 will be given. This indicates that the request was processed\nsuccessfully, but that no response body is needed.\n", + "tags": [ + "Block Storage" + ], + "parameters": [ + { + "$ref": "#/components/parameters/snapshot_id" + } + ], + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE \\\n -H 'Content-Type: application/json' \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/snapshots/fbe805e8-866b-11e6-96bf-000f53315a41\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n _, err := client.Storage.DeleteSnapshot(ctx, \"82a48a18-873f-11e6-96bf-000f53315a41\")\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.snapshots.delete(id: \"fbe805e8-866b-11e6-96bf-000f53315a41\")" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"name\": \"big-data-snapshot1475261774\"\n}\n\nresp = client.volume_snapshots.delete_by_id(snapshot_id=\"da3aa3a\")" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/volumes/{volume_id}": { + "get": { + "operationId": "volumes_get", + "summary": "Retrieve an Existing Block Storage Volume", + "description": "To show information about a block storage volume, send a GET request to `/v2/volumes/$VOLUME_ID`.\n\n", + "tags": [ + "Block Storage" + ], + "parameters": [ + { + "$ref": "#/components/parameters/volume_id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/volume" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "# Retrieve an existing volume\ncurl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/volumes/7724db7c-e098-11e5-b522-000f53304e51\"\n\n# Retrieve and existing volume by name\ncurl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/volumes?name=example®ion=nyc1\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n volume, _, err := client.Storage.GetVolume(ctx, \"7724db7c-e098-11e5-b522-000f53304e51\")\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.volumes.find(id: '7724db7c-e098-11e5-b522-000f53304e51')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.volumes.get(volume_id=\"7724db7c\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "delete": { + "operationId": "volumes_delete", + "summary": "Delete a Block Storage Volume", + "description": "To delete a block storage volume, destroying all data and removing it from your account, send a DELETE request to `/v2/volumes/$VOLUME_ID`.\nNo response body will be sent back, but the response code will indicate success. Specifically, the response code will be a 204, which means that the action was successful with no returned body data.\n\n", + "tags": [ + "Block Storage" + ], + "parameters": [ + { + "$ref": "#/components/parameters/volume_id" + } + ], + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/volumes/7724db7c-e098-11e5-b522-000f53304e51\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n _, err := client.Storage.DeleteVolume(ctx, \"7724db7c-e098-11e5-b522-000f53304e51\")\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.volumes.delete(id: '7724db7c-e098-11e5-b522-000f53304e51')" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.volumes.delete(volume_id=\"7724db7c\")" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/volumes/{volume_id}/actions": { + "get": { + "operationId": "volumeActions_list", + "summary": "List All Actions for a Volume", + "description": "To retrieve all actions that have been executed on a volume, send a GET request to `/v2/volumes/$VOLUME_ID/actions`.\n\n", + "tags": [ + "Block Storage Actions" + ], + "parameters": [ + { + "$ref": "#/components/parameters/volume_id" + }, + { + "$ref": "#/components/parameters/per_page" + }, + { + "$ref": "#/components/parameters/page" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/volumeActions" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/volumes/7724db7c-e098-11e5-b522-000f53304e51/actions?page=1&per_page=1\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n opt := &godo.ListOptions{\n Page: 1,\n PerPage: 200,\n }\n\n actions, _, err := client.StorageActions(ctx, \"7724db7c-e098-11e5-b522-000f53304e51\", opt)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nactions = client.volume.actions(id: '7724db7c-e098-11e5-b522-000f53304e51')\nactions.each" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.volume_actions.list(volume_id=\"7724db7c\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "post": { + "operationId": "volumeActions_post_byId", + "summary": "Initiate A Block Storage Action By Volume Id", + "description": "To initiate an action on a block storage volume by Id, send a POST request to\n`~/v2/volumes/$VOLUME_ID/actions`. The body should contain the appropriate\nattributes for the respective action.\n\n## Attach a Block Storage Volume to a Droplet\n\n| Attribute | Details |\n| ---------- | ------------------------------------------------------------------- |\n| type | This must be `attach` |\n| droplet_id | Set to the Droplet's ID |\n| region | Set to the slug representing the region where the volume is located |\n\nEach volume may only be attached to a single Droplet. However, up to seven\nvolumes may be attached to a Droplet at a time. Pre-formatted volumes will be\nautomatically mounted to Ubuntu, Debian, Fedora, Fedora Atomic, and CentOS\nDroplets created on or after April 26, 2018 when attached. On older Droplets,\n[additional configuration](https://www.digitalocean.com/community/tutorials/how-to-partition-and-format-digitalocean-block-storage-volumes-in-linux#mounting-the-filesystems)\nis required.\n\n## Remove a Block Storage Volume from a Droplet\n\n| Attribute | Details |\n| ---------- | ------------------------------------------------------------------- |\n| type | This must be `detach` |\n| droplet_id | Set to the Droplet's ID |\n| region | Set to the slug representing the region where the volume is located |\n\n## Resize a Volume\n\n| Attribute | Details |\n| -------------- | ------------------------------------------------------------------- |\n| type | This must be `resize` |\n| size_gigabytes | The new size of the block storage volume in GiB (1024^3) |\n| region | Set to the slug representing the region where the volume is located |\n\nVolumes may only be resized upwards. The maximum size for a volume is 16TiB.\n", + "tags": [ + "Block Storage Actions" + ], + "parameters": [ + { + "$ref": "#/components/parameters/volume_id" + }, + { + "$ref": "#/components/parameters/per_page" + }, + { + "$ref": "#/components/parameters/page" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/volume_action_post_attach" + }, + { + "$ref": "#/components/schemas/volume_action_post_detach" + }, + { + "$ref": "#/components/schemas/volume_action_post_resize" + } + ], + "discriminator": { + "propertyName": "type", + "mapping": { + "attach": "#/components/schemas/volume_action_post_attach", + "detach": "#/components/schemas/volume_action_post_detach", + "resize": "#/components/schemas/volume_action_post_resize" + } + } + }, + "examples": { + "VolumeActionAttach": { + "value": { + "type": "attach", + "droplet_id": 11612190, + "region": "nyc1", + "tags": [ + "aninterestingtag" + ] + } + }, + "VolumeActionDetach": { + "value": { + "type": "detach", + "droplet_id": 11612190, + "region": "nyc1" + } + }, + "VolumeActionResize": { + "value": { + "type": "resize", + "size_gigabytes": 100, + "region": "nyc1" + } + } + } + } + } + }, + "responses": { + "202": { + "$ref": "#/components/responses/volumeAction" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "# Attach a Volume to a Droplet by ID\ncurl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"type\": \"attach\", \"droplet_id\": 11612190, \"region\": \"nyc1\", \"tags\":[\"aninterestingtag\"]}' \\\n \"https://api.digitalocean.com/v2/volumes/7724db7c-e098-11e5-b522-000f53304e51/actions\"\n\n# Remove a Volume from a Droplet by ID\ncurl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"type\": \"detach\", \"droplet_id\": \"11612190\", \"region\": \"nyc1\"}' \\\n \"https://api.digitalocean.com/v2/volumes/7724db7c-e098-11e5-b522-000f53304e51/actions\"\n\n# Resize a Volume\ncurl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"type\":\"resize\",\"size_gigabytes\": 100, \"region\":\"nyc1\"}' \\\n \"https://api.digitalocean.com/v2/volumes/7724db7c-e098-11e5-b522-000f53304e51/actions\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n // Attach a Volume to a Droplet by ID\n action, _, err := client.StorageActions.Attach(ctx, \"7724db7c-e098-11e5-b522-000f53304e51\", 11612190)\n\n // Remove a Volume from a Droplet by ID\n // action, _, err := client.StorageActions.Detach(ctx, \"7724db7c-e098-11e5-b522-000f53304e51\")\n\n // Resize a Volume\n // action, _, err := client.StorageActions.Resize(ctx, \"7724db7c-e098-11e5-b522-000f53304e51\", 100, \"nyc1\")\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\n# Attach a Volume to a Droplet by ID\nclient.volume_actions.attach(volume_id:'7724db7c-e098-11e5-b522-000f53304e51', droplet_id: 11612190, region: 'nyc1'\n\n\n# Remove a Volume from a Droplet by ID\n# client.volume_actions.detach(volume_id:'7724db7c-e098-11e5-b522-000f53304e51', droplet_id: 11612190, region: 'nyc1'" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"type\": \"attach\",\n \"droplet_id\": 11612190,\n \"region\": \"nyc1\",\n \"tags\": [\n \"aninterestingtag\"\n ]\n}\n\nresp = client.volume_actions.post_by_id(volume_id=\"7724db7c\", body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/volumes/{volume_id}/actions/{action_id}": { + "get": { + "operationId": "volumeActions_get", + "summary": "Retrieve an Existing Volume Action", + "description": "To retrieve the status of a volume action, send a GET request to `/v2/volumes/$VOLUME_ID/actions/$ACTION_ID`.\n\n", + "tags": [ + "Block Storage Actions" + ], + "parameters": [ + { + "$ref": "#/components/parameters/volume_id" + }, + { + "$ref": "#/components/parameters/action_id" + }, + { + "$ref": "#/components/parameters/per_page" + }, + { + "$ref": "#/components/parameters/page" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/volumeAction" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/volumes/7724db7c-e098-11e5-b522-000f53304e51/actions/72531856\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n action, _, err := client.StorageActions.Get(ctx, \"7724db7c-e098-11e5-b522-000f53304e51\", 72531856)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.volume.actions.find(volume_id: '7724db7c-e098-11e5-b522-000f53304e51', id: 72531856)" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.volume_actions.get(volume_id=\"7724db7c\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/volumes/{volume_id}/snapshots": { + "get": { + "operationId": "volumeSnapshots_list", + "summary": "List Snapshots for a Volume", + "description": "To retrieve the snapshots that have been created from a volume, send a GET request to `/v2/volumes/$VOLUME_ID/snapshots`.\n\n", + "tags": [ + "Block Storage" + ], + "parameters": [ + { + "$ref": "#/components/parameters/volume_id" + }, + { + "$ref": "#/components/parameters/per_page" + }, + { + "$ref": "#/components/parameters/page" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/volumeSnapshots" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H 'Content-Type: application/json' \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/volumes/82a48a18-873f-11e6-96bf-000f53315a41/snapshots?page=1&per_page=1\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n opt := &godo.ListOptions{\n Page: 1,\n PerPage: 200,\n }\n\n volumes, _, err := client.Storage.ListSnapshots(ctx, '82a48a18-873f-11e6-96bf-000f53315a41', opt)\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nsnapshots = client.volumes.snapshots(id: '82a48a18-873f-11e6-96bf-000f53315a41')\nsnapshots.each" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"name\": \"big-data-snapshot1475261774\"\n}\n\nresp = client.volume_snapshots.list(snapshot_id=\"da3aa3a\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "post": { + "operationId": "volumeSnapshots_create", + "summary": "Create Snapshot from a Volume", + "description": "To create a snapshot from a volume, sent a POST request to `/v2/volumes/$VOLUME_ID/snapshots`.", + "tags": [ + "Block Storage" + ], + "parameters": [ + { + "$ref": "#/components/parameters/volume_id" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "properties": { + "name": { + "type": "string", + "description": "A human-readable name for the volume snapshot.", + "example": "big-data-snapshot1475261774" + }, + "tags": { + "$ref": "#/components/schemas/tags_array" + } + }, + "required": [ + "name" + ] + }, + "example": { + "name": "big-data-snapshot1475261774" + } + } + } + }, + "responses": { + "201": { + "$ref": "#/components/responses/volumeSnapshot" + }, + "400": { + "$ref": "#/components/responses/bad_request" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H 'Content-Type: application/json' \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"name\":\"big-data-snapshot1475261774\", \"tags\":[\"aninterestingtag\"]}' \\\n \"https://api.digitalocean.com/v2/volumes/82a48a18-873f-11e6-96bf-000f53315a41/snapshots\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n snapshot, _, err := client.Storage.CreateSnapshot(ctx, &godo.SnapshotCreateRequest{\n VolumeID: \"82a48a18-873f-11e6-96bf-000f53315a41\",\n Name: \"my snapshot\",\n Description: \"my description\",\n Tags: []string{\"one\", \"two\"},\n })\n}" + }, + { + "lang": "Ruby", + "source": "require 'droplet_kit'\ntoken = ENV['DIGITALOCEAN_TOKEN']\nclient = DropletKit::Client.new(access_token: token)\n\nclient.volumes.create_snapshot(id: \"82a48a18-873f-11e6-96bf-000f53315a41\", name: \"big-data-snapshot1475261774\")" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"name\": \"big-data-snapshot1475261774\"\n}\n\nresp = client.volume_snapshots.create(volume_id=\"da3aa3a\", body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/vpcs": { + "get": { + "operationId": "vpcs_list", + "summary": "List All VPCs", + "description": "To list all of the VPCs on your account, send a GET request to `/v2/vpcs`.", + "tags": [ + "VPCs" + ], + "parameters": [ + { + "$ref": "#/components/parameters/per_page" + }, + { + "$ref": "#/components/parameters/page" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/all_vpcs" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/vpcs\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n opts := &godo.ListOptions{\n Page: 1,\n PerPage: 200,\n }\n\n vpcs, _, err := client.VPCs.List(ctx, opts)\n}" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.vpcs.list()" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "post": { + "operationId": "vpcs_create", + "summary": "Create a New VPC", + "description": "To create a VPC, send a POST request to `/v2/vpcs` specifying the attributes\nin the table below in the JSON body.\n\n**Note:** If you do not currently have a VPC network in a specific datacenter\nregion, the first one that you create will be set as the default for that\nregion. The default VPC for a region cannot be changed or deleted.\n", + "tags": [ + "VPCs" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/vpc_updatable" + }, + { + "$ref": "#/components/schemas/vpc_create" + } + ], + "required": [ + "name", + "region" + ] + } + } + } + }, + "responses": { + "201": { + "$ref": "#/components/responses/existing_vpc" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"name\":\"my-new-vpc\", \"region\":\"nyc1\", \"ip_range\": \"10.10.10.0/24\"}' \\\n \"https://api.digitalocean.com/v2/vpcs\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n createRequest := &godo.VPCCreateRequest{\n Name: \"my-new-vpc\",\n RegionSlug: \"nyc1\",\n IPRange: \"10.10.10.0/24\",\n }\n\n vpc, _, err := client.VPCs.Create(ctx, createRequest)\n}" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"name\": \"env.prod-vpc\",\n \"description\": \"VPC for production environment\",\n \"region\": \"nyc1\",\n \"ip_range\": \"10.10.10.0/24\"\n}\n\nresp = client.vpcs.create(body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/vpcs/{vpc_id}": { + "get": { + "operationId": "vpcs_get", + "summary": "Retrieve an Existing VPC", + "description": "To show information about an existing VPC, send a GET request to `/v2/vpcs/$VPC_ID`.", + "tags": [ + "VPCs" + ], + "parameters": [ + { + "$ref": "#/components/parameters/vpc_id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/existing_vpc" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/vpcs/5a4981aa-9653-4bd1-bef5-d6bff52042e4\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n vpc, _, err := client.VPCs.Get(ctx, \"5a4981aa-9653-4bd1-bef5-d6bff52042e4\")\n}" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.vpcs.get(vpc_id=\"e0fe0f4d\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "put": { + "operationId": "vpcs_update", + "summary": "Update a VPC", + "description": "To update information about a VPC, send a PUT request to `/v2/vpcs/$VPC_ID`.\n", + "tags": [ + "VPCs" + ], + "parameters": [ + { + "$ref": "#/components/parameters/vpc_id" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/vpc_updatable" + }, + { + "$ref": "#/components/schemas/vpc_default" + } + ], + "required": [ + "name" + ] + } + } + } + }, + "responses": { + "200": { + "$ref": "#/components/responses/existing_vpc" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X PUT \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"name\":\"renamed-new-vpc\", \"description\": \"A new description\", \"default\": true}' \\\n \"https://api.digitalocean.com/v2/vpcs/5a4981aa-9653-4bd1-bef5-d6bff52042e4\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n updateRequest := &godo.VPCUpdateRequest{\n Name: \"renamed-new-vpc\",\n Description: \"A new description\",\n }\n\n _, _, err := client.VPCs.Update(ctx, \"5a4981aa-9653-4bd1-bef5-d6bff52042e4\", updateRequest)\n}" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"name\": \"env.prod-vpc\",\n \"description\": \"VPC for production environment\",\n \"default\": True\n}\n\nresp = client.vpcs.update(vpc_id=\"8fdsfa\", body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + }, + "patch": { + "operationId": "vpcs_patch", + "summary": "Partially Update a VPC", + "description": "To update a subset of information about a VPC, send a PATCH request to\n`/v2/vpcs/$VPC_ID`.\n", + "tags": [ + "VPCs" + ], + "parameters": [ + { + "$ref": "#/components/parameters/vpc_id" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/vpc_updatable" + }, + { + "$ref": "#/components/schemas/vpc_default" + } + ] + } + } + } + }, + "responses": { + "200": { + "$ref": "#/components/responses/existing_vpc" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X PATCH \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"description\": \"An updated description\"}' \\\n \"https://api.digitalocean.com/v2/vpcs/5a4981aa-9653-4bd1-bef5-d6bff52042e4\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n vpcDesc := \"An updated description\"\n _, _, err := client.VPCs.Set(ctx, \"5a4981aa-9653-4bd1-bef5-d6bff52042e4\", godo.VPCSetDescription(vpcDesc))\n}" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"name\": \"env.prod-vpc\",\n \"description\": \"VPC for production environment\",\n \"default\": True\n}\n\nresp = client.vpcs.patch(vpc_id=\"8fdsfa\", body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + }, + "delete": { + "operationId": "vpcs_delete", + "summary": "Delete a VPC", + "description": "To delete a VPC, send a DELETE request to `/v2/vpcs/$VPC_ID`. A 204 status\ncode with no body will be returned in response to a successful request.\n\nThe default VPC for a region can not be deleted. Additionally, a VPC can only\nbe deleted if it does not contain any member resources. Attempting to delete\na region's default VPC or a VPC that still has members will result in a\n403 Forbidden error response.\n", + "tags": [ + "VPCs" + ], + "parameters": [ + { + "$ref": "#/components/parameters/vpc_id" + } + ], + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/vpcs/e0fe0f4d-596a-465e-a902-571ce57b79fa\"" + }, + { + "lang": "Go", + "source": "import (\n \"context\"\n \"os\"\n\n \"github.com/digitalocean/godo\"\n)\n\nfunc main() {\n token := os.Getenv(\"DIGITALOCEAN_TOKEN\")\n\n client := godo.NewFromToken(token)\n ctx := context.TODO()\n\n resp, err := client.VPCs.Delete(ctx, \"5a4981aa-9653-4bd1-bef5-d6bff52042e4\")\n}" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.vpcs.delete(vpc_id=\"e0fe0f4d\")" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/vpcs/{vpc_id}/members": { + "get": { + "operationId": "vpcs_list_members", + "summary": "List the Member Resources of a VPC", + "description": "To list all of the resources that are members of a VPC, send a GET request to\n`/v2/vpcs/$VPC_ID/members`.\n\nTo only list resources of a specific type that are members of the VPC,\nincluded a `resource_type` query parameter. For example, to only list Droplets\nin the VPC, send a GET request to `/v2/vpcs/$VPC_ID/members?resource_type=droplet`.\n", + "tags": [ + "VPCs" + ], + "parameters": [ + { + "$ref": "#/components/parameters/vpc_id" + }, + { + "$ref": "#/components/parameters/vpc_resource_type" + }, + { + "$ref": "#/components/parameters/per_page" + }, + { + "$ref": "#/components/parameters/page" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/vpc_members" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/vpcs/5a4981aa-9653-4bd1-bef5-d6bff52042e4/members\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.vpcs.list_members(vpc_id=\"e0fe0f4d\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/uptime/checks": { + "get": { + "operationId": "uptime_list_checks", + "summary": "List All Checks", + "description": "To list all of the Uptime checks on your account, send a GET request to `/v2/uptime/checks`.", + "tags": [ + "Uptime" + ], + "parameters": [ + { + "$ref": "#/components/parameters/per_page" + }, + { + "$ref": "#/components/parameters/page" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/all_checks" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/uptime/checks\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.uptime.checks_list()" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "post": { + "operationId": "uptime_create_check", + "summary": "Create a New Check", + "description": "To create an Uptime check, send a POST request to `/v2/uptime/checks` specifying the attributes\nin the table below in the JSON body.\n", + "tags": [ + "Uptime" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/check_updatable" + } + ], + "required": [ + "name", + "method", + "target", + "regions", + "type", + "enabled" + ] + } + } + } + }, + "responses": { + "201": { + "$ref": "#/components/responses/existing_check" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"name\":\"Landing page check\",\"type\":\"https\",\"target\":\"https://www.landingpage.com\",\"regions\":[\"us_east\",\"eu_west\"],\"enabled\":true}' \\\n \"https://api.digitalocean.com/v2/uptime/checks\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"name\": \"Landing page check\",\n \"type\": \"https\",\n \"target\": \"https://www.landingpage.com\",\n \"regions\": [\n \"us_east\",\n \"eu_west\"\n ],\n \"enabled\": True\n}\n\nresp = client.uptime.check_create(body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/uptime/checks/{check_id}": { + "get": { + "operationId": "uptime_get_check", + "summary": "Retrieve an Existing Check", + "description": "To show information about an existing check, send a GET request to `/v2/uptime/checks/$CHECK_ID`.", + "tags": [ + "Uptime" + ], + "parameters": [ + { + "$ref": "#/components/parameters/check_id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/existing_check" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/uptime/checks/{check_id}\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.uptime.check_get(check_id=\"fd9dfa\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "put": { + "operationId": "uptime_update_check", + "summary": "Update a Check", + "description": "To update the settings of an Uptime check, send a PUT request to `/v2/uptime/checks/$CHECK_ID`.\n", + "tags": [ + "Uptime" + ], + "parameters": [ + { + "$ref": "#/components/parameters/check_id" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/check_updatable" + } + ] + } + } + } + }, + "responses": { + "200": { + "$ref": "#/components/responses/existing_check" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X PUT \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"name\":\"Landing page check\",\"type\":\"https\",\"target\":\"https://www.newlandingpage.com\",\"regions\":[\"us_east\",\"eu_west\"],\"enabled\":true}' \\\n \"https://api.digitalocean.com/v2/uptime/checks/{check_id}\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"name\": \"Landing page check\",\n \"type\": \"https\",\n \"target\": \"https://www.landingpage.com\",\n \"regions\": [\n \"us_east\",\n \"eu_west\"\n ],\n \"enabled\": True\n}\n\nresp = client.uptime.check_update(check_id=\"fd9fda\", body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + }, + "delete": { + "operationId": "uptime_delete_check", + "summary": "Delete a Check", + "description": "To delete an Uptime check, send a DELETE request to `/v2/uptime/checks/$CHECK_ID`. A 204 status\ncode with no body will be returned in response to a successful request.\n\n\nDeleting a check will also delete alerts associated with the check.\n", + "tags": [ + "Uptime" + ], + "parameters": [ + { + "$ref": "#/components/parameters/check_id" + } + ], + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/uptime/checks/{check_id}\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.uptime.check_delete(check_id=\"fd9dfa\")" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/uptime/checks/{check_id}/state": { + "get": { + "operationId": "uptime_get_checkState", + "summary": "Retrieve Check State", + "description": "To show information about an existing check's state, send a GET request to `/v2/uptime/checks/$CHECK_ID/state`.", + "tags": [ + "Uptime" + ], + "parameters": [ + { + "$ref": "#/components/parameters/check_id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/existing_check_state" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/uptime/checks/{check_id}/state\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.uptime.check_state_get(check_id=\"fd9fda\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + } + }, + "/v2/uptime/checks/{check_id}/alerts": { + "get": { + "operationId": "uptime_list_alerts", + "summary": "List All Alerts", + "description": "To list all of the alerts for an Uptime check, send a GET request to `/v2/uptime/checks/$CHECK_ID/alerts`.", + "tags": [ + "Uptime" + ], + "parameters": [ + { + "$ref": "#/components/parameters/check_id" + }, + { + "$ref": "#/components/parameters/per_page" + }, + { + "$ref": "#/components/parameters/page" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/all_alerts" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/uptime/checks/{check_id}/alerts\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.uptime.check_alerts_list(check_id=\"4de7ac8b\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "post": { + "operationId": "uptime_create_alert", + "summary": "Create a New Alert", + "description": "To create an Uptime alert, send a POST request to `/v2/uptime/checks/$CHECK_ID/alerts` specifying the attributes\nin the table below in the JSON body.\n", + "tags": [ + "Uptime" + ], + "parameters": [ + { + "$ref": "#/components/parameters/check_id" + } + ], + "requestBody": { + "required": true, + "description": "The ''type'' field dictates the type of alert, and hence what type of value to pass into the threshold property.\nType | Description | Threshold Value\n-----|-------------|--------------------\n`latency` | alerts on the response latency | milliseconds\n`down` | alerts on a target registering as down in any region | N/A (Not required)\n`down_global` | alerts on a target registering as down globally | N/A (Not required)\n`ssl_expiry` | alerts on a SSL certificate expiring within $threshold days | days\n", + "content": { + "application/json": { + "schema": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/alert" + } + ], + "required": [ + "name", + "type", + "notifications" + ] + } + } + } + }, + "responses": { + "201": { + "$ref": "#/components/responses/existing_alert" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X POST \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"name\":\"Landing page degraded performance\",\"type\":\"latency\",\"threshold\":300,\"comparison\":\"greater_than\",\"notifications\":{\"email\":[\"bob@example.com\"],\"slack\":[{\"channel\":\"Production Alerts\",\"url\":\"https://hooks.slack.com/services/T1234567/AAAAAAAA/ZZZZZZ\"}]},\"period\":\"2m\"}' \\\n \"https://api.digitalocean.com/v2/uptime/checks/{check_id}/alerts\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"name\": \"Landing page degraded performance\",\n \"type\": \"latency\",\n \"threshold\": 300,\n \"comparison\": \"greater_than\",\n \"notifications\": {\n \"email\": [\n \"bob@example.com\"\n ],\n \"slack\": [\n {\n \"channel\": \"Production Alerts\",\n \"url\": \"https://hooks.slack.com/services/T1234567/AAAAAAAA/ZZZZZZ\"\n }\n ]\n },\n \"period\": \"2m\"\n}\n\nresp = client.uptime.alert_create(check_id=\"4de7ac8b\", body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + }, + "/v2/uptime/checks/{check_id}/alerts/{alert_id}": { + "get": { + "operationId": "uptime_get_alert", + "summary": "Retrieve an Existing Alert", + "description": "To show information about an existing alert, send a GET request to `/v2/uptime/checks/$CHECK_ID/alerts/$ALERT_ID`.", + "tags": [ + "Uptime" + ], + "parameters": [ + { + "$ref": "#/components/parameters/check_id" + }, + { + "$ref": "#/components/parameters/parameters_alert_id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/existing_alert" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X GET \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/uptime/checks/{check_id}/alerts/{alert_id}\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.uptime.alert_get(check_id=\"4de7ac8b\", alert_id=\"da9da9\")" + } + ], + "security": [ + { + "bearer_auth": [ + "read" + ] + } + ] + }, + "put": { + "operationId": "uptime_update_alert", + "summary": "Update an Alert", + "description": "To update the settings of an Uptime alert, send a PUT request to `/v2/uptime/checks/$CHECK_ID/alerts/$ALERT_ID`.\n", + "tags": [ + "Uptime" + ], + "parameters": [ + { + "$ref": "#/components/parameters/check_id" + }, + { + "$ref": "#/components/parameters/parameters_alert_id" + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/alert_updatable" + } + ] + } + } + } + }, + "responses": { + "200": { + "$ref": "#/components/responses/existing_alert" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X PUT \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n -d '{\"name\":\"Landing page down globally\",\"type\":\"down_global\",\"notifications\":{\"email\":[\"bob@example.com\"],\"slack\":[{\"channel\":\"Production Alerts\",\"url\":\"https://hooks.slack.com/services/T1234567/AAAAAAAA/ZZZZZZ\"}]},\"period\":\"2m\"}' \\\n \"https://api.digitalocean.com/v2/uptime/checks/{check_id}/alerts/{alert_id}\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nreq = {\n \"name\": \"Landing page degraded performance\",\n \"type\": \"latency\",\n \"threshold\": 300,\n \"comparison\": \"greater_than\",\n \"notifications\": {\n \"email\": [\n \"bob@example.com\"\n ],\n \"slack\": [\n {\n \"channel\": \"Production Alerts\",\n \"url\": \"https://hooks.slack.com/services/T1234567/AAAAAAAA/ZZZZZZ\"\n }\n ]\n },\n \"period\": \"2m\"\n}\n\nresp = client.uptime.alert_update(check_id=\"4de7ac8b\", alert_id=\"da9da9\", body=req)" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + }, + "delete": { + "operationId": "uptime_delete_alert", + "summary": "Delete an Alert", + "description": "To delete an Uptime alert, send a DELETE request to `/v2/uptime/checks/$CHECK_ID/alerts/$ALERT_ID`. A 204 status\ncode with no body will be returned in response to a successful request.\n", + "tags": [ + "Uptime" + ], + "parameters": [ + { + "$ref": "#/components/parameters/check_id" + }, + { + "$ref": "#/components/parameters/parameters_alert_id" + } + ], + "responses": { + "204": { + "$ref": "#/components/responses/no_content" + }, + "401": { + "$ref": "#/components/responses/unauthorized" + }, + "404": { + "$ref": "#/components/responses/not_found" + }, + "429": { + "$ref": "#/components/responses/too_many_requests" + }, + "500": { + "$ref": "#/components/responses/server_error" + }, + "default": { + "$ref": "#/components/responses/unexpected_error" + } + }, + "x-codeSamples": [ + { + "lang": "cURL", + "source": "curl -X DELETE \\\n -H \"Content-Type: application/json\" \\\n -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \\\n \"https://api.digitalocean.com/v2/uptime/checks/{check_id}/alerts/{alert_id}\"" + }, + { + "lang": "Python", + "source": "import os\nfrom pydo import Client\n\nclient = Client(token=os.environ.get(\"DIGITALOCEAN_TOKEN\"))\n\nresp = client.uptime.alert_delete(check_id=\"4de7ac8b\", alert_id=\"da9da9\")" + } + ], + "security": [ + { + "bearer_auth": [ + "write" + ] + } + ] + } + } + }, + "components": { + "securitySchemes": { + "bearer_auth": { + "type": "http", + "scheme": "bearer", + "description": "## OAuth Authentication\n\nIn order to interact with the DigitalOcean API, you or your application must\nauthenticate.\n\nThe DigitalOcean API handles this through OAuth, an open standard for\nauthorization. OAuth allows you to delegate access to your account in full\nor in read-only mode.\n\nYou can generate an OAuth token by visiting the [Apps & API](https://cloud.digitalocean.com/account/api/tokens)\nsection of the DigitalOcean control panel for your account.\n\nAn OAuth token functions as a complete authentication request. In effect, it\nacts as a substitute for a username and password pair.\n\nBecause of this, it is absolutely **essential** that you keep your OAuth\ntokens secure. In fact, upon generation, the web interface will only display\neach token a single time in order to prevent the token from being compromised.\n\nDigitalOcean access tokens begin with an identifiable prefix in order to\ndistinguish them from other similar tokens.\n\n- `dop_v1_` for personal access tokens generated in the control panel\n- `doo_v1_` for tokens generated by applications using [the OAuth flow](https://docs.digitalocean.com/reference/api/oauth-api/)\n- `dor_v1_` for OAuth refresh tokens\n\n### How to Authenticate with OAuth\n\nIn order to make an authenticated request, include a bearer-type\n`Authorization` header containing your OAuth token. All requests must be\nmade over HTTPS.\n\n### Authenticate with a Bearer Authorization Header\n\n```\ncurl -X $HTTP_METHOD -H \"Authorization: Bearer $DIGITALOCEAN_TOKEN\" \"https://api.digitalocean.com/v2/$OBJECT\"\n```\n" + } + }, + "parameters": { + "oneClicks_type": { + "in": "query", + "name": "type", + "description": "Restrict results to a certain type of 1-Click.", + "required": false, + "schema": { + "type": "string", + "enum": [ + "droplet", + "kubernetes" + ] + }, + "example": "kubernetes" + }, + "per_page": { + "in": "query", + "name": "per_page", + "required": false, + "description": "Number of items returned per page", + "schema": { + "type": "integer", + "minimum": 1, + "default": 20, + "maximum": 200 + }, + "example": 2 + }, + "page": { + "in": "query", + "name": "page", + "required": false, + "description": "Which 'page' of paginated results to return.", + "schema": { + "type": "integer", + "minimum": 1, + "default": 1 + }, + "example": 1 + }, + "ssh_key_identifier": { + "in": "path", + "name": "ssh_key_identifier", + "required": true, + "description": "Either the ID or the fingerprint of an existing SSH key.", + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/ssh_key_id" + }, + { + "$ref": "#/components/schemas/ssh_key_fingerprint" + } + ] + }, + "example": 512189 + }, + "action_id": { + "in": "path", + "name": "action_id", + "description": "A unique numeric ID that can be used to identify and reference an action.", + "required": true, + "schema": { + "type": "integer", + "minimum": 1 + }, + "example": 36804636 + }, + "with_projects": { + "description": "Whether the project_id of listed apps should be fetched and included.", + "in": "query", + "name": "with_projects", + "schema": { + "type": "boolean" + }, + "example": true + }, + "accept": { + "description": "The content-type that should be used by the response. By default, the response will be `application/json`. `application/yaml` is also supported.", + "in": "header", + "name": "Accept", + "schema": { + "type": "string", + "enum": [ + "application/json", + "application/yaml" + ] + }, + "example": "application/json" + }, + "content-type": { + "description": "The content-type used for the request. By default, the requests are assumed to use `application/json`. `application/yaml` is also supported.", + "in": "header", + "name": "Content-Type", + "schema": { + "type": "string", + "enum": [ + "application/json", + "application/yaml" + ] + }, + "example": "application/json" + }, + "id_app": { + "description": "The ID of the app", + "in": "path", + "name": "id", + "required": true, + "schema": { + "type": "string" + }, + "example": "4f6c71e2-1e90-4762-9fee-6cc4a0a9f2cf" + }, + "app_name": { + "description": "The name of the app to retrieve.", + "in": "query", + "name": "name", + "schema": { + "type": "string" + }, + "example": "myApp" + }, + "app_id": { + "description": "The app ID", + "in": "path", + "name": "app_id", + "required": true, + "schema": { + "type": "string" + }, + "example": "4f6c71e2-1e90-4762-9fee-6cc4a0a9f2cf" + }, + "component": { + "description": "An optional component name. If set, logs will be limited to this component only.", + "in": "path", + "name": "component_name", + "required": true, + "schema": { + "type": "string" + }, + "example": "component" + }, + "live_updates": { + "description": "Whether the logs should follow live updates.", + "in": "query", + "name": "follow", + "schema": { + "type": "boolean" + }, + "example": true + }, + "log_type": { + "description": "The type of logs to retrieve\n- BUILD: Build-time logs\n- DEPLOY: Deploy-time logs\n- RUN: Live run-time logs", + "in": "query", + "name": "type", + "required": true, + "schema": { + "default": "UNSPECIFIED", + "enum": [ + "UNSPECIFIED", + "BUILD", + "DEPLOY", + "RUN" + ], + "type": "string" + }, + "example": "BUILD" + }, + "time_wait": { + "description": "An optional time duration to wait if the underlying component instance is not immediately available. Default: `3m`.", + "in": "query", + "name": "pod_connection_timeout", + "schema": { + "type": "string" + }, + "example": "3m" + }, + "deployment_id": { + "description": "The deployment ID", + "in": "path", + "name": "deployment_id", + "required": true, + "schema": { + "type": "string" + }, + "example": "3aa4d20e-5527-4c00-b496-601fbd22520a" + }, + "slug_tier": { + "description": "The slug of the tier", + "in": "path", + "name": "slug", + "required": true, + "schema": { + "type": "string" + }, + "example": "basic" + }, + "slug_size": { + "description": "The slug of the instance size", + "in": "path", + "name": "slug", + "required": true, + "schema": { + "type": "string" + }, + "example": "basic-xxs" + }, + "alert_id": { + "description": "The alert ID", + "in": "path", + "name": "alert_id", + "required": true, + "schema": { + "type": "string" + }, + "example": "5a624ab5-dd58-4b39-b7dd-8b7c36e8a91d" + }, + "cdn_endpoint_id": { + "in": "path", + "name": "cdn_id", + "description": "A unique identifier for a CDN endpoint.", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "minimum": 1 + }, + "example": "19f06b6a-3ace-4315-b086-499a0e521b76" + }, + "certificate_id": { + "in": "path", + "name": "certificate_id", + "description": "A unique identifier for a certificate.", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "minimum": 1 + }, + "example": "4de7ac8b-495b-4884-9a69-1050c6793cd6" + }, + "invoice_uuid": { + "name": "invoice_uuid", + "description": "UUID of the invoice", + "in": "path", + "schema": { + "type": "string" + }, + "example": "22737513-0ea7-4206-8ceb-98a575af7681", + "required": true + }, + "tag_name": { + "in": "query", + "name": "tag_name", + "description": "Limits the results to database clusters with a specific tag.", + "required": false, + "example": "production", + "schema": { + "type": "string" + } + }, + "database_cluster_uuid": { + "in": "path", + "name": "database_cluster_uuid", + "description": "A unique identifier for a database cluster.", + "required": true, + "example": "9cc10173-e9ea-4176-9dbc-a4cee4c4ff30", + "schema": { + "type": "string", + "format": "uuid" + } + }, + "migration_id": { + "in": "path", + "name": "migration_id", + "description": "A unique identifier assigned to the online migration.", + "required": true, + "example": "77b28fc8-19ff-11eb-8c9c-c68e24557488", + "schema": { + "type": "string" + } + }, + "replica_name": { + "in": "path", + "name": "replica_name", + "description": "The name of the database replica.", + "required": true, + "example": "read-nyc3-01", + "schema": { + "type": "string" + } + }, + "username": { + "in": "path", + "name": "username", + "description": "The name of the database user.", + "required": true, + "example": "app-01", + "schema": { + "type": "string" + } + }, + "database_name": { + "in": "path", + "name": "database_name", + "description": "The name of the database.", + "required": true, + "example": "alpha", + "schema": { + "type": "string" + } + }, + "pool_name": { + "in": "path", + "name": "pool_name", + "description": "The name used to identify the connection pool.", + "required": true, + "example": "backend-pool", + "schema": { + "type": "string" + } + }, + "kafka_topic_name": { + "in": "path", + "name": "topic_name", + "description": "The name used to identify the Kafka topic.", + "required": true, + "example": "customer-events", + "schema": { + "type": "string" + } + }, + "domain_name": { + "name": "domain_name", + "description": "The name of the domain itself.", + "in": "path", + "schema": { + "type": "string" + }, + "example": "example.com", + "required": true + }, + "domain_name_query": { + "name": "name", + "description": "A fully qualified record name. For example, to only include records matching sub.example.com, send a GET request to `/v2/domains/$DOMAIN_NAME/records?name=sub.example.com`.", + "in": "query", + "schema": { + "type": "string" + }, + "example": "sub.example.com" + }, + "domain_type_query": { + "name": "type", + "description": "The type of the DNS record. For example: A, CNAME, TXT, ...", + "in": "query", + "schema": { + "type": "string", + "enum": [ + "A", + "AAAA", + "CAA", + "CNAME", + "MX", + "NS", + "SOA", + "SRV", + "TXT" + ] + }, + "example": "A" + }, + "domain_record_id": { + "name": "domain_record_id", + "description": "The unique identifier of the domain record.", + "in": "path", + "schema": { + "type": "integer" + }, + "example": 3352896, + "required": true + }, + "droplet_tag_name": { + "in": "query", + "name": "tag_name", + "description": "Used to filter Droplets by a specific tag. Can not be combined with `name`.", + "required": false, + "schema": { + "type": "string" + }, + "example": "env:prod" + }, + "droplet_name": { + "in": "query", + "name": "name", + "description": "Used to filter list response by Droplet name returning only exact matches. It is case-insensitive and can not be combined with `tag_name`.", + "required": false, + "schema": { + "type": "string" + }, + "example": "web-01" + }, + "droplet_delete_tag_name": { + "in": "query", + "name": "tag_name", + "description": "Specifies Droplets to be deleted by tag.", + "required": true, + "schema": { + "type": "string" + }, + "example": "env:test" + }, + "droplet_id": { + "in": "path", + "name": "droplet_id", + "description": "A unique identifier for a Droplet instance.", + "required": true, + "schema": { + "type": "integer", + "minimum": 1 + }, + "example": 3164444 + }, + "x_dangerous": { + "in": "header", + "name": "X-Dangerous", + "description": "Acknowledge this action will destroy the Droplet and all associated resources and _can not_ be reversed.", + "schema": { + "type": "boolean" + }, + "example": true, + "required": true + }, + "firewall_id": { + "name": "firewall_id", + "description": "A unique ID that can be used to identify and reference a firewall.", + "in": "path", + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "bb4b2611-3d72-467b-8602-280330ecd65c", + "required": true + }, + "floating_ip": { + "in": "path", + "name": "floating_ip", + "description": "A floating IP address.", + "required": true, + "schema": { + "type": "string", + "format": "ipv4", + "minimum": 1 + }, + "example": "45.55.96.47" + }, + "namespace_id": { + "name": "namespace_id", + "description": "The ID of the namespace to be managed.", + "in": "path", + "schema": { + "type": "string" + }, + "example": "fn-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", + "required": true + }, + "trigger_name": { + "name": "trigger_name", + "description": "The name of the trigger to be managed.", + "in": "path", + "schema": { + "type": "string" + }, + "example": "my trigger", + "required": true + }, + "type": { + "in": "query", + "name": "type", + "description": "Filters results based on image type which can be either `application` or `distribution`.", + "required": false, + "schema": { + "type": "string", + "enum": [ + "application", + "distribution" + ] + }, + "example": "distribution" + }, + "private": { + "in": "query", + "name": "private", + "description": "Used to filter only user images.", + "required": false, + "schema": { + "type": "boolean" + }, + "example": true + }, + "tag": { + "in": "query", + "name": "tag_name", + "description": "Used to filter images by a specific tag.", + "required": false, + "schema": { + "type": "string" + }, + "example": "base-image" + }, + "image_id": { + "in": "path", + "name": "image_id", + "description": "A unique number that can be used to identify and reference a specific image.", + "required": true, + "schema": { + "type": "integer" + }, + "example": 62137902 + }, + "kubernetes_cluster_id": { + "in": "path", + "name": "cluster_id", + "description": "A unique ID that can be used to reference a Kubernetes cluster.", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "minimum": 1 + }, + "example": "bd5f5959-5e1e-4205-a714-a914373942af" + }, + "kubernetes_expiry_seconds": { + "in": "query", + "name": "expiry_seconds", + "required": false, + "description": "The duration in seconds that the returned Kubernetes credentials will be valid. If not set or 0, the credentials will have a 7 day expiry.", + "schema": { + "type": "integer", + "minimum": 0, + "default": 0 + }, + "example": 300 + }, + "kubernetes_node_pool_id": { + "in": "path", + "name": "node_pool_id", + "description": "A unique ID that can be used to reference a Kubernetes node pool.", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "minimum": 1 + }, + "example": "cdda885e-7663-40c8-bc74-3a036c66545d" + }, + "kubernetes_node_id": { + "in": "path", + "name": "node_id", + "description": "A unique ID that can be used to reference a node in a Kubernetes node pool.", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "minimum": 1 + }, + "example": "478247f8-b1bb-4f7a-8db9-2a5f8d4b8f8f" + }, + "kubernetes_node_skip_drain": { + "in": "query", + "name": "skip_drain", + "required": false, + "description": "Specifies whether or not to drain workloads from a node before it is deleted. Setting it to `1` causes node draining to be skipped. Omitting the query parameter or setting its value to `0` carries out draining prior to deletion.", + "schema": { + "type": "integer", + "minimum": 0, + "maximum": 1, + "default": 0 + }, + "example": 1 + }, + "kubernetes_node_replace": { + "in": "query", + "name": "replace", + "required": false, + "description": "Specifies whether or not to replace a node after it has been deleted. Setting it to `1` causes the node to be replaced by a new one after deletion. Omitting the query parameter or setting its value to `0` deletes without replacement.", + "schema": { + "type": "integer", + "minimum": 0, + "maximum": 1, + "default": 0 + }, + "example": 1 + }, + "clusterlint_run_id": { + "in": "query", + "name": "run_id", + "description": "Specifies the clusterlint run whose results will be retrieved.", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "50c2f44c-011d-493e-aee5-361a4a0d1844" + }, + "load_balancer_id": { + "in": "path", + "name": "lb_id", + "description": "A unique identifier for a load balancer.", + "required": true, + "schema": { + "type": "string", + "minimum": 1 + }, + "example": "4de7ac8b-495b-4884-9a69-1050c6793cd6" + }, + "alert_uuid": { + "in": "path", + "name": "alert_uuid", + "description": "A unique identifier for an alert policy.", + "required": true, + "schema": { + "type": "string" + }, + "example": "4de7ac8b-495b-4884-9a69-1050c6793cd6" + }, + "parameters_droplet_id": { + "in": "query", + "name": "host_id", + "description": "The droplet ID.", + "example": "17209102", + "required": true, + "schema": { + "type": "string" + } + }, + "network_interface": { + "in": "query", + "name": "interface", + "description": "The network interface.", + "required": true, + "example": "private", + "schema": { + "type": "string", + "enum": [ + "private", + "public" + ] + } + }, + "network_direction": { + "in": "query", + "name": "direction", + "description": "The traffic direction.", + "required": true, + "example": "inbound", + "schema": { + "type": "string", + "enum": [ + "inbound", + "outbound" + ] + } + }, + "metric_timestamp_start": { + "in": "query", + "name": "start", + "description": "Timestamp to start metric window.", + "example": "1620683817", + "required": true, + "schema": { + "type": "string" + } + }, + "metric_timestamp_end": { + "in": "query", + "name": "end", + "description": "Timestamp to end metric window.", + "example": "1620705417", + "required": true, + "schema": { + "type": "string" + } + }, + "project_id": { + "in": "path", + "name": "project_id", + "description": "A unique identifier for a project.", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "minimum": 1 + }, + "example": "4de7ac8b-495b-4884-9a69-1050c6793cd6" + }, + "registry_expiry_seconds": { + "in": "query", + "name": "expiry_seconds", + "required": false, + "description": "The duration in seconds that the returned registry credentials will be valid. If not set or 0, the credentials will not expire.", + "schema": { + "type": "integer", + "minimum": 0, + "default": 0 + }, + "example": 3600 + }, + "registry_read_write": { + "in": "query", + "name": "read_write", + "required": false, + "description": "By default, the registry credentials allow for read-only access. Set this query parameter to `true` to obtain read-write credentials.", + "schema": { + "type": "boolean", + "default": false + }, + "example": true + }, + "registry_name": { + "in": "path", + "name": "registry_name", + "description": "The name of a container registry.", + "required": true, + "schema": { + "type": "string" + }, + "example": "example" + }, + "token_pagination_page": { + "in": "query", + "name": "page", + "required": false, + "description": "Which 'page' of paginated results to return. Ignored when 'page_token' is provided.", + "schema": { + "type": "integer", + "minimum": 1, + "default": 1 + }, + "example": 1 + }, + "token_pagination_page_token": { + "in": "query", + "name": "page_token", + "required": false, + "description": "Token to retrieve of the next or previous set of results more quickly than using 'page'.", + "schema": { + "type": "string" + }, + "example": "eyJUb2tlbiI6IkNnZGpiMjlz" + }, + "registry_repository_name": { + "in": "path", + "name": "repository_name", + "description": "The name of a container registry repository. If the name contains `/` characters, they must be URL-encoded, e.g. `%2F`.", + "required": true, + "schema": { + "type": "string" + }, + "example": "repo-1" + }, + "registry_repository_tag": { + "in": "path", + "name": "repository_tag", + "description": "The name of a container registry repository tag.", + "required": true, + "schema": { + "type": "string" + }, + "example": "06a447a" + }, + "registry_manifest_digest": { + "in": "path", + "name": "manifest_digest", + "description": "The manifest digest of a container registry repository tag.", + "required": true, + "schema": { + "type": "string" + }, + "example": "sha256:cb8a924afdf0229ef7515d9e5b3024e23b3eb03ddbba287f4a19c6ac90b8d221" + }, + "garbage_collection_uuid": { + "in": "path", + "name": "garbage_collection_uuid", + "description": "The UUID of a garbage collection run.", + "required": true, + "schema": { + "type": "string" + }, + "example": "eff0feee-49c7-4e8f-ba5c-a320c109c8a8" + }, + "reserved_ip": { + "in": "path", + "name": "reserved_ip", + "description": "A reserved IP address.", + "required": true, + "schema": { + "type": "string", + "format": "ipv4", + "minimum": 1 + }, + "example": "45.55.96.47" + }, + "snapshot_resource_type": { + "in": "query", + "name": "resource_type", + "description": "Used to filter snapshots by a resource type.", + "required": false, + "schema": { + "type": "string", + "enum": [ + "droplet", + "volume" + ] + }, + "example": "droplet" + }, + "snapshot_id": { + "in": "path", + "name": "snapshot_id", + "required": true, + "description": "Either the ID of an existing snapshot. This will be an integer for a Droplet snapshot or a string for a volume snapshot.", + "schema": { + "anyOf": [ + { + "type": "integer", + "description": "The ID of a Droplet snapshot.", + "example": 6372321 + }, + { + "type": "string", + "description": "The ID of a volume snapshot.", + "example": "fbe805e8-866b-11e6-96bf-000f53315a41" + } + ] + }, + "example": 6372321 + }, + "tag_id": { + "in": "path", + "name": "tag_id", + "description": "The name of the tag. Tags may contain letters, numbers, colons, dashes, and underscores. There is a limit of 255 characters per tag.", + "required": true, + "schema": { + "type": "string", + "maxLength": 255, + "pattern": "^[a-zA-Z0-9_\\-\\:]+$" + }, + "example": "awesome" + }, + "volume_name": { + "name": "name", + "in": "query", + "description": "The block storage volume's name.", + "schema": { + "type": "string" + }, + "example": "example" + }, + "region": { + "name": "region", + "in": "query", + "description": "The slug identifier for the region where the resource is available.", + "schema": { + "$ref": "#/components/schemas/region_slug" + }, + "example": "nyc3" + }, + "volume_id": { + "name": "volume_id", + "in": "path", + "required": true, + "description": "The ID of the block storage volume.", + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "7724db7c-e098-11e5-b522-000f53304e51" + }, + "vpc_id": { + "in": "path", + "name": "vpc_id", + "description": "A unique identifier for a VPC.", + "required": true, + "schema": { + "type": "string", + "format": "uuid", + "minimum": 1 + }, + "example": "4de7ac8b-495b-4884-9a69-1050c6793cd6" + }, + "vpc_resource_type": { + "in": "query", + "name": "resource_type", + "description": "Used to filter VPC members by a resource type.", + "required": false, + "schema": { + "type": "string" + }, + "example": "droplet" + }, + "check_id": { + "in": "path", + "name": "check_id", + "description": "A unique identifier for a check.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "4de7ac8b-495b-4884-9a69-1050c6793cd6" + }, + "parameters_alert_id": { + "in": "path", + "name": "alert_id", + "description": "A unique identifier for an alert.", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "17f0f0ae-b7e5-4ef6-86e3-aa569db58284" + } + }, + "headers": { + "ratelimit-limit": { + "schema": { + "type": "integer" + }, + "example": 5000, + "description": "The default limit on number of requests that can be made per hour and per minute. Current rate limits are 5000 requests per hour and 250 requests per minute." + }, + "ratelimit-remaining": { + "schema": { + "type": "integer" + }, + "example": 4816, + "description": "The number of requests in your hourly quota that remain before you hit your request limit. See https://developers.digitalocean.com/documentation/v2/#rate-limit for information about how requests expire." + }, + "ratelimit-reset": { + "schema": { + "type": "integer" + }, + "example": 1444931833, + "description": "The time when the oldest request will expire. The value is given in Unix epoch time. See https://developers.digitalocean.com/documentation/v2/#rate-limit for information about how requests expire." + }, + "content-disposition": { + "description": "Indicates if the content is expected to be displayed *inline* in the browser, that is, as a Web page or as part of a Web page, or as an *attachment*, that is downloaded and saved locally.", + "schema": { + "type": "string" + }, + "example": "attachment; filename=\"DigitalOcean Invoice 2020 Jul (6173678-418071234).csv\"" + }, + "content-type": { + "description": "The type of data that is returned from a request. ", + "schema": { + "type": "string" + }, + "example": "application/json; charset=utf-8" + }, + "x-request-id": { + "description": "Optionally, some endpoints may include a request ID that should be provided when reporting bugs or opening support tickets to help identify the issue.", + "schema": { + "type": "string", + "format": "uuid" + }, + "example": "515850a0-a812-50bf-aa3c-d0d21d287e40" + } + }, + "schemas": { + "error": { + "type": "object", + "properties": { + "id": { + "description": "A short identifier corresponding to the HTTP status code returned. For example, the ID for a response returning a 404 status code would be \"not_found.\"", + "type": "string", + "example": "not_found" + }, + "message": { + "description": "A message providing additional information about the error, including details to help resolve it when possible.", + "type": "string", + "example": "The resource you were accessing could not be found." + }, + "request_id": { + "description": "Optionally, some endpoints may include a request ID that should be provided when reporting bugs or opening support tickets to help identify the issue.", + "type": "string", + "example": "4d9d8375-3c56-4925-a3e7-eb137fed17e9" + } + }, + "required": [ + "id", + "message" + ] + }, + "oneClicks": { + "type": "object", + "properties": { + "slug": { + "title": "slug", + "type": "string", + "example": "monitoring", + "description": "The slug identifier for the 1-Click application." + }, + "type": { + "title": "type", + "type": "string", + "example": "kubernetes", + "description": "The type of the 1-Click application." + } + }, + "required": [ + "slug", + "type" + ] + }, + "oneClicks_create": { + "type": "object", + "properties": { + "addon_slugs": { + "title": "addon_slugs", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "kube-state-metrics", + "loki" + ], + "default": [], + "description": "An array of 1-Click Application slugs to be installed to the Kubernetes cluster." + }, + "cluster_uuid": { + "title": "cluster_uuid", + "type": "string", + "example": "50a994b6-c303-438f-9495-7e896cfe6b08", + "description": "A unique ID for the Kubernetes cluster to which the 1-Click Applications will be installed." + } + }, + "required": [ + "addon_slugs", + "cluster_uuid" + ] + }, + "account": { + "type": "object", + "properties": { + "droplet_limit": { + "description": "The total number of Droplets current user or team may have active at one time.", + "type": "integer", + "example": 25 + }, + "floating_ip_limit": { + "description": "The total number of Floating IPs the current user or team may have.", + "type": "integer", + "example": 5 + }, + "email": { + "description": "The email address used by the current user to register for DigitalOcean.", + "type": "string", + "example": "sammy@digitalocean.com" + }, + "name": { + "description": "The display name for the current user.", + "type": "string", + "example": "Sammy the Shark" + }, + "uuid": { + "description": "The unique universal identifier for the current user.", + "type": "string", + "example": "b6fr89dbf6d9156cace5f3c78dc9851d957381ef" + }, + "email_verified": { + "description": "If true, the user has verified their account via email. False otherwise.", + "type": "boolean", + "default": false, + "example": true + }, + "status": { + "description": "This value is one of \"active\", \"warning\" or \"locked\".", + "type": "string", + "enum": [ + "active", + "warning", + "locked" + ], + "default": "active", + "example": "active" + }, + "status_message": { + "description": "A human-readable message giving more details about the status of the account.", + "type": "string", + "example": " " + }, + "team": { + "type": "object", + "description": "When authorized in a team context, includes information about the current team.", + "properties": { + "uuid": { + "description": "The unique universal identifier for the current team.", + "type": "string", + "example": "5df3e3004a17e242b7c20ca6c9fc25b701a47ece" + }, + "name": { + "description": "The name for the current team.", + "type": "string", + "example": "My Team" + } + } + } + }, + "required": [ + "droplet_limit", + "floating_ip_limit", + "email", + "uuid", + "email_verified", + "status", + "status_message" + ] + }, + "ssh_key_id": { + "type": "integer", + "description": "A unique identification number for this key. Can be used to embed a specific SSH key into a Droplet.", + "readOnly": true, + "example": 512189 + }, + "ssh_key_fingerprint": { + "type": "string", + "description": "A unique identifier that differentiates this key from other keys using a format that SSH recognizes. The fingerprint is created when the key is added to your account.", + "readOnly": true, + "example": "3b:16:bf:e4:8b:00:8b:b8:59:8c:a9:d3:f0:19:45:fa" + }, + "ssh_key_name": { + "type": "string", + "description": "A human-readable display name for this key, used to easily identify the SSH keys when they are displayed.", + "example": "My SSH Public Key" + }, + "sshKeys": { + "type": "object", + "properties": { + "id": { + "$ref": "#/components/schemas/ssh_key_id" + }, + "fingerprint": { + "$ref": "#/components/schemas/ssh_key_fingerprint" + }, + "public_key": { + "description": "The entire public key string that was uploaded. Embedded into the root user's `authorized_keys` file if you include this key during Droplet creation.", + "type": "string", + "example": "ssh-rsa AEXAMPLEaC1yc2EAAAADAQABAAAAQQDDHr/jh2Jy4yALcK4JyWbVkPRaWmhck3IgCoeOO3z1e2dBowLh64QAM+Qb72pxekALga2oi4GvT+TlWNhzPH4V example" + }, + "name": { + "$ref": "#/components/schemas/ssh_key_name" + } + }, + "required": [ + "public_key", + "name" + ] + }, + "link_to_last_page": { + "type": "object", + "properties": { + "last": { + "description": "URI of the last page of the results.", + "type": "string", + "example": "https://api.digitalocean.com/v2/images?page=2" + } + } + }, + "link_to_next_page": { + "type": "object", + "properties": { + "next": { + "description": "URI of the next page of the results.", + "type": "string", + "example": "https://api.digitalocean.com/v2/images?page=2" + } + } + }, + "forward_links": { + "allOf": [ + { + "$ref": "#/components/schemas/link_to_last_page" + }, + { + "$ref": "#/components/schemas/link_to_next_page" + } + ] + }, + "link_to_first_page": { + "type": "object", + "properties": { + "first": { + "description": "URI of the first page of the results.", + "type": "string", + "example": "https://api.digitalocean.com/v2/images?page=1" + } + } + }, + "link_to_prev_page": { + "type": "object", + "properties": { + "prev": { + "description": "URI of the previous page of the results.", + "type": "string", + "example": "https://api.digitalocean.com/v2/images?page=1" + } + } + }, + "backward_links": { + "allOf": [ + { + "$ref": "#/components/schemas/link_to_first_page" + }, + { + "$ref": "#/components/schemas/link_to_prev_page" + } + ] + }, + "page_links": { + "type": "object", + "properties": { + "pages": { + "anyOf": [ + { + "$ref": "#/components/schemas/forward_links" + }, + { + "$ref": "#/components/schemas/backward_links" + }, + {} + ], + "example": { + "pages": { + "first": "https://api.digitalocean.com/v2/account/keys?page=1", + "prev": "https://api.digitalocean.com/v2/account/keys?page=2" + } + } + } + } + }, + "pagination": { + "type": "object", + "properties": { + "links": { + "$ref": "#/components/schemas/page_links" + } + } + }, + "meta_properties": { + "type": "object", + "description": "Information about the response itself.", + "properties": { + "total": { + "description": "Number of objects returned by the request.", + "type": "integer", + "example": 1 + } + } + }, + "meta": { + "type": "object", + "properties": { + "meta": { + "allOf": [ + { + "$ref": "#/components/schemas/meta_properties" + }, + { + "required": [ + "total" + ] + } + ] + } + }, + "required": [ + "meta" + ] + }, + "region": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The display name of the region. This will be a full name that is used in the control panel and other interfaces.", + "example": "New York 3" + }, + "slug": { + "type": "string", + "description": "A human-readable string that is used as a unique identifier for each region.", + "example": "nyc3" + }, + "features": { + "items": { + "type": "string" + }, + "description": "This attribute is set to an array which contains features available in this region", + "example": [ + "private_networking", + "backups", + "ipv6", + "metadata", + "install_agent", + "storage", + "image_transfer" + ] + }, + "available": { + "type": "boolean", + "description": "This is a boolean value that represents whether new Droplets can be created in this region.", + "example": true + }, + "sizes": { + "items": { + "type": "string" + }, + "description": "This attribute is set to an array which contains the identifying slugs for the sizes available in this region.", + "example": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192g" + ] + } + }, + "required": [ + "available", + "features", + "name", + "sizes", + "slug" + ] + }, + "slug": { + "type": "string", + "description": "A human-readable string that is used as a unique identifier for each region.", + "example": "nyc3" + }, + "action": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "description": "A unique numeric ID that can be used to identify and reference an action.", + "example": 36804636 + }, + "status": { + "type": "string", + "description": "The current status of the action. This can be \"in-progress\", \"completed\", or \"errored\".", + "enum": [ + "in-progress", + "completed", + "errored" + ], + "example": "completed", + "default": "in-progress" + }, + "type": { + "type": "string", + "description": "This is the type of action that the object represents. For example, this could be \"transfer\" to represent the state of an image transfer action.", + "example": "create" + }, + "started_at": { + "type": "string", + "format": "date-time", + "description": "A time value given in ISO8601 combined date and time format that represents when the action was initiated.", + "example": "2020-11-14T16:29:21Z" + }, + "completed_at": { + "type": "string", + "format": "date-time", + "nullable": true, + "description": "A time value given in ISO8601 combined date and time format that represents when the action was completed.", + "example": "2020-11-14T16:30:06Z" + }, + "resource_id": { + "type": "integer", + "nullable": true, + "description": "A unique identifier for the resource that the action is associated with.", + "example": 3164444 + }, + "resource_type": { + "type": "string", + "description": "The type of resource that the action is associated with.", + "example": "droplet" + }, + "region": { + "$ref": "#/components/schemas/region" + }, + "region_slug": { + "allOf": [ + { + "$ref": "#/components/schemas/slug" + }, + { + "type": "string", + "nullable": true + } + ] + } + } + }, + "apps_deployment_job": { + "properties": { + "name": { + "title": "The name of this job", + "type": "string", + "example": "migrate-db" + }, + "source_commit_hash": { + "title": "The commit hash of the repository that was used to build this job", + "type": "string", + "example": "54d4a727f457231062439895000d45437c7bb405" + } + }, + "type": "object" + }, + "apps_deployment_functions": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "The name of this functions component", + "example": "my-functions-component" + }, + "source_commit_hash": { + "type": "string", + "description": "The commit hash of the repository that was used to build this functions component.", + "example": "54d4a727f457231062439895000d45437c7bb405" + }, + "namespace": { + "type": "string", + "description": "The namespace where the functions are deployed.", + "example": "ap-b2a93513-8d9b-4223-9d61-5e7272c81c32" + } + } + }, + "apps_deployment_phase": { + "default": "UNKNOWN", + "enum": [ + "UNKNOWN", + "PENDING_BUILD", + "BUILDING", + "PENDING_DEPLOY", + "DEPLOYING", + "ACTIVE", + "SUPERSEDED", + "ERROR", + "CANCELED" + ], + "type": "string", + "example": "ACTIVE" + }, + "apps_deployment_progress_step_reason": { + "properties": { + "code": { + "title": "The error code", + "type": "string", + "example": "Title of Error" + }, + "message": { + "title": "The error message", + "type": "string", + "example": "This is an error" + } + }, + "type": "object" + }, + "apps_deployment_progress_step_status": { + "default": "UNKNOWN", + "enum": [ + "UNKNOWN", + "PENDING", + "RUNNING", + "ERROR", + "SUCCESS" + ], + "type": "string", + "example": "SUCCESS" + }, + "apps_deployment_progress_step": { + "properties": { + "component_name": { + "title": "The component name that this step is associated with", + "type": "string", + "example": "component" + }, + "ended_at": { + "format": "date-time", + "title": "The end time of this step", + "type": "string", + "example": "2020-11-19T20:27:18Z" + }, + "message_base": { + "description": "The base of a human-readable description of the step intended to be combined with the component name for presentation. For example:\n\n`message_base` = \"Building service\"\n`component_name` = \"api\"", + "type": "string", + "example": "Building service" + }, + "name": { + "title": "The name of this step", + "type": "string", + "example": "example_step" + }, + "reason": { + "$ref": "#/components/schemas/apps_deployment_progress_step_reason" + }, + "started_at": { + "format": "date-time", + "title": "The start time of this step", + "type": "string", + "example": "2020-11-19T20:27:18Z" + }, + "status": { + "$ref": "#/components/schemas/apps_deployment_progress_step_status" + }, + "steps": { + "items": { + "type": "object" + }, + "title": "Child steps of this step", + "type": "array" + } + }, + "title": "A step that is run as part of the deployment's lifecycle", + "type": "object" + }, + "apps_deployment_progress": { + "properties": { + "error_steps": { + "format": "int32", + "title": "Number of unsuccessful steps", + "type": "integer", + "example": 3 + }, + "pending_steps": { + "format": "int32", + "title": "Number of pending steps", + "type": "integer", + "example": 2 + }, + "running_steps": { + "format": "int32", + "title": "Number of currently running steps", + "type": "integer", + "example": 2 + }, + "steps": { + "items": { + "$ref": "#/components/schemas/apps_deployment_progress_step" + }, + "title": "The deployment's steps", + "type": "array" + }, + "success_steps": { + "format": "int32", + "title": "Number of successful steps", + "type": "integer", + "example": 4 + }, + "summary_steps": { + "items": { + "$ref": "#/components/schemas/apps_deployment_progress_step" + }, + "title": "A flattened summary of the steps", + "type": "array" + }, + "total_steps": { + "format": "int32", + "title": "Total number of steps", + "type": "integer", + "example": 5 + } + }, + "type": "object" + }, + "apps_deployment_service": { + "properties": { + "name": { + "title": "The name of this service", + "type": "string", + "example": "web" + }, + "source_commit_hash": { + "title": "The commit hash of the repository that was used to build this service", + "type": "string", + "example": "54d4a727f457231062439895000d45437c7bb405" + } + }, + "type": "object" + }, + "app_domain_spec": { + "type": "object", + "properties": { + "domain": { + "type": "string", + "maxLength": 253, + "minLength": 4, + "pattern": "^((xn--)?[a-zA-Z0-9]+(-[a-zA-Z0-9]+)*\\.)+[a-zA-Z]{2,}\\.?$", + "description": "The hostname for the domain", + "example": "app.example.com" + }, + "type": { + "type": "string", + "default": "UNSPECIFIED", + "enum": [ + "UNSPECIFIED", + "DEFAULT", + "PRIMARY", + "ALIAS" + ], + "description": "- DEFAULT: The default `.ondigitalocean.app` domain assigned to this app\n- PRIMARY: The primary domain for this app that is displayed as the default in the control panel, used in bindable environment variables, and any other places that reference an app's live URL. Only one domain may be set as primary.\n- ALIAS: A non-primary domain", + "example": "DEFAULT" + }, + "wildcard": { + "type": "boolean", + "description": "Indicates whether the domain includes all sub-domains, in addition to the given domain", + "example": true + }, + "zone": { + "description": "Optional. If the domain uses DigitalOcean DNS and you would like App\nPlatform to automatically manage it for you, set this to the name of the\ndomain on your account.\n\nFor example, If the domain you are adding is `app.domain.com`, the zone\ncould be `domain.com`.", + "type": "string", + "format": "hostname", + "example": "example.com" + }, + "minimum_tls_version": { + "type": "string", + "maxLength": 3, + "minLength": 3, + "enum": [ + "1.2", + "1.3" + ], + "description": "The minimum version of TLS a client application can use to access resources for the domain. Must be one of the following values wrapped within quotations: `\"1.2\"` or `\"1.3\"`.", + "example": "1.3" + } + }, + "required": [ + "domain" + ] + }, + "apps_git_source_spec": { + "type": "object", + "properties": { + "branch": { + "type": "string", + "description": "The name of the branch to use", + "example": "main" + }, + "repo_clone_url": { + "type": "string", + "description": "The clone URL of the repo. Example: `https://github.com/digitalocean/sample-golang.git`", + "example": "https://github.com/digitalocean/sample-golang.git" + } + } + }, + "apps_github_source_spec": { + "type": "object", + "properties": { + "branch": { + "type": "string", + "description": "The name of the branch to use", + "example": "main" + }, + "deploy_on_push": { + "type": "boolean", + "description": "Whether to automatically deploy new commits made to the repo", + "example": true + }, + "repo": { + "type": "string", + "description": "The name of the repo in the format owner/repo. Example: `digitalocean/sample-golang`", + "example": "digitalocean/sample-golang" + } + } + }, + "apps_gitlab_source_spec": { + "type": "object", + "properties": { + "branch": { + "type": "string", + "description": "The name of the branch to use", + "example": "main" + }, + "deploy_on_push": { + "type": "boolean", + "description": "Whether to automatically deploy new commits made to the repo", + "example": true + }, + "repo": { + "type": "string", + "description": "The name of the repo in the format owner/repo. Example: `digitalocean/sample-golang`", + "example": "digitalocean/sample-golang" + } + } + }, + "apps_image_source_spec": { + "type": "object", + "properties": { + "registry": { + "type": "string", + "description": "The registry name. Must be left empty for the `DOCR` registry type.", + "example": "registry.hub.docker.com" + }, + "registry_type": { + "type": "string", + "enum": [ + "DOCKER_HUB", + "DOCR" + ], + "description": "- DOCKER_HUB: The DockerHub container registry type.\n- DOCR: The DigitalOcean container registry type.", + "example": "DOCR" + }, + "repository": { + "type": "string", + "description": "The repository name.", + "example": "origin/master" + }, + "tag": { + "type": "string", + "description": "The repository tag. Defaults to `latest` if not provided.", + "example": "latest", + "default": "latest" + } + } + }, + "app_variable_definition": { + "type": "object", + "properties": { + "key": { + "type": "string", + "pattern": "^[_A-Za-z][_A-Za-z0-9]*$", + "description": "The variable name", + "example": "BASE_URL" + }, + "scope": { + "type": "string", + "enum": [ + "UNSET", + "RUN_TIME", + "BUILD_TIME", + "RUN_AND_BUILD_TIME" + ], + "description": "- RUN_TIME: Made available only at run-time\n- BUILD_TIME: Made available only at build-time\n- RUN_AND_BUILD_TIME: Made available at both build and run-time", + "default": "RUN_AND_BUILD_TIME", + "example": "BUILD_TIME" + }, + "type": { + "type": "string", + "enum": [ + "GENERAL", + "SECRET" + ], + "description": "- GENERAL: A plain-text environment variable\n- SECRET: A secret encrypted environment variable", + "default": "GENERAL", + "example": "GENERAL" + }, + "value": { + "description": "The value. If the type is `SECRET`, the value will be encrypted on first submission. On following submissions, the encrypted value should be used.", + "type": "string", + "example": "http://example.com" + } + }, + "required": [ + "key" + ] + }, + "app_log_destination_papertrail_spec": { + "type": "object", + "properties": { + "endpoint": { + "type": "string", + "description": "Papertrail syslog endpoint.", + "example": "https://mypapertrailendpoint.com" + } + }, + "description": "Papertrail configuration.", + "required": [ + "endpoint" + ] + }, + "app_log_destination_datadog_spec": { + "type": "object", + "properties": { + "endpoint": { + "type": "string", + "description": "Datadog HTTP log intake endpoint.", + "example": "https://mydatadogendpoint.com" + }, + "api_key": { + "type": "string", + "description": "Datadog API key.", + "example": "abcdefghijklmnopqrstuvwxyz0123456789" + } + }, + "description": "DataDog configuration.", + "required": [ + "api_key" + ] + }, + "app_log_destination_logtail_spec": { + "type": "object", + "properties": { + "token": { + "type": "string", + "description": "Logtail token.", + "example": "abcdefghijklmnopqrstuvwxyz0123456789" + } + }, + "description": "Logtail configuration.", + "required": [ + "endpoint" + ] + }, + "app_log_destination_definition": { + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 42, + "minLength": 2, + "pattern": "^[A-Za-z0-9()\\[\\]'\"][-A-Za-z0-9_. \\/()\\[\\]]{0,40}[A-Za-z0-9()\\[\\]'\"]$", + "example": "my_log_destination" + }, + "papertrail": { + "$ref": "#/components/schemas/app_log_destination_papertrail_spec" + }, + "datadog": { + "$ref": "#/components/schemas/app_log_destination_datadog_spec" + }, + "logtail": { + "$ref": "#/components/schemas/app_log_destination_logtail_spec" + } + }, + "title": "Configurations for external logging.", + "required": [ + "name" + ] + }, + "app_component_base": { + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 32, + "minLength": 2, + "pattern": "^[a-z][a-z0-9-]{0,30}[a-z0-9]$", + "description": "The name. Must be unique across all components within the same app.", + "example": "api" + }, + "git": { + "$ref": "#/components/schemas/apps_git_source_spec" + }, + "github": { + "$ref": "#/components/schemas/apps_github_source_spec" + }, + "gitlab": { + "$ref": "#/components/schemas/apps_gitlab_source_spec" + }, + "image": { + "$ref": "#/components/schemas/apps_image_source_spec" + }, + "dockerfile_path": { + "type": "string", + "description": "The path to the Dockerfile relative to the root of the repo. If set, it will be used to build this component. Otherwise, App Platform will attempt to build it using buildpacks.", + "example": "path/to/Dockerfile" + }, + "build_command": { + "type": "string", + "description": "An optional build command to run while building this component from source.", + "example": "npm run build" + }, + "run_command": { + "type": "string", + "description": "An optional run command to override the component's default.", + "example": "bin/api" + }, + "source_dir": { + "type": "string", + "description": "An optional path to the working directory to use for the build. For Dockerfile builds, this will be used as the build context. Must be relative to the root of the repo.", + "example": "path/to/dir" + }, + "envs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/app_variable_definition" + }, + "description": "A list of environment variables made available to the component." + }, + "environment_slug": { + "type": "string", + "description": "An environment slug describing the type of this app. For a full list, please refer to [the product documentation](https://www.digitalocean.com/docs/app-platform/).", + "example": "node-js" + }, + "log_destinations": { + "$ref": "#/components/schemas/app_log_destination_definition" + } + } + }, + "app_component_instance_base": { + "type": "object", + "properties": { + "instance_count": { + "type": "integer", + "format": "int64", + "minimum": 1, + "description": "The amount of instances that this component should be scaled to. Default: 1", + "default": 1, + "example": 2 + }, + "instance_size_slug": { + "description": "The instance size to use for this component. Default: `basic-xxs`", + "type": "string", + "enum": [ + "basic-xxs", + "basic-xs", + "basic-s", + "basic-m", + "professional-xs", + "professional-s", + "professional-m", + "professional-1l", + "professional-l", + "professional-xl" + ], + "default": "basic-xxs", + "example": "basic-xxs" + } + } + }, + "apps_string_match": { + "type": "object", + "properties": { + "exact": { + "type": "string", + "description": "Exact string match. Only 1 of `exact`, `prefix`, or `regex` must be set.", + "maxLength": 256, + "minLength": 1, + "example": "https://www.example.com" + }, + "prefix": { + "type": "string", + "description": "Prefix-based match. Only 1 of `exact`, `prefix`, or `regex` must be set.", + "maxLength": 256, + "minLength": 1, + "example": "https://www.example.com" + }, + "regex": { + "type": "string", + "maxLength": 256, + "minLength": 1, + "description": "RE2 style regex-based match. Only 1 of `exact`, `prefix`, or `regex` must be set. For more information about RE2 syntax, see: https://github.com/google/re2/wiki/Syntax", + "example": "^.*example.com" + } + } + }, + "apps_cors_policy": { + "type": "object", + "properties": { + "allow_origins": { + "type": "array", + "description": "The set of allowed CORS origins.", + "items": { + "$ref": "#/components/schemas/apps_string_match" + }, + "example": [ + { + "exact": "https://www.example.com" + }, + { + "regex": "^.*example.com" + } + ] + }, + "allow_methods": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The set of allowed HTTP methods. This configures the `Access-Control-Allow-Methods` header.", + "example": [ + "GET", + "OPTIONS", + "POST", + "PUT", + "PATCH", + "DELETE" + ] + }, + "allow_headers": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The set of allowed HTTP request headers. This configures the `Access-Control-Allow-Headers` header.", + "example": [ + "Content-Type", + "X-Custom-Header" + ] + }, + "expose_headers": { + "type": "array", + "items": { + "type": "string" + }, + "description": "The set of HTTP response headers that browsers are allowed to access. This configures the `Access-Control-Expose-Headers` header.", + "example": [ + "Content-Encoding", + "X-Custom-Header" + ] + }, + "max_age": { + "type": "string", + "description": "An optional duration specifying how long browsers can cache the results of a preflight request. This configures the `Access-Control-Max-Age` header.", + "example": "5h30m" + }, + "allow_credentials": { + "type": "boolean", + "description": "Whether browsers should expose the response to the client-side JavaScript code when the request’s credentials mode is include. This configures the `Access-Control-Allow-Credentials` header.", + "example": false + } + } + }, + "app_service_spec_health_check": { + "type": "object", + "properties": { + "failure_threshold": { + "type": "integer", + "format": "int32", + "description": "The number of failed health checks before considered unhealthy.", + "example": 2 + }, + "port": { + "type": "integer", + "format": "int64", + "description": "The port on which the health check will be performed. If not set, the health check will be performed on the component's http_port.", + "example": 80, + "maximum": 65535, + "minimum": 1 + }, + "http_path": { + "type": "string", + "description": "The route path used for the HTTP health check ping. If not set, the HTTP health check will be disabled and a TCP health check used instead.", + "example": "/health" + }, + "initial_delay_seconds": { + "type": "integer", + "format": "int32", + "description": "The number of seconds to wait before beginning health checks.", + "example": 30 + }, + "period_seconds": { + "type": "integer", + "format": "int32", + "description": "The number of seconds to wait between health checks.", + "example": 60 + }, + "success_threshold": { + "type": "integer", + "format": "int32", + "description": "The number of successful health checks before considered healthy.", + "example": 3 + }, + "timeout_seconds": { + "type": "integer", + "format": "int32", + "description": "The number of seconds after which the check times out.", + "example": 45 + } + } + }, + "app_route_spec": { + "title": "A criterion for routing HTTP traffic to a component.", + "type": "object", + "properties": { + "path": { + "description": "An HTTP path prefix. Paths must start with / and must be unique across all components within an app.", + "type": "string", + "example": "/api" + }, + "preserve_path_prefix": { + "description": "An optional flag to preserve the path that is forwarded to the backend service. By default, the HTTP request path will be trimmed from the left when forwarded to the component. For example, a component with `path=/api` will have requests to `/api/list` trimmed to `/list`. If this value is `true`, the path will remain `/api/list`.", + "type": "boolean", + "example": true + } + } + }, + "app_service_spec": { + "allOf": [ + { + "$ref": "#/components/schemas/app_component_base" + }, + { + "$ref": "#/components/schemas/app_component_instance_base" + }, + { + "type": "object", + "properties": { + "cors": { + "$ref": "#/components/schemas/apps_cors_policy" + }, + "health_check": { + "$ref": "#/components/schemas/app_service_spec_health_check" + }, + "http_port": { + "type": "integer", + "description": "The internal port on which this service's run command will listen. Default: 8080\nIf there is not an environment variable with the name `PORT`, one will be automatically added with its value set to the value of this field.", + "format": "int64", + "maximum": 65535, + "minimum": 1, + "example": 3000 + }, + "internal_ports": { + "type": "array", + "description": "The ports on which this service will listen for internal traffic.", + "items": { + "format": "int64", + "type": "integer" + }, + "example": [ + 80, + 443 + ] + }, + "routes": { + "type": "array", + "description": "A list of HTTP routes that should be routed to this component.", + "items": { + "$ref": "#/components/schemas/app_route_spec" + } + } + }, + "required": [ + "name" + ] + } + ] + }, + "app_static_site_spec": { + "allOf": [ + { + "$ref": "#/components/schemas/app_component_base" + }, + { + "type": "object", + "properties": { + "index_document": { + "type": "string", + "description": "The name of the index document to use when serving this static site. Default: index.html", + "default": "index.html", + "example": "main.html" + }, + "error_document": { + "type": "string", + "description": "The name of the error document to use when serving this static site. Default: 404.html. If no such file exists within the built assets, App Platform will supply one.", + "default": "404.html", + "example": "error.html" + }, + "catchall_document": { + "type": "string", + "description": "The name of the document to use as the fallback for any requests to documents that are not found when serving this static site. Only 1 of `catchall_document` or `error_document` can be set.", + "example": "index.html" + }, + "output_dir": { + "type": "string", + "description": "An optional path to where the built assets will be located, relative to the build context. If not set, App Platform will automatically scan for these directory names: `_static`, `dist`, `public`, `build`.", + "example": "dist/" + }, + "cors": { + "$ref": "#/components/schemas/apps_cors_policy" + }, + "routes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/app_route_spec" + }, + "description": "A list of HTTP routes that should be routed to this component." + } + } + } + ], + "required": [ + "name" + ] + }, + "app_job_spec": { + "allOf": [ + { + "$ref": "#/components/schemas/app_component_base" + }, + { + "$ref": "#/components/schemas/app_component_instance_base" + }, + { + "type": "object", + "properties": { + "kind": { + "type": "string", + "enum": [ + "UNSPECIFIED", + "PRE_DEPLOY", + "POST_DEPLOY", + "FAILED_DEPLOY" + ], + "description": "- UNSPECIFIED: Default job type, will auto-complete to POST_DEPLOY kind.\n- PRE_DEPLOY: Indicates a job that runs before an app deployment.\n- POST_DEPLOY: Indicates a job that runs after an app deployment.\n- FAILED_DEPLOY: Indicates a job that runs after a component fails to deploy.", + "default": "UNSPECIFIED", + "example": "PRE_DEPLOY" + } + }, + "required": [ + "name" + ] + } + ] + }, + "app_worker_spec": { + "allOf": [ + { + "$ref": "#/components/schemas/app_component_base" + }, + { + "$ref": "#/components/schemas/app_component_instance_base" + } + ], + "required": [ + "name" + ] + }, + "app_alert_spec_rule": { + "default": "UNSPECIFIED_RULE", + "enum": [ + "UNSPECIFIED_RULE", + "CPU_UTILIZATION", + "MEM_UTILIZATION", + "RESTART_COUNT", + "DEPLOYMENT_FAILED", + "DEPLOYMENT_LIVE", + "DOMAIN_FAILED", + "DOMAIN_LIVE", + "FUNCTIONS_ACTIVATION_COUNT", + "FUNCTIONS_AVERAGE_DURATION_MS", + "FUNCTIONS_ERROR_RATE_PER_MINUTE", + "FUNCTIONS_AVERAGE_WAIT_TIME_MS", + "FUNCTIONS_ERROR_COUNT", + "FUNCTIONS_GB_RATE_PER_SECOND" + ], + "type": "string", + "example": "CPU_UTILIZATION" + }, + "app_alert_spec_operator": { + "default": "UNSPECIFIED_OPERATOR", + "enum": [ + "UNSPECIFIED_OPERATOR", + "GREATER_THAN", + "LESS_THAN" + ], + "type": "string", + "example": "GREATER_THAN" + }, + "app_alert_spec_window": { + "default": "UNSPECIFIED_WINDOW", + "enum": [ + "UNSPECIFIED_WINDOW", + "FIVE_MINUTES", + "TEN_MINUTES", + "THIRTY_MINUTES", + "ONE_HOUR" + ], + "type": "string", + "example": "FIVE_MINUTES" + }, + "app_alert_spec": { + "properties": { + "rule": { + "$ref": "#/components/schemas/app_alert_spec_rule" + }, + "disabled": { + "description": "Is the alert disabled?", + "type": "boolean", + "example": false + }, + "operator": { + "$ref": "#/components/schemas/app_alert_spec_operator" + }, + "value": { + "description": "Threshold value for alert", + "format": "float", + "type": "number", + "example": 2.32 + }, + "window": { + "$ref": "#/components/schemas/app_alert_spec_window" + } + }, + "type": "object" + }, + "app_functions_spec": { + "type": "object", + "properties": { + "cors": { + "$ref": "#/components/schemas/apps_cors_policy" + }, + "routes": { + "type": "array", + "description": "A list of HTTP routes that should be routed to this component.", + "items": { + "$ref": "#/components/schemas/app_route_spec" + } + }, + "name": { + "type": "string", + "maxLength": 32, + "minLength": 2, + "pattern": "^[a-z][a-z0-9-]{0,30}[a-z0-9]$", + "description": "The name. Must be unique across all components within the same app.", + "example": "api" + }, + "source_dir": { + "type": "string", + "description": "An optional path to the working directory to use for the build. For Dockerfile builds, this will be used as the build context. Must be relative to the root of the repo.", + "example": "path/to/dir" + }, + "alerts": { + "type": "array", + "items": { + "$ref": "#/components/schemas/app_alert_spec" + } + }, + "envs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/app_variable_definition" + }, + "description": "A list of environment variables made available to the component." + }, + "git": { + "$ref": "#/components/schemas/apps_git_source_spec" + }, + "github": { + "$ref": "#/components/schemas/apps_github_source_spec" + }, + "gitlab": { + "$ref": "#/components/schemas/apps_gitlab_source_spec" + }, + "log_destinations": { + "$ref": "#/components/schemas/app_log_destination_definition" + } + }, + "required": [ + "name" + ] + }, + "app_database_spec": { + "type": "object", + "properties": { + "cluster_name": { + "description": "The name of the underlying DigitalOcean DBaaS cluster. This is required for production databases. For dev databases, if cluster_name is not set, a new cluster will be provisioned.", + "type": "string", + "example": "cluster_name" + }, + "db_name": { + "description": "The name of the MySQL or PostgreSQL database to configure.", + "type": "string", + "example": "my_db" + }, + "db_user": { + "description": "The name of the MySQL or PostgreSQL user to configure.", + "type": "string", + "example": "superuser" + }, + "engine": { + "type": "string", + "default": "UNSET", + "enum": [ + "UNSET", + "MYSQL", + "PG", + "REDIS" + ], + "description": "- MYSQL: MySQL\n- PG: PostgreSQL\n- REDIS: Redis", + "example": "PG" + }, + "name": { + "description": "The name. Must be unique across all components within the same app.", + "maxLength": 32, + "minLength": 2, + "pattern": "^[a-z][a-z0-9-]{0,30}[a-z0-9]$", + "type": "string", + "example": "prod-db" + }, + "production": { + "description": "Whether this is a production or dev database.", + "type": "boolean", + "example": true + }, + "version": { + "description": "The version of the database engine", + "type": "string", + "example": "12" + } + }, + "required": [ + "name" + ] + }, + "app_ingress_spec_rule_string_match": { + "type": "object", + "properties": { + "prefix": { + "type": "string", + "description": "Prefix-based match. For example, `/api` will match `/api`, `/api/`, and any nested paths such as `/api/v1/endpoint`.", + "maxLength": 256, + "example": "/api" + } + }, + "description": "The path to match on.", + "required": [ + "prefix" + ] + }, + "app_ingress_spec_rule_match": { + "type": "object", + "properties": { + "path": { + "$ref": "#/components/schemas/app_ingress_spec_rule_string_match" + } + }, + "description": "The match configuration for the rule.", + "required": [ + "path" + ] + }, + "app_ingress_spec_rule_routing_component": { + "type": "object", + "properties": { + "name": { + "description": "The name of the component to route to.", + "type": "string", + "example": "web" + }, + "preserve_path_prefix": { + "description": "An optional flag to preserve the path that is forwarded to the backend service. By default, the HTTP request path will be trimmed from the left when forwarded to the component. For example, a component with `path=/api` will have requests to `/api/list` trimmed to `/list`. If this value is `true`, the path will remain `/api/list`. Note: this is not applicable for Functions Components and is mutually exclusive with `rewrite`.", + "type": "string", + "example": "true" + }, + "rewrite": { + "description": "An optional field that will rewrite the path of the component to be what is specified here. By default, the HTTP request path will be trimmed from the left when forwarded to the component. For example, a component with `path=/api` will have requests to `/api/list` trimmed to `/list`. If you specified the rewrite to be `/v1/`, requests to `/api/list` would be rewritten to `/v1/list`. Note: this is mutually exclusive with `preserve_path_prefix`.", + "type": "string", + "example": "/api/v1/" + } + }, + "description": "The component to route to. Only one of `component` or `redirect` may be set.", + "required": [ + "name" + ] + }, + "app_ingress_spec_rule_routing_redirect": { + "type": "object", + "properties": { + "uri": { + "description": "An optional URI path to redirect to. Note: if this is specified the whole URI of the original request will be overwritten to this value, irrespective of the original request URI being matched.", + "type": "string", + "example": "/about" + }, + "authority": { + "description": "The authority/host to redirect to. This can be a hostname or IP address. Note: use `port` to set the port.", + "type": "string", + "example": "example.com" + }, + "port": { + "description": "The port to redirect to.", + "type": "integer", + "format": "int64", + "example": 443 + }, + "scheme": { + "description": "The scheme to redirect to. Supported values are `http` or `https`. Default: `https`.", + "type": "string", + "example": "https" + }, + "redirect_code": { + "description": "The redirect code to use. Defaults to `302`. Supported values are 300, 301, 302, 303, 304, 307, 308.", + "type": "integer", + "format": "int64", + "example": 302 + } + }, + "description": "The redirect configuration for the rule. Only one of `component` or `redirect` may be set." + }, + "app_ingress_spec_rule": { + "type": "object", + "properties": { + "match": { + "$ref": "#/components/schemas/app_ingress_spec_rule_match" + }, + "cors": { + "$ref": "#/components/schemas/apps_cors_policy" + }, + "component": { + "$ref": "#/components/schemas/app_ingress_spec_rule_routing_component" + }, + "redirect": { + "$ref": "#/components/schemas/app_ingress_spec_rule_routing_redirect" + } + } + }, + "app_ingress_spec": { + "type": "object", + "properties": { + "rules": { + "description": "Rules for configuring HTTP ingress for component routes, CORS, rewrites, and redirects.", + "type": "array", + "items": { + "$ref": "#/components/schemas/app_ingress_spec_rule" + } + } + }, + "description": "Specification for app ingress configurations." + }, + "app_spec": { + "title": "AppSpec", + "type": "object", + "description": "The desired configuration of an application.", + "properties": { + "name": { + "description": "The name of the app. Must be unique across all apps in the same account.", + "maxLength": 32, + "minLength": 2, + "pattern": "^[a-z][a-z0-9-]{0,30}[a-z0-9]$", + "type": "string", + "example": "web-app-01" + }, + "region": { + "description": "The slug form of the geographical origin of the app. Default: `nearest available`", + "type": "string", + "enum": [ + "ams", + "nyc", + "fra", + "sfo", + "sgp", + "blr", + "tor", + "lon", + "syd" + ], + "example": "nyc" + }, + "domains": { + "description": "A set of hostnames where the application will be available.", + "type": "array", + "items": { + "$ref": "#/components/schemas/app_domain_spec" + } + }, + "services": { + "description": "Workloads which expose publicly-accessible HTTP services.", + "type": "array", + "items": { + "$ref": "#/components/schemas/app_service_spec" + } + }, + "static_sites": { + "description": "Content which can be rendered to static web assets.", + "type": "array", + "items": { + "$ref": "#/components/schemas/app_static_site_spec" + } + }, + "jobs": { + "description": "Pre and post deployment workloads which do not expose publicly-accessible HTTP routes.", + "type": "array", + "items": { + "$ref": "#/components/schemas/app_job_spec" + } + }, + "workers": { + "description": "Workloads which do not expose publicly-accessible HTTP services.", + "items": { + "$ref": "#/components/schemas/app_worker_spec" + }, + "type": "array" + }, + "functions": { + "description": "Workloads which expose publicly-accessible HTTP services via Functions Components.", + "items": { + "$ref": "#/components/schemas/app_functions_spec" + }, + "type": "array" + }, + "databases": { + "description": "Database instances which can provide persistence to workloads within the\napplication.", + "type": "array", + "items": { + "$ref": "#/components/schemas/app_database_spec" + } + }, + "ingress": { + "$ref": "#/components/schemas/app_ingress_spec" + } + }, + "required": [ + "name" + ] + }, + "apps_deployment_static_site": { + "properties": { + "name": { + "title": "The name of this static site", + "type": "string", + "example": "web" + }, + "source_commit_hash": { + "title": "The commit hash of the repository that was used to build this static site", + "type": "string", + "example": "54d4a727f457231062439895000d45437c7bb405" + } + }, + "type": "object" + }, + "apps_deployment_worker": { + "properties": { + "name": { + "title": "The name of this worker", + "type": "string", + "example": "queue-runner" + }, + "source_commit_hash": { + "title": "The commit hash of the repository that was used to build this worker", + "type": "string", + "example": "54d4a727f457231062439895000d45437c7bb405" + } + }, + "type": "object" + }, + "apps_deployment": { + "properties": { + "cause": { + "title": "What caused this deployment to be created", + "type": "string", + "example": "commit 9a4df0b pushed to github/digitalocean/sample-golang" + }, + "cloned_from": { + "title": "The ID of a previous deployment that this deployment was cloned from", + "type": "string", + "example": "3aa4d20e-5527-4c00-b496-601fbd22520a" + }, + "created_at": { + "format": "date-time", + "title": "The creation time of the deployment", + "type": "string", + "example": "2020-07-28T18:00:00Z" + }, + "id": { + "title": "The ID of the deployment", + "type": "string", + "example": "b6bdf840-2854-4f87-a36c-5f231c617c84" + }, + "jobs": { + "items": { + "$ref": "#/components/schemas/apps_deployment_job" + }, + "title": "Job components that are part of this deployment", + "type": "array" + }, + "functions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/apps_deployment_functions" + }, + "title": "Functions components that are part of this deployment" + }, + "phase": { + "$ref": "#/components/schemas/apps_deployment_phase" + }, + "phase_last_updated_at": { + "format": "date-time", + "title": "When the deployment phase was last updated", + "type": "string", + "example": "0001-01-01T00:00:00Z" + }, + "progress": { + "$ref": "#/components/schemas/apps_deployment_progress" + }, + "services": { + "items": { + "$ref": "#/components/schemas/apps_deployment_service" + }, + "title": "Service components that are part of this deployment", + "type": "array" + }, + "spec": { + "$ref": "#/components/schemas/app_spec" + }, + "static_sites": { + "items": { + "$ref": "#/components/schemas/apps_deployment_static_site" + }, + "title": "Static Site components that are part of this deployment", + "type": "array" + }, + "tier_slug": { + "readOnly": true, + "title": "The current pricing tier slug of the deployment", + "type": "string", + "example": "basic" + }, + "updated_at": { + "format": "date-time", + "title": "When the deployment was last updated", + "type": "string", + "example": "2020-07-28T18:00:00Z" + }, + "workers": { + "items": { + "$ref": "#/components/schemas/apps_deployment_worker" + }, + "title": "Worker components that are part of this deployment", + "type": "array" + } + }, + "title": "An app deployment", + "type": "object" + }, + "apps_domain_phase": { + "default": "UNKNOWN", + "enum": [ + "UNKNOWN", + "PENDING", + "CONFIGURING", + "ACTIVE", + "ERROR" + ], + "type": "string", + "example": "ACTIVE" + }, + "apps_domain_progress": { + "properties": { + "steps": { + "items": { + "type": "object" + }, + "title": "The steps of the domain's progress", + "type": "array" + } + }, + "type": "object" + }, + "app_domain_validation": { + "properties": { + "txt_name": { + "title": "TXT record name", + "type": "string", + "readOnly": true, + "example": "_acme-challenge.app.example.com" + }, + "txt_value": { + "title": "TXT record value", + "type": "string", + "readOnly": true, + "example": "lXLOcN6cPv0nproViNcUHcahD9TrIPlNgdwesj0pYpk" + } + } + }, + "apps_domain": { + "properties": { + "id": { + "title": "The ID of the domain", + "type": "string", + "example": "4f6c71e2-1e90-4762-9fee-6cc4a0a9f2cf" + }, + "phase": { + "$ref": "#/components/schemas/apps_domain_phase" + }, + "progress": { + "$ref": "#/components/schemas/apps_domain_progress" + }, + "spec": { + "$ref": "#/components/schemas/app_domain_spec" + }, + "validations": { + "title": "List of TXT validation records", + "type": "array", + "items": { + "$ref": "#/components/schemas/app_domain_validation" + } + }, + "rotate_validation_records": { + "title": "Validation values have changed and require manual intervention", + "type": "boolean", + "readOnly": true + }, + "certificate_expires_at": { + "title": "Current SSL certificate expiration time", + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2024-01-29T23:59:59Z" + } + }, + "type": "object" + }, + "apps_region": { + "properties": { + "continent": { + "readOnly": true, + "title": "The continent that this region is in", + "type": "string", + "example": "europe" + }, + "data_centers": { + "items": { + "type": "string", + "example": "ams" + }, + "readOnly": true, + "title": "Data centers that are in this region", + "type": "array", + "example": [ + "ams" + ] + }, + "default": { + "description": "Whether or not the region is presented as the default.", + "readOnly": true, + "type": "boolean", + "example": true + }, + "disabled": { + "readOnly": true, + "title": "Whether or not the region is open for new apps", + "type": "boolean", + "example": true + }, + "flag": { + "readOnly": true, + "title": "The flag of this region", + "type": "string", + "example": "ams" + }, + "label": { + "readOnly": true, + "title": "A human-readable name of the region", + "type": "string", + "example": "ams" + }, + "reason": { + "readOnly": true, + "title": "Reason that this region is not available", + "type": "string", + "example": "to crowded" + }, + "slug": { + "readOnly": true, + "title": "The slug form of the region name", + "type": "string", + "example": "basic" + } + }, + "title": "Geographical information about an app origin", + "type": "object" + }, + "app": { + "description": "An application's configuration and status.", + "properties": { + "active_deployment": { + "$ref": "#/components/schemas/apps_deployment" + }, + "created_at": { + "format": "date-time", + "readOnly": true, + "title": "The creation time of the app", + "type": "string", + "example": "2020-11-19T20:27:18Z" + }, + "default_ingress": { + "readOnly": true, + "title": "The default hostname on which the app is accessible", + "type": "string", + "example": "digitalocean.com" + }, + "domains": { + "items": { + "$ref": "#/components/schemas/apps_domain" + }, + "readOnly": true, + "title": "Contains all domains for the app", + "type": "array" + }, + "id": { + "readOnly": true, + "title": "The ID of the application", + "type": "string", + "example": "4f6c71e2-1e90-4762-9fee-6cc4a0a9f2cf" + }, + "in_progress_deployment": { + "$ref": "#/components/schemas/apps_deployment" + }, + "last_deployment_created_at": { + "format": "date-time", + "readOnly": true, + "title": "The creation time of the last deployment", + "type": "string", + "example": "2020-11-19T20:27:18Z" + }, + "live_domain": { + "readOnly": true, + "title": "The live domain of the app", + "type": "string", + "example": "live_domain" + }, + "live_url": { + "readOnly": true, + "title": "The live URL of the app", + "type": "string", + "example": "google.com" + }, + "live_url_base": { + "readOnly": true, + "title": "The live URL base of the app, the URL excluding the path", + "type": "string", + "example": "digitalocean.com" + }, + "owner_uuid": { + "readOnly": true, + "title": "The ID of the account to which the application belongs", + "type": "string", + "example": "4f6c71e2-1e90-4762-9fee-6cc4a0a9f2cf" + }, + "pending_deployment": { + "allOf": [ + { + "description": "The most recent pending deployment. For CreateApp and UpdateApp transactions this is guaranteed to reflect the associated deployment." + }, + { + "$ref": "#/components/schemas/apps_deployment" + } + ] + }, + "project_id": { + "readOnly": true, + "type": "string", + "example": "88b72d1a-b78a-4d9f-9090-b53c4399073f", + "title": "The ID of the project the app is assigned to. This will be empty if there is a lookup failure." + }, + "region": { + "$ref": "#/components/schemas/apps_region" + }, + "spec": { + "$ref": "#/components/schemas/app_spec" + }, + "tier_slug": { + "readOnly": true, + "title": "The current pricing tier slug of the app", + "type": "string", + "example": "basic" + }, + "updated_at": { + "format": "date-time", + "readOnly": true, + "title": "Time of the app's last configuration update", + "type": "string", + "example": "2020-12-01T00:42:16Z" + }, + "pinned_deployment": { + "allOf": [ + { + "description": "The deployment that the app is pinned to." + }, + { + "$ref": "#/components/schemas/apps_deployment" + } + ] + } + }, + "required": [ + "spec" + ], + "type": "object" + }, + "apps_response": { + "allOf": [ + { + "type": "object", + "properties": { + "apps": { + "title": "A list of apps", + "type": "array", + "items": { + "$ref": "#/components/schemas/app" + } + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ] + }, + "apps_create_app_request": { + "properties": { + "spec": { + "$ref": "#/components/schemas/app_spec" + }, + "project_id": { + "type": "string", + "description": "The ID of the project the app should be assigned to. If omitted, it will be assigned to your default project." + } + }, + "required": [ + "spec" + ], + "type": "object" + }, + "app_response": { + "properties": { + "app": { + "$ref": "#/components/schemas/app" + } + }, + "type": "object" + }, + "apps_update_app_request": { + "type": "object", + "properties": { + "spec": { + "$ref": "#/components/schemas/app_spec" + } + }, + "required": [ + "spec" + ] + }, + "apps_delete_app_response": { + "properties": { + "id": { + "title": "The ID of the app that was deleted", + "type": "string", + "example": "4f6c71e2-1e90-4762-9fee-6cc4a0a9f2cf" + } + }, + "type": "object" + }, + "apps_get_logs_response": { + "properties": { + "historic_urls": { + "items": { + "type": "string", + "example": "https://logs/build.log" + }, + "title": "A list of URLs to archived log files", + "type": "array" + }, + "live_url": { + "description": "A URL of the real-time live logs. This URL may use either the `https://` or `wss://` protocols and will keep pushing live logs as they become available.", + "type": "string", + "example": "ws://logs/build" + } + }, + "type": "object" + }, + "apps_deployments_response": { + "allOf": [ + { + "type": "object", + "properties": { + "deployments": { + "title": "A list of deployments", + "type": "array", + "items": { + "$ref": "#/components/schemas/apps_deployment" + } + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ] + }, + "apps_create_deployment_request": { + "type": "object", + "properties": { + "force_build": { + "title": "Indicates whether to force a build of app from source even if an existing cached build is suitable for re-use", + "type": "boolean", + "example": true + } + } + }, + "apps_deployment_response": { + "properties": { + "deployment": { + "$ref": "#/components/schemas/apps_deployment" + } + }, + "type": "object" + }, + "apps_tier": { + "properties": { + "build_seconds": { + "format": "int64", + "title": "The amount of included build time in seconds", + "type": "string", + "example": "233" + }, + "egress_bandwidth_bytes": { + "format": "int64", + "title": "The amount of included outbound bandwidth in bytes", + "type": "string", + "example": "123" + }, + "name": { + "title": "A human-readable name of the tier", + "type": "string", + "example": "test" + }, + "slug": { + "title": "The slug of the tier", + "type": "string", + "example": "test" + }, + "storage_bytes": { + "format": "int64", + "title": "The allotted disk space in bytes", + "type": "string", + "example": "10000000" + } + }, + "type": "object" + }, + "apps_list_tiers_response": { + "properties": { + "tiers": { + "items": { + "$ref": "#/components/schemas/apps_tier" + }, + "type": "array" + } + }, + "type": "object" + }, + "apps_get_tier_response": { + "properties": { + "tier": { + "$ref": "#/components/schemas/apps_tier" + } + }, + "type": "object" + }, + "instance_size_cpu_type": { + "default": "UNSPECIFIED", + "enum": [ + "UNSPECIFIED", + "SHARED", + "DEDICATED" + ], + "title": "- SHARED: Shared vCPU cores\n - DEDICATED: Dedicated vCPU cores", + "type": "string", + "example": "SHARED" + }, + "apps_instance_size": { + "properties": { + "cpu_type": { + "$ref": "#/components/schemas/instance_size_cpu_type" + }, + "cpus": { + "format": "int64", + "title": "The number of allotted vCPU cores", + "type": "string", + "example": "3" + }, + "memory_bytes": { + "format": "int64", + "title": "The allotted memory in bytes", + "type": "string", + "example": "1048" + }, + "name": { + "title": "A human-readable name of the instance size", + "type": "string", + "example": "name" + }, + "slug": { + "title": "The slug of the instance size", + "type": "string", + "example": "basic" + }, + "tier_downgrade_to": { + "title": "The slug of the corresponding downgradable instance size on the lower tier", + "type": "string", + "example": "basic" + }, + "tier_slug": { + "title": "The slug of the tier to which this instance size belongs", + "type": "string", + "example": "basic" + }, + "tier_upgrade_to": { + "title": "The slug of the corresponding upgradable instance size on the higher tier", + "type": "string", + "example": "basic" + }, + "usd_per_month": { + "title": "The cost of this instance size in USD per month", + "type": "string", + "example": "23" + }, + "usd_per_second": { + "title": "The cost of this instance size in USD per second", + "type": "string", + "example": "0.00000001232" + } + }, + "type": "object" + }, + "apps_list_instance_sizes_response": { + "properties": { + "discount_percent": { + "format": "float", + "type": "number", + "example": 2.32 + }, + "instance_sizes": { + "items": { + "$ref": "#/components/schemas/apps_instance_size" + }, + "type": "array" + } + }, + "type": "object" + }, + "apps_get_instance_size_response": { + "properties": { + "instance_size": { + "$ref": "#/components/schemas/apps_instance_size" + } + }, + "type": "object" + }, + "apps_list_regions_response": { + "properties": { + "regions": { + "items": { + "$ref": "#/components/schemas/apps_region" + }, + "type": "array" + } + }, + "type": "object" + }, + "app_propose": { + "type": "object", + "properties": { + "spec": { + "$ref": "#/components/schemas/app_spec" + }, + "app_id": { + "type": "string", + "description": "An optional ID of an existing app. If set, the spec will be treated as a proposed update to the specified app. The existing app is not modified using this method.", + "example": "b6bdf840-2854-4f87-a36c-5f231c617c84" + } + }, + "required": [ + "spec" + ] + }, + "app_propose_response": { + "type": "object", + "properties": { + "app_is_static": { + "type": "boolean", + "description": "Indicates whether the app is a static app.", + "example": true + }, + "app_name_available": { + "type": "boolean", + "description": "Indicates whether the app name is available.", + "example": true + }, + "app_name_suggestion": { + "type": "string", + "description": "The suggested name if the proposed app name is unavailable.", + "example": "newName" + }, + "existing_static_apps": { + "type": "string", + "description": "The maximum number of free static apps the account can have. We will charge you for any additional static apps.", + "example": "2" + }, + "spec": { + "$ref": "#/components/schemas/app_spec" + }, + "app_cost": { + "type": "integer", + "format": "int32", + "description": "The monthly cost of the proposed app in USD using the next pricing plan tier. For example, if you propose an app that uses the Basic tier, the `app_tier_upgrade_cost` field displays the monthly cost of the app if it were to use the Professional tier. If the proposed app already uses the most expensive tier, the field is empty.", + "example": 5 + }, + "app_tier_downgrade_cost": { + "type": "integer", + "format": "int32", + "description": "The monthly cost of the proposed app in USD using the previous pricing plan tier. For example, if you propose an app that uses the Professional tier, the `app_tier_downgrade_cost` field displays the monthly cost of the app if it were to use the Basic tier. If the proposed app already uses the lest expensive tier, the field is empty.", + "example": 17 + } + } + }, + "app_alert_email": { + "default": "", + "type": "string", + "example": "sammy@digitalocean.com" + }, + "app_alert_slack_webhook": { + "properties": { + "url": { + "title": "URL of the Slack webhook", + "type": "string", + "example": "https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX" + }, + "channel": { + "title": "Name of the Slack Webhook Channel", + "type": "string", + "example": "Channel Name" + } + }, + "type": "object" + }, + "app_alert_phase": { + "default": "UNKNOWN", + "enum": [ + "UNKNOWN", + "PENDING", + "CONFIGURING", + "ACTIVE", + "ERROR" + ], + "type": "string", + "example": "ACTIVE" + }, + "app_alert_progress_step_status": { + "default": "UNKNOWN", + "enum": [ + "UNKNOWN", + "PENDING", + "RUNNING", + "ERROR", + "SUCCESS" + ], + "type": "string", + "example": "SUCCESS" + }, + "app_alert_progress_step_reason": { + "properties": { + "code": { + "title": "The error code", + "type": "string", + "example": "Title of Error" + }, + "message": { + "title": "The error message", + "type": "string", + "example": "This is an error" + } + }, + "type": "object" + }, + "app_alert_progress_step": { + "properties": { + "name": { + "title": "The name of this step", + "type": "string", + "example": "example_step" + }, + "status": { + "$ref": "#/components/schemas/app_alert_progress_step_status" + }, + "started_at": { + "format": "date-time", + "title": "The start time of this step", + "type": "string", + "example": "2020-11-19T20:27:18Z" + }, + "ended_at": { + "format": "date-time", + "title": "The start time of this step", + "type": "string", + "example": "2020-11-19T20:27:18Z" + }, + "reason": { + "$ref": "#/components/schemas/app_alert_progress_step_reason" + } + }, + "type": "object" + }, + "app_alert_progress": { + "properties": { + "steps": { + "title": "Steps of an alert's progress.", + "type": "array", + "items": { + "$ref": "#/components/schemas/app_alert_progress_step" + } + } + }, + "type": "object" + }, + "app_alert": { + "properties": { + "id": { + "readOnly": true, + "title": "The ID of the alert", + "type": "string", + "example": "4f6c71e2-1e90-4762-9fee-6cc4a0a9f2cf" + }, + "component_name": { + "title": "Name of component the alert belongs to", + "type": "string", + "example": "backend" + }, + "spec": { + "$ref": "#/components/schemas/app_alert_spec" + }, + "emails": { + "title": "Emails for alerts to go to", + "type": "array", + "items": { + "$ref": "#/components/schemas/app_alert_email" + }, + "example": [ + "sammy@digitalocean.com" + ] + }, + "slack_webhooks": { + "title": "Slack Webhooks to send alerts to", + "type": "array", + "items": { + "$ref": "#/components/schemas/app_alert_slack_webhook" + } + }, + "phase": { + "$ref": "#/components/schemas/app_alert_phase" + }, + "progress": { + "$ref": "#/components/schemas/app_alert_progress" + } + }, + "type": "object" + }, + "apps_list_alerts_response": { + "properties": { + "alerts": { + "type": "array", + "items": { + "$ref": "#/components/schemas/app_alert" + } + } + }, + "type": "object" + }, + "apps_assign_app_alert_destinations_request": { + "properties": { + "emails": { + "type": "array", + "items": { + "$ref": "#/components/schemas/app_alert_email" + }, + "example": [ + "sammy@digitalocean.com" + ] + }, + "slack_webhooks": { + "type": "array", + "items": { + "$ref": "#/components/schemas/app_alert_slack_webhook" + } + } + }, + "type": "object" + }, + "apps_alert_response": { + "properties": { + "alert": { + "$ref": "#/components/schemas/app_alert" + } + }, + "type": "object" + }, + "apps_rollback_app_request": { + "type": "object", + "properties": { + "deployment_id": { + "type": "string", + "description": "The ID of the deployment to rollback to.", + "example": "3aa4d20e-5527-4c00-b496-601fbd22520a" + }, + "skip_pin": { + "type": "boolean", + "description": "Whether to skip pinning the rollback deployment. If false, the rollback deployment will be pinned and any new deployments including Auto Deploy on Push hooks will be disabled until the rollback is either manually committed or reverted via the CommitAppRollback or RevertAppRollback endpoints respectively. If true, the rollback will be immediately committed and the app will remain unpinned.", + "example": false + } + } + }, + "app_rollback_validation_condition": { + "type": "object", + "properties": { + "code": { + "type": "string", + "enum": [ + "incompatible_phase", + "incompatible_result", + "exceeded_revision_limit", + "app_pinned", + "database_config_conflict", + "region_conflict", + "static_site_requires_rebuild", + "image_source_missing_digest" + ], + "example": "exceeded_revision_limit", + "description": "A code identifier that represents the failing condition.\n\nFailing conditions:\n - `incompatible_phase` - indicates that the deployment's phase is not suitable for rollback.\n - `incompatible_result` - indicates that the deployment's result is not suitable for rollback.\n - `exceeded_revision_limit` - indicates that the app has exceeded the rollback revision limits for its tier.\n - `app_pinned` - indicates that there is already a rollback in progress and the app is pinned.\n - `database_config_conflict` - indicates that the deployment's database config is different than the current config.\n - `region_conflict` - indicates that the deployment's region differs from the current app region.\n \nWarning conditions:\n - `static_site_requires_rebuild` - indicates that the deployment contains at least one static site that will require a rebuild.\n - `image_source_missing_digest` - indicates that the deployment contains at least one component with an image source that is missing a digest.\n" + }, + "message": { + "type": "string", + "description": "A human-readable message describing the failing condition.", + "example": "the deployment is past the maximum historical revision limit of 0 for the \"starter\" app tier" + }, + "components": { + "type": "array", + "items": { + "type": "string", + "description": "If applicable, a list of components that are failing the condition." + }, + "example": [ + "www" + ] + } + } + }, + "app_metrics_bandwidth_usage_details": { + "type": "object", + "properties": { + "app_id": { + "type": "string", + "description": "The ID of the app.", + "example": "4f6c71e2-1e90-4762-9fee-6cc4a0a9f2cf" + }, + "bandwidth_bytes": { + "type": "string", + "format": "uint64", + "description": "The used bandwidth amount in bytes.", + "example": "513668" + } + }, + "description": "Bandwidth usage for an app." + }, + "app_metrics_bandwidth_usage": { + "type": "object", + "properties": { + "app_bandwidth_usage": { + "type": "array", + "items": { + "$ref": "#/components/schemas/app_metrics_bandwidth_usage_details" + }, + "description": "A list of bandwidth usage details by app." + }, + "date": { + "type": "string", + "format": "date-time", + "description": "The date for the metrics data.", + "example": "2023-01-17T00:00:00Z" + } + } + }, + "app_metrics_bandwidth_usage_request": { + "type": "object", + "properties": { + "app_ids": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of app IDs to query bandwidth metrics for.", + "maxItems": 100, + "example": [ + "4f6c71e2-1e90-4762-9fee-6cc4a0a9f2cf", + "c2a93513-8d9b-4223-9d61-5e7272c81cf5" + ] + }, + "date": { + "type": "string", + "format": "date-time", + "description": "Optional day to query. Only the date component of the timestamp will be considered. Default: yesterday.", + "example": "2023-01-17T00:00:00Z" + } + }, + "required": [ + "app_ids" + ] + }, + "cdn_endpoint": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "example": "892071a0-bb95-49bc-8021-3afd67a210bf", + "description": "A unique ID that can be used to identify and reference a CDN endpoint." + }, + "origin": { + "type": "string", + "format": "hostname", + "example": "static-images.nyc3.digitaloceanspaces.com", + "description": "The fully qualified domain name (FQDN) for the origin server which provides the content for the CDN. This is currently restricted to a Space." + }, + "endpoint": { + "type": "string", + "format": "hostname", + "readOnly": true, + "example": "static-images.nyc3.cdn.digitaloceanspaces.com", + "description": "The fully qualified domain name (FQDN) from which the CDN-backed content is served." + }, + "ttl": { + "type": "integer", + "example": 3600, + "enum": [ + 60, + 600, + 3600, + 86400, + 604800 + ], + "default": 3600, + "description": "The amount of time the content is cached by the CDN's edge servers in seconds. TTL must be one of 60, 600, 3600, 86400, or 604800. Defaults to 3600 (one hour) when excluded." + }, + "certificate_id": { + "type": "string", + "format": "uuid", + "example": "892071a0-bb95-49bc-8021-3afd67a210bf", + "description": "The ID of a DigitalOcean managed TLS certificate used for SSL when a custom subdomain is provided." + }, + "custom_domain": { + "type": "string", + "format": "hostname", + "example": "static.example.com", + "description": "The fully qualified domain name (FQDN) of the custom subdomain used with the CDN endpoint." + }, + "created_at": { + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-03-21T16:02:37Z", + "description": "A time value given in ISO8601 combined date and time format that represents when the CDN endpoint was created." + } + }, + "required": [ + "origin" + ] + }, + "update_endpoint": { + "type": "object", + "properties": { + "ttl": { + "type": "integer", + "example": 3600, + "enum": [ + 60, + 600, + 3600, + 86400, + 604800 + ], + "default": 3600, + "description": "The amount of time the content is cached by the CDN's edge servers in seconds. TTL must be one of 60, 600, 3600, 86400, or 604800. Defaults to 3600 (one hour) when excluded." + }, + "certificate_id": { + "type": "string", + "format": "uuid", + "example": "892071a0-bb95-49bc-8021-3afd67a210bf", + "description": "The ID of a DigitalOcean managed TLS certificate used for SSL when a custom subdomain is provided." + }, + "custom_domain": { + "type": "string", + "format": "hostname", + "example": "static.example.com", + "description": "The fully qualified domain name (FQDN) of the custom subdomain used with the CDN endpoint." + } + } + }, + "purge_cache": { + "type": "object", + "properties": { + "files": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "path/to/image.png", + "path/to/css/*" + ], + "description": "An array of strings containing the path to the content to be purged from the CDN cache." + } + }, + "required": [ + "files" + ] + }, + "certificate": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "example": "892071a0-bb95-49bc-8021-3afd67a210bf", + "description": "A unique ID that can be used to identify and reference a certificate." + }, + "name": { + "type": "string", + "example": "web-cert-01", + "description": "A unique human-readable name referring to a certificate." + }, + "not_after": { + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2017-02-22T00:23:00Z", + "description": "A time value given in ISO8601 combined date and time format that represents the certificate's expiration date." + }, + "sha1_fingerprint": { + "type": "string", + "readOnly": true, + "example": "dfcc9f57d86bf58e321c2c6c31c7a971be244ac7", + "description": "A unique identifier generated from the SHA-1 fingerprint of the certificate." + }, + "created_at": { + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2017-02-08T16:02:37Z", + "description": "A time value given in ISO8601 combined date and time format that represents when the certificate was created." + }, + "dns_names": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "www.example.com", + "example.com" + ], + "description": "An array of fully qualified domain names (FQDNs) for which the certificate was issued." + }, + "state": { + "type": "string", + "enum": [ + "pending", + "verified", + "error" + ], + "readOnly": true, + "example": "verified", + "description": "A string representing the current state of the certificate. It may be `pending`, `verified`, or `error`." + }, + "type": { + "type": "string", + "enum": [ + "custom", + "lets_encrypt" + ], + "example": "lets_encrypt", + "description": "A string representing the type of the certificate. The value will be `custom` for a user-uploaded certificate or `lets_encrypt` for one automatically generated with Let's Encrypt." + } + } + }, + "certificate_create_base": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "web-cert-01", + "description": "A unique human-readable name referring to a certificate." + }, + "type": { + "type": "string", + "enum": [ + "custom", + "lets_encrypt" + ], + "example": "lets_encrypt", + "description": "A string representing the type of the certificate. The value will be `custom` for a user-uploaded certificate or `lets_encrypt` for one automatically generated with Let's Encrypt." + } + }, + "required": [ + "name" + ] + }, + "certificate_request_lets_encrypt": { + "title": "Let's Encrypt Certificate Request", + "allOf": [ + { + "$ref": "#/components/schemas/certificate_create_base" + }, + { + "type": "object", + "properties": { + "dns_names": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "www.example.com", + "example.com" + ], + "description": "An array of fully qualified domain names (FQDNs) for which the certificate was issued. A certificate covering all subdomains can be issued using a wildcard (e.g. `*.example.com`)." + } + }, + "required": [ + "dns_names" + ] + } + ] + }, + "certificate_request_custom": { + "title": "Custom Certificate Request", + "allOf": [ + { + "$ref": "#/components/schemas/certificate_create_base" + }, + { + "type": "object", + "properties": { + "private_key": { + "type": "string", + "example": "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDBIZMz8pnK6V52\nSVf+CYssOfCQHAx5f0Ou5rYbq3xNh8VHAIYJCQ1QxQIxKSP6+uODSYrb2KWyurP1\nDwGb8OYm0J3syEDtCUQik1cpCzpeNlAZ2f8FzXyYQAqPopxdRpsFz8DtZnVvu86X\nwrE4oFPl9MReICmZfBNWylpV5qgFPoXyJ70ZAsTm3cEe3n+LBXEnY4YrVDRWxA3w\nZ2mzZ03HZ1hHrxK9CMnS829U+8sK+UneZpCO7yLRPuxwhmps0wpK/YuZZfRAKF1F\nZRnak/SIQ28rnWufmdg16YqqHgl5JOgnb3aslKRvL4dI2Gwnkd2IHtpZnTR0gxFX\nfqqbQwuRAgMBAAECggEBAILLmkW0JzOkmLTDNzR0giyRkLoIROqDpfLtjKdwm95l\n9NUBJcU4vCvXQITKt/NhtnNTexcowg8pInb0ksJpg3UGE+4oMNBXVi2UW5MQZ5cm\ncVkQqgXkBF2YAY8FMaB6EML+0En2+dGR/3gIAr221xsFiXe1kHbB8Nb2c/d5HpFt\neRpLVJnK+TxSr78PcZA8DDGlSgwvgimdAaFUNO2OqB9/0E9UPyKk2ycdff/Z6ldF\n0hkCLtdYTTl8Kf/OwjcuTgmA2O3Y8/CoQX/L+oP9Rvt9pWCEfuebiOmHJVPO6Y6x\ngtQVEXwmF1pDHH4Qtz/e6UZTdYeMl9G4aNO2CawwcaYECgYEA57imgSOG4XsJLRh\nGGncV9R/xhy4AbDWLtAMzQRX4ktvKCaHWyQV2XK2we/cu29NLv2Y89WmerTNPOU+\nP8+pB31uty2ELySVn15QhKpQClVEAlxCnnNjXYrii5LOM80+lVmxvQwxVd8Yz8nj\nIntyioXNBEnYS7V2RxxFGgFun1cCgYEA1V3W+Uyamhq8JS5EY0FhyGcXdHd70K49\nW1ou7McIpncf9tM9acLS1hkI98rd2T69Zo8mKoV1V2hjFaKUYfNys6tTkYWeZCcJ\n3rW44j9DTD+FmmjcX6b8DzfybGLehfNbCw6n67/r45DXIV/fk6XZfkx6IEGO4ODt\nNfnvx4TuI1cCgYBACDiKqwSUvmkUuweOo4IuCxyb5Ee8v98P5JIE/VRDxlCbKbpx\npxEam6aBBQVcDi+n8o0H3WjjlKc6UqbW/01YMoMrvzotxNBLz8Y0QtQHZvR6KoCG\nRKCKstxTcWflzKuknbqN4RapAhNbKBDJ8PMSWfyDWNyaXzSmBdvaidbF1QKBgDI0\no4oD0Xkjg1QIYAUu9FBQmb9JAjRnW36saNBEQS/SZg4RRKknM683MtoDvVIKJk0E\nsAlfX+4SXQZRPDMUMtA+Jyrd0xhj6zmhbwClvDMr20crF3fWdgcqtft1BEFmsuyW\nJUMe5OWmRkjPI2+9ncDPRAllA7a8lnSV/Crph5N/AoGBAIK249temKrGe9pmsmAo\nQbNuYSmwpnMoAqdHTrl70HEmK7ob6SIVmsR8QFAkH7xkYZc4Bxbx4h1bdpozGB+/\nAangbiaYJcAOD1QyfiFbflvI1RFeHgrk7VIafeSeQv6qu0LLMi2zUbpgVzxt78Wg\neTuK2xNR0PIM8OI7pRpgyj1I\n-----END PRIVATE KEY-----", + "description": "The contents of a PEM-formatted private-key corresponding to the SSL certificate." + }, + "leaf_certificate": { + "type": "string", + "example": "-----BEGIN CERTIFICATE-----\nMIIFFjCCA/6gAwIBAgISA0AznUJmXhu08/89ZuSPC/kRMA0GCSqGSIb3DQEBCwUA\nMEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD\nExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xNjExMjQwMDIzMDBaFw0x\nNzAyMjIwMDIzMDBaMCQxIjAgBgNVBAMTGWNsb3VkLmFuZHJld3NvbWV0aGluZy5j\nb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDBIZMz8pnK6V52SVf+\nCYssOfCQHAx5f0Ou5rYbq3xNh8VWHIYJCQ1QxQIxKSP6+uODSYrb2KWyurP1DwGb\n8OYm0J3syEDtCUQik1cpCzpeNlAZ2f8FzXyYQAqPopxdRpsFz8DtZnVvu86XwrE4\noFPl9MReICmZfBNWylpV5qgFPoXyJ70ZAsTm3cEe3n+LBXEnY4YrVDRWxA3wZ2mz\nZ03HZ1hHrxK9CMnS829U+8sK+UneZpCO7yLRPuxwhmps0wpK/YuZZfRAKF1FZRna\nk/SIQ28rnWufmdg16YqqHgl5JOgnb3aslKRvL4dI2Gwnkd2IHtpZnTR0gxFXfqqb\nQwuRAgMBAAGjggIaMIICFjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYB\nBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFLsAFcxAhFX1\nMbCnzr9hEO5rL4jqMB8GA1UdIwQYMBaAFKhKamMEfd265tE5t6ZFZe/zqOyhMHAG\nCCsGAQUFBwEBBGQwYjAvBggrBgEFBQcwAYYjaHR0cDovL29jc3AuaW50LXgzLmxl\ndHNlbmNyeXB0Lm9yZy8wLwYIKwYBBQUHMAKGI2h0dHA6Ly9jZXJ0LmludC14My5s\nZXRzZW5jcnlwdC5vcmcvMCQGA1UdEQQdMBuCGWNsb3VkLmFuZHJld3NvbWV0aGlu\nZy5jb20wgf4GA1UdIASB9jCB8zAIBgZngQwBAgWrgeYGCysGAQQBgt8TAQEBMIHW\nMCYGCCsGAQUFBwIBFhpodHRwOi8vY3BzLmxldHNlbmNyeXB0Lm9yZzCBqwYIKwYB\nBQUHAgIwgZ4MgZtUaGlzIENlcnRpZmljYXRlIG1heSBvbmx5IGJlIHJlbGllZCB1\ncG9uIGJ5IFJlbHlpbmcgUGFydGllcyBhbmQgb25seSQ2ziBhY2NvcmRhbmNlIHdp\ndGggdGhlIENlcnRpZmljYXRlIFBvbGljeSBmb3VuZCBhdCBodHRwczovL2xldHNl\nbmNyeXB0Lm9yZy9yZXBvc2l0b3J5LzANBgkqhkiG9w0BAQsFAAOCAQEAOZVQvrjM\nPKXLARTjB5XsgfyDN3/qwLl7SmwGkPe+B+9FJpfScYG1JzVuCj/SoaPaK34G4x/e\niXwlwOXtMOtqjQYzNu2Pr2C+I+rVmaxIrCUXFmC205IMuUBEeWXG9Y/HvXQLPabD\nD3Gdl5+Feink9SDRP7G0HaAwq13hI7ARxkL9p+UIY39X0dV3WOboW2Re8nrkFXJ7\nq9Z6shK5QgpBfsLjtjNsQzaGV3ve1gOg25aTJGearBWOvEjJNA1wGMoKVXOtYwm/\nWyWoVdCQ8HmconcbJB6xc0UZ1EjvzRr5ZIvSa5uHZD0L3m7/kpPWlAlFJ7hHASPu\nUlF1zblDmg2Iaw==\n-----END CERTIFICATE-----", + "description": "The contents of a PEM-formatted public SSL certificate." + }, + "certificate_chain": { + "type": "string", + "example": "-----BEGIN CERTIFICATE-----\nMIIFFjCCA/6gAwIBAgISA0AznUJmXhu08/89ZuSPC/kRMA0GCSqGSIb3DQEBCwUA\nMEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD\nExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xNjExMjQwMDIzMDBaFw0x\nNzAyMjIwMDIzMDBaMCQxIjAgBgNVBAMTGWNsb3VkLmFuZHJld3NvbWV0aGluZy5j\nb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDBIZMz7tnK6V52SVf+\nCYssOfCQHAx5f0Ou5rYbq3xNh8VHAIYJCQ1QxQIxKSP6+uODSYrb2KWyurP1DwGb\n8OYm0J3syEDtCUQik1cpCzpeNlAZ2f8FzXyYQAqPopxdRpsFz8DtZnVvu86XwrE4\noFPl9MReICmZfBNWylpV5qgFPoXyJ70ZAsTm3cEe3n+LBXEnY4YrVDRWxA3wZ2mz\nZ03HZ1hHrxK9CMnS829U+8sK+UneZpCO7yLRPuxwhmps0wpK/YuZZfRAKF1FZRna\nk/SIQ28rnWufmdg16YqqHgl5JOgnb3aslKRvL4dI2Gwnkd2IHtpZnTR0gxFXfqqb\nQwuRAgMBAAGjggIaMIICFjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYB\nBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFLsAFcxAhFX1\nMbCnzr9hEO5rL4jqMB8GA1UdIwQYMBaAFKhKamMEfd265tE5t6ZFZe/zqOyhMHAG\nCCsGAQUFBwEBBGQwYjAvBggrBgEFBQcwAYYjaHR0cDovL29jc3AuaW50LXgzLmxl\ndHNlbmNyeXB0Lm9yZy8wLwYIKwYBBQUHMAKGI2h0dHA6Ly9jZXJ0LmludC14My5s\nZXRzZW5jcnlwdC5vcmcvMCQGA1UdEQQdMBuCGWNsb3VkLmFuZHJld3NvbWV0aGlu\nZy5jb20wgf4GA1UdIASB9jCB8zAIBgZngQwBAgEwgeWECysGAQQBgt8TAQEBMIHW\nMCYGCCsGAQUFBwIBFhpodHRwOi8vY3BzLmxldHNlbmNyeXB0Lm9yZzCBqwYIKwYB\nBQUHAgIwgZ4MgZtUaGlzIENlcnRpZmljYXRlIG1heSBvbmx5IGJlIHJlbGllZCB1\ncG9uIGJ5IFJlbHlpbmcgUGFydGllcyBhbmQgb25seSQ2ziBhY2NvcmRhbmNlIHdp\ndGggdGhlIENlcnRpZmljYXRlIFBvbGljeSBmb3VuZCBhdCBsdHRwczovL2xldHNl\nbmNyeXB0Lm9yZy9yZXBvc2l0b3J5LzANBgkqhkiG9w0BAQsFAAOCAQEAOZVQvrjM\nPKXLARTjB5XsgfyDN3/qwLl7SmwGkPe+B+9FJpfScYG1JzVuCj/SoaPaK34G4x/e\niXwlwOXtMOtqjQYzNu2Pr2C+I+rVmaxIrCUXFmC205IMuUBEeWXG9Y/HvXQLPabD\nD3Gdl5+Feink9SDRP7G0HaAwq13hI7ARxkL3o+UIY39X0dV3WOboW2Re8nrkFXJ7\nq9Z6shK5QgpBfsLjtjNsQzaGV3ve1gOg25aTJGearBWOvEjJNA1wGMoKVXOtYwm/\nWyWoVdCQ8HmconcbJB6xc0UZ1EjvzRr5ZIvSa5uHZD0L3m7/kpPWlAlFJ7hHASPu\nUlF1zblDmg2Iaw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/\nMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT\nDkRTVCBSb290IENBIFgzMB4XDTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0Nlow\nSjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxIzAhBgNVBAMT\nGkxldCdzIEVuY3J5cHQgQXV0aG9yaXR5IFgzMIIBIjANBgkqhkiG9w0BAQEFAAOC\nAQ8AMIIBCgKCAQEAnNMM8FrlLsd3cl03g7NoYzDq1zUmGSXhvb418XCSL7e4S0EF\nq6meNQhY7LEqxGiHC6PjdeTm86dicbp5gWAf15Gan/PQeGdxyGkOlZHP/uaZ6WA8\nSMx+yk13EiSdRxta67nsHjcAHJyse6cF6s5K671B5TaYucv9bTyWaN8jKkKQDIZ0\nZ8h/pZq4UmEUEz9l6YKHy9v6Dlb2honzhT+Xhq+w3Brvaw2VFn3EK6BlspkENnWA\na6xK8xuQSXgvopZPKiAlKQTGdMDQMc2PMTiVFrqoM7hD8bEfwzB/onkxEz0tNvjj\n/PIzark5McWvxI0NHWQWM6r6hCm21AvA2H3DkwIPOIUo4IBfTCCAXkwEgYDVR0T\nAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwfwYIKwYBBQUHAQEEczBxMDIG\nCCsGAQUFBzABhiZodHRwOi8vaXNyZy50cnVzdGlkLm9jc3AuaWRlbnRydXN0LmNv\nbTA7BggrBgEFBQcwAoYvaHR0cDovL2FwcHMuaWRlbnRydXN0LmNvbS9yb290cy9k\nc3Ryb290Y2F4My5wN2MwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQdf/EFWCFiRAw\nVAYDVR0gBE0wSzAIBgZngQwBAgEwPwYLKwYBBAGC3xMBAQEwMDAuBggrBgEFBQcC\nARYiaHR0cDovL2Nwcy5yb290LXgxLmxldHNlbmNyeXB0Lm9yZzA8BgNVHR8ENTAz\nMDGgL6AthitodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9PVENBWDNDUkwu\nY3JsMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTANBgkqhkiG9w0BAQsF\nAAOCAQEA3TPXEfNjWDjdGBX7CVW+dla5cEilaUcne8IkCJLxWh9KEik3JHRRHGJo\nuM2VcGfl96S8TihRzZvoroed6ti6WqEBmtzw3Wodatg+VyOeph4EYpr/1wXKtx8/\nwApIvJSwtmVi4MFU5aMqrSDE6ea73Mj2tcMyo5jMd6jmeWUHK8so/joWUoHOUgwu\nX4Po1QYz+3dszkDqMp4fklxBwXRsW10KXzPMTZ+sOPAveyxindmjkW8lGy+QsRlG\nPfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6\nKOqkqm57TH2H3eDJAkSnh6/DNFu0Qg==\n-----END CERTIFICATE-----", + "description": "The full PEM-formatted trust chain between the certificate authority's certificate and your domain's SSL certificate." + } + }, + "required": [ + "private_key", + "leaf_certificate" + ] + } + ] + }, + "balance": { + "type": "object", + "properties": { + "month_to_date_balance": { + "type": "string", + "description": "Balance as of the `generated_at` time. This value includes the `account_balance` and `month_to_date_usage`.", + "example": "23.44" + }, + "account_balance": { + "type": "string", + "description": "Current balance of the customer's most recent billing activity. Does not reflect `month_to_date_usage`.", + "example": "12.23" + }, + "month_to_date_usage": { + "type": "string", + "description": "Amount used in the current billing period as of the `generated_at` time.", + "example": "11.21" + }, + "generated_at": { + "type": "string", + "format": "date-time", + "description": "The time at which balances were most recently generated.", + "example": "2019-07-09T15:01:12Z" + } + } + }, + "billing_history": { + "type": "object", + "properties": { + "description": { + "type": "string", + "description": "Description of the billing history entry.", + "example": "Invoice for May 2018" + }, + "amount": { + "type": "string", + "description": "Amount of the billing history entry.", + "example": "12.34" + }, + "invoice_id": { + "type": "string", + "description": "ID of the invoice associated with the billing history entry, if applicable.", + "example": "123" + }, + "invoice_uuid": { + "type": "string", + "description": "UUID of the invoice associated with the billing history entry, if applicable.", + "example": "example-uuid" + }, + "date": { + "type": "string", + "format": "date-time", + "description": "Time the billing history entry occurred.", + "example": "2018-06-01T08:44:38Z" + }, + "type": { + "type": "string", + "description": "Type of billing history entry.", + "example": "Invoice", + "enum": [ + "ACHFailure", + "Adjustment", + "AttemptFailed", + "Chargeback", + "Credit", + "CreditExpiration", + "Invoice", + "Payment", + "Refund", + "Reversal" + ] + } + } + }, + "meta_optional_total": { + "type": "object", + "properties": { + "meta": { + "$ref": "#/components/schemas/meta_properties" + } + }, + "required": [ + "meta" + ] + }, + "invoice_preview": { + "type": "object", + "description": "The invoice preview.", + "properties": { + "invoice_uuid": { + "type": "string", + "description": "The UUID of the invoice. The canonical reference for the invoice.", + "example": "fdabb512-6faf-443c-ba2e-665452332a9e" + }, + "amount": { + "type": "string", + "description": "Total amount of the invoice, in USD. This will reflect month-to-date usage in the invoice preview.", + "example": "23.45" + }, + "invoice_period": { + "type": "string", + "description": "Billing period of usage for which the invoice is issued, in `YYYY-MM` format.", + "example": "2020-01" + }, + "updated_at": { + "type": "string", + "description": "Time the invoice was last updated. This is only included with the invoice preview.", + "example": "2020-01-23T06:31:50Z" + } + } + }, + "invoice_item": { + "type": "object", + "properties": { + "product": { + "type": "string", + "description": "Name of the product being billed in the invoice item.", + "example": "Kubernetes Clusters" + }, + "resource_uuid": { + "type": "string", + "description": "UUID of the resource billing in the invoice item if available.", + "example": "711157cb-37c8-4817-b371-44fa3504a39c" + }, + "resource_id": { + "type": "string", + "description": "ID of the resource billing in the invoice item if available.", + "example": "2353624" + }, + "group_description": { + "type": "string", + "description": "Description of the invoice item when it is a grouped set of usage, such as DOKS or databases.", + "example": "my-doks-cluster" + }, + "description": { + "type": "string", + "description": "Description of the invoice item.", + "example": "a56e086a317d8410c8b4cfd1f4dc9f82" + }, + "amount": { + "type": "string", + "description": "Billed amount of this invoice item. Billed in USD.", + "example": "12.34" + }, + "duration": { + "type": "string", + "description": "Duration of time this invoice item was used and subsequently billed.", + "example": "744" + }, + "duration_unit": { + "type": "string", + "description": "Unit of time for duration.", + "example": "Hours" + }, + "start_time": { + "type": "string", + "description": "Time the invoice item began to be billed for usage.", + "example": "2020-01-01T00:00:00Z" + }, + "end_time": { + "type": "string", + "description": "Time the invoice item stopped being billed for usage.", + "example": "2020-02-01T00:00:00Z" + }, + "project_name": { + "type": "string", + "description": "Name of the DigitalOcean Project this resource belongs to.", + "example": "web" + } + } + }, + "billing_address": { + "type": "object", + "properties": { + "address_line1": { + "type": "string", + "description": "Street address line 1", + "example": "101 Shark Row" + }, + "address_line2": { + "type": "string", + "description": "Street address line 2", + "example": " " + }, + "city": { + "type": "string", + "description": "City", + "example": "Atlantis" + }, + "region": { + "type": "string", + "description": "Region", + "example": "OC" + }, + "postal_code": { + "type": "string", + "description": "Postal code", + "example": "12345" + }, + "country_iso2_code": { + "type": "string", + "description": "Country (ISO2) code", + "example": "US" + }, + "created_at": { + "type": "string", + "description": "Timestamp billing address was created", + "example": "2019-09-03T16:34:46.000+00:00" + }, + "updated_at": { + "type": "string", + "description": "Timestamp billing address was updated", + "example": "2019-09-03T16:34:46.000+00:00" + } + } + }, + "product_charge_item": { + "type": "object", + "properties": { + "amount": { + "type": "string", + "description": "Amount of the charge", + "example": "10.00" + }, + "name": { + "type": "string", + "description": "Description of the charge", + "example": "Spaces Subscription" + }, + "count": { + "type": "string", + "description": "Number of times the charge was applied", + "example": "1" + } + } + }, + "product_usage_charges": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Description of usage charges", + "example": "Product usage charges" + }, + "amount": { + "type": "string", + "description": "Total amount charged", + "example": "12.34" + }, + "items": { + "type": "array", + "description": "List of amount, and grouped aggregates by resource type.", + "items": { + "$ref": "#/components/schemas/product_charge_item" + }, + "example": [ + { + "amount": "10.00", + "name": "Spaces Subscription", + "count": "1" + }, + { + "amount": "2.34", + "name": "Database Clusters", + "count": "1" + } + ] + } + } + }, + "simple_charge": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the charge", + "example": "Overages" + }, + "amount": { + "type": "string", + "description": "Total amount charged in USD", + "example": "3.45" + } + } + }, + "invoice_summary": { + "type": "object", + "properties": { + "invoice_uuid": { + "type": "string", + "description": "UUID of the invoice", + "example": "22737513-0ea7-4206-8ceb-98a575af7681" + }, + "billing_period": { + "type": "string", + "description": "Billing period of usage for which the invoice is issued, in `YYYY-MM` format.", + "example": "2020-01" + }, + "amount": { + "type": "string", + "description": "Total amount of the invoice, in USD. This will reflect month-to-date usage in the invoice preview.", + "example": "27.13" + }, + "user_name": { + "type": "string", + "description": "Name of the DigitalOcean customer being invoiced.", + "example": "Sammy Shark" + }, + "user_billing_address": { + "allOf": [ + { + "description": "The billing address of the customer being invoiced." + }, + { + "$ref": "#/components/schemas/billing_address" + } + ] + }, + "user_company": { + "type": "string", + "description": "Company of the DigitalOcean customer being invoiced, if set.", + "example": "DigitalOcean" + }, + "user_email": { + "type": "string", + "description": "Email of the DigitalOcean customer being invoiced.", + "example": "sammy@digitalocean.com" + }, + "product_charges": { + "allOf": [ + { + "description": "A summary of the product usage charges contributing to the invoice. This will include an amount, and grouped aggregates by resource type under the `items` key." + }, + { + "$ref": "#/components/schemas/product_usage_charges" + } + ] + }, + "overages": { + "allOf": [ + { + "description": "A summary of the overages contributing to the invoice." + }, + { + "$ref": "#/components/schemas/simple_charge" + } + ] + }, + "taxes": { + "allOf": [ + { + "description": "A summary of the taxes contributing to the invoice." + }, + { + "$ref": "#/components/schemas/simple_charge" + } + ] + }, + "credits_and_adjustments": { + "allOf": [ + { + "description": "A summary of the credits and adjustments contributing to the invoice." + }, + { + "$ref": "#/components/schemas/simple_charge" + } + ] + } + } + }, + "database_region_options": { + "type": "object", + "properties": { + "regions": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "ams3", + "blr1" + ], + "readOnly": true, + "description": "An array of strings containing the names of available regions" + } + } + }, + "database_version_options": { + "type": "object", + "properties": { + "versions": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "4.4", + "5.0" + ], + "readOnly": true, + "description": "An array of strings containing the names of available regions" + } + } + }, + "database_layout_option": { + "type": "object", + "properties": { + "num_nodes": { + "type": "integer", + "example": 1 + }, + "sizes": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "db-s-1vcpu-1gb", + "db-s-1vcpu-2gb" + ], + "readOnly": true, + "description": "An array of objects containing the slugs available with various node counts" + } + } + }, + "database_layout_options": { + "type": "object", + "properties": { + "layouts": { + "type": "array", + "readOnly": true, + "description": "An array of objects, each indicating the node sizes (otherwise referred to as slugs) that are available with various numbers of nodes in the database cluster. Each slugs denotes the node's identifier, CPU, and RAM (in that order).", + "items": { + "$ref": "#/components/schemas/database_layout_option" + } + } + } + }, + "database_version_availability": { + "type": "object", + "properties": { + "end_of_life": { + "type": "string", + "example": "2023-11-09T00:00:00Z", + "nullable": true, + "description": "A timestamp referring to the date when the particular version will no longer be supported. If null, the version does not have an end of life timeline." + }, + "end_of_availability": { + "type": "string", + "example": "2023-05-09T00:00:00Z", + "nullable": true, + "description": "A timestamp referring to the date when the particular version will no longer be available for creating new clusters. If null, the version does not have an end of availability timeline." + }, + "version": { + "type": "string", + "example": "8", + "description": "The engine version." + } + } + }, + "database_version_availabilities": { + "type": "array", + "description": "An array of objects, each indicating the version end-of-life, end-of-availability for various database engines", + "items": { + "$ref": "#/components/schemas/database_version_availability" + } + }, + "options": { + "type": "object", + "properties": { + "options": { + "type": "object", + "properties": { + "kafka": { + "allOf": [ + { + "$ref": "#/components/schemas/database_region_options" + }, + { + "$ref": "#/components/schemas/database_version_options" + }, + { + "$ref": "#/components/schemas/database_layout_options" + } + ] + }, + "mongodb": { + "allOf": [ + { + "$ref": "#/components/schemas/database_region_options" + }, + { + "$ref": "#/components/schemas/database_version_options" + }, + { + "$ref": "#/components/schemas/database_layout_options" + } + ] + }, + "pg": { + "allOf": [ + { + "$ref": "#/components/schemas/database_region_options" + }, + { + "$ref": "#/components/schemas/database_version_options" + }, + { + "$ref": "#/components/schemas/database_layout_options" + } + ] + }, + "mysql": { + "allOf": [ + { + "$ref": "#/components/schemas/database_region_options" + }, + { + "$ref": "#/components/schemas/database_version_options" + }, + { + "$ref": "#/components/schemas/database_layout_options" + } + ] + }, + "redis": { + "allOf": [ + { + "$ref": "#/components/schemas/database_region_options" + }, + { + "$ref": "#/components/schemas/database_version_options" + }, + { + "$ref": "#/components/schemas/database_layout_options" + } + ] + } + } + }, + "version_availability": { + "type": "object", + "properties": { + "kafka": { + "$ref": "#/components/schemas/database_version_availabilities" + }, + "pg": { + "$ref": "#/components/schemas/database_version_availabilities" + }, + "mysql": { + "$ref": "#/components/schemas/database_version_availabilities" + }, + "redis": { + "$ref": "#/components/schemas/database_version_availabilities" + }, + "mongodb": { + "$ref": "#/components/schemas/database_version_availabilities" + } + } + } + } + }, + "database_connection": { + "type": "object", + "properties": { + "uri": { + "type": "string", + "description": "A connection string in the format accepted by the `psql` command. This is provided as a convenience and should be able to be constructed by the other attributes.", + "example": "postgres://doadmin:wv78n3zpz42xezdk@backend-do-user-19081923-0.db.ondigitalocean.com:25060/defaultdb?sslmode=require", + "readOnly": true + }, + "database": { + "type": "string", + "description": "The name of the default database.", + "example": "defaultdb", + "readOnly": true + }, + "host": { + "type": "string", + "description": "The FQDN pointing to the database cluster's current primary node.", + "example": "backend-do-user-19081923-0.db.ondigitalocean.com", + "readOnly": true + }, + "port": { + "type": "integer", + "description": "The port on which the database cluster is listening.", + "example": 25060, + "readOnly": true + }, + "user": { + "type": "string", + "description": "The default user for the database.", + "example": "doadmin", + "readOnly": true + }, + "password": { + "type": "string", + "description": "The randomly generated password for the default user.", + "example": "wv78n3zpz42xezdk", + "readOnly": true + }, + "ssl": { + "type": "boolean", + "description": "A boolean value indicating if the connection should be made over SSL.", + "example": true, + "readOnly": true + } + } + }, + "mysql_settings": { + "type": "object", + "properties": { + "auth_plugin": { + "type": "string", + "enum": [ + "mysql_native_password", + "caching_sha2_password" + ], + "example": "mysql_native_password", + "description": "A string specifying the authentication method to be used for connections\nto the MySQL user account. The valid values are `mysql_native_password`\nor `caching_sha2_password`. If excluded when creating a new user, the\ndefault for the version of MySQL in use will be used. As of MySQL 8.0, the\ndefault is `caching_sha2_password`.\n" + } + }, + "required": [ + "auth_plugin" + ] + }, + "user_settings": { + "type": "object", + "properties": { + "acl": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "An identifier for the ACL.", + "example": "aaa" + }, + "topic": { + "type": "string", + "example": "topic-abc.*", + "description": "A regex for matching the topic(s) that this ACL should apply to." + }, + "permission": { + "type": "string", + "enum": [ + "admin", + "consume", + "produce", + "produceconsume" + ], + "example": "consume", + "description": "Permission set applied to the ACL. 'consume' allows for messages to be consumed from the topic. 'produce' allows for messages to be published to the topic. 'produceconsume' allows for both 'consume' and 'produce' permission. 'admin' allows for 'produceconsume' as well as any operations to administer the topic (delete, update)." + } + }, + "required": [ + "id", + "topic", + "permission" + ] + }, + "description": "ACLs (Access Control Lists) specifying permissions on topics within a Kafka cluster." + } + } + }, + "database_user": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "app-01", + "description": "The name of a database user." + }, + "role": { + "type": "string", + "enum": [ + "primary", + "normal" + ], + "example": "normal", + "description": "A string representing the database user's role. The value will be either\n\"primary\" or \"normal\".\n", + "readOnly": true + }, + "password": { + "type": "string", + "example": "jge5lfxtzhx42iff", + "description": "A randomly generated password for the database user.", + "readOnly": true + }, + "access_cert": { + "type": "string", + "example": "-----BEGIN CERTIFICATE-----\nMIIFFjCCA/6gAwIBAgISA0AznUJmXhu08/89ZuSPC/kRMA0GCSqGSIb3DQEBCwUA\nMEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD\nExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xNjExMjQwMDIzMDBaFw0x\nNzAyMjIwMDIzMDBaMCQxIjAgBgNVBAMTGWNsb3VkLmFuZHJld3NvbWV0aGluZy5j\nb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDBIZMz8pnK6V52SVf+\nCYssOfCQHAx5f0Ou5rYbq3xNh8VWHIYJCQ1QxQIxKSP6+uODSYrb2KWyurP1DwGb\n8OYm0J3syEDtCUQik1cpCzpeNlAZ2f8FzXyYQAqPopxdRpsFz8DtZnVvu86XwrE4\noFPl9MReICmZfBNWylpV5qgFPoXyJ70ZAsTm3cEe3n+LBXEnY4YrVDRWxA3wZ2mz\nZ03HZ1hHrxK9CMnS829U+8sK+UneZpCO7yLRPuxwhmps0wpK/YuZZfRAKF1FZRna\nk/SIQ28rnWufmdg16YqqHgl5JOgnb3aslKRvL4dI2Gwnkd2IHtpZnTR0gxFXfqqb\nQwuRAgMBAAGjggIaMIICFjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYB\nBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFLsAFcxAhFX1\nMbCnzr9hEO5rL4jqMB8GA1UdIwQYMBaAFKhKamMEfd265tE5t6ZFZe/zqOyhMHAG\nCCsGAQUFBwEBBGQwYjAvBggrBgEFBQcwAYYjaHR0cDovL29jc3AuaW50LXgzLmxl\ndHNlbmNyeXB0Lm9yZy8wLwYIKwYBBQUHMAKGI2h0dHA6Ly9jZXJ0LmludC14My5s\nZXRzZW5jcnlwdC5vcmcvMCQGA1UdEQQdMBuCGWNsb3VkLmFuZHJld3NvbWV0aGlu\nZy5jb20wgf4GA1UdIASB9jCB8zAIBgZngQwBAgWrgeYGCysGAQQBgt8TAQEBMIHW\nMCYGCCsGAQUFBwIBFhpodHRwOi8vY3BzLmxldHNlbmNyeXB0Lm9yZzCBqwYIKwYB\nBQUHAgIwgZ4MgZtUaGlzIENlcnRpZmljYXRlIG1heSBvbmx5IGJlIHJlbGllZCB1\ncG9uIGJ5IFJlbHlpbmcgUGFydGllcyBhbmQgb25seSQ2ziBhY2NvcmRhbmNlIHdp\ndGggdGhlIENlcnRpZmljYXRlIFBvbGljeSBmb3VuZCBhdCBodHRwczovL2xldHNl\nbmNyeXB0Lm9yZy9yZXBvc2l0b3J5LzANBgkqhkiG9w0BAQsFAAOCAQEAOZVQvrjM\nPKXLARTjB5XsgfyDN3/qwLl7SmwGkPe+B+9FJpfScYG1JzVuCj/SoaPaK34G4x/e\niXwlwOXtMOtqjQYzNu2Pr2C+I+rVmaxIrCUXFmC205IMuUBEeWXG9Y/HvXQLPabD\nD3Gdl5+Feink9SDRP7G0HaAwq13hI7ARxkL9p+UIY39X0dV3WOboW2Re8nrkFXJ7\nq9Z6shK5QgpBfsLjtjNsQzaGV3ve1gOg25aTJGearBWOvEjJNA1wGMoKVXOtYwm/\nWyWoVdCQ8HmconcbJB6xc0UZ1EjvzRr5ZIvSa5uHZD0L3m7/kpPWlAlFJ7hHASPu\nUlF1zblDmg2Iaw==\n-----END CERTIFICATE-----", + "description": "Access certificate for TLS client authentication. (Kafka only)", + "readOnly": true + }, + "access_key": { + "type": "string", + "example": "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDBIZMz8pnK6V52\nSVf+CYssOfCQHAx5f0Ou5rYbq3xNh8VHAIYJCQ1QxQIxKSP6+uODSYrb2KWyurP1\nDwGb8OYm0J3syEDtCUQik1cpCzpeNlAZ2f8FzXyYQAqPopxdRpsFz8DtZnVvu86X\nwrE4oFPl9MReICmZfBNWylpV5qgFPoXyJ70ZAsTm3cEe3n+LBXEnY4YrVDRWxA3w\nZ2mzZ03HZ1hHrxK9CMnS829U+8sK+UneZpCO7yLRPuxwhmps0wpK/YuZZfRAKF1F\nZRnak/SIQ28rnWufmdg16YqqHgl5JOgnb3aslKRvL4dI2Gwnkd2IHtpZnTR0gxFX\nfqqbQwuRAgMBAAECggEBAILLmkW0JzOkmLTDNzR0giyRkLoIROqDpfLtjKdwm95l\n9NUBJcU4vCvXQITKt/NhtnNTexcowg8pInb0ksJpg3UGE+4oMNBXVi2UW5MQZ5cm\ncVkQqgXkBF2YAY8FMaB6EML+0En2+dGR/3gIAr221xsFiXe1kHbB8Nb2c/d5HpFt\neRpLVJnK+TxSr78PcZA8DDGlSgwvgimdAaFUNO2OqB9/0E9UPyKk2ycdff/Z6ldF\n0hkCLtdYTTl8Kf/OwjcuTgmA2O3Y8/CoQX/L+oP9Rvt9pWCEfuebiOmHJVPO6Y6x\ngtQVEXwmF1pDHH4Qtz/e6UZTdYeMl9G4aNO2CawwcaYECgYEA57imgSOG4XsJLRh\nGGncV9R/xhy4AbDWLtAMzQRX4ktvKCaHWyQV2XK2we/cu29NLv2Y89WmerTNPOU+\nP8+pB31uty2ELySVn15QhKpQClVEAlxCnnNjXYrii5LOM80+lVmxvQwxVd8Yz8nj\nIntyioXNBEnYS7V2RxxFGgFun1cCgYEA1V3W+Uyamhq8JS5EY0FhyGcXdHd70K49\nW1ou7McIpncf9tM9acLS1hkI98rd2T69Zo8mKoV1V2hjFaKUYfNys6tTkYWeZCcJ\n3rW44j9DTD+FmmjcX6b8DzfybGLehfNbCw6n67/r45DXIV/fk6XZfkx6IEGO4ODt\nNfnvx4TuI1cCgYBACDiKqwSUvmkUuweOo4IuCxyb5Ee8v98P5JIE/VRDxlCbKbpx\npxEam6aBBQVcDi+n8o0H3WjjlKc6UqbW/01YMoMrvzotxNBLz8Y0QtQHZvR6KoCG\nRKCKstxTcWflzKuknbqN4RapAhNbKBDJ8PMSWfyDWNyaXzSmBdvaidbF1QKBgDI0\no4oD0Xkjg1QIYAUu9FBQmb9JAjRnW36saNBEQS/SZg4RRKknM683MtoDvVIKJk0E\nsAlfX+4SXQZRPDMUMtA+Jyrd0xhj6zmhbwClvDMr20crF3fWdgcqtft1BEFmsuyW\nJUMe5OWmRkjPI2+9ncDPRAllA7a8lnSV/Crph5N/AoGBAIK249temKrGe9pmsmAo\nQbNuYSmwpnMoAqdHTrl70HEmK7ob6SIVmsR8QFAkH7xkYZc4Bxbx4h1bdpozGB+/\nAangbiaYJcAOD1QyfiFbflvI1RFeHgrk7VIafeSeQv6qu0LLMi2zUbpgVzxt78Wg\neTuK2xNR0PIM8OI7pRpgyj1I\n-----END PRIVATE KEY-----", + "description": "Access key for TLS client authentication. (Kafka only)", + "readOnly": true + }, + "mysql_settings": { + "$ref": "#/components/schemas/mysql_settings" + }, + "settings": { + "$ref": "#/components/schemas/user_settings" + } + }, + "required": [ + "name" + ] + }, + "database_maintenance_window": { + "type": "object", + "nullable": true, + "properties": { + "day": { + "type": "string", + "example": "tuesday", + "description": "The day of the week on which to apply maintenance updates." + }, + "hour": { + "type": "string", + "example": "14:00", + "description": "The hour in UTC at which maintenance updates will be applied in 24 hour format." + }, + "pending": { + "type": "boolean", + "example": true, + "description": "A boolean value indicating whether any maintenance is scheduled to be performed in the next window.", + "readOnly": true + }, + "description": { + "type": "array", + "items": { + "type": "string" + }, + "description": "A list of strings, each containing information about a pending maintenance update.", + "example": [ + "Update TimescaleDB to version 1.2.1", + "Upgrade to PostgreSQL 11.2 and 10.7 bugfix releases" + ], + "readOnly": true + } + }, + "required": [ + "day", + "hour" + ] + }, + "firewall_rule": { + "type": "object", + "properties": { + "uuid": { + "type": "string", + "pattern": "^$|[0-9a-f]{8}\\b-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-\\b[0-9a-f]{12}", + "example": "79f26d28-ea8a-41f2-8ad8-8cfcdd020095", + "description": "A unique ID for the firewall rule itself." + }, + "cluster_uuid": { + "type": "string", + "pattern": "^$|[0-9a-f]{8}\\b-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-\\b[0-9a-f]{12}", + "example": "9cc10173-e9ea-4176-9dbc-a4cee4c4ff30", + "description": "A unique ID for the database cluster to which the rule is applied." + }, + "type": { + "type": "string", + "enum": [ + "droplet", + "k8s", + "ip_addr", + "tag", + "app" + ], + "example": "droplet", + "description": "The type of resource that the firewall rule allows to access the database cluster." + }, + "value": { + "type": "string", + "example": "ff2a6c52-5a44-4b63-b99c-0e98e7a63d61", + "description": "The ID of the specific resource, the name of a tag applied to a group of resources, or the IP address that the firewall rule allows to access the database cluster." + }, + "created_at": { + "type": "string", + "format": "date-time", + "example": "2019-01-11T18:37:36Z", + "description": "A time value given in ISO8601 combined date and time format that represents when the firewall rule was created.", + "readOnly": true + } + }, + "required": [ + "type", + "value" + ] + }, + "database_cluster": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "9cc10173-e9ea-4176-9dbc-a4cee4c4ff30", + "description": "A unique ID that can be used to identify and reference a database cluster.", + "readOnly": true + }, + "name": { + "type": "string", + "example": "backend", + "description": "A unique, human-readable name referring to a database cluster." + }, + "engine": { + "type": "string", + "example": "mysql", + "enum": [ + "pg", + "mysql", + "redis", + "mongodb", + "kafka" + ], + "description": "A slug representing the database engine used for the cluster. The possible values are: \"pg\" for PostgreSQL, \"mysql\" for MySQL, \"redis\" for Redis, \"mongodb\" for MongoDB, and \"kafka\" for Kafka." + }, + "version": { + "type": "string", + "example": "8", + "description": "A string representing the version of the database engine in use for the cluster." + }, + "semantic_version": { + "type": "string", + "example": "8.0.28", + "description": "A string representing the semantic version of the database engine in use for the cluster.", + "readOnly": true + }, + "num_nodes": { + "type": "integer", + "example": 2, + "description": "The number of nodes in the database cluster." + }, + "size": { + "type": "string", + "example": "db-s-2vcpu-4gb", + "description": "The slug identifier representing the size of the nodes in the database cluster." + }, + "region": { + "type": "string", + "example": "nyc3", + "description": "The slug identifier for the region where the database cluster is located." + }, + "status": { + "type": "string", + "enum": [ + "creating", + "online", + "resizing", + "migrating", + "forking" + ], + "example": "creating", + "description": "A string representing the current status of the database cluster.", + "readOnly": true + }, + "created_at": { + "type": "string", + "format": "date-time", + "example": "2019-01-11T18:37:36Z", + "description": "A time value given in ISO8601 combined date and time format that represents when the database cluster was created.", + "readOnly": true + }, + "private_network_uuid": { + "type": "string", + "pattern": "^$|[0-9a-f]{8}\\b-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-\\b[0-9a-f]{12}", + "example": "d455e75d-4858-4eec-8c95-da2f0a5f93a7", + "description": "A string specifying the UUID of the VPC to which the database cluster will be assigned. If excluded, the cluster when creating a new database cluster, it will be assigned to your account's default VPC for the region." + }, + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "production" + ], + "nullable": true, + "description": "An array of tags that have been applied to the database cluster." + }, + "db_names": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "doadmin" + ], + "nullable": true, + "readOnly": true, + "description": "An array of strings containing the names of databases created in the database cluster." + }, + "connection": { + "allOf": [ + { + "$ref": "#/components/schemas/database_connection" + }, + { + "readOnly": true + } + ] + }, + "private_connection": { + "allOf": [ + { + "$ref": "#/components/schemas/database_connection" + }, + { + "readOnly": true + } + ] + }, + "users": { + "type": "array", + "nullable": true, + "items": { + "$ref": "#/components/schemas/database_user" + }, + "readOnly": true + }, + "maintenance_window": { + "allOf": [ + { + "$ref": "#/components/schemas/database_maintenance_window" + }, + { + "readOnly": true + } + ] + }, + "project_id": { + "type": "string", + "format": "uuid", + "example": "9cc10173-e9ea-4176-9dbc-a4cee4c4ff30", + "description": "The ID of the project that the database cluster is assigned to. If excluded when creating a new database cluster, it will be assigned to your default project." + }, + "rules": { + "type": "array", + "items": { + "$ref": "#/components/schemas/firewall_rule" + } + }, + "version_end_of_life": { + "type": "string", + "example": "2023-11-09T00:00:00Z", + "readOnly": true, + "description": "A timestamp referring to the date when the particular version will no longer be supported. If null, the version does not have an end of life timeline." + }, + "version_end_of_availability": { + "type": "string", + "example": "2023-05-09T00:00:00Z", + "readOnly": true, + "description": "A timestamp referring to the date when the particular version will no longer be available for creating new clusters. If null, the version does not have an end of availability timeline." + } + }, + "required": [ + "name", + "engine", + "num_nodes", + "size", + "region" + ] + }, + "database_backup": { + "type": "object", + "properties": { + "database_name": { + "type": "string", + "example": "backend", + "description": "The name of an existing database cluster from which the backup will be restored." + }, + "backup_created_at": { + "type": "string", + "format": "date-time", + "example": "2019-01-31T19:25:22Z", + "description": "The timestamp of an existing database cluster backup in ISO8601 combined date and time format. The most recent backup will be used if excluded." + } + }, + "required": [ + "database_name" + ] + }, + "mysql": { + "type": "object", + "properties": { + "backup_hour": { + "description": "The hour of day (in UTC) when backup for the service starts. New backup only starts if previous backup has already completed.", + "minimum": 0, + "maximum": 23, + "type": "integer", + "example": 3 + }, + "backup_minute": { + "description": "The minute of the backup hour when backup for the service starts. New backup only starts if previous backup has already completed.", + "minimum": 0, + "maximum": 59, + "type": "integer", + "example": 30 + }, + "sql_mode": { + "description": "Global SQL mode. If empty, uses MySQL server defaults. Must only include uppercase alphabetic characters, underscores, and commas.", + "type": "string", + "pattern": "^[A-Z_]*(,[A-Z_]+)*$", + "example": "ANSI,TRADITIONAL", + "maxLength": 1024 + }, + "connect_timeout": { + "description": "The number of seconds that the mysqld server waits for a connect packet before responding with bad handshake.", + "type": "integer", + "minimum": 2, + "maximum": 3600, + "example": 10 + }, + "default_time_zone": { + "description": "Default server time zone, in the form of an offset from UTC (from -12:00 to +12:00), a time zone name (EST), or 'SYSTEM' to use the MySQL server default.", + "type": "string", + "example": "+03:00", + "minLength": 2, + "maxLength": 100 + }, + "group_concat_max_len": { + "description": "The maximum permitted result length, in bytes, for the GROUP_CONCAT() function.", + "type": "integer", + "minimum": 4, + "maximum": 18446744073709552000, + "example": 1024 + }, + "information_schema_stats_expiry": { + "description": "The time, in seconds, before cached statistics expire.", + "type": "integer", + "minimum": 900, + "maximum": 31536000, + "example": 86400 + }, + "innodb_ft_min_token_size": { + "description": "The minimum length of words that an InnoDB FULLTEXT index stores.", + "type": "integer", + "minimum": 0, + "maximum": 16, + "example": 3 + }, + "innodb_ft_server_stopword_table": { + "description": "The InnoDB FULLTEXT index stopword list for all InnoDB tables.", + "type": "string", + "pattern": "^.+/.+$", + "example": "db_name/table_name", + "maxLength": 1024 + }, + "innodb_lock_wait_timeout": { + "description": "The time, in seconds, that an InnoDB transaction waits for a row lock. before giving up.", + "type": "integer", + "minimum": 1, + "maximum": 3600, + "example": 50 + }, + "innodb_log_buffer_size": { + "description": "The size of the buffer, in bytes, that InnoDB uses to write to the log files. on disk.", + "type": "integer", + "minimum": 1048576, + "maximum": 4294967295, + "example": 16777216 + }, + "innodb_online_alter_log_max_size": { + "description": "The upper limit, in bytes, of the size of the temporary log files used during online DDL operations for InnoDB tables.", + "type": "integer", + "minimum": 65536, + "maximum": 1099511627776, + "example": 134217728 + }, + "innodb_print_all_deadlocks": { + "description": "When enabled, records information about all deadlocks in InnoDB user transactions in the error log. Disabled by default.", + "type": "boolean", + "example": true + }, + "innodb_rollback_on_timeout": { + "description": "When enabled, transaction timeouts cause InnoDB to abort and roll back the entire transaction.", + "type": "boolean", + "example": true + }, + "interactive_timeout": { + "description": "The time, in seconds, the server waits for activity on an interactive. connection before closing it.", + "type": "integer", + "minimum": 30, + "maximum": 604800, + "example": 3600 + }, + "internal_tmp_mem_storage_engine": { + "description": "The storage engine for in-memory internal temporary tables.", + "type": "string", + "enum": [ + "TempTable", + "MEMORY" + ], + "example": "TempTable" + }, + "net_read_timeout": { + "description": "The time, in seconds, to wait for more data from an existing connection. aborting the read.", + "type": "integer", + "minimum": 1, + "maximum": 3600, + "example": 30 + }, + "net_write_timeout": { + "description": "The number of seconds to wait for a block to be written to a connection before aborting the write.", + "type": "integer", + "minimum": 1, + "maximum": 3600, + "example": 30 + }, + "sql_require_primary_key": { + "description": "Require primary key to be defined for new tables or old tables modified with ALTER TABLE and fail if missing. It is recommended to always have primary keys because various functionality may break if any large table is missing them.", + "type": "boolean", + "example": true + }, + "wait_timeout": { + "description": "The number of seconds the server waits for activity on a noninteractive connection before closing it.", + "type": "integer", + "minimum": 1, + "maximum": 2147483, + "example": 28800 + }, + "max_allowed_packet": { + "description": "The size of the largest message, in bytes, that can be received by the server. Default is 67108864 (64M).", + "type": "integer", + "minimum": 102400, + "maximum": 1073741824, + "example": 67108864 + }, + "max_heap_table_size": { + "description": "The maximum size, in bytes, of internal in-memory tables. Also set tmp_table_size. Default is 16777216 (16M)", + "type": "integer", + "minimum": 1048576, + "maximum": 1073741824, + "example": 16777216 + }, + "sort_buffer_size": { + "description": "The sort buffer size, in bytes, for ORDER BY optimization. Default is 262144. (256K).", + "type": "integer", + "minimum": 32768, + "maximum": 1073741824, + "example": 262144 + }, + "tmp_table_size": { + "description": "The maximum size, in bytes, of internal in-memory tables. Also set max_heap_table_size. Default is 16777216 (16M).", + "type": "integer", + "minimum": 1048576, + "maximum": 1073741824, + "example": 16777216 + }, + "slow_query_log": { + "description": "When enabled, captures slow queries. When disabled, also truncates the mysql.slow_log table. Default is false.", + "type": "boolean", + "example": true + }, + "long_query_time": { + "description": "The time, in seconds, for a query to take to execute before being captured by slow_query_logs. Default is 10 seconds.", + "type": "number", + "minimum": 0, + "maximum": 3600, + "example": 10 + }, + "binlog_retention_period": { + "description": "The minimum amount of time, in seconds, to keep binlog entries before deletion. This may be extended for services that require binlog entries for longer than the default, for example if using the MySQL Debezium Kafka connector.", + "type": "number", + "minimum": 600, + "maximum": 86400, + "example": 600 + }, + "innodb_change_buffer_max_size": { + "description": "Specifies the maximum size of the InnoDB change buffer as a percentage of the buffer pool.", + "type": "integer", + "minimum": 0, + "maximum": 50, + "example": 25 + }, + "innodb_flush_neighbors": { + "description": "Specifies whether flushing a page from the InnoDB buffer pool also flushes other dirty pages in the same extent.\n - 0 — disables this functionality, dirty pages in the same extent are not flushed.\n - 1 — flushes contiguous dirty pages in the same extent.\n - 2 — flushes dirty pages in the same extent.", + "type": "integer", + "enum": [ + 0, + 1, + 2 + ], + "example": 0 + }, + "innodb_read_io_threads": { + "description": "The number of I/O threads for read operations in InnoDB. Changing this parameter will lead to a restart of the MySQL service.", + "type": "integer", + "minimum": 1, + "maximum": 64, + "example": 16 + }, + "innodb_write_io_threads": { + "description": "The number of I/O threads for write operations in InnoDB. Changing this parameter will lead to a restart of the MySQL service.", + "type": "integer", + "minimum": 1, + "maximum": 64, + "example": 16 + }, + "innodb_thread_concurrency": { + "description": "Defines the maximum number of threads permitted inside of InnoDB. A value of 0 (the default) is interpreted as infinite concurrency (no limit). This variable is intended for performance tuning on high concurrency systems.", + "type": "integer", + "minimum": 0, + "maximum": 1000, + "example": 0 + }, + "net_buffer_length": { + "description": "Start sizes of connection buffer and result buffer, must be multiple of 1024. Changing this parameter will lead to a restart of the MySQL service.", + "type": "integer", + "minimum": 1024, + "maximum": 1048576, + "example": 4096 + } + } + }, + "pgbouncer": { + "type": "object", + "description": "PGBouncer connection pooling settings", + "properties": { + "server_reset_query_always": { + "description": "Run server_reset_query (DISCARD ALL) in all pooling modes.", + "type": "boolean", + "example": false + }, + "ignore_startup_parameters": { + "description": "List of parameters to ignore when given in startup packet.", + "type": "array", + "example": [ + "extra_float_digits", + "search_path" + ], + "items": { + "description": "Enum of parameters to ignore when given in startup packet.", + "type": "string", + "enum": [ + "extra_float_digits", + "search_path" + ] + }, + "maxItems": 32 + }, + "min_pool_size": { + "description": "If current server connections are below this number, adds more. Improves behavior when usual load comes suddenly back after period of total inactivity. The value is effectively capped at the pool size.", + "type": "integer", + "minimum": 0, + "maximum": 10000, + "example": 1 + }, + "server_lifetime": { + "description": "The pooler closes any unused server connection that has been connected longer than this amount of seconds.", + "type": "integer", + "minimum": 60, + "maximum": 86400, + "example": 3600 + }, + "server_idle_timeout": { + "description": "Drops server connections if they have been idle more than this many seconds. If 0, timeout is disabled. ", + "type": "integer", + "minimum": 0, + "maximum": 86400, + "example": 600 + }, + "autodb_pool_size": { + "description": "If non-zero, automatically creates a pool of that size per user when a pool doesn't exist.", + "type": "integer", + "minimum": 0, + "maximum": 10000, + "example": 1 + }, + "autodb_pool_mode": { + "enum": [ + "session", + "transaction", + "statement" + ], + "example": "session", + "description": "PGBouncer pool mode", + "type": "string" + }, + "autodb_max_db_connections": { + "description": "Only allows a maximum this many server connections per database (regardless of user). If 0, allows unlimited connections.", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "example": 1 + }, + "autodb_idle_timeout": { + "description": "If the automatically-created database pools have been unused this many seconds, they are freed. If 0, timeout is disabled.", + "type": "integer", + "minimum": 0, + "maximum": 86400, + "example": 3600 + } + } + }, + "timescaledb": { + "type": "object", + "description": "TimescaleDB extension configuration values", + "properties": { + "max_background_workers": { + "description": "The number of background workers for timescaledb operations. Set to the sum of your number of databases and the total number of concurrent background workers you want running at any given point in time.", + "type": "integer", + "minimum": 1, + "maximum": 4096, + "example": 8 + } + } + }, + "postgres": { + "type": "object", + "properties": { + "autovacuum_freeze_max_age": { + "description": "Specifies the maximum age (in transactions) that a table's pg_class.relfrozenxid field can attain before a VACUUM operation is forced to prevent transaction ID wraparound within the table. Note that the system will launch autovacuum processes to prevent wraparound even when autovacuum is otherwise disabled. This parameter will cause the server to be restarted.", + "type": "integer", + "minimum": 200000000, + "maximum": 1500000000, + "example": 200000000 + }, + "autovacuum_max_workers": { + "description": "Specifies the maximum number of autovacuum processes (other than the autovacuum launcher) that may be running at any one time. The default is three. This parameter can only be set at server start.", + "type": "integer", + "minimum": 1, + "maximum": 20, + "example": 5 + }, + "autovacuum_naptime": { + "description": "Specifies the minimum delay, in seconds, between autovacuum runs on any given database. The default is one minute.", + "type": "integer", + "minimum": 0, + "maximum": 86400, + "example": 43200 + }, + "autovacuum_vacuum_threshold": { + "description": "Specifies the minimum number of updated or deleted tuples needed to trigger a VACUUM in any one table. The default is 50 tuples.", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "example": 50 + }, + "autovacuum_analyze_threshold": { + "description": "Specifies the minimum number of inserted, updated, or deleted tuples needed to trigger an ANALYZE in any one table. The default is 50 tuples.", + "type": "integer", + "minimum": 0, + "maximum": 2147483647, + "example": 50 + }, + "autovacuum_vacuum_scale_factor": { + "description": "Specifies a fraction, in a decimal value, of the table size to add to autovacuum_vacuum_threshold when deciding whether to trigger a VACUUM. The default is 0.2 (20% of table size).", + "type": "number", + "minimum": 0, + "maximum": 1, + "example": 0.2 + }, + "autovacuum_analyze_scale_factor": { + "description": "Specifies a fraction, in a decimal value, of the table size to add to autovacuum_analyze_threshold when deciding whether to trigger an ANALYZE. The default is 0.2 (20% of table size).", + "type": "number", + "minimum": 0, + "maximum": 1, + "example": 0.2 + }, + "autovacuum_vacuum_cost_delay": { + "description": "Specifies the cost delay value, in milliseconds, that will be used in automatic VACUUM operations. If -1, uses the regular vacuum_cost_delay value, which is 20 milliseconds.", + "type": "integer", + "minimum": -1, + "maximum": 100, + "example": 20 + }, + "autovacuum_vacuum_cost_limit": { + "description": "Specifies the cost limit value that will be used in automatic VACUUM operations. If -1 is specified (which is the default), the regular vacuum_cost_limit value will be used.", + "type": "integer", + "minimum": -1, + "maximum": 10000, + "example": -1 + }, + "backup_hour": { + "description": "The hour of day (in UTC) when backup for the service starts. New backup only starts if previous backup has already completed.", + "minimum": 0, + "maximum": 23, + "type": "integer", + "example": 3 + }, + "backup_minute": { + "description": "The minute of the backup hour when backup for the service starts. New backup is only started if previous backup has already completed.", + "minimum": 0, + "maximum": 59, + "type": "integer", + "example": 30 + }, + "bgwriter_delay": { + "description": "Specifies the delay, in milliseconds, between activity rounds for the background writer. Default is 200 ms.", + "type": "integer", + "minimum": 10, + "maximum": 10000, + "example": 200 + }, + "bgwriter_flush_after": { + "description": "The amount of kilobytes that need to be written by the background writer before attempting to force the OS to issue these writes to underlying storage. Specified in kilobytes, default is 512. Setting of 0 disables forced writeback.", + "type": "integer", + "minimum": 0, + "maximum": 2048, + "example": 512 + }, + "bgwriter_lru_maxpages": { + "description": "The maximum number of buffers that the background writer can write. Setting this to zero disables background writing. Default is 100.", + "type": "integer", + "minimum": 0, + "maximum": 1073741823, + "example": 100 + }, + "bgwriter_lru_multiplier": { + "description": "The average recent need for new buffers is multiplied by bgwriter_lru_multiplier to arrive at an estimate of the number that will be needed during the next round, (up to bgwriter_lru_maxpages). 1.0 represents a “just in time” policy of writing exactly the number of buffers predicted to be needed. Larger values provide some cushion against spikes in demand, while smaller values intentionally leave writes to be done by server processes. The default is 2.0.", + "type": "number", + "minimum": 0, + "maximum": 10, + "example": 2 + }, + "deadlock_timeout": { + "description": "The amount of time, in milliseconds, to wait on a lock before checking to see if there is a deadlock condition.", + "type": "integer", + "minimum": 500, + "maximum": 1800000, + "example": 1000 + }, + "default_toast_compression": { + "description": "Specifies the default TOAST compression method for values of compressible columns (the default is lz4).", + "type": "string", + "enum": [ + "lz4", + "pglz" + ], + "example": "lz4" + }, + "idle_in_transaction_session_timeout": { + "description": "Time out sessions with open transactions after this number of milliseconds", + "type": "integer", + "minimum": 0, + "maximum": 604800000, + "example": 10000 + }, + "jit": { + "description": "Activates, in a boolean, the system-wide use of Just-in-Time Compilation (JIT).", + "type": "boolean", + "example": true + }, + "log_autovacuum_min_duration": { + "description": "Causes each action executed by autovacuum to be logged if it ran for at least the specified number of milliseconds. Setting this to zero logs all autovacuum actions. Minus-one (the default) disables logging autovacuum actions.", + "type": "integer", + "minimum": -1, + "maximum": 2147483647, + "example": -1 + }, + "log_error_verbosity": { + "description": "Controls the amount of detail written in the server log for each message that is logged.", + "type": "string", + "enum": [ + "TERSE", + "DEFAULT", + "VERBOSE" + ], + "example": "VERBOSE" + }, + "log_line_prefix": { + "description": "Selects one of the available log-formats. These can support popular log analyzers like pgbadger, pganalyze, etc.", + "type": "string", + "enum": [ + "pid=%p,user=%u,db=%d,app=%a,client=%h", + "%m [%p] %q[user=%u,db=%d,app=%a]", + "%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h" + ], + "example": "pid=%p,user=%u,db=%d,app=%a,client=%h" + }, + "log_min_duration_statement": { + "description": "Log statements that take more than this number of milliseconds to run. If -1, disables.", + "type": "integer", + "minimum": -1, + "maximum": 86400000, + "example": -1 + }, + "max_files_per_process": { + "description": "PostgreSQL maximum number of files that can be open per process.", + "type": "integer", + "minimum": 1000, + "maximum": 4096, + "example": 2048 + }, + "max_prepared_transactions": { + "description": "PostgreSQL maximum prepared transactions. Once increased, this parameter cannot be lowered from its set value.", + "type": "integer", + "minimum": 0, + "maximum": 10000, + "example": 20 + }, + "max_pred_locks_per_transaction": { + "description": "PostgreSQL maximum predicate locks per transaction.", + "type": "integer", + "minimum": 64, + "maximum": 640, + "example": 128 + }, + "max_locks_per_transaction": { + "description": "PostgreSQL maximum locks per transaction. Once increased, this parameter cannot be lowered from its set value.", + "type": "integer", + "minimum": 64, + "maximum": 6400, + "example": 128 + }, + "max_stack_depth": { + "description": "Maximum depth of the stack in bytes.", + "type": "integer", + "minimum": 2097152, + "maximum": 6291456, + "example": 2097152 + }, + "max_standby_archive_delay": { + "description": "Max standby archive delay in milliseconds.", + "type": "integer", + "minimum": 1, + "maximum": 43200000, + "example": 43200 + }, + "max_standby_streaming_delay": { + "description": "Max standby streaming delay in milliseconds.", + "type": "integer", + "minimum": 1, + "maximum": 43200000, + "example": 43200 + }, + "max_replication_slots": { + "description": "PostgreSQL maximum replication slots.", + "type": "integer", + "minimum": 8, + "maximum": 64, + "example": 16 + }, + "max_logical_replication_workers": { + "description": "PostgreSQL maximum logical replication workers (taken from the pool of max_parallel_workers).", + "type": "integer", + "minimum": 4, + "maximum": 64, + "example": 16 + }, + "max_parallel_workers": { + "description": "Sets the maximum number of workers that the system can support for parallel queries.", + "type": "integer", + "minimum": 0, + "maximum": 96, + "example": 12 + }, + "max_parallel_workers_per_gather": { + "description": "Sets the maximum number of workers that can be started by a single Gather or Gather Merge node.", + "type": "integer", + "minimum": 0, + "maximum": 96, + "example": 16 + }, + "max_worker_processes": { + "description": "Sets the maximum number of background processes that the system can support. Once increased, this parameter cannot be lowered from its set value.", + "type": "integer", + "minimum": 8, + "maximum": 96, + "example": 16 + }, + "pg_partman_bgw.role": { + "type": "string", + "pattern": "^[_A-Za-z0-9][-._A-Za-z0-9]{0,63}$", + "maxLength": 64, + "example": "myrolename", + "description": "Controls which role to use for pg_partman's scheduled background tasks. Must consist of alpha-numeric characters, dots, underscores, or dashes. May not start with dash or dot. Maximum of 64 characters." + }, + "pg_partman_bgw.interval": { + "description": "Sets the time interval to run pg_partman's scheduled tasks.", + "type": "integer", + "minimum": 3600, + "maximum": 604800, + "example": 3600 + }, + "pg_stat_statements.track": { + "description": "Controls which statements are counted. Specify 'top' to track top-level statements (those issued directly by clients), 'all' to also track nested statements (such as statements invoked within functions), or 'none' to disable statement statistics collection. The default value is top.", + "type": "string", + "enum": [ + "all", + "top", + "none" + ], + "example": "all" + }, + "temp_file_limit": { + "description": "PostgreSQL temporary file limit in KiB. If -1, sets to unlimited.", + "type": "integer", + "example": 5000000, + "minimum": -1, + "maximum": 2147483647 + }, + "timezone": { + "description": "PostgreSQL service timezone", + "type": "string", + "example": "Europe/Helsinki", + "maxLength": 64 + }, + "track_activity_query_size": { + "description": "Specifies the number of bytes reserved to track the currently executing command for each active session.", + "type": "integer", + "example": 1024, + "minimum": 1024, + "maximum": 10240 + }, + "track_commit_timestamp": { + "description": "Record commit time of transactions.", + "type": "string", + "enum": [ + "off", + "on" + ], + "example": "off" + }, + "track_functions": { + "description": "Enables tracking of function call counts and time used.", + "type": "string", + "enum": [ + "all", + "pl", + "none" + ], + "example": "all" + }, + "track_io_timing": { + "description": "Enables timing of database I/O calls. This parameter is off by default, because it will repeatedly query the operating system for the current time, which may cause significant overhead on some platforms.", + "type": "string", + "enum": [ + "off", + "on" + ], + "example": "off" + }, + "max_wal_senders": { + "description": "PostgreSQL maximum WAL senders. Once increased, this parameter cannot be lowered from its set value.", + "type": "integer", + "minimum": 20, + "maximum": 64, + "example": 32 + }, + "wal_sender_timeout": { + "description": "Terminate replication connections that are inactive for longer than this amount of time, in milliseconds. Setting this value to zero disables the timeout. Must be either 0 or between 5000 and 10800000.", + "type": "integer", + "minimum": 0, + "maximum": 10800000, + "example": 60000 + }, + "wal_writer_delay": { + "description": "WAL flush interval in milliseconds. Note that setting this value to lower than the default 200ms may negatively impact performance", + "type": "integer", + "minimum": 10, + "maximum": 200, + "example": 50 + }, + "shared_buffers_percentage": { + "description": "Percentage of total RAM that the database server uses for shared memory buffers. Valid range is 20-60 (float), which corresponds to 20% - 60%. This setting adjusts the shared_buffers configuration value.", + "type": "number", + "minimum": 20, + "maximum": 60, + "example": 41.5 + }, + "pgbouncer": { + "$ref": "#/components/schemas/pgbouncer" + }, + "work_mem": { + "description": "The maximum amount of memory, in MB, used by a query operation (such as a sort or hash table) before writing to temporary disk files. Default is 1MB + 0.075% of total RAM (up to 32MB).", + "type": "integer", + "minimum": 1, + "maximum": 1024, + "example": 4 + }, + "timescaledb": { + "$ref": "#/components/schemas/timescaledb" + }, + "synchronous_replication": { + "description": "Synchronous replication type. Note that the service plan also needs to support synchronous replication.", + "type": "string", + "example": "off", + "enum": [ + "off", + "quorum" + ] + }, + "stat_monitor_enable": { + "description": "Enable the pg_stat_monitor extension. Enabling this extension will cause the cluster to be restarted. When this extension is enabled, pg_stat_statements results for utility commands are unreliable.", + "type": "boolean", + "example": false + } + } + }, + "eviction_policy_model": { + "type": "string", + "enum": [ + "noeviction", + "allkeys_lru", + "allkeys_random", + "volatile_lru", + "volatile_random", + "volatile_ttl" + ], + "description": "A string specifying the desired eviction policy for the Redis cluster.\n\n- `noeviction`: Don't evict any data, returns error when memory limit is reached.\n- `allkeys_lru:` Evict any key, least recently used (LRU) first.\n- `allkeys_random`: Evict keys in a random order.\n- `volatile_lru`: Evict keys with expiration only, least recently used (LRU) first.\n- `volatile_random`: Evict keys with expiration only in a random order.\n- `volatile_ttl`: Evict keys with expiration only, shortest time-to-live (TTL) first.", + "example": "allkeys_lru" + }, + "redis": { + "type": "object", + "properties": { + "redis_maxmemory_policy": { + "$ref": "#/components/schemas/eviction_policy_model" + }, + "redis_pubsub_client_output_buffer_limit": { + "description": "Set output buffer limit for pub / sub clients in MB. The value is the hard limit, the soft limit is 1/4 of the hard limit. When setting the limit, be mindful of the available memory in the selected service plan.", + "type": "integer", + "minimum": 32, + "maximum": 512, + "example": 64 + }, + "redis_number_of_databases": { + "type": "integer", + "minimum": 1, + "maximum": 128, + "description": "Set number of redis databases. Changing this will cause a restart of redis service.", + "example": 16 + }, + "redis_io_threads": { + "description": "Redis IO thread count", + "type": "integer", + "minimum": 1, + "maximum": 32, + "example": 1 + }, + "redis_lfu_log_factor": { + "description": "Counter logarithm factor for volatile-lfu and allkeys-lfu maxmemory-policies", + "type": "integer", + "minimum": 0, + "maximum": 100, + "default": 10, + "example": 10 + }, + "redis_lfu_decay_time": { + "description": "LFU maxmemory-policy counter decay time in minutes", + "type": "integer", + "minimum": 1, + "maximum": 120, + "default": 1, + "example": 1 + }, + "redis_ssl": { + "description": "Require SSL to access Redis", + "type": "boolean", + "default": true, + "example": true + }, + "redis_timeout": { + "description": "Redis idle connection timeout in seconds", + "type": "integer", + "minimum": 0, + "maximum": 31536000, + "default": 300, + "example": 300 + }, + "redis_notify_keyspace_events": { + "description": "Set notify-keyspace-events option. Requires at least `K` or `E` and accepts any combination of the following options. Setting the parameter to `\"\"` disables notifications.\n- `K` — Keyspace events\n- `E` — Keyevent events\n- `g` — Generic commands (e.g. `DEL`, `EXPIRE`, `RENAME`, ...)\n- `$` — String commands\n- `l` — List commands\n- `s` — Set commands\n- `h` — Hash commands\n- `z` — Sorted set commands\n- `t` — Stream commands\n- `d` — Module key type events\n- `x` — Expired events\n- `e` — Evicted events\n- `m` — Key miss events\n- `n` — New key events\n- `A` — Alias for `\"g$lshztxed\"`", + "type": "string", + "pattern": "^[KEg\\$lshzxeA]*$", + "default": "", + "maxLength": 32, + "example": "K" + }, + "redis_persistence": { + "type": "string", + "enum": [ + "off", + "rdb" + ], + "description": "When persistence is 'rdb', Redis does RDB dumps each 10 minutes if any key is changed. Also RDB dumps are done according to backup schedule for backup purposes. When persistence is 'off', no RDB dumps and backups are done, so data can be lost at any moment if service is restarted for any reason, or if service is powered off. Also service can't be forked.", + "example": "rdb" + }, + "redis_acl_channels_default": { + "type": "string", + "enum": [ + "allchannels", + "resetchannels" + ], + "description": "Determines default pub/sub channels' ACL for new users if ACL is not supplied. When this option is not defined, all_channels is assumed to keep backward compatibility. This option doesn't affect Redis configuration acl-pubsub-default.", + "example": "allchannels" + } + } + }, + "database_config": { + "type": "object", + "properties": { + "config": { + "anyOf": [ + { + "$ref": "#/components/schemas/mysql" + }, + { + "$ref": "#/components/schemas/postgres" + }, + { + "$ref": "#/components/schemas/redis" + } + ] + } + } + }, + "ca": { + "type": "object", + "properties": { + "certificate": { + "type": "string", + "example": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVRVENDQXFtZ0F3SUJBZ0lVRUZZWTdBWFZQS0Raam9jb1lpMk00Y0dvcU0wd0RRWUpLb1pJaHZjTkFRRU0KQlFBd09qRTRNRFlHQTFVRUF3d3ZOek0zT1RaaE1XRXRaamhrTUMwME9HSmpMV0V4Wm1NdFpqbGhNVFZsWXprdwpORGhsSUZCeWIycGxZM1FnUTBFd0hoY05NakF3TnpFM01UVTFNREEyV2hjTk16QXdOekUxTVRVMU1EQTJXakE2Ck1UZ3dOZ1lEVlFRRERDODNNemM1Tm1FeFlTMW1PR1F3TFRRNFltTXRZVEZtWXkxbU9XRXhOV1ZqT1RBME9HVWcKVUhKdmFtVmpkQ0JEUVRDQ0FhSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnR1BBRENDQVlvQ2dnR0JBTVdScXhycwpMZnpNdHZyUmxKVEw4MldYMVBLZkhKbitvYjNYcmVBY3FZd1dBUUp2Q3IycmhxSXZieVZzMGlaU0NzOHI4c3RGClljQ0R1bkxJNmUwTy9laERZYTBIT2RrMkFFRzE1ckVOVmNha2NSczcyQWlHVHNrdkNXS2VkUjFTUWswVWt0WCsKQUg4S1ExS3F5bzNtZ2Y2cVV1WUpzc3JNTXFselk3YTN1RVpEb2ZqTjN5Q3MvM21pTVJKcVcyNm1JV0IrUUlEbAo5YzdLRVF5MTZvdCtjeHVnd0lLMm9oZHMzaFY1bjBKMFVBM0I3QWRBdXY5aUl5L3JHaHlTNm5CNTdaWm9JZnAyCnFybXdOY0UrVjlIdXhQSGtRVjFOQjUwOFFudWZ4Z0E5VCtqU2VrdGVUbWFORkxqNjFXL3BtcndrTytOaWFXUTIKaGgzVXBKOEozY1BoNkErbHRnUmpSV2NEb2lsYVNwRVVpU09WemNNYVFvalZKYVJlNk9NbnZYc29NaSs3ZzdneApWcittQ0lUcGcvck9DaXpBWWQ2UFAxLzdYTjk1ZXNmU2tBQnM5c3hJakpjTUFqbDBYTEFzRmtGZVdyeHNIajlVCmJnaDNWYXdtcnpUeXhZT0RQcXV1cS9JcGlwc0RRT3Fpb2ZsUStkWEJJL3NUT0NNbVp6K0pNcG5HYXdJREFRQUIKb3o4d1BUQWRCZ05WSFE0RUZnUVVSekdDRlE3WEtUdHRDN3JzNS8ydFlQcExTZGN3RHdZRFZSMFRCQWd3QmdFQgovd0lCQURBTEJnTlZIUThFQkFNQ0FRWXdEUVlKS29aSWh2Y05BUUVNQlFBRGdnR0JBSWFKQ0dSVVNxUExtcmcvCmk3MW10b0NHUDdzeG1BVXVCek1oOEdrU25uaVdaZnZGMTRwSUtqTlkwbzVkWmpHKzZqK1VjalZtK0RIdGE1RjYKOWJPeEk5S0NFeEI1blBjRXpMWjNZYitNOTcrellxbm9zUm85S21DVFJBb2JrNTZ0WU1FS1h1aVJja2tkMm1yUQo4cGw2N2xxdThjM1V4c0dHZEZVT01wMkk3ZTNpdUdWVm5UR0ZWM3JQZUdaQ0J3WGVyUUQyY0F4UjkzS3BnWVZ2ClhUUzk5dnpSbm1HOHhhUm9EVy9FbEdXZ2xWd0Q5a1JrbXhUUkdoYTdDWVZCcjFQVWY2dVVFVjhmVFIxc1hFZnIKLytMR1JoSVVsSUhWT3l2Yzk3YnZYQURPbWF1MWZDVE5lWGtRdTNyZnZFSlBmaFlLeVIwT0V3eWVvdlhRNzl0LwpTV2ZGTjBreU1Pc1UrNVNIdHJKSEh1eWNWcU0yQlVVK083VjM1UnNwOU9MZGRZMFFVbTZldFpEVEhhSUhYYzRRCnl1Rm1OL1NhSFZtNE0wL3BTVlJQdVd6TmpxMnZyRllvSDRtbGhIZk95TUNJMjc2elE2aWhGNkdDSHlkOUJqajcKUm1UWGEyNHM3NWhmSi9YTDV2bnJSdEtpVHJlVHF6V21EOVhnUmNMQ0gyS1hJaVRtSWc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==", + "description": "base64 encoding of the certificate used to secure database connections", + "readOnly": true + } + }, + "required": [ + "certificate" + ] + }, + "online_migration": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The ID of the most recent migration.", + "example": "77b28fc8-19ff-11eb-8c9c-c68e24557488" + }, + "status": { + "type": "string", + "description": "The current status of the migration.", + "enum": [ + "running", + "canceled", + "error", + "done" + ], + "example": "running" + }, + "created_at": { + "type": "string", + "description": "The time the migration was initiated, in ISO 8601 format.", + "example": "2020-10-29T15:57:38Z" + } + } + }, + "source_database": { + "type": "object", + "properties": { + "source": { + "type": "object", + "properties": { + "host": { + "type": "string", + "description": "The FQDN pointing to the database cluster's current primary node.", + "example": "backend-do-user-19081923-0.db.ondigitalocean.com" + }, + "port": { + "type": "integer", + "description": "The port on which the database cluster is listening.", + "example": 25060 + }, + "dbname": { + "type": "string", + "description": "The name of the default database.", + "example": "defaultdb" + }, + "username": { + "type": "string", + "description": "The default user for the database.", + "example": "doadmin" + }, + "password": { + "type": "string", + "description": "The randomly generated password for the default user.", + "example": "wv78n3zpz42xezdk" + } + } + }, + "disable_ssl": { + "type": "boolean", + "description": "Enables SSL encryption when connecting to the source database.", + "example": false + } + } + }, + "database_cluster_resize": { + "type": "object", + "properties": { + "size": { + "type": "string", + "example": "db-s-4vcpu-8gb", + "description": "A slug identifier representing desired the size of the nodes in the database cluster." + }, + "num_nodes": { + "type": "integer", + "format": "int32", + "example": 3, + "description": "The number of nodes in the database cluster. Valid values are are 1-3. In addition to the primary node, up to two standby nodes may be added for highly available configurations." + } + }, + "required": [ + "size", + "num_nodes" + ] + }, + "backup": { + "type": "object", + "properties": { + "created_at": { + "type": "string", + "format": "date-time", + "example": "2019-01-31T19:25:22Z", + "description": "A time value given in ISO8601 combined date and time format at which the backup was created." + }, + "size_gigabytes": { + "type": "number", + "example": 0.03364864, + "description": "The size of the database backup in GBs." + } + }, + "required": [ + "created_at", + "size_gigabytes" + ] + }, + "database_replica": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "9cc10173-e9ea-4176-9dbc-a4cee4c4ff30", + "description": "A unique ID that can be used to identify and reference a database replica.", + "readOnly": true + }, + "name": { + "type": "string", + "example": "read-nyc3-01", + "description": "The name to give the read-only replicating" + }, + "region": { + "type": "string", + "example": "nyc3", + "description": "A slug identifier for the region where the read-only replica will be located. If excluded, the replica will be placed in the same region as the cluster." + }, + "size": { + "type": "string", + "writeOnly": true, + "example": "db-s-2vcpu-4gb", + "description": "A slug identifier representing the size of the node for the read-only replica. The size of the replica must be at least as large as the node size for the database cluster from which it is replicating." + }, + "status": { + "type": "string", + "enum": [ + "creating", + "online", + "resizing", + "migrating", + "forking" + ], + "example": "creating", + "description": "A string representing the current status of the database cluster.", + "readOnly": true + }, + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "production" + ], + "description": "A flat array of tag names as strings to apply to the read-only replica after it is created. Tag names can either be existing or new tags." + }, + "created_at": { + "type": "string", + "format": "date-time", + "example": "2019-01-11T18:37:36Z", + "description": "A time value given in ISO8601 combined date and time format that represents when the database cluster was created.", + "readOnly": true + }, + "private_network_uuid": { + "type": "string", + "example": "9423cbad-9211-442f-820b-ef6915e99b5f", + "description": "A string specifying the UUID of the VPC to which the read-only replica will be assigned. If excluded, the replica will be assigned to your account's default VPC for the region." + }, + "connection": { + "allOf": [ + { + "readOnly": true + }, + { + "$ref": "#/components/schemas/database_connection" + } + ] + }, + "private_connection": { + "allOf": [ + { + "readOnly": true + }, + { + "$ref": "#/components/schemas/database_connection" + } + ] + } + }, + "required": [ + "name" + ] + }, + "database": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "alpha", + "description": "The name of the database." + } + }, + "required": [ + "name" + ] + }, + "connection_pool": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "A unique name for the connection pool. Must be between 3 and 60 characters.", + "example": "backend-pool" + }, + "mode": { + "type": "string", + "description": "The PGBouncer transaction mode for the connection pool. The allowed values are session, transaction, and statement.", + "example": "transaction" + }, + "size": { + "type": "integer", + "format": "int32", + "description": "The desired size of the PGBouncer connection pool. The maximum allowed size is determined by the size of the cluster's primary node. 25 backend server connections are allowed for every 1GB of RAM. Three are reserved for maintenance. For example, a primary node with 1 GB of RAM allows for a maximum of 22 backend server connections while one with 4 GB would allow for 97. Note that these are shared across all connection pools in a cluster.", + "example": 10 + }, + "db": { + "type": "string", + "description": "The database for use with the connection pool.", + "example": "defaultdb" + }, + "user": { + "type": "string", + "description": "The name of the user for use with the connection pool. When excluded, all sessions connect to the database as the inbound user.", + "example": "doadmin" + }, + "connection": { + "allOf": [ + { + "$ref": "#/components/schemas/database_connection" + }, + { + "readOnly": true + } + ] + }, + "private_connection": { + "allOf": [ + { + "$ref": "#/components/schemas/database_connection" + }, + { + "readOnly": true + } + ] + } + }, + "required": [ + "name", + "mode", + "size", + "db" + ] + }, + "connection_pools": { + "type": "object", + "properties": { + "pools": { + "type": "array", + "readOnly": true, + "description": "An array of connection pool objects.", + "items": { + "$ref": "#/components/schemas/connection_pool" + } + } + } + }, + "connection_pool_update": { + "type": "object", + "properties": { + "mode": { + "type": "string", + "description": "The PGBouncer transaction mode for the connection pool. The allowed values are session, transaction, and statement.", + "example": "transaction" + }, + "size": { + "type": "integer", + "format": "int32", + "description": "The desired size of the PGBouncer connection pool. The maximum allowed size is determined by the size of the cluster's primary node. 25 backend server connections are allowed for every 1GB of RAM. Three are reserved for maintenance. For example, a primary node with 1 GB of RAM allows for a maximum of 22 backend server connections while one with 4 GB would allow for 97. Note that these are shared across all connection pools in a cluster.", + "example": 10 + }, + "db": { + "type": "string", + "description": "The database for use with the connection pool.", + "example": "defaultdb" + }, + "user": { + "type": "string", + "description": "The name of the user for use with the connection pool. When excluded, all sessions connect to the database as the inbound user.", + "example": "doadmin" + } + }, + "required": [ + "mode", + "size", + "db" + ] + }, + "sql_mode": { + "type": "object", + "properties": { + "sql_mode": { + "type": "string", + "example": "ANSI,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,STRICT_ALL_TABLES", + "description": "A string specifying the configured SQL modes for the MySQL cluster." + } + }, + "required": [ + "sql_mode" + ] + }, + "version": { + "type": "string", + "example": "8", + "description": "A string representing the version of the database engine in use for the cluster." + }, + "version-2": { + "type": "object", + "properties": { + "version": { + "$ref": "#/components/schemas/version" + } + } + }, + "kafka_topic_base": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The name of the Kafka topic.", + "example": "events" + }, + "replication_factor": { + "type": "integer", + "example": 2, + "description": "The number of nodes to replicate data across the cluster." + }, + "partition_count": { + "type": "integer", + "example": 3, + "description": "The number of partitions available for the topic. On update, this value can only be increased." + } + } + }, + "kafka_topic": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/kafka_topic_base" + }, + { + "properties": { + "state": { + "type": "string", + "enum": [ + "active", + "configuring", + "deleting", + "unknown" + ], + "example": "active", + "description": "The state of the Kafka topic." + } + } + } + ] + }, + "kafka_topic_config": { + "type": "object", + "properties": { + "cleanup_policy": { + "type": "string", + "enum": [ + "delete", + "compact", + "compact_delete" + ], + "example": "delete", + "default": "delete", + "description": "The cleanup_policy sets the retention policy to use on log segments. 'delete' will discard old segments when retention time/size limits are reached. 'compact' will enable log compaction, resulting in retention of the latest value for each key." + }, + "compression_type": { + "type": "string", + "enum": [ + "producer", + "gzip", + "snappy", + "Iz4", + "zstd", + "uncompressed" + ], + "example": "producer", + "default": "producer", + "description": "The compression_type specifies the compression type of the topic." + }, + "delete_retention_ms": { + "type": "integer", + "example": 86400000, + "default": 86400000, + "description": "The delete_retention_ms specifies how long (in ms) to retain delete tombstone markers for topics." + }, + "file_delete_delay_ms": { + "type": "integer", + "example": 60000, + "default": 60000, + "description": "The file_delete_delay_ms specifies the time (in ms) to wait before deleting a file from the filesystem." + }, + "flush_messages": { + "type": "integer", + "example": 9223372036854776000, + "default": 9223372036854776000, + "description": "The flush_messages specifies the number of messages to accumulate on a log partition before messages are flushed to disk." + }, + "flush_ms": { + "type": "integer", + "example": 9223372036854776000, + "default": 9223372036854776000, + "description": "The flush_ms specifies the maximum time (in ms) that a message is kept in memory before being flushed to disk." + }, + "index_interval_bytes": { + "type": "integer", + "example": 4096, + "default": 4096, + "description": "The index_interval_bytes specifies the number of bytes between entries being added into te offset index." + }, + "max_compaction_lag_ms": { + "type": "integer", + "example": 9223372036854776000, + "default": 9223372036854776000, + "description": "The max_compaction_lag_ms specifies the maximum amount of time (in ms) that a message will remain uncompacted. This is only applicable if the logs are have compaction enabled." + }, + "max_message_bytes": { + "type": "integer", + "example": 1048588, + "default": 1048588, + "description": "The max_messages_bytes specifies the largest record batch size (in bytes) that can be sent to the server. This is calculated after compression if compression is enabled." + }, + "message_down_conversion_enable": { + "type": "boolean", + "example": true, + "default": true, + "description": "The message_down_conversion_enable specifies whether down-conversion of message formats is enabled to satisfy consumer requests. When 'false', the broker will not perform conversion for consumers expecting older message formats. The broker will respond with an `UNSUPPORTED_VERSION` error for consume requests from these older clients." + }, + "message_format_version": { + "type": "string", + "example": "3.0-IV1", + "enum": [ + "0.8.0", + "0.8.1", + "0.8.2", + "0.9.0", + "0.10.0-IV0", + "0.10.0-IV1", + "0.10.1-IV0", + "0.10.1-IV1", + "0.10.1-IV2", + "0.10.2-IV0", + "0.11.0-IV0", + "0.11.0-IV1", + "0.11.0-IV2", + "1.0-IV0", + "1.1-IV0", + "2.0-IV0", + "2.0-IV1", + "2.1-IV0", + "2.1-IV1", + "2.1-IV2", + "2.2-IV0", + "2.2-IV1", + "2.3-IV0", + "2.3-IV1", + "2.4-IV0", + "2.4-IV1", + "2.5-IV0", + "2.6-IV0", + "2.7-IV0", + "2.7-IV1", + "2.7-IV2", + "2.8-IV0", + "2.8-IV1", + "3.0-IV0", + "3.0-IV1", + "3.1-IV0", + "3.2-IV0", + "3.3-IV0", + "3.3-IV1", + "3.3-IV2", + "3.3-IV3" + ], + "default": "3.0-IV1", + "description": "The message_format_version specifies the message format version used by the broker to append messages to the logs. The value of this setting is assumed to be 3.0-IV1 if the broker protocol version is 3.0 or higher. By setting a particular message format version, all existing messages on disk must be smaller or equal to the specified version." + }, + "message_timestamp_type": { + "type": "string", + "example": "create_time", + "enum": [ + "create_time", + "log_append_time" + ], + "default": "create_time", + "description": "The message_timestamp_type specifies whether to use the message create time or log append time as the timestamp on a message." + }, + "min_cleanable_dirty_ratio": { + "type": "number", + "format": "float", + "default": 0.5, + "example": 0.5, + "minimum": 0, + "maximum": 1, + "description": "The min_cleanable_dirty_ratio specifies the frequency of log compaction (if enabled) in relation to duplicates present in the logs. For example, at 0.5, at most 50% of the log could be duplicates before compaction would begin." + }, + "min_compaction_lag_ms": { + "type": "integer", + "example": 0, + "default": 0, + "description": "The min_compaction_lag_ms specifies the minimum time (in ms) that a message will remain uncompacted in the log. Only relevant if log compaction is enabled." + }, + "min_insync_replicas": { + "type": "integer", + "example": 1, + "default": 1, + "minimum": 1, + "description": "The min_insync_replicas specifies the number of replicas that must ACK a write for the write to be considered successful." + }, + "preallocate": { + "type": "boolean", + "example": false, + "default": false, + "description": "The preallocate specifies whether a file should be preallocated on disk when creating a new log segment." + }, + "retention_bytes": { + "type": "integer", + "example": 1000000, + "default": -1, + "description": "The retention_bytes specifies the maximum size of the log (in bytes) before deleting messages. -1 indicates that there is no limit." + }, + "retention_ms": { + "type": "integer", + "example": 604800000, + "default": 604800000, + "description": "The retention_ms specifies the maximum amount of time (in ms) to keep a message before deleting it." + }, + "segment_bytes": { + "type": "integer", + "example": 209715200, + "default": 209715200, + "minimum": 14, + "description": "The segment_bytes specifies the maximum size of a single log file (in bytes)." + }, + "segment_jitter_ms": { + "type": "integer", + "example": 0, + "default": 0, + "description": "The segment_jitter_ms specifies the maximum random jitter subtracted from the scheduled segment roll time to avoid thundering herds of segment rolling." + }, + "segment_ms": { + "type": "integer", + "example": 604800000, + "default": 604800000, + "minimum": 1, + "description": "The segment_ms specifies the period of time after which the log will be forced to roll if the segment file isn't full. This ensures that retention can delete or compact old data." + }, + "unclean_leader_election_enable": { + "type": "boolean", + "example": false, + "default": false, + "description": "Whether unclean_leader_election_enable specifies whether to allow replicas that are not insync to be elected as leaders as a last resort. This may result in data loss since those leaders are not insync." + } + } + }, + "kafka_topic_create": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/kafka_topic_base" + }, + { + "properties": { + "config": { + "$ref": "#/components/schemas/kafka_topic_config" + } + } + } + ] + }, + "kafka_topic_partition": { + "type": "object", + "properties": { + "size": { + "type": "integer", + "description": "Size of the topic partition in bytes.", + "example": 4096 + }, + "id": { + "type": "integer", + "description": "An identifier for the partition.", + "example": 1 + }, + "in_sync_replicas": { + "type": "integer", + "description": "The number of nodes that are in-sync (have the latest data) for the given partition", + "example": 3 + }, + "earliest_offset": { + "type": "integer", + "description": "The earliest consumer offset amongst consumer groups.", + "example": 0 + }, + "consumer_groups": { + "type": "array", + "nullable": true, + "items": { + "type": "object", + "properties": { + "group_name": { + "type": "string", + "description": "Name of the consumer group.", + "example": "consumer" + }, + "offset": { + "type": "integer", + "description": "The current offset of the consumer group.", + "example": 0 + } + } + } + } + } + }, + "kafka_topic_verbose": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The name of the Kafka topic.", + "example": "events" + }, + "state": { + "type": "string", + "enum": [ + "active", + "configuring", + "deleting", + "unknown" + ], + "example": "active", + "description": "The state of the Kafka topic." + }, + "replication_factor": { + "type": "integer", + "example": 2, + "description": "The number of nodes to replicate data across the cluster." + }, + "partitions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/kafka_topic_partition" + } + }, + "config": { + "$ref": "#/components/schemas/kafka_topic_config" + } + }, + "required": [ + "name" + ] + }, + "kafka_topic_update": { + "type": "object", + "properties": { + "topic": { + "allOf": [ + { + "$ref": "#/components/schemas/kafka_topic_base" + }, + { + "properties": { + "config": { + "$ref": "#/components/schemas/kafka_topic_config" + } + } + } + ] + } + } + }, + "domain": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The name of the domain itself. This should follow the standard domain format of domain.TLD. For instance, `example.com` is a valid domain name.", + "example": "example.com" + }, + "ip_address": { + "type": "string", + "writeOnly": true, + "description": "This optional attribute may contain an IP address. When provided, an A record will be automatically created pointing to the apex domain.", + "example": "192.0.2.1" + }, + "ttl": { + "type": "integer", + "readOnly": true, + "nullable": true, + "description": "This value is the time to live for the records on this domain, in seconds. This defines the time frame that clients can cache queried information before a refresh should be requested.", + "example": 1800 + }, + "zone_file": { + "type": "string", + "readOnly": true, + "nullable": true, + "description": "This attribute contains the complete contents of the zone file for the selected domain. Individual domain record resources should be used to get more granular control over records. However, this attribute can also be used to get information about the SOA record, which is created automatically and is not accessible as an individual record resource.", + "example": "$ORIGIN example.com.\n$TTL 1800\nexample.com. IN SOA ns1.digitalocean.com. hostmaster.example.com. 1415982609 10800 3600 604800 1800\nexample.com. 1800 IN NS ns1.digitalocean.com.\nexample.com. 1800 IN NS ns2.digitalocean.com.\nexample.com. 1800 IN NS ns3.digitalocean.com.\nexample.com. 1800 IN A 1.2.3.4\n" + } + } + }, + "domain_record": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "id": { + "type": "integer", + "description": "A unique identifier for each domain record.", + "example": 28448429, + "readOnly": true + }, + "type": { + "type": "string", + "description": "The type of the DNS record. For example: A, CNAME, TXT, ...", + "example": "NS" + }, + "name": { + "type": "string", + "description": "The host name, alias, or service being defined by the record.", + "example": "@" + }, + "data": { + "type": "string", + "description": "Variable data depending on record type. For example, the \"data\" value for an A record would be the IPv4 address to which the domain will be mapped. For a CAA record, it would contain the domain name of the CA being granted permission to issue certificates.", + "example": "ns1.digitalocean.com" + }, + "priority": { + "type": "integer", + "description": "The priority for SRV and MX records.", + "nullable": true, + "example": null + }, + "port": { + "type": "integer", + "description": "The port for SRV records.", + "nullable": true, + "example": null + }, + "ttl": { + "type": "integer", + "description": "This value is the time to live for the record, in seconds. This defines the time frame that clients can cache queried information before a refresh should be requested.", + "example": 1800 + }, + "weight": { + "type": "integer", + "description": "The weight for SRV records.", + "nullable": true, + "example": null + }, + "flags": { + "type": "integer", + "description": "An unsigned integer between 0-255 used for CAA records.", + "nullable": true, + "example": null + }, + "tag": { + "type": "string", + "description": "The parameter tag for CAA records. Valid values are \"issue\", \"issuewild\", or \"iodef\"", + "nullable": true, + "example": null + } + } + }, + "domain_record_a": { + "allOf": [ + { + "$ref": "#/components/schemas/domain_record" + }, + { + "required": [ + "type", + "name", + "data" + ] + } + ] + }, + "domain_record_aaaa": { + "allOf": [ + { + "$ref": "#/components/schemas/domain_record" + }, + { + "required": [ + "type", + "name", + "data" + ] + } + ] + }, + "domain_record_caa": { + "allOf": [ + { + "$ref": "#/components/schemas/domain_record" + }, + { + "required": [ + "type", + "name", + "data", + "flags", + "tag" + ] + } + ] + }, + "domain_record_cname": { + "allOf": [ + { + "$ref": "#/components/schemas/domain_record" + }, + { + "required": [ + "type", + "name", + "data" + ] + } + ] + }, + "domain_record_mx": { + "allOf": [ + { + "$ref": "#/components/schemas/domain_record" + }, + { + "required": [ + "type", + "data", + "priority" + ] + } + ] + }, + "domain_record_ns": { + "allOf": [ + { + "$ref": "#/components/schemas/domain_record" + }, + { + "required": [ + "type", + "name", + "data", + "flags", + "tag" + ] + } + ] + }, + "domain_record_soa": { + "allOf": [ + { + "$ref": "#/components/schemas/domain_record" + }, + { + "required": [ + "type", + "ttl" + ] + } + ] + }, + "domain_record_srv": { + "allOf": [ + { + "$ref": "#/components/schemas/domain_record" + }, + { + "required": [ + "type", + "name", + "data", + "priority", + "port", + "flags", + "tag" + ] + } + ] + }, + "domain_record_txt": { + "allOf": [ + { + "$ref": "#/components/schemas/domain_record" + }, + { + "required": [ + "type", + "name", + "data", + "flags", + "tag" + ] + } + ] + }, + "kernel": { + "type": "object", + "description": "**Note**: All Droplets created after March 2017 use internal kernels by default.\nThese Droplets will have this attribute set to `null`.\n\nThe current [kernel](https://www.digitalocean.com/docs/droplets/how-to/kernel/)\nfor Droplets with externally managed kernels. This will initially be set to\nthe kernel of the base image when the Droplet is created.\n", + "nullable": true, + "deprecated": true, + "properties": { + "id": { + "type": "integer", + "example": 7515, + "description": "A unique number used to identify and reference a specific kernel." + }, + "name": { + "type": "string", + "example": "DigitalOcean GrubLoader v0.2 (20160714)", + "description": "The display name of the kernel. This is shown in the web UI and is generally a descriptive title for the kernel in question." + }, + "version": { + "type": "string", + "example": "2016.07.13-DigitalOcean_loader_Ubuntu", + "description": "A standard kernel version string representing the version, patch, and release information." + } + } + }, + "image_name": { + "type": "string", + "description": "The display name that has been given to an image. This is what is shown in the control panel and is generally a descriptive title for the image in question.", + "example": "Nifty New Snapshot" + }, + "distribution": { + "type": "string", + "description": "The name of a custom image's distribution. Currently, the valid values are `Arch Linux`, `CentOS`, `CoreOS`, `Debian`, `Fedora`, `Fedora Atomic`, `FreeBSD`, `Gentoo`, `openSUSE`, `RancherOS`, `Rocky Linux`, `Ubuntu`, and `Unknown`. Any other value will be accepted but ignored, and `Unknown` will be used in its place.", + "enum": [ + "Arch Linux", + "CentOS", + "CoreOS", + "Debian", + "Fedora", + "Fedora Atomic", + "FreeBSD", + "Gentoo", + "openSUSE", + "RancherOS", + "Rocky Linux", + "Ubuntu", + "Unknown" + ], + "example": "Ubuntu" + }, + "region_slug": { + "type": "string", + "description": "The slug identifier for the region where the resource will initially be available.", + "enum": [ + "ams1", + "ams2", + "ams3", + "blr1", + "fra1", + "lon1", + "nyc1", + "nyc2", + "nyc3", + "sfo1", + "sfo2", + "sfo3", + "sgp1", + "tor1" + ], + "example": "nyc3" + }, + "regions_array": { + "type": "array", + "items": { + "$ref": "#/components/schemas/region_slug" + }, + "description": "This attribute is an array of the regions that the image is available in. The regions are represented by their identifying slug values.", + "example": [ + "nyc1", + "nyc2" + ] + }, + "image_description": { + "type": "string", + "description": "An optional free-form text field to describe an image.", + "example": " " + }, + "tags_array": { + "type": "array", + "items": { + "type": "string" + }, + "nullable": true, + "description": "A flat array of tag names as strings to be applied to the resource. Tag names may be for either existing or new tags.", + "example": [ + "base-image", + "prod" + ] + }, + "image": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "description": "A unique number that can be used to identify and reference a specific image.", + "example": 7555620, + "readOnly": true + }, + "name": { + "$ref": "#/components/schemas/image_name" + }, + "type": { + "type": "string", + "description": "Describes the kind of image. It may be one of `base`, `snapshot`, `backup`, `custom`, or `admin`. Respectively, this specifies whether an image is a DigitalOcean base OS image, user-generated Droplet snapshot, automatically created Droplet backup, user-provided virtual machine image, or an image used for DigitalOcean managed resources (e.g. DOKS worker nodes).", + "enum": [ + "base", + "snapshot", + "backup", + "custom", + "admin" + ], + "example": "snapshot" + }, + "distribution": { + "$ref": "#/components/schemas/distribution" + }, + "slug": { + "type": "string", + "nullable": true, + "description": "A uniquely identifying string that is associated with each of the DigitalOcean-provided public images. These can be used to reference a public image as an alternative to the numeric id.", + "example": "nifty1" + }, + "public": { + "type": "boolean", + "description": "This is a boolean value that indicates whether the image in question is public or not. An image that is public is available to all accounts. A non-public image is only accessible from your account.", + "example": true + }, + "regions": { + "$ref": "#/components/schemas/regions_array" + }, + "created_at": { + "type": "string", + "format": "date-time", + "description": "A time value given in ISO8601 combined date and time format that represents when the image was created.", + "example": "2020-05-04T22:23:02Z" + }, + "min_disk_size": { + "type": "integer", + "description": "The minimum disk size in GB required for a Droplet to use this image.", + "example": 20, + "nullable": true, + "minimum": 0 + }, + "size_gigabytes": { + "type": "number", + "format": "float", + "nullable": true, + "description": "The size of the image in gigabytes.", + "example": 2.34 + }, + "description": { + "$ref": "#/components/schemas/image_description" + }, + "tags": { + "$ref": "#/components/schemas/tags_array" + }, + "status": { + "type": "string", + "description": "A status string indicating the state of a custom image. This may be `NEW`,\n `available`, `pending`, `deleted`, or `retired`.", + "enum": [ + "NEW", + "available", + "pending", + "deleted", + "retired" + ], + "example": "NEW" + }, + "error_message": { + "type": "string", + "description": "A string containing information about errors that may occur when importing\n a custom image.", + "example": " " + } + } + }, + "size": { + "type": "object", + "properties": { + "slug": { + "type": "string", + "example": "s-1vcpu-1gb", + "description": "A human-readable string that is used to uniquely identify each size." + }, + "memory": { + "type": "integer", + "multipleOf": 8, + "minimum": 8, + "example": 1024, + "description": "The amount of RAM allocated to Droplets created of this size. The value is represented in megabytes." + }, + "vcpus": { + "type": "integer", + "example": 1, + "description": "The integer of number CPUs allocated to Droplets of this size." + }, + "disk": { + "type": "integer", + "example": 25, + "description": "The amount of disk space set aside for Droplets of this size. The value is represented in gigabytes." + }, + "transfer": { + "type": "number", + "format": "float", + "example": 1, + "description": "The amount of transfer bandwidth that is available for Droplets created in this size. This only counts traffic on the public interface. The value is given in terabytes." + }, + "price_monthly": { + "type": "number", + "format": "float", + "example": 5, + "description": "This attribute describes the monthly cost of this Droplet size if the Droplet is kept for an entire month. The value is measured in US dollars." + }, + "price_hourly": { + "type": "number", + "format": "float", + "example": 0.00743999984115362, + "description": "This describes the price of the Droplet size as measured hourly. The value is measured in US dollars." + }, + "regions": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "ams2", + "ams3", + "blr1", + "fra1", + "lon1", + "nyc1", + "nyc2", + "nyc3", + "sfo1", + "sfo2", + "sfo3", + "sgp1", + "tor1" + ], + "description": "An array containing the region slugs where this size is available for Droplet creates." + }, + "available": { + "type": "boolean", + "default": true, + "example": true, + "description": "This is a boolean value that represents whether new Droplets can be created with this size." + }, + "description": { + "type": "string", + "example": "Basic", + "description": "A string describing the class of Droplets created from this size. For example: Basic, General Purpose, CPU-Optimized, Memory-Optimized, or Storage-Optimized." + } + }, + "required": [ + "available", + "disk", + "memory", + "price_hourly", + "price_monthly", + "regions", + "slug", + "transfer", + "vcpus", + "description" + ] + }, + "network_v4": { + "type": "object", + "properties": { + "ip_address": { + "type": "string", + "format": "ipv4", + "example": "104.236.32.182", + "description": "The IP address of the IPv4 network interface." + }, + "netmask": { + "type": "string", + "format": "ipv4", + "example": "255.255.192.0", + "description": "The netmask of the IPv4 network interface." + }, + "gateway": { + "type": "string", + "example": "104.236.0.1", + "description": "The gateway of the specified IPv4 network interface.\n\nFor private interfaces, a gateway is not provided. This is denoted by\nreturning `nil` as its value.\n" + }, + "type": { + "type": "string", + "enum": [ + "public", + "private" + ], + "example": "public", + "description": "The type of the IPv4 network interface." + } + } + }, + "network_v6": { + "type": "object", + "properties": { + "ip_address": { + "type": "string", + "format": "ipv6", + "example": "2604:a880:0:1010::18a:a001", + "description": "The IP address of the IPv6 network interface." + }, + "netmask": { + "type": "integer", + "example": 64, + "description": "The netmask of the IPv6 network interface." + }, + "gateway": { + "type": "string", + "format": "ipv6", + "example": "2604:a880:0:1010::1", + "description": "The gateway of the specified IPv6 network interface." + }, + "type": { + "type": "string", + "enum": [ + "public" + ], + "example": "public", + "description": "The type of the IPv6 network interface.\n\n**Note**: IPv6 private networking is not currently supported.\n" + } + } + }, + "droplet": { + "type": "object", + "properties": { + "id": { + "type": "integer", + "example": 3164444, + "description": "A unique identifier for each Droplet instance. This is automatically generated upon Droplet creation." + }, + "name": { + "type": "string", + "example": "example.com", + "description": "The human-readable name set for the Droplet instance." + }, + "memory": { + "type": "integer", + "multipleOf": 8, + "example": 1024, + "description": "Memory of the Droplet in megabytes." + }, + "vcpus": { + "type": "integer", + "example": 1, + "description": "The number of virtual CPUs." + }, + "disk": { + "type": "integer", + "example": 25, + "description": "The size of the Droplet's disk in gigabytes." + }, + "locked": { + "type": "boolean", + "example": false, + "description": "A boolean value indicating whether the Droplet has been locked, preventing actions by users." + }, + "status": { + "type": "string", + "enum": [ + "new", + "active", + "off", + "archive" + ], + "example": "active", + "description": "A status string indicating the state of the Droplet instance. This may be \"new\", \"active\", \"off\", or \"archive\"." + }, + "kernel": { + "$ref": "#/components/schemas/kernel" + }, + "created_at": { + "type": "string", + "format": "date-time", + "example": "2020-07-21T18:37:44Z", + "description": "A time value given in ISO8601 combined date and time format that represents when the Droplet was created." + }, + "features": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "backups", + "private_networking", + "ipv6" + ], + "description": "An array of features enabled on this Droplet." + }, + "backup_ids": { + "type": "array", + "items": { + "type": "integer" + }, + "example": [ + 53893572 + ], + "description": "An array of backup IDs of any backups that have been taken of the Droplet instance. Droplet backups are enabled at the time of the instance creation." + }, + "next_backup_window": { + "type": "object", + "description": "The details of the Droplet's backups feature, if backups are configured for the Droplet. This object contains keys for the start and end times of the window during which the backup will start.", + "nullable": true, + "properties": { + "start": { + "type": "string", + "format": "date-time", + "example": "2019-12-04T00:00:00Z", + "description": "A time value given in ISO8601 combined date and time format specifying the start of the Droplet's backup window." + }, + "end": { + "type": "string", + "format": "date-time", + "example": "2019-12-04T23:00:00Z", + "description": "A time value given in ISO8601 combined date and time format specifying the end of the Droplet's backup window." + } + } + }, + "snapshot_ids": { + "type": "array", + "items": { + "type": "integer" + }, + "example": [ + 67512819 + ], + "description": "An array of snapshot IDs of any snapshots created from the Droplet instance." + }, + "image": { + "$ref": "#/components/schemas/image" + }, + "volume_ids": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "506f78a4-e098-11e5-ad9f-000f53306ae1" + ], + "description": "A flat array including the unique identifier for each Block Storage volume attached to the Droplet." + }, + "size": { + "$ref": "#/components/schemas/size" + }, + "size_slug": { + "type": "string", + "example": "s-1vcpu-1gb", + "description": "The unique slug identifier for the size of this Droplet." + }, + "networks": { + "type": "object", + "description": "The details of the network that are configured for the Droplet instance. This is an object that contains keys for IPv4 and IPv6. The value of each of these is an array that contains objects describing an individual IP resource allocated to the Droplet. These will define attributes like the IP address, netmask, and gateway of the specific network depending on the type of network it is.", + "properties": { + "v4": { + "type": "array", + "items": { + "$ref": "#/components/schemas/network_v4" + } + }, + "v6": { + "type": "array", + "items": { + "$ref": "#/components/schemas/network_v6" + } + } + } + }, + "region": { + "$ref": "#/components/schemas/region" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "web", + "env:prod" + ], + "description": "An array of Tags the Droplet has been tagged with." + }, + "vpc_uuid": { + "type": "string", + "example": "760e09ef-dc84-11e8-981e-3cfdfeaae000", + "description": "A string specifying the UUID of the VPC to which the Droplet is assigned." + } + }, + "required": [ + "id", + "name", + "memory", + "vcpus", + "disk", + "locked", + "status", + "created_at", + "features", + "backup_ids", + "next_backup_window", + "snapshot_ids", + "image", + "volume_ids", + "size", + "size_slug", + "networks", + "region", + "tags" + ] + }, + "droplet_create": { + "type": "object", + "properties": { + "region": { + "type": "string", + "example": "nyc3", + "description": "The slug identifier for the region that you wish to deploy the Droplet in. If the specific datacenter is not not important, a slug prefix (e.g. `nyc`) can be used to deploy the Droplet in any of the that region's locations (`nyc1`, `nyc2`, or `nyc3`). If the region is omitted from the create request completely, the Droplet may deploy in any region." + }, + "size": { + "type": "string", + "example": "s-1vcpu-1gb", + "description": "The slug identifier for the size that you wish to select for this Droplet." + }, + "image": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ], + "example": "ubuntu-20-04-x64", + "description": "The image ID of a public or private image or the slug identifier for a public image. This image will be the base image for your Droplet." + }, + "ssh_keys": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ] + }, + "example": [ + 289794, + "3b:16:e4:bf:8b:00:8b:b8:59:8c:a9:d3:f0:19:fa:45" + ], + "default": [], + "description": "An array containing the IDs or fingerprints of the SSH keys that you wish to embed in the Droplet's root account upon creation." + }, + "backups": { + "type": "boolean", + "example": true, + "default": false, + "description": "A boolean indicating whether automated backups should be enabled for the Droplet." + }, + "ipv6": { + "type": "boolean", + "example": true, + "default": false, + "description": "A boolean indicating whether to enable IPv6 on the Droplet." + }, + "monitoring": { + "type": "boolean", + "example": true, + "default": false, + "description": "A boolean indicating whether to install the DigitalOcean agent for monitoring." + }, + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "nullable": true, + "example": [ + "env:prod", + "web" + ], + "default": [], + "description": "A flat array of tag names as strings to apply to the Droplet after it is created. Tag names can either be existing or new tags." + }, + "user_data": { + "type": "string", + "example": "#cloud-config\nruncmd:\n - touch /test.txt\n", + "description": "A string containing 'user data' which may be used to configure the Droplet on first boot, often a 'cloud-config' file or Bash script. It must be plain text and may not exceed 64 KiB in size." + }, + "private_networking": { + "type": "boolean", + "example": true, + "default": false, + "deprecated": true, + "description": "This parameter has been deprecated. Use `vpc_uuid` instead to specify a VPC network for the Droplet. If no `vpc_uuid` is provided, the Droplet will be placed in your account's default VPC for the region." + }, + "volumes": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "12e97116-7280-11ed-b3d0-0a58ac146812" + ], + "default": [], + "description": "An array of IDs for block storage volumes that will be attached to the Droplet once created. The volumes must not already be attached to an existing Droplet." + }, + "vpc_uuid": { + "type": "string", + "example": "760e09ef-dc84-11e8-981e-3cfdfeaae000", + "description": "A string specifying the UUID of the VPC to which the Droplet will be assigned. If excluded, the Droplet will be assigned to your account's default VPC for the region." + }, + "with_droplet_agent": { + "type": "boolean", + "example": true, + "description": "A boolean indicating whether to install the DigitalOcean agent used for providing access to the Droplet web console in the control panel. By default, the agent is installed on new Droplets but installation errors (i.e. OS not supported) are ignored. To prevent it from being installed, set to `false`. To make installation errors fatal, explicitly set it to `true`." + } + }, + "required": [ + "size", + "image" + ] + }, + "droplet_single_create": { + "title": "Single Droplet Request", + "allOf": [ + { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "example.com", + "description": "The human-readable string you wish to use when displaying the Droplet name. The name, if set to a domain name managed in the DigitalOcean DNS management system, will configure a PTR record for the Droplet. The name set during creation will also determine the hostname for the Droplet in its internal configuration." + } + }, + "required": [ + "name" + ] + }, + { + "$ref": "#/components/schemas/droplet_create" + } + ] + }, + "droplet_multi_create": { + "title": "Multiple Droplet Request", + "allOf": [ + { + "type": "object", + "properties": { + "names": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "sub-01.example.com", + "sub-02.example.com" + ], + "description": "An array of human human-readable strings you wish to use when displaying the Droplet name. Each name, if set to a domain name managed in the DigitalOcean DNS management system, will configure a PTR record for the Droplet. Each name set during creation will also determine the hostname for the Droplet in its internal configuration." + } + }, + "required": [ + "names" + ] + }, + { + "$ref": "#/components/schemas/droplet_create" + } + ] + }, + "action_link": { + "type": "object", + "description": "The linked actions can be used to check the status of a Droplet's create event.", + "properties": { + "id": { + "type": "integer", + "example": 7515, + "description": "A unique numeric ID that can be used to identify and reference an action." + }, + "rel": { + "type": "string", + "example": "create", + "description": "A string specifying the type of the related action." + }, + "href": { + "type": "string", + "format": "uri", + "example": "https://api.digitalocean.com/v2/actions/7515", + "description": "A URL that can be used to access the action." + } + } + }, + "snapshots_base": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "web-01-1595954862243", + "description": "A human-readable name for the snapshot." + }, + "created_at": { + "type": "string", + "format": "date-time", + "example": "2020-07-28T16:47:44Z", + "description": "A time value given in ISO8601 combined date and time format that represents when the snapshot was created." + }, + "regions": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "nyc3", + "sfo3" + ], + "description": "An array of the regions that the snapshot is available in. The regions are represented by their identifying slug values." + }, + "min_disk_size": { + "type": "integer", + "example": 25, + "description": "The minimum size in GB required for a volume or Droplet to use this snapshot." + }, + "size_gigabytes": { + "type": "number", + "format": "float", + "example": 2.34, + "description": "The billable size of the snapshot in gigabytes." + } + }, + "required": [ + "name", + "created_at", + "regions", + "min_disk_size", + "size_gigabytes" + ] + }, + "droplet_snapshot": { + "allOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "integer", + "example": 6372321, + "description": "The unique identifier for the snapshot or backup." + } + }, + "required": [ + "id" + ] + }, + { + "$ref": "#/components/schemas/snapshots_base" + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "snapshot", + "backup" + ], + "example": "snapshot", + "description": "Describes the kind of image. It may be one of `snapshot` or `backup`. This specifies whether an image is a user-generated Droplet snapshot or automatically created Droplet backup." + } + }, + "required": [ + "type" + ] + } + ] + }, + "droplet_action": { + "required": [ + "type" + ], + "type": "object", + "description": "Specifies the action that will be taken on the Droplet.", + "properties": { + "type": { + "type": "string", + "enum": [ + "enable_backups", + "disable_backups", + "reboot", + "power_cycle", + "shutdown", + "power_off", + "power_on", + "restore", + "password_reset", + "resize", + "rebuild", + "rename", + "change_kernel", + "enable_ipv6", + "snapshot" + ], + "example": "reboot", + "description": "The type of action to initiate for the Droplet." + } + } + }, + "droplet_action_restore": { + "allOf": [ + { + "$ref": "#/components/schemas/droplet_action" + }, + { + "type": "object", + "properties": { + "image": { + "type": "integer", + "example": 12389723, + "description": "The ID of a backup of the current Droplet instance to restore from." + } + } + } + ] + }, + "droplet_action_resize": { + "allOf": [ + { + "$ref": "#/components/schemas/droplet_action" + }, + { + "type": "object", + "properties": { + "disk": { + "type": "boolean", + "example": true, + "description": "When `true`, the Droplet's disk will be resized in addition to its RAM and CPU. This is a permanent change and cannot be reversed as a Droplet's disk size cannot be decreased." + }, + "size": { + "type": "string", + "example": "s-2vcpu-2gb", + "description": "The slug identifier for the size to which you wish to resize the Droplet." + } + } + } + ] + }, + "droplet_action_rebuild": { + "allOf": [ + { + "$ref": "#/components/schemas/droplet_action" + }, + { + "type": "object", + "properties": { + "image": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "integer" + } + ], + "example": "ubuntu-20-04-x64", + "description": "The image ID of a public or private image or the slug identifier for a public image. The Droplet will be rebuilt using this image as its base." + } + } + } + ] + }, + "droplet_action_rename": { + "allOf": [ + { + "$ref": "#/components/schemas/droplet_action" + }, + { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "nifty-new-name", + "description": "The new name for the Droplet." + } + } + } + ] + }, + "droplet_action_change_kernel": { + "allOf": [ + { + "$ref": "#/components/schemas/droplet_action" + }, + { + "type": "object", + "properties": { + "kernel": { + "type": "integer", + "example": 12389723, + "description": "A unique number used to identify and reference a specific kernel." + } + } + } + ] + }, + "droplet_action_snapshot": { + "allOf": [ + { + "$ref": "#/components/schemas/droplet_action" + }, + { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "Nifty New Snapshot", + "description": "The name to give the new snapshot of the Droplet." + } + } + } + ] + }, + "firewall_rule_base": { + "type": "object", + "properties": { + "protocol": { + "type": "string", + "enum": [ + "tcp", + "udp", + "icmp" + ], + "description": "The type of traffic to be allowed. This may be one of `tcp`, `udp`, or `icmp`.", + "example": "tcp" + }, + "ports": { + "type": "string", + "description": "The ports on which traffic will be allowed specified as a string containing a single port, a range (e.g. \"8000-9000\"), or \"0\" when all ports are open for a protocol. For ICMP rules this parameter will always return \"0\".", + "example": "8000" + } + }, + "required": [ + "protocol", + "ports" + ] + }, + "firewall_rule_target": { + "type": "object", + "properties": { + "addresses": { + "type": "array", + "items": { + "type": "string" + }, + "description": "An array of strings containing the IPv4 addresses, IPv6 addresses, IPv4 CIDRs, and/or IPv6 CIDRs to which the firewall will allow traffic.", + "example": [ + "1.2.3.4", + "18.0.0.0/8" + ] + }, + "droplet_ids": { + "type": "array", + "items": { + "type": "integer" + }, + "description": "An array containing the IDs of the Droplets to which the firewall will allow traffic.", + "example": [ + 8043964 + ] + }, + "load_balancer_uids": { + "type": "array", + "items": { + "type": "string" + }, + "description": "An array containing the IDs of the load balancers to which the firewall will allow traffic.", + "example": [ + "4de7ac8b-495b-4884-9a69-1050c6793cd6" + ] + }, + "kubernetes_ids": { + "type": "array", + "items": { + "type": "string" + }, + "description": "An array containing the IDs of the Kubernetes clusters to which the firewall will allow traffic.", + "example": [ + "41b74c5d-9bd0-5555-5555-a57c495b81a3" + ] + }, + "tags": { + "allOf": [ + { + "$ref": "#/components/schemas/tags_array" + }, + { + "description": "An array containing the names of Tags corresponding to groups of Droplets to which the firewall will allow traffic.", + "example": [ + "frontend" + ] + } + ] + } + } + }, + "firewall_rules": { + "type": "object", + "properties": { + "inbound_rules": { + "nullable": true, + "type": "array", + "items": { + "allOf": [ + { + "$ref": "#/components/schemas/firewall_rule_base" + }, + { + "properties": { + "sources": { + "allOf": [ + { + "$ref": "#/components/schemas/firewall_rule_target" + }, + { + "description": "An object specifying locations from which inbound traffic will be accepted." + } + ] + } + }, + "required": [ + "sources" + ] + } + ] + } + }, + "outbound_rules": { + "nullable": true, + "type": "array", + "items": { + "allOf": [ + { + "$ref": "#/components/schemas/firewall_rule_base" + }, + { + "properties": { + "destinations": { + "allOf": [ + { + "$ref": "#/components/schemas/firewall_rule_target" + }, + { + "description": "An object specifying locations to which outbound traffic that will be allowed." + } + ] + } + }, + "required": [ + "destinations" + ] + } + ] + } + } + } + }, + "firewall": { + "type": "object", + "allOf": [ + { + "properties": { + "id": { + "type": "string", + "description": "A unique ID that can be used to identify and reference a firewall.", + "readOnly": true, + "example": "bb4b2611-3d72-467b-8602-280330ecd65c" + }, + "status": { + "type": "string", + "description": "A status string indicating the current state of the firewall. This can be \"waiting\", \"succeeded\", or \"failed\".", + "enum": [ + "waiting", + "succeeded", + "failed" + ], + "readOnly": true, + "example": "waiting" + }, + "created_at": { + "type": "string", + "format": "date-time", + "description": "A time value given in ISO8601 combined date and time format that represents when the firewall was created.", + "readOnly": true, + "example": "2020-05-23T21:24:00Z" + }, + "pending_changes": { + "type": "array", + "description": "An array of objects each containing the fields \"droplet_id\", \"removing\", and \"status\". It is provided to detail exactly which Droplets are having their security policies updated. When empty, all changes have been successfully applied.", + "items": { + "type": "object", + "properties": { + "droplet_id": { + "type": "integer", + "example": 8043964 + }, + "removing": { + "type": "boolean", + "example": false + }, + "status": { + "type": "string", + "example": "waiting" + } + } + }, + "readOnly": true, + "example": [ + { + "droplet_id": 8043964, + "removing": false, + "status": "waiting" + } + ] + }, + "name": { + "type": "string", + "description": "A human-readable name for a firewall. The name must begin with an alphanumeric character. Subsequent characters must either be alphanumeric characters, a period (.), or a dash (-).", + "pattern": "^[a-zA-Z0-9][a-zA-Z0-9\\.-]+$", + "example": "firewall" + }, + "droplet_ids": { + "type": "array", + "description": "An array containing the IDs of the Droplets assigned to the firewall.", + "nullable": true, + "items": { + "type": "integer" + }, + "example": [ + 8043964 + ] + }, + "tags": { + "allOf": [ + { + "$ref": "#/components/schemas/tags_array" + }, + { + "description": "An array containing the names of the Tags assigned to the firewall.", + "example": "gateway" + } + ] + } + } + }, + { + "$ref": "#/components/schemas/firewall_rules" + } + ] + }, + "associated_resource": { + "type": "object", + "description": "An objects containing information about a resource associated with a Droplet.", + "properties": { + "id": { + "type": "string", + "example": "61486916", + "description": "The unique identifier for the resource associated with the Droplet." + }, + "name": { + "type": "string", + "example": "ubuntu-s-1vcpu-1gb-nyc1-01-1585758823330", + "description": "The name of the resource associated with the Droplet." + }, + "cost": { + "type": "string", + "example": "0.05", + "description": "The cost of the resource in USD per month if the resource is retained after the Droplet is destroyed." + } + } + }, + "selective_destroy_associated_resource": { + "type": "object", + "description": "An object containing information about a resource to be scheduled for deletion.", + "properties": { + "floating_ips": { + "type": "array", + "deprecated": true, + "description": "An array of unique identifiers for the floating IPs to be scheduled for deletion.", + "items": { + "type": "string" + }, + "example": [ + "6186916" + ] + }, + "reserved_ips": { + "type": "array", + "description": "An array of unique identifiers for the reserved IPs to be scheduled for deletion.", + "items": { + "type": "string" + }, + "example": [ + "6186916" + ] + }, + "snapshots": { + "type": "array", + "description": "An array of unique identifiers for the snapshots to be scheduled for deletion.", + "items": { + "type": "string" + }, + "example": [ + "61486916" + ] + }, + "volumes": { + "type": "array", + "description": "An array of unique identifiers for the volumes to be scheduled for deletion.", + "items": { + "type": "string" + }, + "example": [ + "ba49449a-7435-11ea-b89e-0a58ac14480f" + ] + }, + "volume_snapshots": { + "type": "array", + "description": "An array of unique identifiers for the volume snapshots to be scheduled for deletion.", + "items": { + "type": "string" + }, + "example": [ + "edb0478d-7436-11ea-86e6-0a58ac144b91" + ] + } + } + }, + "destroyed_associated_resource": { + "type": "object", + "description": "An object containing information about a resource scheduled for deletion.", + "properties": { + "id": { + "type": "string", + "example": "61486916", + "description": "The unique identifier for the resource scheduled for deletion." + }, + "name": { + "type": "string", + "example": "ubuntu-s-1vcpu-1gb-nyc1-01-1585758823330", + "description": "The name of the resource scheduled for deletion." + }, + "destroyed_at": { + "type": "string", + "format": "date-time", + "example": "2020-04-01T18:11:49Z", + "description": "A time value given in ISO8601 combined date and time format indicating when the resource was destroyed if the request was successful." + }, + "error_message": { + "type": "string", + "example": " ", + "description": "A string indicating that the resource was not successfully destroyed and providing additional information." + } + } + }, + "associated_resource_status": { + "type": "object", + "description": "An objects containing information about a resources scheduled for deletion.", + "properties": { + "droplet": { + "$ref": "#/components/schemas/destroyed_associated_resource" + }, + "resources": { + "type": "object", + "description": "An object containing additional information about resource related to a Droplet requested to be destroyed.", + "properties": { + "reserved_ips": { + "type": "array", + "items": { + "$ref": "#/components/schemas/destroyed_associated_resource" + } + }, + "floating_ips": { + "type": "array", + "items": { + "$ref": "#/components/schemas/destroyed_associated_resource" + } + }, + "snapshots": { + "type": "array", + "items": { + "$ref": "#/components/schemas/destroyed_associated_resource" + } + }, + "volumes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/destroyed_associated_resource" + } + }, + "volume_snapshots": { + "type": "array", + "items": { + "$ref": "#/components/schemas/destroyed_associated_resource" + } + } + } + }, + "completed_at": { + "type": "string", + "format": "date-time", + "example": "2020-04-01T18:11:49Z", + "description": "A time value given in ISO8601 combined date and time format indicating when the requested action was completed." + }, + "failures": { + "type": "integer", + "example": 0, + "description": "A count of the associated resources that failed to be destroyed, if any." + } + } + }, + "floating_ip": { + "type": "object", + "properties": { + "ip": { + "type": "string", + "format": "ipv4", + "example": "45.55.96.47", + "description": "The public IP address of the floating IP. It also serves as its identifier." + }, + "region": { + "allOf": [ + { + "$ref": "#/components/schemas/region" + }, + { + "type": "object", + "description": "The region that the floating IP is reserved to. When you query a floating IP, the entire region object will be returned." + } + ] + }, + "droplet": { + "description": "The Droplet that the floating IP has been assigned to. When you query a floating IP, if it is assigned to a Droplet, the entire Droplet object will be returned. If it is not assigned, the value will be null.", + "anyOf": [ + { + "title": "null", + "type": "object", + "nullable": true, + "description": "If the floating IP is not assigned to a Droplet, the value will be null." + }, + { + "$ref": "#/components/schemas/droplet" + } + ], + "example": null + }, + "locked": { + "type": "boolean", + "example": true, + "description": "A boolean value indicating whether or not the floating IP has pending actions preventing new ones from being submitted." + }, + "project_id": { + "type": "string", + "format": "uuid", + "example": "746c6152-2fa2-11ed-92d3-27aaa54e4988", + "description": "The UUID of the project to which the reserved IP currently belongs." + } + } + }, + "floating_ip_create": { + "oneOf": [ + { + "title": "Assign to Droplet", + "type": "object", + "properties": { + "droplet_id": { + "type": "integer", + "example": 2457247, + "description": "The ID of the Droplet that the floating IP will be assigned to." + } + }, + "required": [ + "droplet_id" + ] + }, + { + "title": "Reserve to Region", + "type": "object", + "properties": { + "region": { + "type": "string", + "example": "nyc3", + "description": "The slug identifier for the region the floating IP will be reserved to." + }, + "project_id": { + "type": "string", + "format": "uuid", + "example": "746c6152-2fa2-11ed-92d3-27aaa54e4988", + "description": "The UUID of the project to which the floating IP will be assigned." + } + }, + "required": [ + "region" + ] + } + ] + }, + "floatingIPsAction": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "assign", + "unassign" + ], + "description": "The type of action to initiate for the floating IP." + } + }, + "discriminator": { + "propertyName": "type", + "mapping": { + "assign": "#/components/schemas/floating_ip_action_assign", + "unassign": "#/components/schemas/floating_ip_action_unassign" + } + } + }, + "floating_ip_action_assign": { + "allOf": [ + { + "$ref": "#/components/schemas/floatingIPsAction" + }, + { + "type": "object", + "required": [ + "type", + "droplet_id" + ], + "properties": { + "droplet_id": { + "type": "integer", + "example": 758604968, + "description": "The ID of the Droplet that the floating IP will be assigned to." + } + } + } + ] + }, + "floating_ip_action_unassign": { + "allOf": [ + { + "$ref": "#/components/schemas/floatingIPsAction" + }, + { + "type": "object", + "required": [ + "type" + ] + } + ] + }, + "namespace_info": { + "type": "object", + "properties": { + "api_host": { + "type": "string", + "example": "https://api_host.io", + "description": "The namespace's API hostname. Each function in a namespace is provided an endpoint at the namespace's hostname." + }, + "namespace": { + "type": "string", + "example": "fn-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", + "description": "A unique string format of UUID with a prefix fn-." + }, + "created_at": { + "type": "string", + "example": "2022-09-14T04:16:45Z", + "description": "UTC time string." + }, + "updated_at": { + "type": "string", + "example": "2022-09-14T04:16:45Z", + "description": "UTC time string." + }, + "label": { + "type": "string", + "example": "my namespace", + "description": "The namespace's unique name." + }, + "region": { + "type": "string", + "example": "nyc1", + "description": "The namespace's datacenter region." + }, + "uuid": { + "type": "string", + "example": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", + "description": "The namespace's Universally Unique Identifier." + }, + "key": { + "type": "string", + "example": "d1zcd455h01mqjfs4s2eaewyejehi5f2uj4etqq3h7cera8iwkub6xg5of1wdde2", + "description": "A random alpha numeric string. This key is used in conjunction with the namespace's UUID to authenticate \na user to use the namespace via `doctl`, DigitalOcean's official CLI." + } + } + }, + "create_namespace": { + "type": "object", + "properties": { + "region": { + "type": "string", + "example": "nyc1", + "description": "The [datacenter region](https://docs.digitalocean.com/products/platform/availability-matrix/#available-datacenters) in which to create the namespace." + }, + "label": { + "type": "string", + "example": "my namespace", + "description": "The namespace's unique name." + } + }, + "required": [ + "region", + "label" + ] + }, + "scheduled_details": { + "type": "object", + "description": "Trigger details for SCHEDULED type, where body is optional.\n", + "properties": { + "cron": { + "description": "valid cron expression string which is required for SCHEDULED type triggers.", + "type": "string", + "example": "* * * * *" + }, + "body": { + "description": "Optional data to be sent to function while triggering the function.", + "type": "object", + "nullable": true, + "properties": { + "name": { + "type": "string", + "example": "Welcome to DO!" + } + } + } + }, + "required": [ + "cron" + ] + }, + "trigger_info": { + "type": "object", + "properties": { + "namespace": { + "type": "string", + "example": "fn-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", + "description": "A unique string format of UUID with a prefix fn-." + }, + "name": { + "type": "string", + "example": "my trigger", + "description": "The trigger's unique name within the namespace." + }, + "function": { + "type": "string", + "example": "hello", + "description": "Name of function(action) that exists in the given namespace." + }, + "type": { + "type": "string", + "example": "SCHEDULED", + "description": "String which indicates the type of trigger source like SCHEDULED." + }, + "is_enabled": { + "type": "boolean", + "example": true, + "description": "Indicates weather the trigger is paused or unpaused." + }, + "created_at": { + "type": "string", + "example": "2022-11-11T04:16:45Z", + "description": "UTC time string." + }, + "updated_at": { + "type": "string", + "example": "2022-11-11T04:16:45Z", + "description": "UTC time string." + }, + "scheduled_details": { + "$ref": "#/components/schemas/scheduled_details" + }, + "scheduled_runs": { + "type": "object", + "properties": { + "last_run_at": { + "description": "Indicates last run time. null value indicates trigger not run yet.", + "type": "string", + "nullable": true, + "example": "2022-11-11T04:16:45Z" + }, + "next_run_at": { + "description": "Indicates next run time. null value indicates trigger will not run.", + "type": "string", + "nullable": true, + "example": "2022-11-11T04:16:45Z" + } + } + } + } + }, + "create_trigger": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "my trigger", + "description": "The trigger's unique name within the namespace." + }, + "function": { + "type": "string", + "example": "hello", + "description": "Name of function(action) that exists in the given namespace." + }, + "type": { + "type": "string", + "example": "SCHEDULED", + "description": "One of different type of triggers. Currently only SCHEDULED is supported." + }, + "is_enabled": { + "type": "boolean", + "example": true, + "description": "Indicates weather the trigger is paused or unpaused." + }, + "scheduled_details": { + "$ref": "#/components/schemas/scheduled_details" + } + }, + "required": [ + "name", + "function", + "type", + "is_enabled", + "scheduled_details" + ] + }, + "update_trigger": { + "type": "object", + "properties": { + "is_enabled": { + "type": "boolean", + "example": true, + "description": "Indicates weather the trigger is paused or unpaused." + }, + "scheduled_details": { + "$ref": "#/components/schemas/scheduled_details" + } + } + }, + "image_update": { + "type": "object", + "properties": { + "name": { + "$ref": "#/components/schemas/image_name" + }, + "distribution": { + "$ref": "#/components/schemas/distribution" + }, + "description": { + "$ref": "#/components/schemas/image_description" + } + } + }, + "image_new_custom": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/image_update" + }, + { + "properties": { + "url": { + "type": "string", + "description": "A URL from which the custom Linux virtual machine image may be retrieved. The image it points to must be in the raw, qcow2, vhdx, vdi, or vmdk format. It may be compressed using gzip or bzip2 and must be smaller than 100 GB after being decompressed.", + "example": "http://cloud-images.ubuntu.com/minimal/releases/bionic/release/ubuntu-18.04-minimal-cloudimg-amd64.img" + }, + "region": { + "$ref": "#/components/schemas/region_slug" + }, + "tags": { + "$ref": "#/components/schemas/tags_array" + } + } + } + ], + "required": [ + "name", + "url", + "region" + ], + "example": { + "name": "ubuntu-18.04-minimal", + "url": "http://cloud-images.ubuntu.com/minimal/releases/bionic/release/ubuntu-18.04-minimal-cloudimg-amd64.img", + "distribution": "Ubuntu", + "region": "nyc3", + "description": "Cloud-optimized image w/ small footprint", + "tags": [ + "base-image", + "prod" + ] + } + }, + "image_action_base": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The action to be taken on the image. Can be either `convert` or `transfer`.", + "enum": [ + "convert", + "transfer" + ], + "example": "convert" + } + }, + "required": [ + "type" + ] + }, + "image_action_transfer": { + "allOf": [ + { + "$ref": "#/components/schemas/image_action_base" + }, + { + "type": "object", + "properties": { + "region": { + "$ref": "#/components/schemas/region_slug" + } + }, + "required": [ + "type", + "region" + ] + } + ] + }, + "kubernetes_node_pool_size": { + "type": "object", + "properties": { + "size": { + "type": "string", + "example": "s-1vcpu-2gb", + "description": "The slug identifier for the type of Droplet used as workers in the node pool." + } + } + }, + "kubernetes_node_pool_taint": { + "type": "object", + "properties": { + "key": { + "type": "string", + "example": "priority", + "description": "An arbitrary string. The `key` and `value` fields of the `taint` object form a key-value pair. For example, if the value of the `key` field is \"special\" and the value of the `value` field is \"gpu\", the key value pair would be `special=gpu`." + }, + "value": { + "type": "string", + "example": "high", + "description": "An arbitrary string. The `key` and `value` fields of the `taint` object form a key-value pair. For example, if the value of the `key` field is \"special\" and the value of the `value` field is \"gpu\", the key value pair would be `special=gpu`." + }, + "effect": { + "type": "string", + "enum": [ + "NoSchedule", + "PreferNoSchedule", + "NoExecute" + ], + "example": "NoSchedule", + "description": "How the node reacts to pods that it won't tolerate. Available effect values are `NoSchedule`, `PreferNoSchedule`, and `NoExecute`." + } + } + }, + "node": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "e78247f8-b1bb-4f7a-8db9-2a5f8d4b8f8f", + "description": "A unique ID that can be used to identify and reference the node." + }, + "name": { + "type": "string", + "example": "adoring-newton-3niq", + "description": "An automatically generated, human-readable name for the node." + }, + "status": { + "type": "object", + "description": "An object containing a `state` attribute whose value is set to a string indicating the current status of the node.", + "properties": { + "state": { + "type": "string", + "enum": [ + "provisioning", + "running", + "draining", + "deleting" + ], + "example": "provisioning", + "description": "A string indicating the current status of the node." + } + } + }, + "droplet_id": { + "type": "string", + "example": "205545370", + "description": "The ID of the Droplet used for the worker node." + }, + "created_at": { + "type": "string", + "format": "date-time", + "example": "2018-11-15T16:00:11Z", + "description": "A time value given in ISO8601 combined date and time format that represents when the node was created." + }, + "updated_at": { + "type": "string", + "format": "date-time", + "example": "2018-11-15T16:00:11Z", + "description": "A time value given in ISO8601 combined date and time format that represents when the node was last updated." + } + } + }, + "kubernetes_node_pool_base": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "example": "cdda885e-7663-40c8-bc74-3a036c66545d", + "description": "A unique ID that can be used to identify and reference a specific node pool." + }, + "name": { + "type": "string", + "example": "frontend-pool", + "description": "A human-readable name for the node pool." + }, + "count": { + "type": "integer", + "example": 3, + "description": "The number of Droplet instances in the node pool." + }, + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "k8s", + "k8s:bd5f5959-5e1e-4205-a714-a914373942af", + "k8s-worker", + "production", + "web-team" + ], + "description": "An array containing the tags applied to the node pool. All node pools are automatically tagged `k8s`, `k8s-worker`, and `k8s:$K8S_CLUSTER_ID`." + }, + "labels": { + "type": "object", + "nullable": true, + "example": null, + "description": "An object of key/value mappings specifying labels to apply to all nodes in a pool. Labels will automatically be applied to all existing nodes and any subsequent nodes added to the pool. Note that when a label is removed, it is not deleted from the nodes in the pool." + }, + "taints": { + "type": "array", + "items": { + "$ref": "#/components/schemas/kubernetes_node_pool_taint" + }, + "description": "An array of taints to apply to all nodes in a pool. Taints will automatically be applied to all existing nodes and any subsequent nodes added to the pool. When a taint is removed, it is deleted from all nodes in the pool." + }, + "auto_scale": { + "type": "boolean", + "example": true, + "description": "A boolean value indicating whether auto-scaling is enabled for this node pool." + }, + "min_nodes": { + "type": "integer", + "example": 3, + "description": "The minimum number of nodes that this node pool can be auto-scaled to. The value will be `0` if `auto_scale` is set to `false`." + }, + "max_nodes": { + "type": "integer", + "example": 6, + "description": "The maximum number of nodes that this node pool can be auto-scaled to. The value will be `0` if `auto_scale` is set to `false`." + }, + "nodes": { + "type": "array", + "readOnly": true, + "description": "An object specifying the details of a specific worker node in a node pool.", + "items": { + "$ref": "#/components/schemas/node" + } + } + } + }, + "kubernetes_node_pool": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/kubernetes_node_pool_size" + }, + { + "$ref": "#/components/schemas/kubernetes_node_pool_base" + } + ], + "required": [ + "name", + "size", + "count" + ] + }, + "maintenance_policy": { + "type": "object", + "nullable": true, + "description": "An object specifying the maintenance window policy for the Kubernetes cluster.", + "properties": { + "start_time": { + "type": "string", + "example": "12:00", + "description": "The start time in UTC of the maintenance window policy in 24-hour clock format / HH:MM notation (e.g., `15:00`)." + }, + "duration": { + "type": "string", + "readOnly": true, + "example": "4h0m0s", + "description": "The duration of the maintenance window policy in human-readable format." + }, + "day": { + "type": "string", + "enum": [ + "any", + "monday", + "tuesday", + "wednesday", + "thursday", + "friday", + "saturday", + "sunday" + ], + "example": "any", + "description": "The day of the maintenance window policy. May be one of `monday` through `sunday`, or `any` to indicate an arbitrary week day." + } + } + }, + "cluster": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "example": "bd5f5959-5e1e-4205-a714-a914373942af", + "description": "A unique ID that can be used to identify and reference a Kubernetes cluster." + }, + "name": { + "type": "string", + "example": "prod-cluster-01", + "description": "A human-readable name for a Kubernetes cluster." + }, + "region": { + "type": "string", + "example": "nyc1", + "description": "The slug identifier for the region where the Kubernetes cluster is located." + }, + "version": { + "type": "string", + "example": "1.18.6-do.0", + "description": "The slug identifier for the version of Kubernetes used for the cluster. If set to a minor version (e.g. \"1.14\"), the latest version within it will be used (e.g. \"1.14.6-do.1\"); if set to \"latest\", the latest published version will be used. See the `/v2/kubernetes/options` endpoint to find all currently available versions." + }, + "cluster_subnet": { + "type": "string", + "format": "cidr", + "readOnly": true, + "example": "10.244.0.0/16", + "description": "The range of IP addresses in the overlay network of the Kubernetes cluster in CIDR notation." + }, + "service_subnet": { + "type": "string", + "readOnly": true, + "example": "10.245.0.0/16", + "description": "The range of assignable IP addresses for services running in the Kubernetes cluster in CIDR notation." + }, + "vpc_uuid": { + "type": "string", + "format": "uuid", + "example": "c33931f2-a26a-4e61-b85c-4e95a2ec431b", + "description": "A string specifying the UUID of the VPC to which the Kubernetes cluster is assigned." + }, + "ipv4": { + "type": "string", + "readOnly": true, + "example": "68.183.121.157", + "description": "The public IPv4 address of the Kubernetes master node. This will not be set if high availability is configured on the cluster (v1.21+)" + }, + "endpoint": { + "type": "string", + "readOnly": true, + "example": "https://bd5f5959-5e1e-4205-a714-a914373942af.k8s.ondigitalocean.com", + "description": "The base URL of the API server on the Kubernetes master node." + }, + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "k8s", + "k8s:bd5f5959-5e1e-4205-a714-a914373942af", + "production", + "web-team" + ], + "description": "An array of tags applied to the Kubernetes cluster. All clusters are automatically tagged `k8s` and `k8s:$K8S_CLUSTER_ID`." + }, + "node_pools": { + "type": "array", + "description": "An object specifying the details of the worker nodes available to the Kubernetes cluster.", + "items": { + "$ref": "#/components/schemas/kubernetes_node_pool" + } + }, + "maintenance_policy": { + "$ref": "#/components/schemas/maintenance_policy" + }, + "auto_upgrade": { + "type": "boolean", + "default": false, + "example": true, + "description": "A boolean value indicating whether the cluster will be automatically upgraded to new patch releases during its maintenance window." + }, + "status": { + "type": "object", + "readOnly": true, + "description": "An object containing a `state` attribute whose value is set to a string indicating the current status of the cluster.", + "properties": { + "state": { + "type": "string", + "enum": [ + "running", + "provisioning", + "degraded", + "error", + "deleted", + "upgrading", + "deleting" + ], + "example": "provisioning", + "description": "A string indicating the current status of the cluster." + }, + "message": { + "type": "string", + "example": "provisioning", + "description": "An optional message providing additional information about the current cluster state." + } + } + }, + "created_at": { + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-11-15T16:00:11Z", + "description": "A time value given in ISO8601 combined date and time format that represents when the Kubernetes cluster was created." + }, + "updated_at": { + "type": "string", + "format": "date-time", + "example": "2018-11-15T16:00:11Z", + "readOnly": true, + "description": "A time value given in ISO8601 combined date and time format that represents when the Kubernetes cluster was last updated." + }, + "surge_upgrade": { + "type": "boolean", + "default": false, + "example": true, + "description": "A boolean value indicating whether surge upgrade is enabled/disabled for the cluster. Surge upgrade makes cluster upgrades fast and reliable by bringing up new nodes before destroying the outdated nodes." + }, + "ha": { + "type": "boolean", + "default": false, + "example": true, + "description": "A boolean value indicating whether the control plane is run in a highly available configuration in the cluster. Highly available control planes incur less downtime. The property cannot be disabled." + }, + "registry_enabled": { + "type": "boolean", + "readOnly": true, + "example": true, + "description": "A read-only boolean value indicating if a container registry is integrated with the cluster." + } + }, + "required": [ + "name", + "region", + "version", + "node_pools" + ] + }, + "cluster_update": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "prod-cluster-01", + "description": "A human-readable name for a Kubernetes cluster." + }, + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "k8s", + "k8s:bd5f5959-5e1e-4205-a714-a914373942af", + "production", + "web-team" + ], + "description": "An array of tags applied to the Kubernetes cluster. All clusters are automatically tagged `k8s` and `k8s:$K8S_CLUSTER_ID`." + }, + "maintenance_policy": { + "$ref": "#/components/schemas/maintenance_policy" + }, + "auto_upgrade": { + "type": "boolean", + "default": false, + "example": true, + "description": "A boolean value indicating whether the cluster will be automatically upgraded to new patch releases during its maintenance window." + }, + "surge_upgrade": { + "type": "boolean", + "default": false, + "example": true, + "description": "A boolean value indicating whether surge upgrade is enabled/disabled for the cluster. Surge upgrade makes cluster upgrades fast and reliable by bringing up new nodes before destroying the outdated nodes." + }, + "ha": { + "type": "boolean", + "default": false, + "example": true, + "description": "A boolean value indicating whether the control plane is run in a highly available configuration in the cluster. Highly available control planes incur less downtime. The property cannot be disabled." + } + }, + "required": [ + "name" + ] + }, + "associated_kubernetes_resource": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The ID of a resource associated with a Kubernetes cluster.", + "example": "edb0478d-7436-11ea-86e6-0a58ac144b91" + }, + "name": { + "type": "string", + "description": "The name of a resource associated with a Kubernetes cluster.", + "example": "volume-001" + } + } + }, + "associated_kubernetes_resources": { + "type": "object", + "description": "An object containing the IDs of resources associated with a Kubernetes cluster.", + "properties": { + "load_balancers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/associated_kubernetes_resource" + }, + "example": [ + { + "id": "4de7ac8b-495b-4884-9a69-1050c6793cd6", + "name": "lb-001" + } + ], + "description": "A list of names and IDs for associated load balancers that can be destroyed along with the cluster." + }, + "volumes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/associated_kubernetes_resource" + }, + "example": [ + { + "id": "ba49449a-7435-11ea-b89e-0a58ac14480f", + "name": "volume-001" + } + ], + "description": "A list of names and IDs for associated volumes that can be destroyed along with the cluster." + }, + "volume_snapshots": { + "type": "array", + "items": { + "$ref": "#/components/schemas/associated_kubernetes_resource" + }, + "example": [ + { + "id": "edb0478d-7436-11ea-86e6-0a58ac144b91", + "name": "snapshot-001" + } + ], + "description": "A list of names and IDs for associated volume snapshots that can be destroyed along with the cluster." + } + } + }, + "destroy_associated_kubernetes_resources": { + "type": "object", + "description": "An object containing the IDs of resources to be destroyed along with their associated with a Kubernetes cluster.", + "properties": { + "load_balancers": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "4de7ac8b-495b-4884-9a69-1050c6793cd6" + ], + "description": "A list of IDs for associated load balancers to destroy along with the cluster." + }, + "volumes": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "ba49449a-7435-11ea-b89e-0a58ac14480f" + ], + "description": "A list of IDs for associated volumes to destroy along with the cluster." + }, + "volume_snapshots": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "edb0478d-7436-11ea-86e6-0a58ac144b91" + ], + "description": "A list of IDs for associated volume snapshots to destroy along with the cluster." + } + } + }, + "credentials": { + "type": "object", + "properties": { + "server": { + "type": "string", + "format": "uri", + "example": "https://bd5f5959-5e1e-4205-a714-a914373942af.k8s.ondigitalocean.com", + "description": "The URL used to access the cluster API server." + }, + "certificate_authority_data": { + "type": "string", + "format": "byte", + "example": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURKekNDQWcrZ0F3SUJBZ0lDQm5Vd0RRWUpLb1pJaHZjTkFRRUxCUUF3TXpFVk1CTUdBMVVFQ2hNTVJHbG4KYVhSaGJFOWpaV0Z1TVJvd0dBWURWUVFERXhGck9ITmhZWE1nUTJ4MWMzUmxjaUJEUVRBZUZ3MHlNREE0TURNeApOVEkxTWpoYUZ3MDBNREE0TURNeE5USTFNamhhTURNeEZUQVRCZ05WQkFvVERFUnBaMmwwWVd4UFkyVmhiakVhCk1CZ0dBMVVFQXhNUmF6aHpZV0Z6SUVOc2RYTjBaWElnUTBFd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUIKRHdBd2dnRUtBb0lCQVFDc21oa2JrSEpUcGhZQlN0R05VVE1ORVZTd2N3bmRtajArelQvcUZaNGsrOVNxUnYrSgpBd0lCaGpBU0JnTlZIUk1CQWY4RUNEQUdBUUgvQWdFQU1CMEdBMVVkRGdRV0JCUlRzazhhZ1hCUnFyZXdlTXJxClhwa3E1NXg5dVRBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQXB6V2F6bXNqYWxXTEx3ZjVpbWdDblNINDlKcGkKYWkvbzFMdEJvVEpleGdqZzE1ZVppaG5BMUJMc0lWNE9BZGM3UEFsL040L0hlbENrTDVxandjamRnNVdaYnMzYwozcFVUQ0g5bVVwMFg1SVdhT1VKV292Q1hGUlM1R2VKYXlkSDVPUXhqTURzR2N2UlNvZGQrVnQ2MXE3aWdFZ2I1CjBOZ1l5RnRnc2p0MHpJN3hURzZFNnlsOVYvUmFoS3lIQks2eExlM1RnUGU4SXhWa2RwT3QzR0FhSDRaK0pLR3gKYisyMVZia1NnRE1QQTlyR0VKNVZwVXlBV0FEVXZDRVFHV0hmNGpQN2ZGZlc3T050S0JWY3h3YWFjcVBVdUhzWApwRG5DZVR3V1NuUVp6L05xNmQxWUtsMFdtbkwzTEowemJzRVFGbEQ4MkkwL09MY2dZSDVxMklOZHhBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=", + "description": "A base64 encoding of bytes representing the certificate authority data for accessing the cluster." + }, + "client_certificate_data": { + "type": "string", + "format": "byte", + "deprecated": true, + "nullable": true, + "example": null, + "description": "A base64 encoding of bytes representing the x509 client\ncertificate data for access the cluster. This is only returned for clusters\nwithout support for token-based authentication.\n\nNewly created Kubernetes clusters do not return credentials using\ncertificate-based authentication. For additional information,\n[see here](https://www.digitalocean.com/docs/kubernetes/how-to/connect-to-cluster/#authenticate).\n" + }, + "client_key_data": { + "type": "string", + "format": "byte", + "deprecated": true, + "nullable": true, + "example": null, + "description": "A base64 encoding of bytes representing the x509 client key\ndata for access the cluster. This is only returned for clusters without\nsupport for token-based authentication.\n\nNewly created Kubernetes clusters do not return credentials using\ncertificate-based authentication. For additional information,\n[see here](https://www.digitalocean.com/docs/kubernetes/how-to/connect-to-cluster/#authenticate).\n" + }, + "token": { + "type": "string", + "example": "$DIGITALOCEAN_TOKEN", + "description": "An access token used to authenticate with the cluster. This is only returned for clusters with support for token-based authentication." + }, + "expires_at": { + "type": "string", + "format": "date-time", + "example": "2019-11-09T11:50:28.889080521Z", + "description": "A time value given in ISO8601 combined date and time format that represents when the access token expires." + } + } + }, + "kubernetes_version": { + "type": "object", + "properties": { + "slug": { + "type": "string", + "example": "1.16.13-do.0", + "description": "The slug identifier for an available version of Kubernetes for use when creating or updating a cluster. The string contains both the upstream version of Kubernetes as well as the DigitalOcean revision." + }, + "kubernetes_version": { + "type": "string", + "example": "1.16.13", + "description": "The upstream version string for the version of Kubernetes provided by a given slug." + }, + "supported_features": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "cluster-autoscaler", + "docr-integration", + "token-authentication" + ], + "description": "The features available with the version of Kubernetes provided by a given slug." + } + } + }, + "kubernetes_node_pool_update": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/kubernetes_node_pool_base" + } + ], + "required": [ + "name", + "count" + ] + }, + "user": { + "type": "object", + "properties": { + "kubernetes_cluster_user": { + "type": "object", + "properties": { + "username": { + "type": "string", + "format": "email", + "example": "sammy@digitalocean.com", + "description": "The username for the cluster admin user." + }, + "groups": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "k8saas:authenticated" + ], + "description": "A list of in-cluster groups that the user belongs to." + } + } + } + } + }, + "kubernetes_region": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "New York 3", + "description": "A DigitalOcean region where Kubernetes is available." + }, + "slug": { + "type": "string", + "example": "nyc3", + "description": "The identifier for a region for use when creating a new cluster." + } + } + }, + "kubernetes_size": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "s-1vcpu-2gb", + "description": "A Droplet size available for use in a Kubernetes node pool." + }, + "slug": { + "type": "string", + "example": "s-1vcpu-2gb", + "description": "The identifier for a size for use when creating a new cluster." + } + } + }, + "kubernetes_options": { + "type": "object", + "properties": { + "options": { + "properties": { + "regions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/kubernetes_region" + } + }, + "versions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/kubernetes_version" + } + }, + "sizes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/kubernetes_size" + } + } + } + } + } + }, + "clusterlint_results": { + "type": "object", + "properties": { + "run_id": { + "type": "string", + "example": "50c2f44c-011d-493e-aee5-361a4a0d1844", + "description": "Id of the clusterlint run that can be used later to fetch the diagnostics." + }, + "requested_at": { + "type": "string", + "format": "date-time", + "example": "2019-10-30T05:34:07Z", + "description": "A time value given in ISO8601 combined date and time format that represents when the schedule clusterlint run request was made." + }, + "completed_at": { + "type": "string", + "format": "date-time", + "example": "2019-10-30T05:34:11Z", + "description": "A time value given in ISO8601 combined date and time format that represents when the schedule clusterlint run request was completed." + }, + "diagnostics": { + "description": "An array of diagnostics reporting potential problems for the given cluster.", + "type": "array", + "items": { + "type": "object", + "properties": { + "check_name": { + "type": "string", + "example": "unused-config-map", + "description": "The clusterlint check that resulted in the diagnostic." + }, + "severity": { + "type": "string", + "example": "warning", + "description": "Can be one of error, warning or suggestion." + }, + "message": { + "type": "string", + "example": "Unused config map", + "description": "Feedback about the object for users to fix." + }, + "object": { + "type": "object", + "description": "Metadata about the Kubernetes API object the diagnostic is reported on.", + "properties": { + "name": { + "type": "string", + "example": "foo", + "description": "Name of the object" + }, + "kind": { + "type": "string", + "example": "config map", + "description": "The kind of Kubernetes API object" + }, + "namespace": { + "type": "string", + "example": "kube-system", + "description": "The namespace the object resides in the cluster." + } + } + } + } + } + } + } + }, + "clusterlint_request": { + "type": "object", + "properties": { + "include_groups": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "basic", + "doks", + "security" + ], + "description": "An array of check groups that will be run when clusterlint executes checks." + }, + "include_checks": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "bare-pods", + "resource-requirements" + ], + "description": "An array of checks that will be run when clusterlint executes checks." + }, + "exclude_groups": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "workload-health" + ], + "description": "An array of check groups that will be omitted when clusterlint executes checks." + }, + "exclude_checks": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "default-namespace" + ], + "description": "An array of checks that will be run when clusterlint executes checks." + } + } + }, + "cluster_registries": { + "type": "object", + "properties": { + "cluster_uuids": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "bd5f5959-5e1e-4205-a714-a914373942af", + "50c2f44c-011d-493e-aee5-361a4a0d1844" + ], + "description": "An array containing the UUIDs of Kubernetes clusters." + } + } + }, + "forwarding_rule": { + "type": "object", + "description": "An object specifying a forwarding rule for a load balancer.", + "properties": { + "entry_protocol": { + "type": "string", + "enum": [ + "http", + "https", + "http2", + "http3", + "tcp", + "udp" + ], + "example": "https", + "description": "The protocol used for traffic to the load balancer. The possible values are: `http`, `https`, `http2`, `http3`, `tcp`, or `udp`. If you set the `entry_protocol` to `udp`, the `target_protocol` must be set to `udp`. When using UDP, the load balancer requires that you set up a health check with a port that uses TCP, HTTP, or HTTPS to work properly.\n" + }, + "entry_port": { + "type": "integer", + "example": 443, + "description": "An integer representing the port on which the load balancer instance will listen." + }, + "target_protocol": { + "type": "string", + "enum": [ + "http", + "https", + "http2", + "tcp", + "udp" + ], + "example": "http", + "description": "The protocol used for traffic from the load balancer to the backend Droplets. The possible values are: `http`, `https`, `http2`, `tcp`, or `udp`. If you set the `target_protocol` to `udp`, the `entry_protocol` must be set to `udp`. When using UDP, the load balancer requires that you set up a health check with a port that uses TCP, HTTP, or HTTPS to work properly.\n" + }, + "target_port": { + "type": "integer", + "example": 80, + "description": "An integer representing the port on the backend Droplets to which the load balancer will send traffic." + }, + "certificate_id": { + "type": "string", + "example": "892071a0-bb95-49bc-8021-3afd67a210bf", + "description": "The ID of the TLS certificate used for SSL termination if enabled." + }, + "tls_passthrough": { + "type": "boolean", + "example": false, + "description": "A boolean value indicating whether SSL encrypted traffic will be passed through to the backend Droplets." + } + }, + "required": [ + "entry_protocol", + "entry_port", + "target_protocol", + "target_port" + ] + }, + "health_check": { + "type": "object", + "description": "An object specifying health check settings for the load balancer.", + "properties": { + "protocol": { + "type": "string", + "enum": [ + "http", + "https", + "tcp" + ], + "default": "http", + "example": "http", + "description": "The protocol used for health checks sent to the backend Droplets. The possible values are `http`, `https`, or `tcp`." + }, + "port": { + "type": "integer", + "default": 80, + "example": 80, + "description": "An integer representing the port on the backend Droplets on which the health check will attempt a connection." + }, + "path": { + "type": "string", + "default": "/", + "example": "/", + "description": "The path on the backend Droplets to which the load balancer instance will send a request." + }, + "check_interval_seconds": { + "type": "integer", + "default": 10, + "example": 10, + "description": "The number of seconds between between two consecutive health checks." + }, + "response_timeout_seconds": { + "type": "integer", + "default": 5, + "example": 5, + "description": "The number of seconds the load balancer instance will wait for a response until marking a health check as failed." + }, + "unhealthy_threshold": { + "type": "integer", + "default": 5, + "example": 5, + "description": "The number of times a health check must fail for a backend Droplet to be marked \"unhealthy\" and be removed from the pool." + }, + "healthy_threshold": { + "type": "integer", + "default": 3, + "example": 3, + "description": "The number of times a health check must pass for a backend Droplet to be marked \"healthy\" and be re-added to the pool." + } + } + }, + "sticky_sessions": { + "type": "object", + "description": "An object specifying sticky sessions settings for the load balancer.", + "properties": { + "type": { + "type": "string", + "enum": [ + "cookies", + "none" + ], + "example": "cookies", + "default": "none", + "description": "An attribute indicating how and if requests from a client will be persistently served by the same backend Droplet. The possible values are `cookies` or `none`." + }, + "cookie_name": { + "type": "string", + "example": "DO-LB", + "description": "The name of the cookie sent to the client. This attribute is only returned when using `cookies` for the sticky sessions type." + }, + "cookie_ttl_seconds": { + "type": "integer", + "example": 300, + "description": "The number of seconds until the cookie set by the load balancer expires. This attribute is only returned when using `cookies` for the sticky sessions type." + } + } + }, + "lb_firewall": { + "type": "object", + "description": "An object specifying allow and deny rules to control traffic to the load balancer.", + "properties": { + "deny": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "ip:1.2.3.4", + "cidr:2.3.0.0/16" + ], + "default": [], + "description": "the rules for denying traffic to the load balancer (in the form 'ip:1.2.3.4' or 'cidr:1.2.0.0/16')" + }, + "allow": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "ip:1.2.3.4", + "cidr:2.3.0.0/16" + ], + "default": [], + "description": "the rules for allowing traffic to the load balancer (in the form 'ip:1.2.3.4' or 'cidr:1.2.0.0/16')" + } + } + }, + "load_balancer_base": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "example": "4de7ac8b-495b-4884-9a69-1050c6793cd6", + "description": "A unique ID that can be used to identify and reference a load balancer." + }, + "name": { + "type": "string", + "example": "example-lb-01", + "description": "A human-readable name for a load balancer instance." + }, + "project_id": { + "type": "string", + "example": "4de7ac8b-495b-4884-9a69-1050c6793cd6", + "description": "The ID of the project that the load balancer is associated with. If no ID is provided at creation, the load balancer associates with the user's default project. If an invalid project ID is provided, the load balancer will not be created." + }, + "ip": { + "type": "string", + "pattern": "^$|^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$", + "readOnly": true, + "example": "104.131.186.241", + "description": "An attribute containing the public-facing IP address of the load balancer." + }, + "size_unit": { + "type": "integer", + "default": 1, + "minimum": 1, + "maximum": 100, + "example": 3, + "description": "How many nodes the load balancer contains. Each additional node increases the load balancer's ability to manage more connections. Load balancers can be scaled up or down, and you can change the number of nodes after creation up to once per hour. This field is currently not available in the AMS2, NYC2, or SFO1 regions. Use the `size` field to scale load balancers that reside in these regions." + }, + "size": { + "type": "string", + "enum": [ + "lb-small", + "lb-medium", + "lb-large" + ], + "deprecated": true, + "default": "lb-small", + "example": "lb-small", + "description": "This field has been replaced by the `size_unit` field for all regions except in AMS2, NYC2, and SFO1. Each available load balancer size now equates to the load balancer having a set number of nodes.\n* `lb-small` = 1 node\n* `lb-medium` = 3 nodes\n* `lb-large` = 6 nodes\n\nYou can resize load balancers after creation up to once per hour. You cannot resize a load balancer within the first hour of its creation." + }, + "algorithm": { + "type": "string", + "example": "round_robin", + "enum": [ + "round_robin", + "least_connections" + ], + "deprecated": true, + "default": "round_robin", + "description": "This field has been deprecated. You can no longer specify an algorithm for load balancers." + }, + "status": { + "type": "string", + "example": "new", + "enum": [ + "new", + "active", + "errored" + ], + "readOnly": true, + "description": "A status string indicating the current state of the load balancer. This can be `new`, `active`, or `errored`." + }, + "created_at": { + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2017-02-01T22:22:58Z", + "description": "A time value given in ISO8601 combined date and time format that represents when the load balancer was created." + }, + "forwarding_rules": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/components/schemas/forwarding_rule" + }, + "description": "An array of objects specifying the forwarding rules for a load balancer." + }, + "health_check": { + "$ref": "#/components/schemas/health_check" + }, + "sticky_sessions": { + "$ref": "#/components/schemas/sticky_sessions" + }, + "redirect_http_to_https": { + "type": "boolean", + "example": true, + "default": false, + "description": "A boolean value indicating whether HTTP requests to the load balancer on port 80 will be redirected to HTTPS on port 443." + }, + "enable_proxy_protocol": { + "type": "boolean", + "example": true, + "default": false, + "description": "A boolean value indicating whether PROXY Protocol is in use." + }, + "enable_backend_keepalive": { + "type": "boolean", + "example": true, + "default": false, + "description": "A boolean value indicating whether HTTP keepalive connections are maintained to target Droplets." + }, + "http_idle_timeout_seconds": { + "type": "integer", + "example": 90, + "default": 60, + "minimum": 30, + "maximum": 600, + "description": "An integer value which configures the idle timeout for HTTP requests to the target droplets." + }, + "vpc_uuid": { + "type": "string", + "format": "uuid", + "example": "c33931f2-a26a-4e61-b85c-4e95a2ec431b", + "description": "A string specifying the UUID of the VPC to which the load balancer is assigned." + }, + "disable_lets_encrypt_dns_records": { + "type": "boolean", + "example": true, + "default": false, + "description": "A boolean value indicating whether to disable automatic DNS record creation for Let's Encrypt certificates that are added to the load balancer." + }, + "firewall": { + "$ref": "#/components/schemas/lb_firewall" + } + }, + "required": [ + "forwarding_rules" + ] + }, + "load_balancer": { + "allOf": [ + { + "$ref": "#/components/schemas/load_balancer_base" + }, + { + "type": "object", + "properties": { + "region": { + "type": "object", + "allOf": [ + { + "description": "The region where the load balancer instance is located. When setting a region, the value should be the slug identifier for the region. When you query a load balancer, an entire region object will be returned." + }, + { + "$ref": "#/components/schemas/region" + } + ] + } + } + }, + { + "type": "object", + "properties": { + "droplet_ids": { + "type": "array", + "items": { + "type": "integer" + }, + "example": [ + 3164444, + 3164445 + ], + "description": "An array containing the IDs of the Droplets assigned to the load balancer." + } + } + }, + { + "type": "object", + "properties": { + "tag": { + "type": "string", + "example": "prod:web", + "description": "The name of a Droplet tag corresponding to Droplets assigned to the load balancer." + } + } + } + ] + }, + "load_balancer_create": { + "oneOf": [ + { + "title": "Assign Droplets by ID", + "allOf": [ + { + "type": "object", + "properties": { + "droplet_ids": { + "type": "array", + "items": { + "type": "integer" + }, + "example": [ + 3164444, + 3164445 + ], + "description": "An array containing the IDs of the Droplets assigned to the load balancer." + } + } + }, + { + "type": "object", + "properties": { + "region": { + "$ref": "#/components/schemas/region_slug" + } + } + }, + { + "$ref": "#/components/schemas/load_balancer_base" + } + ], + "required": [ + "droplet_ids", + "region" + ] + }, + { + "title": "Assign Droplets by Tag", + "allOf": [ + { + "type": "object", + "properties": { + "tag": { + "type": "string", + "example": "prod:web", + "description": "The name of a Droplet tag corresponding to Droplets assigned to the load balancer." + } + } + }, + { + "type": "object", + "properties": { + "region": { + "$ref": "#/components/schemas/region_slug" + } + } + }, + { + "$ref": "#/components/schemas/load_balancer_base" + } + ], + "required": [ + "tag", + "region" + ] + } + ] + }, + "slack_details": { + "type": "object", + "required": [ + "url", + "channel" + ], + "properties": { + "channel": { + "type": "string", + "example": "Production Alerts", + "description": "Slack channel to notify of an alert trigger." + }, + "url": { + "type": "string", + "description": "Slack Webhook URL.", + "example": "https://hooks.slack.com/services/T1234567/AAAAAAAA/ZZZZZZ" + } + } + }, + "alerts": { + "type": "object", + "required": [ + "slack", + "email" + ], + "properties": { + "email": { + "description": "An email to notify on an alert trigger.", + "example": [ + "bob@exmaple.com" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "slack": { + "type": "array", + "description": "Slack integration details.", + "items": { + "$ref": "#/components/schemas/slack_details" + } + } + } + }, + "alert_policy": { + "type": "object", + "required": [ + "uuid", + "type", + "description", + "compare", + "value", + "window", + "entities", + "tags", + "alerts", + "enabled" + ], + "properties": { + "alerts": { + "$ref": "#/components/schemas/alerts" + }, + "compare": { + "type": "string", + "example": "GreaterThan", + "enum": [ + "GreaterThan", + "LessThan" + ] + }, + "description": { + "type": "string", + "example": "CPU Alert" + }, + "enabled": { + "type": "boolean", + "example": true + }, + "entities": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "192018292" + ] + }, + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "droplet_tag" + ] + }, + "type": { + "type": "string", + "enum": [ + "v1/insights/droplet/load_1", + "v1/insights/droplet/load_5", + "v1/insights/droplet/load_15", + "v1/insights/droplet/memory_utilization_percent", + "v1/insights/droplet/disk_utilization_percent", + "v1/insights/droplet/cpu", + "v1/insights/droplet/disk_read", + "v1/insights/droplet/disk_write", + "v1/insights/droplet/public_outbound_bandwidth", + "v1/insights/droplet/public_inbound_bandwidth", + "v1/insights/droplet/private_outbound_bandwidth", + "v1/insights/droplet/private_inbound_bandwidth", + "v1/insights/lbaas/avg_cpu_utilization_percent", + "v1/insights/lbaas/connection_utilization_percent", + "v1/insights/lbaas/droplet_health", + "v1/insights/lbaas/tls_connections_per_second_utilization_percent", + "v1/insights/lbaas/increase_in_http_error_rate_percentage_5xx", + "v1/insights/lbaas/increase_in_http_error_rate_percentage_4xx", + "v1/insights/lbaas/increase_in_http_error_rate_count_5xx", + "v1/insights/lbaas/increase_in_http_error_rate_count_4xx", + "v1/insights/lbaas/high_http_request_response_time", + "v1/insights/lbaas/high_http_request_response_time_50p", + "v1/insights/lbaas/high_http_request_response_time_95p", + "v1/insights/lbaas/high_http_request_response_time_99p", + "v1/dbaas/alerts/load_15_alerts", + "v1/dbaas/alerts/memory_utilization_alerts", + "v1/dbaas/alerts/disk_utilization_alerts", + "v1/dbaas/alerts/cpu_alerts" + ], + "example": "v1/insights/droplet/cpu" + }, + "uuid": { + "type": "string", + "example": "78b3da62-27e5-49ba-ac70-5db0b5935c64" + }, + "value": { + "type": "number", + "format": "float", + "example": 80 + }, + "window": { + "type": "string", + "enum": [ + "5m", + "10m", + "30m", + "1h" + ], + "example": "5m" + } + } + }, + "list_alert_policy": { + "type": "object", + "required": [ + "policies" + ], + "properties": { + "policies": { + "type": "array", + "items": { + "$ref": "#/components/schemas/alert_policy" + } + } + } + }, + "alert_policy_request": { + "type": "object", + "required": [ + "type", + "description", + "compare", + "value", + "window", + "entities", + "tags", + "alerts", + "enabled" + ], + "properties": { + "alerts": { + "$ref": "#/components/schemas/alerts" + }, + "compare": { + "type": "string", + "example": "GreaterThan", + "enum": [ + "GreaterThan", + "LessThan" + ] + }, + "description": { + "type": "string", + "example": "CPU Alert" + }, + "enabled": { + "type": "boolean", + "example": true + }, + "entities": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "192018292" + ] + }, + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "droplet_tag" + ] + }, + "type": { + "type": "string", + "enum": [ + "v1/insights/droplet/load_1", + "v1/insights/droplet/load_5", + "v1/insights/droplet/load_15", + "v1/insights/droplet/memory_utilization_percent", + "v1/insights/droplet/disk_utilization_percent", + "v1/insights/droplet/cpu", + "v1/insights/droplet/disk_read", + "v1/insights/droplet/disk_write", + "v1/insights/droplet/public_outbound_bandwidth", + "v1/insights/droplet/public_inbound_bandwidth", + "v1/insights/droplet/private_outbound_bandwidth", + "v1/insights/droplet/private_inbound_bandwidth", + "v1/insights/lbaas/avg_cpu_utilization_percent", + "v1/insights/lbaas/connection_utilization_percent", + "v1/insights/lbaas/droplet_health", + "v1/insights/lbaas/tls_connections_per_second_utilization_percent", + "v1/insights/lbaas/increase_in_http_error_rate_percentage_5xx", + "v1/insights/lbaas/increase_in_http_error_rate_percentage_4xx", + "v1/insights/lbaas/increase_in_http_error_rate_count_5xx", + "v1/insights/lbaas/increase_in_http_error_rate_count_4xx", + "v1/insights/lbaas/high_http_request_response_time", + "v1/insights/lbaas/high_http_request_response_time_50p", + "v1/insights/lbaas/high_http_request_response_time_95p", + "v1/insights/lbaas/high_http_request_response_time_99p", + "v1/dbaas/alerts/load_15_alerts", + "v1/dbaas/alerts/memory_utilization_alerts", + "v1/dbaas/alerts/disk_utilization_alerts", + "v1/dbaas/alerts/cpu_alerts" + ], + "example": "v1/insights/droplet/cpu" + }, + "value": { + "type": "number", + "format": "float", + "example": 80 + }, + "window": { + "type": "string", + "example": "5m", + "enum": [ + "5m", + "10m", + "30m", + "1h" + ] + } + } + }, + "metrics_result": { + "type": "object", + "required": [ + "metric", + "values" + ], + "properties": { + "metric": { + "type": "object", + "description": "An object containing the metric labels.", + "additionalProperties": { + "type": "string" + }, + "example": { + "host_id": "19201920" + } + }, + "values": { + "type": "array", + "example": [ + [ + 1435781430, + "1" + ], + [ + 1435781445, + "1" + ] + ], + "items": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "integer" + }, + { + "type": "string" + } + ] + } + } + } + } + }, + "metrics_data": { + "type": "object", + "required": [ + "resultType", + "result" + ], + "properties": { + "result": { + "type": "array", + "description": "Result of query.", + "items": { + "$ref": "#/components/schemas/metrics_result" + } + }, + "resultType": { + "type": "string", + "enum": [ + "matrix" + ], + "example": "matrix" + } + } + }, + "metrics": { + "type": "object", + "required": [ + "status", + "data" + ], + "properties": { + "data": { + "$ref": "#/components/schemas/metrics_data" + }, + "status": { + "type": "string", + "example": "success", + "enum": [ + "success", + "error" + ] + } + } + }, + "project_base": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "example": "4e1bfbc3-dc3e-41f2-a18f-1b4d7ba71679", + "description": "The unique universal identifier of this project." + }, + "owner_uuid": { + "type": "string", + "readOnly": true, + "example": "99525febec065ca37b2ffe4f852fd2b2581895e7", + "description": "The unique universal identifier of the project owner." + }, + "owner_id": { + "type": "integer", + "readOnly": true, + "example": 258992, + "description": "The integer id of the project owner." + }, + "name": { + "type": "string", + "maxLength": 175, + "example": "my-web-api", + "description": "The human-readable name for the project. The maximum length is 175 characters and the name must be unique." + }, + "description": { + "type": "string", + "maxLength": 255, + "example": "My website API", + "description": "The description of the project. The maximum length is 255 characters." + }, + "purpose": { + "type": "string", + "maxLength": 255, + "example": "Service or API", + "description": "The purpose of the project. The maximum length is 255 characters. It can\nhave one of the following values:\n\n- Just trying out DigitalOcean\n- Class project / Educational purposes\n- Website or blog\n- Web Application\n- Service or API\n- Mobile Application\n- Machine learning / AI / Data processing\n- IoT\n- Operational / Developer tooling\n\nIf another value for purpose is specified, for example, \"your custom purpose\",\nyour purpose will be stored as `Other: your custom purpose`.\n" + }, + "environment": { + "type": "string", + "enum": [ + "Development", + "Staging", + "Production" + ], + "example": "Production", + "description": "The environment of the project's resources." + }, + "created_at": { + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-09-27T20:10:35Z", + "description": "A time value given in ISO8601 combined date and time format that represents when the project was created." + }, + "updated_at": { + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2018-09-27T20:10:35Z", + "description": "A time value given in ISO8601 combined date and time format that represents when the project was updated." + } + } + }, + "project": { + "allOf": [ + { + "$ref": "#/components/schemas/project_base" + }, + { + "type": "object", + "properties": { + "is_default": { + "type": "boolean", + "example": false, + "description": "If true, all resources will be added to this project if no project is specified." + } + } + } + ] + }, + "urn": { + "type": "string", + "pattern": "^do:(dbaas|domain|droplet|floatingip|loadbalancer|space|volume|kubernetes|vpc):.*", + "example": "do:droplet:13457723", + "description": "The uniform resource name (URN) for the resource in the format do:resource_type:resource_id." + }, + "resource": { + "type": "object", + "properties": { + "urn": { + "$ref": "#/components/schemas/urn" + }, + "assigned_at": { + "type": "string", + "format": "date-time", + "example": "2018-09-28T19:26:37Z", + "description": "A time value given in ISO8601 combined date and time format that represents when the project was created." + }, + "links": { + "type": "object", + "description": "The links object contains the `self` object, which contains the resource relationship.", + "properties": { + "self": { + "type": "string", + "format": "uri", + "example": "https://api.digitalocean.com/v2/droplets/13457723", + "description": "A URI that can be used to retrieve the resource." + } + } + }, + "status": { + "type": "string", + "enum": [ + "ok", + "not_found", + "assigned", + "already_assigned", + "service_down" + ], + "example": "ok", + "description": "The status of assigning and fetching the resources." + } + } + }, + "project_assignment": { + "type": "object", + "properties": { + "resources": { + "type": "array", + "items": { + "$ref": "#/components/schemas/urn" + }, + "example": [ + "do:droplet:13457723" + ], + "description": "A list of uniform resource names (URNs) to be added to a project." + } + } + }, + "subscription_tier_base": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "Basic", + "description": "The name of the subscription tier." + }, + "slug": { + "type": "string", + "example": "basic", + "description": "The slug identifier of the subscription tier." + }, + "included_repositories": { + "type": "integer", + "example": 5, + "description": "The number of repositories included in the subscription tier. `0` indicates that the subscription tier includes unlimited repositories." + }, + "included_storage_bytes": { + "type": "integer", + "example": 5368709120, + "description": "The amount of storage included in the subscription tier in bytes." + }, + "allow_storage_overage": { + "type": "boolean", + "example": true, + "description": "A boolean indicating whether the subscription tier supports additional storage above what is included in the base plan at an additional cost per GiB used." + }, + "included_bandwidth_bytes": { + "type": "integer", + "example": 5368709120, + "description": "The amount of outbound data transfer included in the subscription tier in bytes." + }, + "monthly_price_in_cents": { + "type": "integer", + "example": 500, + "description": "The monthly cost of the subscription tier in cents." + }, + "storage_overage_price_in_cents": { + "type": "integer", + "example": 2, + "description": "The price paid in cents per GiB for additional storage beyond what is included in the subscription plan." + } + } + }, + "subscription": { + "type": "object", + "properties": { + "tier": { + "$ref": "#/components/schemas/subscription_tier_base" + }, + "created_at": { + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2020-01-23T21:19:12Z", + "description": "The time at which the subscription was created." + }, + "updated_at": { + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2020-11-05T15:53:24Z", + "description": "The time at which the subscription was last updated." + } + } + }, + "registry": { + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 63, + "pattern": "^[a-z0-9-]{1,63}$", + "example": "example", + "description": "A globally unique name for the container registry. Must be lowercase and be composed only of numbers, letters and `-`, up to a limit of 63 characters." + }, + "created_at": { + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2020-03-21T16:02:37Z", + "description": "A time value given in ISO8601 combined date and time format that represents when the registry was created." + }, + "region": { + "type": "string", + "example": "fra1", + "description": "Slug of the region where registry data is stored" + }, + "storage_usage_bytes": { + "type": "integer", + "readOnly": true, + "example": 29393920, + "description": "The amount of storage used in the registry in bytes." + }, + "storage_usage_bytes_updated_at": { + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2020-11-04T21:39:49.530562231Z", + "description": "The time at which the storage usage was updated. Storage usage is calculated asynchronously, and may not immediately reflect pushes to the registry." + }, + "subscription": { + "allOf": [ + { + "readOnly": true + }, + { + "$ref": "#/components/schemas/subscription" + } + ] + } + } + }, + "registry_create": { + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 63, + "pattern": "^[a-z0-9-]{1,63}$", + "example": "example", + "description": "A globally unique name for the container registry. Must be lowercase and be composed only of numbers, letters and `-`, up to a limit of 63 characters." + }, + "subscription_tier_slug": { + "type": "string", + "enum": [ + "starter", + "basic", + "professional" + ], + "example": "basic", + "description": "The slug of the subscription tier to sign up for. Valid values can be retrieved using the options endpoint." + }, + "region": { + "type": "string", + "enum": [ + "nyc3", + "sfo3", + "ams3", + "sgp1", + "fra1" + ], + "example": "fra1", + "description": "Slug of the region where registry data is stored. When not provided, a region will be selected." + } + }, + "required": [ + "name", + "subscription_tier_slug" + ] + }, + "docker_credentials": { + "type": "object", + "properties": { + "auths": { + "type": "object", + "properties": { + "registry.digitalocean.com": { + "type": "object", + "properties": { + "auth": { + "type": "string", + "example": "YjdkMDNhNjk0N2IyMTdlZmI2ZjNlYzNiZDM1MDQ1ODI6YjdkMDNhNjk0N2IyMTdlZmI2ZjNlYzNiZDM1MDQ1ODIK", + "description": "A base64 encoded string containing credentials for the container registry." + } + } + } + } + } + } + }, + "validate_registry": { + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 63, + "pattern": "^[a-z0-9-]{1,63}$", + "example": "example", + "description": "A globally unique name for the container registry. Must be lowercase and be composed only of numbers, letters and `-`, up to a limit of 63 characters." + } + }, + "required": [ + "name" + ] + }, + "repository_tag": { + "type": "object", + "properties": { + "registry_name": { + "type": "string", + "example": "example", + "description": "The name of the container registry." + }, + "repository": { + "type": "string", + "example": "repo-1", + "description": "The name of the repository." + }, + "tag": { + "type": "string", + "example": "latest", + "description": "The name of the tag." + }, + "manifest_digest": { + "type": "string", + "example": "sha256:cb8a924afdf0229ef7515d9e5b3024e23b3eb03ddbba287f4a19c6ac90b8d221", + "description": "The digest of the manifest associated with the tag." + }, + "compressed_size_bytes": { + "type": "integer", + "example": 2803255, + "description": "The compressed size of the tag in bytes." + }, + "size_bytes": { + "type": "integer", + "example": 5861888, + "description": "The uncompressed size of the tag in bytes (this size is calculated asynchronously so it may not be immediately available)." + }, + "updated_at": { + "type": "string", + "format": "date-time", + "example": "2020-04-09T23:54:25Z", + "description": "The time the tag was last updated." + } + } + }, + "repository": { + "type": "object", + "properties": { + "registry_name": { + "type": "string", + "example": "example", + "description": "The name of the container registry." + }, + "name": { + "type": "string", + "example": "repo-1", + "description": "The name of the repository." + }, + "latest_tag": { + "$ref": "#/components/schemas/repository_tag" + }, + "tag_count": { + "type": "integer", + "example": 1, + "description": "The number of tags in the repository." + } + } + }, + "repository_blob": { + "type": "object", + "properties": { + "digest": { + "type": "string", + "example": "sha256:cb8a924afdf0229ef7515d9e5b3024e23b3eb03ddbba287f4a19c6ac90b8d221", + "description": "The digest of the blob" + }, + "compressed_size_bytes": { + "type": "integer", + "example": 2803255, + "description": "The compressed size of the blob in bytes." + } + } + }, + "repository_manifest": { + "type": "object", + "properties": { + "registry_name": { + "type": "string", + "example": "example", + "description": "The name of the container registry." + }, + "repository": { + "type": "string", + "example": "repo-1", + "description": "The name of the repository." + }, + "digest": { + "type": "string", + "example": "sha256:cb8a924afdf0229ef7515d9e5b3024e23b3eb03ddbba287f4a19c6ac90b8d221", + "description": "The manifest digest" + }, + "compressed_size_bytes": { + "type": "integer", + "example": 2803255, + "description": "The compressed size of the manifest in bytes." + }, + "size_bytes": { + "type": "integer", + "example": 5861888, + "description": "The uncompressed size of the manifest in bytes (this size is calculated asynchronously so it may not be immediately available)." + }, + "updated_at": { + "type": "string", + "format": "date-time", + "example": "2020-04-09T23:54:25Z", + "description": "The time the manifest was last updated." + }, + "tags": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "latest", + "v1", + "v2" + ], + "description": "All tags associated with this manifest" + }, + "blobs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/repository_blob" + }, + "description": "All blobs associated with this manifest" + } + } + }, + "repository_v2": { + "type": "object", + "properties": { + "registry_name": { + "type": "string", + "example": "example", + "description": "The name of the container registry." + }, + "name": { + "type": "string", + "example": "repo-1", + "description": "The name of the repository." + }, + "latest_manifest": { + "$ref": "#/components/schemas/repository_manifest" + }, + "tag_count": { + "type": "integer", + "example": 1, + "description": "The number of tags in the repository." + }, + "manifest_count": { + "type": "integer", + "example": 1, + "description": "The number of manifests in the repository." + } + } + }, + "garbage_collection": { + "type": "object", + "properties": { + "uuid": { + "type": "string", + "example": "eff0feee-49c7-4e8f-ba5c-a320c109c8a8", + "description": "A string specifying the UUID of the garbage collection." + }, + "registry_name": { + "type": "string", + "example": "example", + "description": "The name of the container registry." + }, + "status": { + "type": "string", + "enum": [ + "requested", + "waiting for write JWTs to expire", + "scanning manifests", + "deleting unreferenced blobs", + "cancelling", + "failed", + "succeeded", + "cancelled" + ], + "example": "requested", + "description": "The current status of this garbage collection." + }, + "created_at": { + "type": "string", + "format": "date-time", + "example": "2020-10-30T21:03:24Z", + "description": "The time the garbage collection was created." + }, + "updated_at": { + "type": "string", + "format": "date-time", + "example": "2020-10-30T21:03:44Z", + "description": "The time the garbage collection was last updated." + }, + "blobs_deleted": { + "type": "integer", + "example": 42, + "description": "The number of blobs deleted as a result of this garbage collection." + }, + "freed_bytes": { + "type": "integer", + "example": 667, + "description": "The number of bytes freed as a result of this garbage collection." + } + } + }, + "update_registry": { + "type": "object", + "properties": { + "cancel": { + "type": "boolean", + "example": true, + "description": "A boolean value indicating that the garbage collection should be cancelled." + } + } + }, + "subscription_tier_extended": { + "type": "object", + "properties": { + "eligible": { + "type": "boolean", + "example": true, + "description": "A boolean indicating whether your account it eligible to use a certain subscription tier." + }, + "eligibility_reasons": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "OverRepositoryLimit", + "OverStorageLimit" + ] + }, + "example": [ + "OverRepositoryLimit" + ], + "description": "If your account is not eligible to use a certain subscription tier, this will include a list of reasons that prevent you from using the tier." + } + } + }, + "neighbor_ids": { + "type": "object", + "properties": { + "neighbor_ids": { + "type": "array", + "items": { + "type": "array", + "items": { + "type": "integer" + } + }, + "description": "An array of arrays. Each array will contain a set of Droplet IDs for Droplets that share a physical server.", + "example": [ + [ + 168671828, + 168663509, + 168671815 + ], + [ + 168671883, + 168671750 + ] + ] + } + } + }, + "reserved_ip": { + "type": "object", + "properties": { + "ip": { + "type": "string", + "format": "ipv4", + "example": "45.55.96.47", + "description": "The public IP address of the reserved IP. It also serves as its identifier." + }, + "region": { + "allOf": [ + { + "$ref": "#/components/schemas/region" + }, + { + "type": "object", + "description": "The region that the reserved IP is reserved to. When you query a reserved IP, the entire region object will be returned." + } + ] + }, + "droplet": { + "description": "The Droplet that the reserved IP has been assigned to. When you query a reserved IP, if it is assigned to a Droplet, the entire Droplet object will be returned. If it is not assigned, the value will be null.", + "anyOf": [ + { + "title": "null", + "type": "object", + "nullable": true, + "description": "If the reserved IP is not assigned to a Droplet, the value will be null." + }, + { + "$ref": "#/components/schemas/droplet" + } + ], + "example": null + }, + "locked": { + "type": "boolean", + "example": true, + "description": "A boolean value indicating whether or not the reserved IP has pending actions preventing new ones from being submitted." + }, + "project_id": { + "type": "string", + "format": "uuid", + "example": "746c6152-2fa2-11ed-92d3-27aaa54e4988", + "description": "The UUID of the project to which the reserved IP currently belongs." + } + } + }, + "reserved_ip_create": { + "oneOf": [ + { + "title": "Assign to Droplet", + "type": "object", + "properties": { + "droplet_id": { + "type": "integer", + "example": 2457247, + "description": "The ID of the Droplet that the reserved IP will be assigned to." + } + }, + "required": [ + "droplet_id" + ] + }, + { + "title": "Reserve to Region", + "type": "object", + "properties": { + "region": { + "type": "string", + "example": "nyc3", + "description": "The slug identifier for the region the reserved IP will be reserved to." + }, + "project_id": { + "type": "string", + "format": "uuid", + "example": "746c6152-2fa2-11ed-92d3-27aaa54e4988", + "description": "The UUID of the project to which the reserved IP will be assigned." + } + }, + "required": [ + "region" + ] + } + ] + }, + "reserved_ip_action_type": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "assign", + "unassign" + ], + "description": "The type of action to initiate for the reserved IP." + } + }, + "discriminator": { + "propertyName": "type", + "mapping": { + "assign": "#/components/schemas/reserved_ip_action_assign", + "unassign": "#/components/schemas/reserved_ip_action_unassign" + } + } + }, + "reserved_ip_action_assign": { + "allOf": [ + { + "$ref": "#/components/schemas/reserved_ip_action_type" + }, + { + "type": "object", + "required": [ + "type", + "droplet_id" + ], + "properties": { + "droplet_id": { + "type": "integer", + "example": 758604968, + "description": "The ID of the Droplet that the reserved IP will be assigned to." + } + } + } + ] + }, + "reserved_ip_action_unassign": { + "allOf": [ + { + "$ref": "#/components/schemas/reserved_ip_action_type" + }, + { + "type": "object", + "required": [ + "type" + ] + } + ] + }, + "snapshots": { + "allOf": [ + { + "type": "object", + "properties": { + "id": { + "type": "string", + "example": "6372321", + "description": "The unique identifier for the snapshot." + } + }, + "required": [ + "id" + ] + }, + { + "$ref": "#/components/schemas/snapshots_base" + }, + { + "type": "object", + "properties": { + "resource_id": { + "type": "string", + "example": "200776916", + "description": "The unique identifier for the resource that the snapshot originated from." + }, + "resource_type": { + "type": "string", + "enum": [ + "droplet", + "volume" + ], + "example": "droplet", + "description": "The type of resource that the snapshot originated from." + }, + "tags": { + "description": "An array of Tags the snapshot has been tagged with.", + "type": "array", + "items": { + "type": "string" + }, + "nullable": true, + "example": [ + "web", + "env:prod" + ] + } + }, + "required": [ + "resource_id", + "resource_type", + "tags" + ] + } + ] + }, + "tags_metadata": { + "type": "object", + "description": "Tagged Resource Statistics include metadata regarding the resource type that has been tagged.", + "properties": { + "count": { + "type": "integer", + "description": "The number of tagged objects for this type of resource.", + "example": 5, + "minimum": 0 + }, + "last_tagged_uri": { + "type": "string", + "description": "The URI for the last tagged object for this type of resource.", + "example": "https://api.digitalocean.com/v2/images/7555620" + } + } + }, + "tags": { + "type": "object", + "description": "A tag is a label that can be applied to a resource (currently Droplets, Images, Volumes, Volume Snapshots, and Database clusters) in order to better organize or facilitate the lookups and actions on it.\nTags have two attributes: a user defined `name` attribute and an embedded `resources` attribute with information about resources that have been tagged.", + "properties": { + "name": { + "type": "string", + "description": "The name of the tag. Tags may contain letters, numbers, colons, dashes, and underscores.\nThere is a limit of 255 characters per tag.\n\n**Note:** Tag names are case stable, which means the capitalization you use when you first create a tag is canonical.\n\nWhen working with tags in the API, you must use the tag's canonical capitalization. For example, if you create a tag named \"PROD\", the URL to add that tag to a resource would be `https://api.digitalocean.com/v2/tags/PROD/resources` (not `/v2/tags/prod/resources`).\n\nTagged resources in the control panel will always display the canonical capitalization. For example, if you create a tag named \"PROD\", you can tag resources in the control panel by entering \"prod\". The tag will still display with its canonical capitalization, \"PROD\".\n", + "pattern": "^[a-zA-Z0-9_\\-\\:]+$", + "maxLength": 255, + "example": "extra-awesome" + }, + "resources": { + "type": "object", + "description": "An embedded object containing key value pairs of resource type and resource statistics. It also includes a count of the total number of resources tagged with the current tag as well as a `last_tagged_uri` attribute set to the last resource tagged with the current tag.", + "readOnly": true, + "allOf": [ + { + "$ref": "#/components/schemas/tags_metadata" + }, + { + "properties": { + "droplets": { + "$ref": "#/components/schemas/tags_metadata" + }, + "imgages": { + "$ref": "#/components/schemas/tags_metadata" + }, + "volumes": { + "$ref": "#/components/schemas/tags_metadata" + }, + "volume_snapshots": { + "$ref": "#/components/schemas/tags_metadata" + }, + "databases": { + "$ref": "#/components/schemas/tags_metadata" + } + } + } + ], + "example": { + "count": 5, + "last_tagged_uri": "https://api.digitalocean.com/v2/images/7555620", + "droplets": { + "count": 1, + "last_tagged_uri": "https://api.digitalocean.com/v2/droplets/3164444" + }, + "images": { + "count": 1, + "last_tagged_uri": "https://api.digitalocean.com/v2/images/7555620" + }, + "volumes": { + "count": 1, + "last_tagged_uri": "https://api.digitalocean.com/v2/volumes/3d80cb72-342b-4aaa-b92e-4e4abb24a933" + }, + "volume_snapshots": { + "count": 1, + "last_tagged_uri": "https://api.digitalocean.com/v2/snapshots/1f6f46e8-6b60-11e9-be4e-0a58ac144519" + }, + "databases": { + "count": 1, + "last_tagged_uri": "https://api.digitalocean.com/v2/databases/b92438f6-ba03-416c-b642-e9236db91976" + } + } + } + } + }, + "error_with_root_causes": { + "type": "object", + "properties": { + "error": { + "description": "A message providing information about the error.", + "type": "string", + "example": "not_found" + }, + "messages": { + "description": "A list of error messages.", + "type": "array", + "items": { + "type": "string" + }, + "nullable": true, + "example": null + }, + "root_causes": { + "description": "A list of underlying causes for the error, including details to help resolve it when possible.", + "type": "array", + "items": { + "type": "string" + }, + "example": [] + } + }, + "required": [ + "error", + "root_causes" + ] + }, + "tags_resource": { + "type": "object", + "properties": { + "resources": { + "description": "An array of objects containing resource_id and resource_type attributes.", + "type": "array", + "items": { + "properties": { + "resource_id": { + "type": "string", + "description": "The identifier of a resource.", + "example": "3d80cb72-342b-4aaa-b92e-4e4abb24a933" + }, + "resource_type": { + "type": "string", + "description": "The type of the resource.", + "example": "volume", + "enum": [ + "droplet", + "image", + "volume", + "volume_snapshot" + ] + } + } + }, + "example": [ + { + "resource_id": "9569411", + "resource_type": "droplet" + }, + { + "resource_id": "7555620", + "resource_type": "image" + }, + { + "resource_id": "3d80cb72-342b-4aaa-b92e-4e4abb24a933", + "resource_type": "volume" + } + ] + } + }, + "required": [ + "resources" + ] + }, + "volume_base": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "The unique identifier for the block storage volume.", + "example": "506f78a4-e098-11e5-ad9f-000f53306ae1", + "readOnly": true + }, + "droplet_ids": { + "type": "array", + "items": { + "type": "integer" + }, + "nullable": true, + "description": "An array containing the IDs of the Droplets the volume is attached to. Note that at this time, a volume can only be attached to a single Droplet.", + "example": [], + "readOnly": true + }, + "name": { + "type": "string", + "description": "A human-readable name for the block storage volume. Must be lowercase and be composed only of numbers, letters and \"-\", up to a limit of 64 characters. The name must begin with a letter.", + "example": "example" + }, + "description": { + "type": "string", + "description": "An optional free-form text field to describe a block storage volume.", + "example": "Block store for examples" + }, + "size_gigabytes": { + "type": "integer", + "description": "The size of the block storage volume in GiB (1024^3). This field does not apply when creating a volume from a snapshot.", + "example": 10 + }, + "created_at": { + "type": "string", + "description": "A time value given in ISO8601 combined date and time format that represents when the block storage volume was created.", + "example": "2020-03-02T17:00:49Z", + "readOnly": true + }, + "tags": { + "$ref": "#/components/schemas/tags_array" + } + } + }, + "volume_full": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/volume_base" + }, + { + "properties": { + "region": { + "allOf": [ + { + "description": "The region that the block storage volume is located in. When setting a region, the value should be the slug identifier for the region. When you query a block storage volume, the entire region object will be returned." + }, + { + "$ref": "#/components/schemas/region" + } + ], + "example": { + "name": "New York 1", + "slug": "nyc1", + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192gb" + ], + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata" + ], + "available": true + }, + "readOnly": true + }, + "filesystem_type": { + "type": "string", + "description": "The type of filesystem currently in-use on the volume.", + "example": "ext4" + }, + "filesystem_label": { + "type": "string", + "description": "The label currently applied to the filesystem.", + "example": "example" + } + } + } + ] + }, + "volume_snapshot_id": { + "properties": { + "snapshot_id": { + "type": "string", + "description": "The unique identifier for the volume snapshot from which to create the volume.", + "example": "b0798135-fb76-11eb-946a-0a58ac146f33" + } + } + }, + "volume_write_file_system_type": { + "type": "object", + "properties": { + "filesystem_type": { + "type": "string", + "description": "The name of the filesystem type to be used on the volume. When provided, the volume will automatically be formatted to the specified filesystem type. Currently, the available options are `ext4` and `xfs`. Pre-formatted volumes are automatically mounted when attached to Ubuntu, Debian, Fedora, Fedora Atomic, and CentOS Droplets created on or after April 26, 2018. Attaching pre-formatted volumes to other Droplets is not recommended.", + "example": "ext4" + } + } + }, + "volume_write_file_system_label": { + "type": "string", + "description": "The label applied to the filesystem. Labels for ext4 type filesystems may contain 16 characters while labels for xfs type filesystems are limited to 12 characters. May only be used in conjunction with filesystem_type.", + "example": "example" + }, + "volumes_ext4": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/volume_base" + }, + { + "$ref": "#/components/schemas/volume_snapshot_id" + }, + { + "$ref": "#/components/schemas/volume_write_file_system_type" + }, + { + "properties": { + "region": { + "$ref": "#/components/schemas/region_slug" + }, + "filesystem_label": { + "allOf": [ + { + "$ref": "#/components/schemas/volume_write_file_system_label" + }, + { + "maxLength": 16 + } + ] + } + }, + "required": [ + "name", + "size_gigabytes", + "region" + ] + } + ] + }, + "volumes_xfs": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/volume_base" + }, + { + "$ref": "#/components/schemas/volume_snapshot_id" + }, + { + "$ref": "#/components/schemas/volume_write_file_system_type" + }, + { + "properties": { + "region": { + "$ref": "#/components/schemas/region_slug" + }, + "filesystem_label": { + "allOf": [ + { + "$ref": "#/components/schemas/volume_write_file_system_label" + }, + { + "maxLength": 12 + } + ] + } + }, + "required": [ + "name", + "size_gigabytes", + "region" + ] + } + ] + }, + "volume_action_post_base": { + "type": "object", + "properties": { + "type": { + "type": "string", + "description": "The volume action to initiate.", + "enum": [ + "attach", + "detach", + "resize" + ], + "example": "attach" + }, + "region": { + "$ref": "#/components/schemas/region_slug" + } + }, + "required": [ + "type" + ] + }, + "volume_action_droplet_id": { + "type": "integer", + "description": "The unique identifier for the Droplet the volume will be attached or detached from.", + "example": 11612190 + }, + "volume_action_post_attach": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/volume_action_post_base" + }, + { + "properties": { + "droplet_id": { + "$ref": "#/components/schemas/volume_action_droplet_id" + }, + "tags": { + "$ref": "#/components/schemas/tags_array" + } + }, + "required": [ + "droplet_id" + ] + } + ] + }, + "volume_action_post_detach": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/volume_action_post_base" + }, + { + "properties": { + "droplet_id": { + "$ref": "#/components/schemas/volume_action_droplet_id" + } + }, + "required": [ + "droplet_id" + ] + } + ] + }, + "volumeAction": { + "type": "object", + "allOf": [ + { + "properties": { + "type": { + "type": "string", + "description": "This is the type of action that the object represents. For example, this could be \"attach_volume\" to represent the state of a volume attach action.", + "example": "attach_volume" + }, + "resource_id": { + "type": "integer", + "nullable": true, + "example": null + } + } + }, + { + "$ref": "#/components/schemas/action" + } + ] + }, + "volume_action_post_resize": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/volume_action_post_base" + }, + { + "properties": { + "size_gigabytes": { + "type": "integer", + "description": "The new size of the block storage volume in GiB (1024^3).", + "maximum": 16384 + } + }, + "required": [ + "size_gigabytes" + ] + } + ] + }, + "vpc_updatable": { + "type": "object", + "properties": { + "name": { + "type": "string", + "pattern": "^[a-zA-Z0-9\\-\\.]+$", + "example": "env.prod-vpc", + "description": "The name of the VPC. Must be unique and may only contain alphanumeric characters, dashes, and periods." + }, + "description": { + "type": "string", + "maxLength": 255, + "example": "VPC for production environment", + "description": "A free-form text field for describing the VPC's purpose. It may be a maximum of 255 characters." + } + } + }, + "vpc_create": { + "type": "object", + "properties": { + "region": { + "type": "string", + "example": "nyc1", + "description": "The slug identifier for the region where the VPC will be created." + }, + "ip_range": { + "type": "string", + "example": "10.10.10.0/24", + "description": "The range of IP addresses in the VPC in CIDR notation. Network ranges cannot overlap with other networks in the same account and must be in range of private addresses as defined in RFC1918. It may not be smaller than `/28` nor larger than `/16`. If no IP range is specified, a `/20` network range is generated that won't conflict with other VPC networks in your account." + } + } + }, + "vpc_default": { + "type": "object", + "properties": { + "default": { + "type": "boolean", + "example": true, + "description": "A boolean value indicating whether or not the VPC is the default network for the region. All applicable resources are placed into the default VPC network unless otherwise specified during their creation. The `default` field cannot be unset from `true`. If you want to set a new default VPC network, update the `default` field of another VPC network in the same region. The previous network's `default` field will be set to `false` when a new default VPC has been defined." + } + } + }, + "vpc_base": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "example": "5a4981aa-9653-4bd1-bef5-d6bff52042e4", + "description": "A unique ID that can be used to identify and reference the VPC." + }, + "urn": { + "$ref": "#/components/schemas/urn" + }, + "created_at": { + "type": "string", + "format": "date-time", + "readOnly": true, + "example": "2020-03-13T19:20:47.442049222Z", + "description": "A time value given in ISO8601 combined date and time format." + } + } + }, + "vpc": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/vpc_updatable" + }, + { + "$ref": "#/components/schemas/vpc_create" + }, + { + "$ref": "#/components/schemas/vpc_default" + }, + { + "$ref": "#/components/schemas/vpc_base" + } + ] + }, + "vpc_member": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "nyc1-load-balancer-01", + "description": "The name of the resource." + }, + "urn": { + "$ref": "#/components/schemas/urn" + }, + "created_at": { + "type": "string", + "example": "2020-03-13T19:30:48Z", + "description": "A time value given in ISO8601 combined date and time format that represents when the resource was created." + } + } + }, + "check_base": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "example": "5a4981aa-9653-4bd1-bef5-d6bff52042e4", + "description": "A unique ID that can be used to identify and reference the check." + } + } + }, + "check_updatable": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "Landing page check", + "description": "A human-friendly display name." + }, + "type": { + "type": "string", + "example": "https", + "enum": [ + "ping", + "http", + "https" + ], + "description": "The type of health check to perform." + }, + "target": { + "type": "string", + "format": "url", + "example": "https://www.landingpage.com", + "description": "The endpoint to perform healthchecks on." + }, + "regions": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "us_east", + "us_west", + "eu_west", + "se_asia" + ] + }, + "example": [ + "us_east", + "eu_west" + ], + "description": "An array containing the selected regions to perform healthchecks from." + }, + "enabled": { + "type": "boolean", + "example": true, + "default": true, + "description": "A boolean value indicating whether the check is enabled/disabled." + } + } + }, + "check": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/check_base" + }, + { + "$ref": "#/components/schemas/check_updatable" + } + ] + }, + "region_state": { + "type": "object", + "properties": { + "status": { + "type": "string", + "example": "UP", + "enum": [ + "DOWN", + "UP", + "CHECKING" + ] + }, + "status_changed_at": { + "type": "string", + "example": "2022-03-17T22:28:51Z" + }, + "thirty_day_uptime_percentage": { + "type": "number", + "example": 97.99 + } + } + }, + "regional_state": { + "type": "object", + "description": "A map of region to regional state", + "properties": { + "us_east": { + "$ref": "#/components/schemas/region_state" + }, + "eu_west": { + "$ref": "#/components/schemas/region_state" + } + } + }, + "previous_outage": { + "type": "object", + "properties": { + "region": { + "type": "string", + "example": "us_east" + }, + "started_at": { + "type": "string", + "example": "2022-03-17T18:04:55Z" + }, + "ended_at": { + "type": "string", + "example": "2022-03-17T18:06:55Z" + }, + "duration_seconds": { + "type": "integer", + "example": 120 + } + } + }, + "state": { + "type": "object", + "properties": { + "regions": { + "$ref": "#/components/schemas/regional_state" + }, + "previous_outage": { + "$ref": "#/components/schemas/previous_outage" + } + } + }, + "alert_base": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "readOnly": true, + "example": "5a4981aa-9653-4bd1-bef5-d6bff52042e4", + "description": "A unique ID that can be used to identify and reference the alert." + } + } + }, + "notification": { + "type": "object", + "description": "The notification settings for a trigger alert.", + "required": [ + "slack", + "email" + ], + "properties": { + "email": { + "description": "An email to notify on an alert trigger.", + "example": [ + "bob@example.com" + ], + "type": "array", + "items": { + "type": "string" + } + }, + "slack": { + "type": "array", + "description": "Slack integration details.", + "items": { + "type": "object", + "required": [ + "url", + "channel" + ], + "properties": { + "channel": { + "type": "string", + "format": "string", + "example": "Production Alerts", + "description": "Slack channel to notify of an alert trigger." + }, + "url": { + "type": "string", + "format": "string", + "description": "Slack Webhook URL.", + "example": "https://hooks.slack.com/services/T1234567/AAAAAAAA/ZZZZZZ" + } + } + } + } + } + }, + "alert_updatable": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "Landing page degraded performance", + "description": "A human-friendly display name." + }, + "type": { + "type": "string", + "example": "latency", + "enum": [ + "latency", + "down", + "down_global", + "ssl_expiry" + ], + "description": "The type of alert." + }, + "threshold": { + "type": "integer", + "example": 300, + "description": "The threshold at which the alert will enter a trigger state. The specific threshold is dependent on the alert type." + }, + "comparison": { + "type": "string", + "example": "greater_than", + "description": "The comparison operator used against the alert's threshold.", + "enum": [ + "greater_than", + "less_than" + ] + }, + "notifications": { + "$ref": "#/components/schemas/notification" + }, + "period": { + "type": "string", + "example": "2m", + "description": "Period of time the threshold must be exceeded to trigger the alert.", + "enum": [ + "2m", + "3m", + "5m", + "10m", + "15m", + "30m", + "1h" + ] + } + } + }, + "alert": { + "type": "object", + "allOf": [ + { + "$ref": "#/components/schemas/alert_base" + }, + { + "$ref": "#/components/schemas/alert_updatable" + } + ] + } + }, + "responses": { + "unexpected_error": { + "description": "Unexpected error", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error" + }, + "example": { + "id": "example_error", + "message": "some error message" + } + } + } + }, + "oneClicks_all": { + "description": "A JSON object with a key of `1_clicks`.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "1_clicks": { + "type": "array", + "items": { + "$ref": "#/components/schemas/oneClicks" + } + } + } + }, + "examples": { + "All 1-Click Applications": { + "value": { + "1_clicks": [ + { + "slug": "monitoring", + "type": "kubernetes" + }, + { + "slug": "wordpress-18-04", + "type": "droplet" + } + ] + } + } + } + } + } + }, + "unauthorized": { + "description": "Unauthorized", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error" + }, + "example": { + "id": "unauthorized", + "message": "Unable to authenticate you." + } + } + } + }, + "too_many_requests": { + "description": "API Rate limit exceeded", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error" + }, + "example": { + "id": "too_many_requests", + "message": "API Rate limit exceeded." + } + } + } + }, + "server_error": { + "description": "Server error.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error" + }, + "example": { + "id": "server_error", + "message": "Unexpected server-side error" + } + } + } + }, + "oneClicks_create": { + "description": "The response will verify that a job has been successfully created to install a 1-Click. The\npost-installation lifecycle of a 1-Click application can not be managed via the DigitalOcean\nAPI. For additional details specific to the 1-Click, find and view its\n[DigitalOcean Marketplace](https://marketplace.digitalocean.com) page.\n", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "A message about the result of the request.", + "example": "Successfully kicked off addon job." + } + } + }, + "examples": { + "Install a 1-Click Application": { + "value": { + "message": "Successfully kicked off addon job." + } + } + } + } + } + }, + "account": { + "description": "A JSON object keyed on account with an excerpt of the current user account data.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "account": { + "$ref": "#/components/schemas/account" + } + } + } + } + } + }, + "sshKeys_all": { + "description": "A JSON object with the key set to `ssh_keys`. The value is an array of `ssh_key` objects, each of which contains the standard `ssh_key` attributes.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "properties": { + "ssh_keys": { + "type": "array", + "items": { + "$ref": "#/components/schemas/sshKeys" + } + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ], + "example": { + "ssh_keys": [ + { + "id": 289794, + "fingerprint": "3b:16:e4:bf:8b:00:8b:b8:59:8c:a9:d3:f0:19:fa:45", + "public_key": "ssh-rsa ANOTHEREXAMPLEaC1yc2EAAAADAQABAAAAQQDDHr/jh2Jy4yALcK4JyWbVkPRaWmhck3IgCoeOO3z1e2dBowLh64QAM+Qb72pxekALga2oi4GvT+TlWNhzPH4V anotherexample", + "name": "Other Public Key" + } + ], + "links": {}, + "meta": { + "total": 1 + } + } + } + } + } + }, + "sshKeys_new": { + "description": "The response body will be a JSON object with a key set to `ssh_key`.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "ssh_key": { + "$ref": "#/components/schemas/sshKeys" + } + } + } + } + }, + "links": { + "sshKeys_get_by_id": { + "$ref": "#/components/links/sshKeys_get_by_id" + }, + "sshKeys_get_by_fingerprint": { + "$ref": "#/components/links/sshKeys_get_by_fingerprint" + }, + "sshKeys_delete_by_id": { + "$ref": "#/components/links/sshKeys_delete_by_id" + }, + "sshKeys_delete_by_fingerprint": { + "$ref": "#/components/links/sshKeys_delete_by_fingerprint" + } + } + }, + "sshKeys_existing": { + "description": "A JSON object with the key set to `ssh_key`. The value is an `ssh_key` object containing the standard `ssh_key` attributes.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "ssh_key": { + "$ref": "#/components/schemas/sshKeys" + } + } + } + } + }, + "links": { + "sshKeys_get_by_id": { + "$ref": "#/components/links/sshKeys_get_by_id" + }, + "sshKeys_get_by_fingerprint": { + "$ref": "#/components/links/sshKeys_get_by_fingerprint" + }, + "sshKeys_delete_by_id": { + "$ref": "#/components/links/sshKeys_delete_by_id" + }, + "sshKeys_delete_by_fingerprint": { + "$ref": "#/components/links/sshKeys_delete_by_fingerprint" + } + } + }, + "not_found": { + "description": "The resource was not found.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error" + }, + "example": { + "id": "not_found", + "message": "The resource you requested could not be found." + } + } + } + }, + "no_content": { + "description": "The action was successful and the response body is empty.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + } + }, + "actions": { + "description": "The results will be returned as a JSON object with an actions key. This will be set to an array filled with action objects containing the standard action attributes", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "actions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/action" + } + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ] + } + } + } + }, + "action": { + "description": "The result will be a JSON object with an action key. This will be set to an action object containing the standard action attributes.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "action": { + "$ref": "#/components/schemas/action" + } + } + } + } + } + }, + "list_apps": { + "description": "A JSON object with a `apps` key. This is list of object `apps`.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/apps_response" + }, + "examples": { + "apps": { + "$ref": "#/components/examples/apps" + } + } + } + }, + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + } + }, + "new_app": { + "description": "A JSON or YAML of a `spec` object.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/app_response" + }, + "examples": { + "app": { + "$ref": "#/components/examples/app" + } + } + } + }, + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + } + }, + "apps_get": { + "description": "A JSON with key `app`", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/app_response" + }, + "examples": { + "app": { + "$ref": "#/components/examples/app" + } + } + } + }, + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + } + }, + "update_app": { + "description": "A JSON object of the updated `app`", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/app_response" + }, + "examples": { + "app": { + "$ref": "#/components/examples/app" + } + } + } + }, + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + } + }, + "delete_app": { + "description": "the ID of the app deleted.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/apps_delete_app_response" + }, + "example": { + "id": "b7d64052-3706-4cb7-b21a-c5a2f44e63b3" + } + } + }, + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + } + }, + "list_logs": { + "description": "A JSON object with urls that point to archived logs", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/apps_get_logs_response" + }, + "examples": { + "logs": { + "$ref": "#/components/examples/logs" + } + } + } + }, + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + } + }, + "existing_deployments": { + "description": "A JSON object with a `deployments` key. This will be a list of all app deployments", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/apps_deployments_response" + }, + "examples": { + "deployments": { + "$ref": "#/components/examples/deployments" + } + } + } + }, + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + } + }, + "new_app_deployment": { + "description": "A JSON object with a `deployment` key.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/apps_deployment_response" + }, + "examples": { + "deployment": { + "$ref": "#/components/examples/deployment" + } + } + } + }, + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + } + }, + "list_deployment": { + "description": "A JSON of the requested deployment", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/apps_deployment_response" + }, + "examples": { + "deployment": { + "$ref": "#/components/examples/deployment" + } + } + } + }, + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + } + }, + "cancel_deployment": { + "description": "A JSON the `deployment` that was just cancelled.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/apps_deployment_response" + }, + "examples": { + "deployment": { + "$ref": "#/components/examples/deployment" + } + } + } + }, + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + } + }, + "all_tiers": { + "description": "A JSON object with a `tiers` key. This will be a list of all app tiers", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/apps_list_tiers_response" + }, + "examples": { + "tiers": { + "$ref": "#/components/examples/tiers" + } + } + } + }, + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + } + }, + "get_tier": { + "description": "A JSON with the key `tier`", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/apps_get_tier_response" + }, + "examples": { + "tier": { + "$ref": "#/components/examples/tier" + } + } + } + }, + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + } + }, + "list_instance": { + "description": "A JSON with key `instance_sizes`", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/apps_list_instance_sizes_response" + }, + "examples": { + "instance_sizes": { + "$ref": "#/components/examples/instance_sizes" + } + } + } + }, + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + } + }, + "get_instance": { + "description": "A JSON with key `instance_size`", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/apps_get_instance_size_response" + }, + "examples": { + "instance_size": { + "$ref": "#/components/examples/instance_size" + } + } + } + }, + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + } + }, + "list_regions": { + "description": "A JSON object with key `regions`", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/apps_list_regions_response" + }, + "examples": { + "regions": { + "$ref": "#/components/examples/regions" + } + } + } + }, + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + } + }, + "propose_app": { + "description": "A JSON object.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/app_propose_response" + }, + "examples": { + "propose": { + "$ref": "#/components/examples/propose" + } + } + } + }, + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + } + }, + "list_alerts": { + "description": "A JSON object with a `alerts` key. This is list of object `alerts`.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/apps_list_alerts_response" + }, + "examples": { + "apps": { + "$ref": "#/components/examples/alerts" + } + } + } + }, + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + } + }, + "assign_alert_destinations": { + "description": "A JSON object with an `alert` key. This is an object of type `alert`.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/apps_alert_response" + }, + "examples": { + "apps": { + "$ref": "#/components/examples/alert" + } + } + } + }, + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + } + }, + "apps_validate_rollback": { + "description": "A JSON object with the validation results.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "valid": { + "type": "boolean", + "description": "Indicates whether the app can be rolled back to the specified deployment." + }, + "error": { + "allOf": [ + { + "description": "Contains the failing condition that is causing the rollback to be invalid." + }, + { + "$ref": "#/components/schemas/app_rollback_validation_condition" + } + ] + }, + "warnings": { + "type": "array", + "description": "Contains a list of warnings that may cause the rollback to run under unideal circumstances.", + "items": { + "$ref": "#/components/schemas/app_rollback_validation_condition" + } + } + } + }, + "examples": { + "Valid rollback": { + "value": { + "valid": true + } + }, + "Valid rollback with warnings": { + "value": { + "valid": true, + "warnings": [ + { + "code": "image_source_missing_digest", + "components": [ + "docker-worker" + ], + "message": "one or more components are missing an image digest and are not guaranteed rollback to the old version" + } + ] + } + }, + "Invalid rollback": { + "value": { + "valid": false, + "error": { + "code": "incompatible_result", + "message": "deployment result \"failed\" is unsuitable for rollback" + } + } + } + } + } + }, + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + } + }, + "get_metrics_bandwidth_usage": { + "description": "A JSON object with a `app_bandwidth_usage` key", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/app_metrics_bandwidth_usage" + }, + "examples": { + "app_bandwidth_usage": { + "$ref": "#/components/examples/app_bandwidth_usage" + } + } + } + }, + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + } + }, + "list_metrics_bandwidth_usage": { + "description": "A JSON object with a `app_bandwidth_usage` key", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/app_metrics_bandwidth_usage" + }, + "examples": { + "app_bandwidth_usage": { + "$ref": "#/components/examples/app_bandwidth_usage_multiple" + } + } + } + }, + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + } + }, + "all_cdn_endpoints": { + "description": "The result will be a JSON object with an `endpoints` key. This will be set to an array of endpoint objects, each of which will contain the standard CDN endpoint attributes.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "endpoints": { + "type": "array", + "items": { + "$ref": "#/components/schemas/cdn_endpoint" + } + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ], + "example": { + "endpoints": [ + { + "id": "19f06b6a-3ace-4315-b086-499a0e521b76", + "origin": "static-images.nyc3.digitaloceanspaces.com", + "endpoint": "static-images.nyc3.cdn.digitaloceanspaces.com", + "created_at": "2018-07-19T15:04:16Z", + "certificate_id": "892071a0-bb95-49bc-8021-3afd67a210bf", + "custom_domain": "static.example.com", + "ttl": 3600 + } + ], + "links": {}, + "meta": { + "total": 1 + } + } + } + } + } + }, + "existing_endpoint": { + "description": "The response will be a JSON object with an `endpoint` key. This will be set to an object containing the standard CDN endpoint attributes.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "endpoint": { + "$ref": "#/components/schemas/cdn_endpoint" + } + } + }, + "examples": { + "CDN Endpoint": { + "value": { + "endpoint": { + "id": "19f06b6a-3ace-4315-b086-499a0e521b76", + "origin": "static-images.nyc3.digitaloceanspaces.com", + "endpoint": "static-images.nyc3.cdn.digitaloceanspaces.com", + "created_at": "2018-07-19T15:04:16Z", + "ttl": 3600 + } + } + }, + "CDN Endpoint With Custom Domain": { + "value": { + "endpoint": { + "id": "19f06b6a-3ace-4315-b086-499a0e521b76", + "origin": "static-images.nyc3.digitaloceanspaces.com", + "endpoint": "static-images.nyc3.cdn.digitaloceanspaces.com", + "created_at": "2018-07-19T15:04:16Z", + "certificate_id": "892071a0-bb95-49bc-8021-3afd67a210bf", + "custom_domain": "static.example.com", + "ttl": 3600 + } + } + } + } + } + } + }, + "all_certificates": { + "description": "The result will be a JSON object with a `certificates` key. This will be set to an array of certificate objects, each of which will contain the standard certificate attributes.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "certificates": { + "type": "array", + "items": { + "$ref": "#/components/schemas/certificate" + } + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ] + }, + "examples": { + "AllCertificates": { + "$ref": "#/components/examples/certificates_all" + } + } + } + } + }, + "new_certificate": { + "description": "The response will be a JSON object with a key called `certificate`. The value of this will be an object that contains the standard attributes associated with a certificate.\nWhen using Let's Encrypt, the initial value of the certificate's `state` attribute will be `pending`. When the certificate has been successfully issued by Let's Encrypt, this will transition to `verified` and be ready for use.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "certificate": { + "$ref": "#/components/schemas/certificate" + } + } + }, + "examples": { + "Custom Certificate": { + "$ref": "#/components/examples/certificates_custom" + }, + "Let's Encrypt Certificate": { + "$ref": "#/components/examples/certificates_lets_encrypt_pending" + } + } + } + } + }, + "existing_certificate": { + "description": "The response will be a JSON object with a `certificate` key. This will be set to an object containing the standard certificate attributes.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "certificate": { + "$ref": "#/components/schemas/certificate" + } + } + }, + "examples": { + "Custom Certificate": { + "$ref": "#/components/examples/certificates_custom" + }, + "Let's Encrypt Certificate": { + "$ref": "#/components/examples/certificates_lets_encrypt" + } + } + } + } + }, + "balance": { + "description": "The response will be a JSON object that contains the following attributes", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/balance" + }, + "example": { + "month_to_date_balance": "23.44", + "account_balance": "12.23", + "month_to_date_usage": "11.21", + "generated_at": "2019-07-09T15:01:12Z" + } + } + } + }, + "billing_history": { + "description": "The response will be a JSON object that contains the following attributes", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "billing_history": { + "type": "array", + "items": { + "$ref": "#/components/schemas/billing_history" + } + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta_optional_total" + } + ], + "example": { + "billing_history": [ + { + "description": "Invoice for May 2018", + "amount": "12.34", + "invoice_id": "123", + "invoice_uuid": "example-uuid", + "date": "2018-06-01T08:44:38Z", + "type": "Invoice" + }, + { + "description": "Payment (MC 2018)", + "amount": "-12.34", + "date": "2018-06-02T08:44:38Z", + "type": "Payment" + } + ], + "links": { + "pages": { + "next": "https://api.digitalocean.com/v2/customers/my/billing_history?page=2&per_page=2", + "last": "https://api.digitalocean.com/v2/customers/my/billing_history?page=3&per_page=2" + } + }, + "meta": { + "total": 5 + } + } + } + } + } + }, + "invoices": { + "description": "The response will be a JSON object contains that contains a list of invoices under the `invoices` key, and the invoice preview under the `invoice_preview` key.\nEach element contains the invoice summary attributes.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "invoices": { + "type": "array", + "items": { + "$ref": "#/components/schemas/invoice_preview" + } + }, + "invoice_preview": { + "$ref": "#/components/schemas/invoice_preview" + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ], + "example": { + "invoices": [ + { + "invoice_uuid": "22737513-0ea7-4206-8ceb-98a575af7681", + "amount": "12.34", + "invoice_period": "2019-12" + }, + { + "invoice_uuid": "fdabb512-6faf-443c-ba2e-665452332a9e", + "amount": "23.45", + "invoice_period": "2019-11" + } + ], + "invoice_preview": { + "invoice_uuid": "1afe95e6-0958-4eb0-8d9a-9c5060d3ef03", + "amount": "34.56", + "invoice_period": "2020-02", + "updated_at": "2020-02-23T06:31:50Z" + }, + "links": { + "pages": { + "next": "https://api.digitalocean.com/v2/customers/my/invoices?page=2&per_page=2", + "last": "https://api.digitalocean.com/v2/customers/my/invoices?page=35&per_page=2" + } + }, + "meta": { + "total": 70 + } + } + } + } + } + }, + "invoice": { + "description": "The response will be a JSON object with a key called `invoice_items`. This will be set to an array of invoice item objects.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "invoice_items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/invoice_item" + } + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ], + "example": { + "invoice_items": [ + { + "product": "Kubernetes Clusters", + "resource_uuid": "711157cb-37c8-4817-b371-44fa3504a39c", + "group_description": "my-doks-cluster", + "description": "a56e086a317d8410c8b4cfd1f4dc9f82", + "amount": "12.34", + "duration": "744", + "duration_unit": "Hours", + "start_time": "2020-01-01T00:00:00Z", + "end_time": "2020-02-01T00:00:00Z" + }, + { + "product": "Spaces Subscription", + "description": "Spaces ($5/mo 250GB storage & 1TB bandwidth)", + "amount": "34.45", + "duration": "744", + "duration_unit": "Hours", + "start_time": "2020-01-01T00:00:00Z", + "end_time": "2020-02-01T00:00:00Z" + } + ], + "links": { + "pages": { + "next": "https://api.digitalocean.com/v2/customers/my/invoices/22737513-0ea7-4206-8ceb-98a575af7681?page=2&per_page=2", + "last": "https://api.digitalocean.com/v2/customers/my/invoices/22737513-0ea7-4206-8ceb-98a575af7681?page=3&per_page=2" + } + }, + "meta": { + "total": 6 + } + } + } + } + } + }, + "invoice_csv": { + "description": "The response will be a CSV file.", + "headers": { + "content-disposition": { + "$ref": "#/components/headers/content-disposition" + }, + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "text/csv": { + "schema": { + "type": "string" + }, + "example": "product,group_description,description,hours,start,end,USD,project_name,category\nFloating IPs,,Unused Floating IP - 1.1.1.1,100,2020-07-01 00:00:00 +0000,2020-07-22 18:14:39 +0000,$3.11,,iaas\nTaxes,,STATE SALES TAX (6.25%),,2020-07-01 00:00:00 +0000,2020-07-31 23:59:59 +0000,$0.16,,iaas\n" + } + } + }, + "invoice_pdf": { + "description": "The response will be a PDF file.", + "headers": { + "content-disposition": { + "$ref": "#/components/headers/content-disposition" + }, + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/pdf": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "invoice_summary": { + "description": "To retrieve a summary for an invoice, send a GET request to `/v2/customers/my/invoices/$INVOICE_UUID/summary`.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/invoice_summary" + }, + "example": { + "invoice_uuid": "22737513-0ea7-4206-8ceb-98a575af7681", + "billing_period": "2020-01", + "amount": "27.13", + "user_name": "Sammy Shark", + "user_billing_address": { + "address_line1": "101 Shark Row", + "city": "Atlantis", + "region": "OC", + "postal_code": "12345", + "country_iso2_code": "US", + "created_at": "2019-09-03T16:34:46.000+00:00", + "updated_at": "2019-09-03T16:34:46.000+00:00" + }, + "user_company": "DigitalOcean", + "user_email": "sammy@digitalocean.com", + "product_charges": { + "name": "Product usage charges", + "amount": "12.34", + "items": [ + { + "amount": "10.00", + "name": "Spaces Subscription", + "count": "1" + }, + { + "amount": "2.34", + "name": "Database Clusters", + "count": "1" + } + ] + }, + "overages": { + "name": "Overages", + "amount": "3.45" + }, + "taxes": { + "name": "Taxes", + "amount": "4.56" + }, + "credits_and_adjustments": { + "name": "Credits & adjustments", + "amount": "6.78" + } + } + } + } + }, + "options": { + "description": "A JSON string with a key of `options`.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/options" + }, + "example": { + "options": { + "kafka": { + "regions": [ + "ams3", + "blr1", + "fra1", + "lon1", + "nyc1", + "nyc3", + "sfo2", + "sfo3", + "sgp1", + "syd1", + "tor1" + ], + "versions": [ + "3.4", + "3.5" + ], + "layouts": [ + { + "num_nodes": 3, + "sizes": [ + "db-s-1vcpu-2gb", + "db-s-2vcpu-4gb", + "gd-2vcpu-8gb", + "gd-4vcpu-16gb", + "gd-8vcpu-32gb", + "gd-16vcpu-64gb", + "gd-32vcpu-128gb", + "gd-40vcpu-160gb" + ] + } + ] + }, + "mongodb": { + "regions": [ + "ams3", + "blr1", + "fra1", + "lon1", + "nyc1", + "nyc3", + "sfo2", + "sfo3", + "sgp1", + "syd1", + "tor1" + ], + "versions": [ + "4.4", + "5.0", + "6.0" + ], + "layouts": [ + { + "num_nodes": 1, + "sizes": [ + "db-s-1vcpu-1gb", + "db-s-1vcpu-2gb", + "db-s-2vcpu-4gb", + "db-s-4vcpu-8gb", + "db-s-6vcpu-16gb", + "db-s-8vcpu-32gb", + "db-s-16vcpu-64gb", + "gd-2vcpu-8gb", + "gd-4vcpu-16gb", + "gd-8vcpu-32gb", + "gd-16vcpu-64gb", + "gd-32vcpu-128gb", + "gd-40vcpu-160gb", + "so1_5-2vcpu-16gb", + "so1_5-4vcpu-32gb", + "so1_5-8vcpu-64gb", + "so1_5-16vcpu-128gb", + "so1_5-24vcpu-192gb", + "so1_5-32vcpu-256gb" + ] + }, + { + "num_nodes": 3, + "sizes": [ + "db-s-1vcpu-1gb", + "db-s-1vcpu-2gb", + "db-s-2vcpu-4gb", + "db-s-4vcpu-8gb", + "db-s-6vcpu-16gb", + "db-s-8vcpu-32gb", + "db-s-16vcpu-64gb", + "gd-2vcpu-8gb", + "gd-4vcpu-16gb", + "gd-8vcpu-32gb", + "gd-16vcpu-64gb", + "gd-32vcpu-128gb", + "gd-40vcpu-160gb", + "so1_5-2vcpu-16gb", + "so1_5-4vcpu-32gb", + "so1_5-8vcpu-64gb", + "so1_5-16vcpu-128gb", + "so1_5-24vcpu-192gb", + "so1_5-32vcpu-256gb" + ] + } + ] + }, + "mysql": { + "regions": [ + "ams3", + "blr1", + "fra1", + "lon1", + "nyc1", + "nyc3", + "sfo2", + "sfo3", + "sgp1", + "syd1", + "tor1" + ], + "versions": [ + "8" + ], + "layouts": [ + { + "num_nodes": 1, + "sizes": [ + "db-s-1vcpu-1gb", + "db-s-1vcpu-2gb", + "db-s-2vcpu-4gb", + "db-s-4vcpu-8gb", + "db-s-6vcpu-16gb", + "db-s-8vcpu-32gb", + "db-s-16vcpu-64gb", + "db-s-1vcpu-1gb", + "db-s-1vcpu-2gb", + "db-s-2vcpu-4gb", + "db-s-4vcpu-8gb", + "db-s-6vcpu-16gb", + "gd-2vcpu-8gb", + "gd-4vcpu-16gb", + "gd-8vcpu-32gb", + "gd-16vcpu-64gb", + "gd-32vcpu-128gb", + "gd-40vcpu-160gb", + "so1_5-2vcpu-16gb", + "so1_5-4vcpu-32gb", + "so1_5-8vcpu-64gb", + "so1_5-16vcpu-128gb", + "so1_5-24vcpu-192gb", + "so1_5-32vcpu-256gb", + "gd-2vcpu-8gb", + "gd-4vcpu-16gb", + "gd-8vcpu-32gb", + "gd-16vcpu-64gb", + "gd-32vcpu-128gb", + "gd-40vcpu-160gb" + ] + }, + { + "num_nodes": 2, + "sizes": [ + "db-s-1vcpu-2gb", + "db-s-2vcpu-4gb", + "db-s-4vcpu-8gb", + "db-s-6vcpu-16gb", + "db-s-8vcpu-32gb", + "db-s-16vcpu-64gb", + "db-s-1vcpu-2gb", + "db-s-2vcpu-4gb", + "db-s-4vcpu-8gb", + "db-s-6vcpu-16gb", + "gd-2vcpu-8gb", + "gd-4vcpu-16gb", + "gd-8vcpu-32gb", + "gd-16vcpu-64gb", + "gd-32vcpu-128gb", + "gd-40vcpu-160gb", + "so1_5-2vcpu-16gb", + "so1_5-4vcpu-32gb", + "so1_5-8vcpu-64gb", + "so1_5-16vcpu-128gb", + "so1_5-24vcpu-192gb", + "so1_5-32vcpu-256gb", + "gd-2vcpu-8gb", + "gd-4vcpu-16gb", + "gd-8vcpu-32gb", + "gd-16vcpu-64gb", + "gd-32vcpu-128gb", + "gd-40vcpu-160gb" + ] + }, + { + "num_nodes": 3, + "sizes": [ + "db-s-1vcpu-2gb", + "db-s-2vcpu-4gb", + "db-s-4vcpu-8gb", + "db-s-6vcpu-16gb", + "db-s-8vcpu-32gb", + "db-s-16vcpu-64gb", + "db-s-1vcpu-2gb", + "db-s-2vcpu-4gb", + "db-s-4vcpu-8gb", + "db-s-6vcpu-16gb", + "gd-2vcpu-8gb", + "gd-4vcpu-16gb", + "gd-8vcpu-32gb", + "gd-16vcpu-64gb", + "gd-32vcpu-128gb", + "gd-40vcpu-160gb", + "so1_5-2vcpu-16gb", + "so1_5-4vcpu-32gb", + "so1_5-8vcpu-64gb", + "so1_5-16vcpu-128gb", + "so1_5-24vcpu-192gb", + "so1_5-32vcpu-256gb", + "gd-2vcpu-8gb", + "gd-4vcpu-16gb", + "gd-8vcpu-32gb", + "gd-16vcpu-64gb", + "gd-32vcpu-128gb", + "gd-40vcpu-160gb" + ] + } + ] + }, + "pg": { + "regions": [ + "ams3", + "blr1", + "fra1", + "lon1", + "nyc1", + "nyc3", + "sfo2", + "sfo3", + "sgp1", + "syd1", + "tor1" + ], + "versions": [ + "12", + "13", + "14", + "15" + ], + "layouts": [ + { + "num_nodes": 1, + "sizes": [ + "db-s-1vcpu-1gb", + "db-s-1vcpu-2gb", + "db-s-2vcpu-4gb", + "db-s-4vcpu-8gb", + "db-s-6vcpu-16gb", + "db-s-8vcpu-32gb", + "db-s-16vcpu-64gb", + "db-s-1vcpu-1gb", + "db-s-1vcpu-2gb", + "db-s-2vcpu-4gb", + "db-s-4vcpu-8gb", + "db-s-6vcpu-16gb", + "gd-2vcpu-8gb", + "gd-4vcpu-16gb", + "gd-8vcpu-32gb", + "gd-16vcpu-64gb", + "gd-32vcpu-128gb", + "gd-40vcpu-160gb", + "so1_5-2vcpu-16gb", + "so1_5-4vcpu-32gb", + "so1_5-8vcpu-64gb", + "so1_5-16vcpu-128gb", + "so1_5-24vcpu-192gb", + "so1_5-32vcpu-256gb", + "gd-2vcpu-8gb", + "gd-4vcpu-16gb", + "gd-8vcpu-32gb", + "gd-16vcpu-64gb", + "gd-32vcpu-128gb", + "gd-40vcpu-160gb" + ] + }, + { + "num_nodes": 2, + "sizes": [ + "db-s-1vcpu-2gb", + "db-s-2vcpu-4gb", + "db-s-4vcpu-8gb", + "db-s-6vcpu-16gb", + "db-s-8vcpu-32gb", + "db-s-16vcpu-64gb", + "db-s-1vcpu-2gb", + "db-s-2vcpu-4gb", + "db-s-4vcpu-8gb", + "db-s-6vcpu-16gb", + "gd-2vcpu-8gb", + "gd-4vcpu-16gb", + "gd-8vcpu-32gb", + "gd-16vcpu-64gb", + "gd-32vcpu-128gb", + "gd-40vcpu-160gb", + "so1_5-2vcpu-16gb", + "so1_5-4vcpu-32gb", + "so1_5-8vcpu-64gb", + "so1_5-16vcpu-128gb", + "so1_5-24vcpu-192gb", + "so1_5-32vcpu-256gb", + "gd-2vcpu-8gb", + "gd-4vcpu-16gb", + "gd-8vcpu-32gb", + "gd-16vcpu-64gb", + "gd-32vcpu-128gb", + "gd-40vcpu-160gb" + ] + }, + { + "num_nodes": 3, + "sizes": [ + "db-s-1vcpu-2gb", + "db-s-2vcpu-4gb", + "db-s-4vcpu-8gb", + "db-s-6vcpu-16gb", + "db-s-8vcpu-32gb", + "db-s-16vcpu-64gb", + "db-s-1vcpu-2gb", + "db-s-2vcpu-4gb", + "db-s-4vcpu-8gb", + "db-s-6vcpu-16gb", + "gd-2vcpu-8gb", + "gd-4vcpu-16gb", + "gd-8vcpu-32gb", + "gd-16vcpu-64gb", + "gd-32vcpu-128gb", + "gd-40vcpu-160gb", + "so1_5-2vcpu-16gb", + "so1_5-4vcpu-32gb", + "so1_5-8vcpu-64gb", + "so1_5-16vcpu-128gb", + "so1_5-24vcpu-192gb", + "so1_5-32vcpu-256gb", + "gd-2vcpu-8gb", + "gd-4vcpu-16gb", + "gd-8vcpu-32gb", + "gd-16vcpu-64gb", + "gd-32vcpu-128gb", + "gd-40vcpu-160gb" + ] + } + ] + }, + "redis": { + "regions": [ + "ams3", + "blr1", + "fra1", + "lon1", + "nyc1", + "nyc3", + "sfo2", + "sfo3", + "sgp1", + "syd1", + "tor1" + ], + "versions": [ + "7" + ], + "layouts": [ + { + "num_nodes": 1, + "sizes": [ + "db-s-1vcpu-1gb", + "db-s-1vcpu-2gb", + "db-s-2vcpu-4gb", + "db-s-4vcpu-8gb", + "db-s-6vcpu-16gb", + "db-s-8vcpu-32gb", + "db-s-16vcpu-64gb", + "m-2vcpu-16gb", + "m-4vcpu-32gb", + "m-8vcpu-64gb", + "m-16vcpu-128gb", + "m-24vcpu-192gb", + "m-32vcpu-256gb" + ] + }, + { + "num_nodes": 2, + "sizes": [ + "db-s-1vcpu-2gb", + "db-s-2vcpu-4gb", + "db-s-4vcpu-8gb", + "db-s-6vcpu-16gb", + "db-s-8vcpu-32gb", + "db-s-16vcpu-64gb", + "m-2vcpu-16gb", + "m-4vcpu-32gb", + "m-8vcpu-64gb", + "m-16vcpu-128gb", + "m-24vcpu-192gb", + "m-32vcpu-256gb" + ] + } + ] + } + }, + "version_availability": { + "kafka": [ + { + "end_of_life": "2024-05-13T00:00:00Z", + "end_of_availability": "2024-02-13T00:00:00Z", + "version": "3.4" + }, + { + "end_of_life": "2024-07-31T00:00:00Z", + "end_of_availability": "2024-04-30T00:00:00Z", + "version": "3.5" + } + ], + "mongodb": [ + { + "end_of_life": "2024-02-01T08:00:00Z", + "end_of_availability": null, + "version": "4.4" + }, + { + "end_of_life": "2024-10-01T07:00:00Z", + "end_of_availability": null, + "version": "5.0" + }, + { + "end_of_life": "2025-07-01T07:00:00Z", + "end_of_availability": null, + "version": "6.0" + } + ], + "mysql": [ + { + "end_of_life": null, + "end_of_availability": null, + "version": "8" + } + ], + "pg": [ + { + "end_of_life": "2024-11-14T00:00:00Z", + "end_of_availability": "2024-05-14T00:00:00Z", + "version": "12" + }, + { + "end_of_life": "2025-11-13T00:00:00Z", + "end_of_availability": "2025-05-13T00:00:00Z", + "version": "13" + }, + { + "end_of_life": "2026-11-12T00:00:00Z", + "end_of_availability": "2026-05-12T00:00:00Z", + "version": "14" + }, + { + "end_of_life": "2027-11-11T00:00:00Z", + "end_of_availability": "2027-05-12T00:00:00Z", + "version": "15" + } + ], + "redis": [ + { + "end_of_life": null, + "end_of_availability": null, + "version": "7" + } + ] + } + } + } + } + }, + "database_clusters": { + "description": "A JSON object with a key of `databases`.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "databases": { + "type": "array", + "items": { + "$ref": "#/components/schemas/database_cluster" + } + } + } + }, + "example": { + "databases": [ + { + "id": "9cc10173-e9ea-4176-9dbc-a4cee4c4ff30", + "name": "backend", + "engine": "pg", + "version": "10", + "connection": { + "uri": "postgres://doadmin:wv78n3zpz42xezdk@backend-do-user-19081923-0.db.ondigitalocean.com:25060/defaultdb?sslmode=require", + "database": "", + "host": "backend-do-user-19081923-0.db.ondigitalocean.com", + "port": 25060, + "user": "doadmin", + "password": "wv78n3zpz42xezdk", + "ssl": true + }, + "private_connection": { + "uri": "postgres://doadmin:wv78n3zpz42xezdk@private-backend-do-user-19081923-0.db.ondigitalocean.com:25060/defaultdb?sslmode=require", + "database": "", + "host": "private-backend-do-user-19081923-0.db.ondigitalocean.com", + "port": 25060, + "user": "doadmin", + "password": "wv78n3zpz42xezdk", + "ssl": true + }, + "users": [ + { + "name": "doadmin", + "role": "primary", + "password": "wv78n3zpz42xezdk" + } + ], + "db_names": [ + "defaultdb" + ], + "num_nodes": 1, + "region": "nyc3", + "status": "online", + "created_at": "2019-01-11T18:37:36Z", + "maintenance_window": { + "day": "saturday", + "hour": "08:45:12", + "pending": true, + "description": [ + "Update TimescaleDB to version 1.2.1", + "Upgrade to PostgreSQL 11.2 and 10.7 bugfix releases" + ] + }, + "size": "db-s-2vcpu-4gb", + "tags": [ + "production" + ], + "private_network_uuid": "d455e75d-4858-4eec-8c95-da2f0a5f93a7", + "version_end_of_life": "2023-11-09T00:00:00Z", + "version_end_of_availability": "2023-05-09T00:00:00Z" + } + ] + } + } + } + }, + "database_cluster": { + "description": "A JSON object with a key of `database`.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "database": { + "$ref": "#/components/schemas/database_cluster" + } + }, + "required": [ + "database" + ] + }, + "example": { + "database": { + "id": "9cc10173-e9ea-4176-9dbc-a4cee4c4ff30", + "name": "backend", + "engine": "pg", + "version": "14", + "semantic_version": "14.5", + "connection": { + "uri": "postgres://doadmin:wv78n3zpz42xezdk@backend-do-user-19081923-0.db.ondigitalocean.com:25060/defaultdb?sslmode=require", + "database": "", + "host": "backend-do-user-19081923-0.db.ondigitalocean.com", + "port": 25060, + "user": "doadmin", + "password": "wv78n3zpz42xezdk", + "ssl": true + }, + "private_connection": { + "uri": "postgres://doadmin:wv78n3zpz42xezdk@private-backend-do-user-19081923-0.db.ondigitalocean.com:25060/defaultdb?sslmode=require", + "database": "", + "host": "private-backend-do-user-19081923-0.db.ondigitalocean.com", + "port": 25060, + "user": "doadmin", + "password": "wv78n3zpz42xezdk", + "ssl": true + }, + "users": [ + { + "name": "doadmin", + "role": "primary", + "password": "wv78n3zpz42xezdk" + } + ], + "db_names": [ + "defaultdb" + ], + "num_nodes": 2, + "region": "nyc3", + "status": "creating", + "created_at": "2019-01-11T18:37:36Z", + "maintenance_window": { + "day": "saturday", + "hour": "08:45:12", + "pending": true, + "description": [ + "Update TimescaleDB to version 1.2.1", + "Upgrade to PostgreSQL 11.2 and 10.7 bugfix releases" + ] + }, + "size": "db-s-2vcpu-4gb", + "tags": [ + "production" + ], + "private_network_uuid": "d455e75d-4858-4eec-8c95-da2f0a5f93a7", + "version_end_of_life": "2023-11-09T00:00:00Z", + "version_end_of_availability": "2023-05-09T00:00:00Z" + } + } + } + } + }, + "database_config": { + "description": "A JSON object with a key of `config`.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "config": { + "anyOf": [ + { + "$ref": "#/components/schemas/mysql" + }, + { + "$ref": "#/components/schemas/postgres" + }, + { + "$ref": "#/components/schemas/redis" + } + ] + } + }, + "required": [ + "config" + ] + }, + "example": { + "config": { + "sql_mode": "ANSI,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,STRICT_ALL_TABLES", + "sql_require_primary_key": true + } + } + } + } + }, + "ca": { + "description": "A JSON object with a key of `ca`.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "ca": { + "$ref": "#/components/schemas/ca" + } + }, + "required": [ + "ca" + ] + }, + "example": { + "ca": { + "certificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVRVENDQXFtZ0F3SUJBZ0lVRUZZWTdBWFZQS0Raam9jb1lpMk00Y0dvcU0wd0RRWUpLb1pJaHZjTkFRRU0KQlFBd09qRTRNRFlHQTFVRUF3d3ZOek0zT1RaaE1XRXRaamhrTUMwME9HSmpMV0V4Wm1NdFpqbGhNVFZsWXprdwpORGhsSUZCeWIycGxZM1FnUTBFd0hoY05NakF3TnpFM01UVTFNREEyV2hjTk16QXdOekUxTVRVMU1EQTJXakE2Ck1UZ3dOZ1lEVlFRRERDODNNemM1Tm1FeFlTMW1PR1F3TFRRNFltTXRZVEZtWXkxbU9XRXhOV1ZqT1RBME9HVWcKVUhKdmFtVmpkQ0JEUVRDQ0FhSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnR1BBRENDQVlvQ2dnR0JBTVdScXhycwpMZnpNdHZyUmxKVEw4MldYMVBLZkhKbitvYjNYcmVBY3FZd1dBUUp2Q3IycmhxSXZieVZzMGlaU0NzOHI4c3RGClljQ0R1bkxJNmUwTy9laERZYTBIT2RrMkFFRzE1ckVOVmNha2NSczcyQWlHVHNrdkNXS2VkUjFTUWswVWt0WCsKQUg4S1ExS3F5bzNtZ2Y2cVV1WUpzc3JNTXFselk3YTN1RVpEb2ZqTjN5Q3MvM21pTVJKcVcyNm1JV0IrUUlEbAo5YzdLRVF5MTZvdCtjeHVnd0lLMm9oZHMzaFY1bjBKMFVBM0I3QWRBdXY5aUl5L3JHaHlTNm5CNTdaWm9JZnAyCnFybXdOY0UrVjlIdXhQSGtRVjFOQjUwOFFudWZ4Z0E5VCtqU2VrdGVUbWFORkxqNjFXL3BtcndrTytOaWFXUTIKaGgzVXBKOEozY1BoNkErbHRnUmpSV2NEb2lsYVNwRVVpU09WemNNYVFvalZKYVJlNk9NbnZYc29NaSs3ZzdneApWcittQ0lUcGcvck9DaXpBWWQ2UFAxLzdYTjk1ZXNmU2tBQnM5c3hJakpjTUFqbDBYTEFzRmtGZVdyeHNIajlVCmJnaDNWYXdtcnpUeXhZT0RQcXV1cS9JcGlwc0RRT3Fpb2ZsUStkWEJJL3NUT0NNbVp6K0pNcG5HYXdJREFRQUIKb3o4d1BUQWRCZ05WSFE0RUZnUVVSekdDRlE3WEtUdHRDN3JzNS8ydFlQcExTZGN3RHdZRFZSMFRCQWd3QmdFQgovd0lCQURBTEJnTlZIUThFQkFNQ0FRWXdEUVlKS29aSWh2Y05BUUVNQlFBRGdnR0JBSWFKQ0dSVVNxUExtcmcvCmk3MW10b0NHUDdzeG1BVXVCek1oOEdrU25uaVdaZnZGMTRwSUtqTlkwbzVkWmpHKzZqK1VjalZtK0RIdGE1RjYKOWJPeEk5S0NFeEI1blBjRXpMWjNZYitNOTcrellxbm9zUm85S21DVFJBb2JrNTZ0WU1FS1h1aVJja2tkMm1yUQo4cGw2N2xxdThjM1V4c0dHZEZVT01wMkk3ZTNpdUdWVm5UR0ZWM3JQZUdaQ0J3WGVyUUQyY0F4UjkzS3BnWVZ2ClhUUzk5dnpSbm1HOHhhUm9EVy9FbEdXZ2xWd0Q5a1JrbXhUUkdoYTdDWVZCcjFQVWY2dVVFVjhmVFIxc1hFZnIKLytMR1JoSVVsSUhWT3l2Yzk3YnZYQURPbWF1MWZDVE5lWGtRdTNyZnZFSlBmaFlLeVIwT0V3eWVvdlhRNzl0LwpTV2ZGTjBreU1Pc1UrNVNIdHJKSEh1eWNWcU0yQlVVK083VjM1UnNwOU9MZGRZMFFVbTZldFpEVEhhSUhYYzRRCnl1Rm1OL1NhSFZtNE0wL3BTVlJQdVd6TmpxMnZyRllvSDRtbGhIZk95TUNJMjc2elE2aWhGNkdDSHlkOUJqajcKUm1UWGEyNHM3NWhmSi9YTDV2bnJSdEtpVHJlVHF6V21EOVhnUmNMQ0gyS1hJaVRtSWc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==" + } + } + } + } + }, + "online_migration": { + "description": "A JSON object.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/online_migration" + }, + "example": { + "id": "77b28fc8-19ff-11eb-8c9c-c68e24557488", + "status": "running", + "created_at": "2020-10-29T15:57:38Z" + } + } + } + }, + "accepted": { + "description": "The does not indicate the success or failure of any operation, just that the request has been accepted for processing.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + } + }, + "firewall_rules": { + "description": "A JSON object with a key of `rules`.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "rules": { + "type": "array", + "items": { + "$ref": "#/components/schemas/firewall_rule" + } + } + } + }, + "example": { + "rules": [ + { + "uuid": "79f26d28-ea8a-41f2-8ad8-8cfcdd020095", + "cluster_uuid": "9cc10173-e9ea-4176-9dbc-a4cee4c4ff30", + "type": "k8s", + "value": "ff2a6c52-5a44-4b63-b99c-0e98e7a63d61", + "created_at": "2019-11-14T20:30:28Z" + }, + { + "uuid": "adfe81a8-0fa1-4e2d-973f-06aa5af19b44", + "cluster_uuid": "9cc10173-e9ea-4176-9dbc-a4cee4c4ff30", + "type": "ip_addr", + "value": "192.168.1.1", + "created_at": "2019-11-14T20:30:28Z" + }, + { + "uuid": "b9b42276-8295-4313-b40f-74173a7f46e6", + "cluster_uuid": "9cc10173-e9ea-4176-9dbc-a4cee4c4ff30", + "type": "droplet", + "value": "163973392", + "created_at": "2019-11-14T20:30:28Z" + }, + { + "uuid": "718d23e0-13d7-4129-8a00-47fb72ee0deb", + "cluster_uuid": "9cc10173-e9ea-4176-9dbc-a4cee4c4ff30", + "type": "tag", + "value": "backend", + "created_at": "2019-11-14T20:30:28Z" + } + ] + } + } + } + }, + "database_backups": { + "description": "A JSON object with a key of `database_backups`.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "backups": { + "type": "array", + "items": { + "$ref": "#/components/schemas/backup" + } + } + }, + "required": [ + "backups" + ] + }, + "example": { + "backups": [ + { + "created_at": "2019-01-11T18:42:27Z", + "size_gigabytes": 0.03357696 + }, + { + "created_at": "2019-01-12T18:42:29Z", + "size_gigabytes": 0.03364864 + } + ] + } + } + } + }, + "database_replicas": { + "description": "A JSON object with a key of `replicas`.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "replicas": { + "type": "array", + "items": { + "$ref": "#/components/schemas/database_replica" + } + } + } + }, + "example": { + "replicas": [ + { + "name": "read-nyc3-01", + "connection": { + "uri": "", + "database": "defaultdb", + "host": "read-nyc3-01-do-user-19081923-0.db.ondigitalocean.com", + "port": 25060, + "user": "doadmin", + "password": "wv78n3zpz42xezdk", + "ssl": true + }, + "private_connection": { + "uri": "postgres://doadmin:wv78n3zpz42xezdk@private-read-nyc3-01-do-user-19081923-0.db.ondigitalocean.com:25060/defaultdb?sslmode=require", + "database": "", + "host": "private-read-nyc3-01-do-user-19081923-0.db.ondigitalocean.com", + "port": 25060, + "user": "doadmin", + "password": "wv78n3zpz42xezdk", + "ssl": true + }, + "region": "nyc3", + "status": "online", + "created_at": "2019-01-11T18:37:36Z" + } + ] + } + } + } + }, + "database_replica": { + "description": "A JSON object with a key of `replica`.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "replica": { + "$ref": "#/components/schemas/database_replica" + } + } + }, + "example": { + "replica": { + "name": "read-nyc3-01", + "connection": { + "uri": "", + "database": "defaultdb", + "host": "read-nyc3-01-do-user-19081923-0.db.ondigitalocean.com", + "port": 25060, + "user": "doadmin", + "password": "wv78n3zpz42xezdk", + "ssl": true + }, + "private_connection": { + "uri": "postgres://doadmin:wv78n3zpz42xezdk@private-read-nyc3-01-do-user-19081923-0.db.ondigitalocean.com:25060/defaultdb?sslmode=require", + "database": "", + "host": "private-read-nyc3-01-do-user-19081923-0.db.ondigitalocean.com", + "port": 25060, + "user": "doadmin", + "password": "wv78n3zpz42xezdk", + "ssl": true + }, + "region": "nyc3", + "status": "online", + "created_at": "2019-01-11T18:37:36Z" + } + } + } + } + }, + "users": { + "description": "A JSON object with a key of `users`.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "users": { + "type": "array", + "items": { + "$ref": "#/components/schemas/database_user" + } + } + } + }, + "example": { + "users": [ + { + "name": "app-01", + "role": "normal", + "password": "jge5lfxtzhx42iff" + }, + { + "name": "doadmin", + "role": "primary", + "password": "wv78n3zpz42xezd" + } + ] + } + } + } + }, + "user": { + "description": "A JSON object with a key of `user`.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "user": { + "$ref": "#/components/schemas/database_user" + } + }, + "required": [ + "user" + ] + }, + "examples": { + "New User": { + "value": { + "user": { + "name": "app-01", + "role": "normal", + "password": "jge5lfxtzhx42iff" + } + } + }, + "New User with MySQL Auth Plugin": { + "value": { + "user": { + "name": "app-02", + "role": "normal", + "password": "wv78n3zpz42xezdk", + "mysql_settings": { + "auth_plugin": "mysql_native_password" + } + } + } + }, + "Kafka User": { + "value": { + "user": { + "name": "app-03", + "role": "normal", + "password": "qv78n3zes42xezdk", + "access_cert": "-----BEGIN CERTIFICATE-----\nMIIFFjCCA/6gAwIBAgISA0AznUJmXhu08/89ZuSPC/kRMA0GCSqGSIb3DQEBCwUA\nMEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD\nExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xNjExMjQwMDIzMDBaFw0x\nNzAyMjIwMDIzMDBaMCQxIjAgBgNVBAMTGWNsb3VkLmFuZHJld3NvbWV0aGluZy5j\nb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDBIZMz8pnK6V52SVf+\nCYssOfCQHAx5f0Ou5rYbq3xNh8VWHIYJCQ1QxQIxKSP6+uODSYrb2KWyurP1DwGb\n8OYm0J3syEDtCUQik1cpCzpeNlAZ2f8FzXyYQAqPopxdRpsFz8DtZnVvu86XwrE4\noFPl9MReICmZfBNWylpV5qgFPoXyJ70ZAsTm3cEe3n+LBXEnY4YrVDRWxA3wZ2mz\nZ03HZ1hHrxK9CMnS829U+8sK+UneZpCO7yLRPuxwhmps0wpK/YuZZfRAKF1FZRna\nk/SIQ28rnWufmdg16YqqHgl5JOgnb3aslKRvL4dI2Gwnkd2IHtpZnTR0gxFXfqqb\nQwuRAgMBAAGjggIaMIICFjAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYB\nBQUHAwEGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFLsAFcxAhFX1\nMbCnzr9hEO5rL4jqMB8GA1UdIwQYMBaAFKhKamMEfd265tE5t6ZFZe/zqOyhMHAG\nCCsGAQUFBwEBBGQwYjAvBggrBgEFBQcwAYYjaHR0cDovL29jc3AuaW50LXgzLmxl\ndHNlbmNyeXB0Lm9yZy8wLwYIKwYBBQUHMAKGI2h0dHA6Ly9jZXJ0LmludC14My5s\nZXRzZW5jcnlwdC5vcmcvMCQGA1UdEQQdMBuCGWNsb3VkLmFuZHJld3NvbWV0aGlu\nZy5jb20wgf4GA1UdIASB9jCB8zAIBgZngQwBAgWrgeYGCysGAQQBgt8TAQEBMIHW\nMCYGCCsGAQUFBwIBFhpodHRwOi8vY3BzLmxldHNlbmNyeXB0Lm9yZzCBqwYIKwYB\nBQUHAgIwgZ4MgZtUaGlzIENlcnRpZmljYXRlIG1heSBvbmx5IGJlIHJlbGllZCB1\ncG9uIGJ5IFJlbHlpbmcgUGFydGllcyBhbmQgb25seSQ2ziBhY2NvcmRhbmNlIHdp\ndGggdGhlIENlcnRpZmljYXRlIFBvbGljeSBmb3VuZCBhdCBodHRwczovL2xldHNl\nbmNyeXB0Lm9yZy9yZXBvc2l0b3J5LzANBgkqhkiG9w0BAQsFAAOCAQEAOZVQvrjM\nPKXLARTjB5XsgfyDN3/qwLl7SmwGkPe+B+9FJpfScYG1JzVuCj/SoaPaK34G4x/e\niXwlwOXtMOtqjQYzNu2Pr2C+I+rVmaxIrCUXFmC205IMuUBEeWXG9Y/HvXQLPabD\nD3Gdl5+Feink9SDRP7G0HaAwq13hI7ARxkL9p+UIY39X0dV3WOboW2Re8nrkFXJ7\nq9Z6shK5QgpBfsLjtjNsQzaGV3ve1gOg25aTJGearBWOvEjJNA1wGMoKVXOtYwm/\nWyWoVdCQ8HmconcbJB6xc0UZ1EjvzRr5ZIvSa5uHZD0L3m7/kpPWlAlFJ7hHASPu\nUlF1zblDmg2Iaw==\n-----END CERTIFICATE-----", + "access_key": "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDBIZMz8pnK6V52\nSVf+CYssOfCQHAx5f0Ou5rYbq3xNh8VHAIYJCQ1QxQIxKSP6+uODSYrb2KWyurP1\nDwGb8OYm0J3syEDtCUQik1cpCzpeNlAZ2f8FzXyYQAqPopxdRpsFz8DtZnVvu86X\nwrE4oFPl9MReICmZfBNWylpV5qgFPoXyJ70ZAsTm3cEe3n+LBXEnY4YrVDRWxA3w\nZ2mzZ03HZ1hHrxK9CMnS829U+8sK+UneZpCO7yLRPuxwhmps0wpK/YuZZfRAKF1F\nZRnak/SIQ28rnWufmdg16YqqHgl5JOgnb3aslKRvL4dI2Gwnkd2IHtpZnTR0gxFX\nfqqbQwuRAgMBAAECggEBAILLmkW0JzOkmLTDNzR0giyRkLoIROqDpfLtjKdwm95l\n9NUBJcU4vCvXQITKt/NhtnNTexcowg8pInb0ksJpg3UGE+4oMNBXVi2UW5MQZ5cm\ncVkQqgXkBF2YAY8FMaB6EML+0En2+dGR/3gIAr221xsFiXe1kHbB8Nb2c/d5HpFt\neRpLVJnK+TxSr78PcZA8DDGlSgwvgimdAaFUNO2OqB9/0E9UPyKk2ycdff/Z6ldF\n0hkCLtdYTTl8Kf/OwjcuTgmA2O3Y8/CoQX/L+oP9Rvt9pWCEfuebiOmHJVPO6Y6x\ngtQVEXwmF1pDHH4Qtz/e6UZTdYeMl9G4aNO2CawwcaYECgYEA57imgSOG4XsJLRh\nGGncV9R/xhy4AbDWLtAMzQRX4ktvKCaHWyQV2XK2we/cu29NLv2Y89WmerTNPOU+\nP8+pB31uty2ELySVn15QhKpQClVEAlxCnnNjXYrii5LOM80+lVmxvQwxVd8Yz8nj\nIntyioXNBEnYS7V2RxxFGgFun1cCgYEA1V3W+Uyamhq8JS5EY0FhyGcXdHd70K49\nW1ou7McIpncf9tM9acLS1hkI98rd2T69Zo8mKoV1V2hjFaKUYfNys6tTkYWeZCcJ\n3rW44j9DTD+FmmjcX6b8DzfybGLehfNbCw6n67/r45DXIV/fk6XZfkx6IEGO4ODt\nNfnvx4TuI1cCgYBACDiKqwSUvmkUuweOo4IuCxyb5Ee8v98P5JIE/VRDxlCbKbpx\npxEam6aBBQVcDi+n8o0H3WjjlKc6UqbW/01YMoMrvzotxNBLz8Y0QtQHZvR6KoCG\nRKCKstxTcWflzKuknbqN4RapAhNbKBDJ8PMSWfyDWNyaXzSmBdvaidbF1QKBgDI0\no4oD0Xkjg1QIYAUu9FBQmb9JAjRnW36saNBEQS/SZg4RRKknM683MtoDvVIKJk0E\nsAlfX+4SXQZRPDMUMtA+Jyrd0xhj6zmhbwClvDMr20crF3fWdgcqtft1BEFmsuyW\nJUMe5OWmRkjPI2+9ncDPRAllA7a8lnSV/Crph5N/AoGBAIK249temKrGe9pmsmAo\nQbNuYSmwpnMoAqdHTrl70HEmK7ob6SIVmsR8QFAkH7xkYZc4Bxbx4h1bdpozGB+/\nAangbiaYJcAOD1QyfiFbflvI1RFeHgrk7VIafeSeQv6qu0LLMi2zUbpgVzxt78Wg\neTuK2xNR0PIM8OI7pRpgyj1I\n-----END PRIVATE KEY-----", + "settings": { + "acl": [ + { + "id": "acl128aaaa99239", + "permission": "produceconsume", + "topic": "customer-events" + }, + { + "id": "acl293098flskdf", + "permission": "produce", + "topic": "customer-events.*" + }, + { + "id": "acl128ajei20123", + "permission": "consume", + "topic": "customer-events" + } + ] + } + } + } + } + } + } + } + }, + "databases": { + "description": "A JSON object with a key of `databases`.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "dbs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/database" + } + } + } + }, + "example": { + "dbs": [ + { + "name": "alpha" + }, + { + "name": "defaultdb" + } + ] + } + } + } + }, + "database": { + "description": "A JSON object with a key of `db`.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "db": { + "$ref": "#/components/schemas/database" + } + }, + "required": [ + "db" + ] + }, + "example": { + "db": { + "name": "alpha" + } + } + } + } + }, + "connection_pools": { + "description": "A JSON object with a key of `pools`.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/connection_pools" + }, + "example": { + "pools": [ + { + "user": "doadmin", + "name": "reporting-pool", + "size": 10, + "db": "defaultdb", + "mode": "session", + "connection": { + "uri": "postgres://doadmin:wv78n3zpz42xezdk@backend-do-user-19081923-0.db.ondigitalocean.com:25061/foo?sslmode=require", + "database": "foo", + "host": "backend-do-user-19081923-0.db.ondigitalocean.com", + "port": 25061, + "user": "doadmin", + "password": "wv78n3zpz42xezdk", + "ssl": true + } + }, + { + "user": "doadmin", + "name": "backend-pool", + "size": 10, + "db": "defaultdb", + "mode": "transaction", + "connection": { + "uri": "postgres://doadmin:wv78n3zpz42xezdk@backend-do-user-19081923-0.db.ondigitalocean.com:25061/backend-pool?sslmode=require", + "database": "backend-pool", + "host": "backend-do-user-19081923-0.db.ondigitalocean.com", + "port": 25061, + "user": "doadmin", + "password": "wv78n3zpz42xezdk", + "ssl": true + } + } + ] + } + } + } + }, + "connection_pool": { + "description": "A JSON object with a key of `pool`.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "pool": { + "$ref": "#/components/schemas/connection_pool" + } + }, + "required": [ + "pool" + ] + }, + "example": { + "pool": { + "user": "doadmin", + "name": "backend-pool", + "size": 10, + "db": "defaultdb", + "mode": "transaction", + "connection": { + "uri": "postgres://doadmin:wv78n3zpz42xezdk@backend-do-user-19081923-0.db.ondigitalocean.com:25061/backend-pool?sslmode=require", + "database": "backend-pool", + "host": "backend-do-user-19081923-0.db.ondigitalocean.com", + "port": 25061, + "user": "doadmin", + "password": "wv78n3zpz42xezdk", + "ssl": true + } + } + } + } + } + }, + "eviction_policy_response": { + "description": "A JSON string with a key of `eviction_policy`.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "required": [ + "eviction_policy" + ], + "properties": { + "eviction_policy": { + "$ref": "#/components/schemas/eviction_policy_model" + } + } + } + } + } + }, + "sql_mode": { + "description": "A JSON string with a key of `sql_mode`.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/sql_mode" + }, + "example": { + "sql_mode": "ANSI,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,STRICT_ALL_TABLES" + } + } + } + }, + "kafka_topics": { + "description": "A JSON object with a key of `topics`.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "topics": { + "type": "array", + "items": { + "$ref": "#/components/schemas/kafka_topic" + } + } + } + }, + "example": { + "topics": [ + { + "name": "customer-events", + "state": "active", + "replication_factor": 2, + "partition_count": 3 + }, + { + "name": "engineering-events", + "state": "configuring", + "replication_factor": 2, + "partition_count": 10 + } + ] + } + } + } + }, + "kafka_topic": { + "description": "A JSON object with a key of `topic`.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "topic": { + "$ref": "#/components/schemas/kafka_topic_verbose" + } + } + }, + "example": { + "topic": { + "name": "customer-events", + "partitions": [ + { + "size": 4096, + "id": 0, + "in_sync_replicas": 3, + "earliest_offset": 0, + "consumer_groups": [ + { + "name": "consumer-group-1", + "offset": 0 + }, + { + "name": "consumer-group-2", + "offset": 1 + } + ] + }, + { + "size": 4096, + "id": 1, + "in_sync_replicas": 3, + "earliest_offset": 0, + "consumer_groups": null + } + ], + "replication_factor": 3, + "state": "active", + "config": { + "cleanup_policy": "delete", + "compression_type": "producer", + "delete_retention_ms": 86400000, + "file_delete_delay_ms": 60000, + "flush_messages": 9223372036854776000, + "flush_ms": 9223372036854776000, + "index_interval_bytes": 4096, + "max_compaction_lag_ms": 9223372036854776000, + "max_message_bytes": 1048588, + "message_down_conversion_enable": true, + "message_format_version": "3.0-IV1", + "message_timestamp_difference_max_ms": 9223372036854776000, + "message_timestamp_type": "create_time", + "min_cleanable_dirty_ratio": 0.5, + "min_compaction_lag_ms": 0, + "min_insync_replicas": 1, + "preallocate": false, + "retention_bytes": -1, + "retention_ms": 604800000, + "segment_bytes": 209715200, + "segment_index_bytes": 10485760, + "segment_jitter_ms": 0, + "segment_ms": 604800000, + "unclean_leader_election_enable": false + } + } + } + } + } + }, + "all_domains_response": { + "description": "The response will be a JSON object with a key called `domains`. The value of this will be an array of Domain objects, each of which contain the standard domain attributes.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "domains": { + "type": "array", + "items": { + "$ref": "#/components/schemas/domain" + }, + "description": "Array of volumes." + } + }, + "required": [ + "domains" + ] + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ], + "example": { + "domains": [ + { + "name": "example.com", + "ttl": 1800, + "zone_file": "$ORIGIN example.com.\n$TTL 1800\nexample.com. IN SOA ns1.digitalocean.com. hostmaster.example.com. 1415982609 10800 3600 604800 1800\nexample.com. 1800 IN NS ns1.digitalocean.com.\nexample.com. 1800 IN NS ns2.digitalocean.com.\nexample.com. 1800 IN NS ns3.digitalocean.com.\nexample.com. 1800 IN A 1.2.3.4\n" + } + ], + "links": {}, + "meta": { + "total": 1 + } + } + } + } + } + }, + "create_domain_response": { + "description": "The response will be a JSON object with a key called `domain`. The value of this will be an object that contains the standard attributes associated with a domain.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "domain": { + "$ref": "#/components/schemas/domain" + } + }, + "example": { + "domain": { + "name": "example.com", + "ttl": 1800, + "zone_file": null + } + } + } + } + } + }, + "existing_domain": { + "description": "The response will be a JSON object with a key called `domain`. The value of this will be an object that contains the standard attributes defined for a domain.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "domain": { + "$ref": "#/components/schemas/domain" + } + }, + "example": { + "domain": { + "name": "example.com", + "ttl": 1800, + "zone_file": "$ORIGIN example.com.\n$TTL 1800\nexample.com. IN SOA ns1.digitalocean.com. hostmaster.example.com. 1415982611 10800 3600 604800 1800\nexample.com. 1800 IN NS ns1.digitalocean.com.\nexample.com. 1800 IN NS ns2.digitalocean.com.\nexample.com. 1800 IN NS ns3.digitalocean.com.\nexample.com. 1800 IN A 1.2.3.4\n" + } + } + } + } + } + }, + "all_domain_records_response": { + "description": "The response will be a JSON object with a key called `domain_records`. The value of this will be an array of domain record objects, each of which contains the standard domain record attributes. For attributes that are not used by a specific record type, a value of `null` will be returned. For instance, all records other than SRV will have `null` for the `weight` and `port` attributes.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "domain_records": { + "type": "array", + "items": { + "$ref": "#/components/schemas/domain_record" + } + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ] + }, + "examples": { + "All Domain Records": { + "$ref": "#/components/examples/domain_records_all" + } + } + } + } + }, + "created_domain_record": { + "description": "The response body will be a JSON object with a key called `domain_record`. The value of this will be an object representing the new record. Attributes that are not applicable for the record type will be set to `null`. An `id` attribute is generated for each record as part of the object.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "domain_record": { + "$ref": "#/components/schemas/domain_record" + } + }, + "example": { + "domain_record": { + "id": 28448433, + "type": "A", + "name": "www", + "data": "162.10.66.0", + "priority": null, + "port": null, + "ttl": 1800, + "weight": null, + "flags": null, + "tag": null + } + } + } + } + } + }, + "domain_record": { + "description": "The response will be a JSON object with a key called `domain_record`. The value of this will be a domain record object which contains the standard domain record attributes.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "domain_record": { + "$ref": "#/components/schemas/domain_record" + } + }, + "example": { + "domain_record": { + "id": 3352896, + "type": "A", + "name": "blog", + "data": "162.10.66.0", + "priority": null, + "port": null, + "ttl": 1800, + "weight": null, + "flags": null, + "tag": null + } + } + } + } + } + }, + "all_droplets": { + "description": "A JSON object with a key of `droplets`.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "droplets": { + "type": "array", + "items": { + "$ref": "#/components/schemas/droplet" + } + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ] + }, + "examples": { + "All Droplets": { + "$ref": "#/components/examples/droplets_all" + }, + "Droplets Filtered By Tag": { + "$ref": "#/components/examples/droplets_tagged" + } + } + } + } + }, + "droplet_create": { + "description": "Accepted", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "title": "Single Droplet Response", + "properties": { + "droplet": { + "$ref": "#/components/schemas/droplet" + }, + "links": { + "type": "object", + "properties": { + "actions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/action_link" + } + } + } + } + }, + "required": [ + "droplet", + "links" + ] + }, + { + "title": "Multiple Droplet Response", + "properties": { + "droplets": { + "type": "array", + "items": { + "$ref": "#/components/schemas/droplet" + } + }, + "links": { + "type": "object", + "properties": { + "actions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/action_link" + } + } + } + } + }, + "required": [ + "droplets", + "links" + ] + } + ] + }, + "examples": { + "Single Droplet Create Response": { + "$ref": "#/components/examples/droplet_create_response" + }, + "Multiple Droplet Create Response": { + "$ref": "#/components/examples/droplet_multi_create_response" + } + } + } + } + }, + "no_content_with_content_type": { + "description": "The action was successful and the response body is empty. This response has content-type set.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + }, + "content-type": { + "$ref": "#/components/headers/content-type" + } + } + }, + "existing_droplet": { + "description": "The response will be a JSON object with a key called `droplet`. This will be\nset to a JSON object that contains the standard Droplet attributes.\n", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "droplet": { + "$ref": "#/components/schemas/droplet" + } + } + }, + "examples": { + "Single Droplet": { + "$ref": "#/components/examples/droplet_single" + } + } + } + } + }, + "all_droplet_backups": { + "description": "A JSON object with an `backups` key.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "backups": { + "type": "array", + "items": { + "$ref": "#/components/schemas/droplet_snapshot" + } + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ] + }, + "example": { + "backups": [ + { + "id": 67539192, + "name": "web-01- 2020-07-29", + "distribution": "Ubuntu", + "slug": null, + "public": false, + "regions": [ + "nyc3" + ], + "created_at": "2020-07-29T01:44:35Z", + "min_disk_size": 50, + "size_gigabytes": 2.34, + "type": "backup" + } + ], + "links": {}, + "meta": { + "total": 1 + } + } + } + } + }, + "all_droplet_snapshots": { + "description": "A JSON object with an `snapshots` key.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "snapshots": { + "type": "array", + "items": { + "$ref": "#/components/schemas/droplet_snapshot" + } + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ] + }, + "example": { + "snapshots": [ + { + "id": 6372321, + "name": "web-01-1595954862243", + "created_at": "2020-07-28T16:47:44Z", + "regions": [ + "nyc3", + "sfo3" + ], + "min_disk_size": 25, + "size_gigabytes": 2.34, + "type": "snapshot" + } + ], + "links": {}, + "meta": { + "total": 1 + } + } + } + } + }, + "all_droplet_actions": { + "description": "A JSON object with an `actions` key.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "actions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/action" + } + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ] + }, + "example": { + "actions": [ + { + "id": 982864273, + "status": "completed", + "type": "create", + "started_at": "2020-07-20T19:37:30Z", + "completed_at": "2020-07-20T19:37:45Z", + "resource_id": 3164444, + "resource_type": "droplet", + "region": { + "name": "New York 3", + "slug": "nyc3", + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata", + "install_agent", + "image_transfer" + ], + "available": true, + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "m-1vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb" + ] + }, + "region_slug": "nyc3" + } + ], + "links": {}, + "meta": { + "total": 1 + } + } + } + } + }, + "droplet_action": { + "description": "The response will be a JSON object with a key called `action`.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "action": { + "$ref": "#/components/schemas/action" + } + } + } + } + } + }, + "droplet_actions_response": { + "description": "The response will be a JSON object with a key called `actions`.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "actions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/action" + } + } + } + } + } + } + }, + "all_kernels": { + "description": "A JSON object that has a key called `kernels`.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "kernels": { + "type": "array", + "items": { + "$ref": "#/components/schemas/kernel" + } + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ] + }, + "example": { + "kernels": [ + { + "id": 7515, + "name": "DigitalOcean GrubLoader v0.2 (20160714)", + "version": "2016.07.13-DigitalOcean_loader_Ubuntu" + } + ], + "links": { + "pages": { + "next": "https://api.digitalocean.com/v2/droplets/3164444/kernels?page=2&per_page=1", + "last": "https://api.digitalocean.com/v2/droplets/3164444/kernels?page=171&per_page=1" + } + }, + "meta": { + "total": 171 + } + } + } + } + }, + "all_firewalls": { + "description": "A JSON object that has a key called `firewalls`.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "firewalls": { + "type": "array", + "items": { + "$ref": "#/components/schemas/firewall" + } + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ] + }, + "example": { + "firewalls": [ + { + "id": "bb4b2611-3d72-467b-8602-280330ecd65c", + "status": "succeeded", + "created_at": "2020-05-23T21:24:00Z", + "pending_changes": [ + { + "droplet_id": 8043964, + "removing": true, + "status": "waiting" + } + ], + "name": "firewall", + "droplet_ids": [ + 89989, + 33322 + ], + "tags": [ + "base-image", + "prod" + ], + "inbound_rules": [ + { + "protocol": "udp", + "ports": "8000-9000", + "sources": { + "addresses": [ + "1.2.3.4", + "18.0.0.0/8" + ], + "droplet_ids": [ + 8282823, + 3930392 + ], + "load_balancer_uids": [ + "4de7ac8b-495b-4884-9a69-1050c6793cd6" + ], + "tags": [ + "base-image", + "dev" + ] + } + } + ], + "outbound_rules": [ + { + "protocol": "tcp", + "ports": "7000-9000", + "destinations": { + "addresses": [ + "1.2.3.4", + "18.0.0.0/8" + ], + "droplet_ids": [ + 3827493, + 213213 + ], + "load_balancer_uids": [ + "4de7ac8b-495b-4884-9a69-1050c6793cd6" + ], + "tags": [ + "base-image", + "prod" + ] + } + } + ] + } + ], + "links": { + "pages": {} + }, + "meta": { + "total": 1 + } + } + } + } + }, + "neighbor_droplets": { + "description": "A JSON object with an `droplets` key.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "droplets": { + "type": "array", + "items": { + "$ref": "#/components/schemas/droplet" + } + } + } + } + ] + } + } + } + }, + "associated_resources_list": { + "description": "A JSON object containing `snapshots`, `volumes`, and `volume_snapshots` keys.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "reserved_ips": { + "type": "array", + "items": { + "$ref": "#/components/schemas/associated_resource" + } + }, + "floating_ips": { + "type": "array", + "items": { + "$ref": "#/components/schemas/associated_resource" + } + }, + "snapshots": { + "type": "array", + "items": { + "$ref": "#/components/schemas/associated_resource" + } + }, + "volumes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/associated_resource" + } + }, + "volume_snapshots": { + "type": "array", + "items": { + "$ref": "#/components/schemas/associated_resource" + } + } + } + } + ] + }, + "example": { + "reserved_ips": [ + { + "id": "6186916", + "name": "45.55.96.47", + "cost": "4.00" + } + ], + "floating_ips": [ + { + "id": "6186916", + "name": "45.55.96.47", + "cost": "4.00" + } + ], + "snapshots": [ + { + "id": "61486916", + "name": "ubuntu-s-1vcpu-1gb-nyc1-01-1585758823330", + "cost": "0.05" + } + ], + "volumes": [ + { + "id": "ba49449a-7435-11ea-b89e-0a58ac14480f", + "name": "volume-nyc1-01", + "cost": "10.00" + } + ], + "volume_snapshots": [ + { + "id": "edb0478d-7436-11ea-86e6-0a58ac144b91", + "name": "volume-nyc1-01-1585758983629", + "cost": "0.04" + } + ] + } + } + } + }, + "associated_resources_status": { + "description": "A JSON object containing containing the status of a request to destroy a Droplet and its associated resources.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/associated_resource_status" + }, + "example": { + "droplet": { + "id": "187000742", + "name": "ubuntu-s-1vcpu-1gb-nyc1-01", + "destroyed_at": "2020-04-01T18:11:49Z" + }, + "resources": { + "reserved_ips": [ + { + "id": "6186916", + "name": "45.55.96.47", + "destroyed_at": "2020-04-01T18:11:44Z" + } + ], + "floating_ips": [ + { + "id": "6186916", + "name": "45.55.96.47", + "destroyed_at": "2020-04-01T18:11:44Z" + } + ], + "snapshots": [ + { + "id": "61486916", + "name": "ubuntu-s-1vcpu-1gb-nyc1-01-1585758823330", + "destroyed_at": "2020-04-01T18:11:44Z" + } + ], + "volumes": [], + "volume_snapshots": [ + { + "id": "edb0478d-7436-11ea-86e6-0a58ac144b91", + "name": "volume-nyc1-01-1585758983629", + "destroyed_at": "2020-04-01T18:11:44Z" + } + ] + }, + "completed_at": "2020-04-01T18:11:49Z", + "failures": 0 + } + } + } + }, + "conflict": { + "description": "Conflict", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error" + }, + "example": { + "id": "conflict", + "message": "The request could not be completed due to a conflict." + } + } + } + }, + "list_firewalls_response": { + "description": "To list all of the firewalls available on your account, send a GET request to `/v2/firewalls`.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "firewalls": { + "type": "array", + "items": { + "$ref": "#/components/schemas/firewall" + } + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ] + }, + "example": { + "firewalls": [ + { + "id": "fb6045f1-cf1d-4ca3-bfac-18832663025b", + "name": "firewall", + "status": "succeeded", + "inbound_rules": [ + { + "protocol": "tcp", + "ports": "80", + "sources": { + "load_balancer_uids": [ + "4de7ac8b-495b-4884-9a69-1050c6793cd6" + ] + } + }, + { + "protocol": "tcp", + "ports": "22", + "sources": { + "tags": [ + "gateway" + ], + "addresses": [ + "18.0.0.0/8" + ] + } + } + ], + "outbound_rules": [ + { + "protocol": "tcp", + "ports": "80", + "destinations": { + "addresses": [ + "0.0.0.0/0", + "::/0" + ] + } + } + ], + "created_at": "2017-05-23T21:23:59Z", + "droplet_ids": [ + 8043964 + ], + "tags": [], + "pending_changes": [] + } + ], + "links": {}, + "meta": { + "total": 1 + } + } + } + } + }, + "create_firewall_response": { + "description": "The response will be a JSON object with a firewall key. This will be set to an object containing the standard firewall attributes", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "firewall": { + "$ref": "#/components/schemas/firewall" + } + } + }, + "example": { + "firewall": { + "id": "bb4b2611-3d72-467b-8602-280330ecd65c", + "name": "firewall", + "status": "waiting", + "inbound_rules": [ + { + "protocol": "tcp", + "ports": "80", + "sources": { + "load_balancer_uids": [ + "4de7ac8b-495b-4884-9a69-1050c6793cd6" + ] + } + }, + { + "protocol": "tcp", + "ports": "22", + "sources": { + "tags": [ + "gateway" + ], + "addresses": [ + "18.0.0.0/8" + ] + } + } + ], + "outbound_rules": [ + { + "protocol": "tcp", + "ports": "80", + "destinations": { + "addresses": [ + "0.0.0.0/0", + "::/0" + ] + } + } + ], + "created_at": "2017-05-23T21:24:00Z", + "droplet_ids": [ + 8043964 + ], + "tags": [], + "pending_changes": [ + { + "droplet_id": 8043964, + "removing": false, + "status": "waiting" + } + ] + } + } + } + } + }, + "bad_request": { + "description": "Bad Request", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error" + }, + "example": { + "id": "bad_request", + "message": "error parsing request body", + "request_id": "4851a473-1621-42ea-b2f9-5071c0ea8414" + } + } + } + }, + "get_firewall_response": { + "description": "The response will be a JSON object with a firewall key. This will be set to an object containing the standard firewall attributes.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "firewall": { + "$ref": "#/components/schemas/firewall" + } + } + }, + "example": { + "firewall": { + "id": "bb4b2611-3d72-467b-8602-280330ecd65c", + "name": "firewall", + "status": "succeeded", + "inbound_rules": [ + { + "protocol": "tcp", + "ports": "80", + "sources": { + "load_balancer_uids": [ + "4de7ac8b-495b-4884-9a69-1050c6793cd6" + ] + } + }, + { + "protocol": "tcp", + "ports": "22", + "sources": { + "tags": [ + "gateway" + ], + "addresses": [ + "18.0.0.0/8" + ] + } + } + ], + "outbound_rules": [ + { + "protocol": "tcp", + "ports": "80", + "destinations": { + "addresses": [ + "0.0.0.0/0", + "::/0" + ] + } + } + ], + "created_at": "2017-05-23T21:24:00Z", + "droplet_ids": [ + 8043964 + ], + "tags": [], + "pending_changes": [] + } + } + } + } + }, + "put_firewall_response": { + "description": "The response will be a JSON object with a `firewall` key. This will be set to an object containing the standard firewall attributes.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "firewall": { + "$ref": "#/components/schemas/firewall" + } + } + }, + "example": { + "firewall": { + "id": "bb4b2611-3d72-467b-8602-280330ecd65c", + "name": "frontend-firewall", + "inbound_rules": [ + { + "protocol": "tcp", + "ports": "80", + "sources": { + "load_balancer_uids": [ + "4de7ac8b-495b-4884-9a69-1050c6793cd6" + ] + } + }, + { + "protocol": "tcp", + "ports": "22", + "sources": { + "tags": [ + "gateway" + ], + "addresses": [ + "18.0.0.0/8" + ] + } + } + ], + "outbound_rules": [ + { + "protocol": "tcp", + "ports": "80", + "destinations": { + "addresses": [ + "0.0.0.0/0", + "::/0" + ] + } + } + ], + "created_at": "2020-05-23T21:24:00Z", + "droplet_ids": [ + 8043964 + ], + "tags": [ + "frontend" + ], + "status": "waiting", + "pending_changes": [ + { + "droplet_id": 8043964, + "removing": false, + "status": "waiting" + } + ] + } + } + } + } + }, + "floating_ip_list": { + "description": "The response will be a JSON object with a key called `floating_ips`. This will be set to an array of floating IP objects, each of which will contain the standard floating IP attributes", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "floating_ips": { + "type": "array", + "items": { + "$ref": "#/components/schemas/floating_ip" + } + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ], + "example": { + "floating_ips": [ + { + "ip": "45.55.96.47", + "droplet": null, + "region": { + "name": "New York 3", + "slug": "nyc3", + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata", + "install_agent", + "storage", + "image_transfer" + ], + "available": true, + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192g" + ] + }, + "locked": false, + "project_id": "746c6152-2fa2-11ed-92d3-27aaa54e4988" + } + ], + "links": {}, + "meta": { + "total": 1 + } + } + } + } + } + }, + "floating_ip_created": { + "description": "The response will be a JSON object with a key called `floating_ip`. The value of this will be an object that contains the standard attributes associated with a floating IP.\nWhen assigning a floating IP to a Droplet at same time as it created, the response's `links` object will contain links to both the Droplet and the assignment action. The latter can be used to check the status of the action.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "floating_ip": { + "$ref": "#/components/schemas/floating_ip" + }, + "links": { + "type": "object", + "properties": { + "droplets": { + "type": "array", + "items": { + "$ref": "#/components/schemas/action_link" + } + }, + "actions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/action_link" + } + } + } + } + } + }, + "examples": { + "floating_ip_assigning": { + "$ref": "#/components/examples/floating_ip_assigning" + }, + "floating_ip_reserving": { + "$ref": "#/components/examples/floating_ip_reserving" + } + } + } + } + }, + "floating_ip": { + "description": "The response will be a JSON object with a key called `floating_ip`. The value of this will be an object that contains the standard attributes associated with a floating IP.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "floating_ip": { + "$ref": "#/components/schemas/floating_ip" + } + } + }, + "examples": { + "floating_ip_assigned": { + "$ref": "#/components/examples/floating_ip_assigned" + }, + "floating_ip_reserved": { + "$ref": "#/components/examples/floating_ip_reserved" + } + } + } + } + }, + "floating_ip_actions": { + "description": "The results will be returned as a JSON object with an `actions` key. This will be set to an array filled with action objects containing the standard floating IP action attributes.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "actions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/action" + } + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ], + "example": { + "actions": [ + { + "id": 72531856, + "status": "completed", + "type": "reserve_ip", + "started_at": "2015-11-21T21:51:09Z", + "completed_at": "2015-11-21T21:51:09Z", + "resource_id": 758604197, + "resource_type": "floating_ip", + "region": { + "name": "New York 3", + "slug": "nyc3", + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192gb" + ], + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata" + ], + "available": true + }, + "region_slug": "nyc3" + } + ], + "links": {}, + "meta": { + "total": 1 + } + } + } + } + } + }, + "floating_ip_action": { + "description": "The response will be an object with a key called `action`. The value of this will be an object that contains the standard floating IP action attributes.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "action": { + "allOf": [ + { + "$ref": "#/components/schemas/action" + }, + { + "type": "object", + "properties": { + "project_id": { + "type": "string", + "format": "uuid", + "example": "746c6152-2fa2-11ed-92d3-27aaa54e4988", + "description": "The UUID of the project to which the reserved IP currently belongs." + } + } + } + ] + } + }, + "example": { + "action": { + "id": 72531856, + "status": "completed", + "type": "assign_ip", + "started_at": "2015-11-12T17:51:03Z", + "completed_at": "2015-11-12T17:51:14Z", + "resource_id": 758604968, + "resource_type": "floating_ip", + "region": { + "name": "New York 3", + "slug": "nyc3", + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192gb" + ], + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata" + ], + "available": true + }, + "region_slug": "nyc3", + "project_id": "746c6152-2fa2-11ed-92d3-27aaa54e4988" + } + } + } + } + } + }, + "list_namespaces": { + "description": "An array of JSON objects with a key called `namespaces`. Each object represents a namespace and contains\nthe properties associated with it. ", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "namespaces": { + "type": "array", + "items": { + "$ref": "#/components/schemas/namespace_info" + } + } + } + } + ] + } + } + } + }, + "namespace_created": { + "description": "A JSON response object with a key called `namespace`. The object contains the properties associated\nwith the namespace.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "namespace": { + "$ref": "#/components/schemas/namespace_info" + } + } + } + } + } + }, + "namespace_bad_request": { + "description": "Bad Request.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error" + }, + "example": { + "id": "bad_request", + "message": "Invalid request payload: missing label field", + "request_id": "4851a473-1621-42ea-b2f9-5071c0ea8414" + } + } + } + }, + "namespace_limit_reached": { + "description": "Limit Reached", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error" + }, + "example": { + "id": "unprocessable_entity", + "message": "namespace limit reached", + "request_id": "a3275238-3d04-4405-a123-55c389b406c0" + } + } + } + }, + "namespace_not_allowed": { + "description": "Not Allowed.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error" + }, + "example": { + "id": "forbidden", + "message": "not allowed to get namespace", + "request_id": "b11e45a4-892c-48c9-9001-b6cffe9fe795" + } + } + } + }, + "namespace_not_found": { + "description": "Bad Request.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error" + }, + "example": { + "id": "not_found", + "message": "namespace not found", + "request_id": "88d17b7a-630b-4083-99ce-5b91045efdb4" + } + } + } + }, + "list_triggers": { + "description": "An array of JSON objects with a key called `namespaces`. Each object represents a namespace and contains\nthe properties associated with it. ", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "triggers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/trigger_info" + } + } + } + } + ] + } + } + } + }, + "trigger_response": { + "description": "A JSON response object with a key called `trigger`. The object contains the properties associated\nwith the trigger.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "trigger": { + "$ref": "#/components/schemas/trigger_info" + } + } + } + } + } + }, + "trigger_bad_request": { + "description": "Bad Request.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error" + }, + "example": { + "id": "bad_request", + "message": "validating create trigger: validation error: missing trigger name, missing function name, missing source details", + "request_id": "4851a473-1621-42ea-b2f9-5071c0ea8414" + } + } + } + }, + "trigger_limit_reached": { + "description": "Limit Reached", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error" + }, + "example": { + "id": "unprocessable_entity", + "message": "triggers limit reached", + "request_id": "7ba99a43-6618-4fe0-9af7-092752ad0d56" + } + } + } + }, + "trigger_not_found": { + "description": "Bad Request.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error" + }, + "examples": { + "namespace not found": { + "value": { + "id": "not_found", + "message": "namespace not found", + "request_id": "88d17b7a-630b-4083-99ce-5b91045efdb4" + } + }, + "trigger not found": { + "value": { + "id": "not_found", + "message": "trigger not found", + "request_id": "88d17b7a-630b-4083-99ce-5b91045efdb4" + } + } + } + } + } + }, + "all_images": { + "description": "The response will be a JSON object with a key called `images`. This will be set to an array of image objects, each of which will contain the standard image attributes.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "images": { + "type": "array", + "items": { + "$ref": "#/components/schemas/image" + } + } + }, + "required": [ + "images" + ] + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ] + }, + "examples": { + "All": { + "$ref": "#/components/examples/images_all" + }, + "Snapshots": { + "$ref": "#/components/examples/images_snapshots" + }, + "Distribution": { + "$ref": "#/components/examples/images_distribution" + }, + "Custom": { + "$ref": "#/components/examples/images_custom" + }, + "Application": { + "$ref": "#/components/examples/images_application" + }, + "Tagged": { + "$ref": "#/components/examples/images_tagged" + } + } + } + } + }, + "new_custom_image": { + "description": "The response will be a JSON object with a key set to `image`. The value of this will be an image object containing a subset of the standard image attributes as listed below, including the image's `id` and `status`. After initial creation, the `status` will be `NEW`. Using the image's id, you may query the image's status by sending a `GET` request to the `/v2/images/$IMAGE_ID` endpoint. When the `status` changes to `available`, the image will be ready for use.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "image": { + "$ref": "#/components/schemas/image" + } + } + }, + "example": { + "image": { + "created_at": "2018-09-20T19:28:00Z", + "description": "Cloud-optimized image w/ small footprint", + "distribution": "Ubuntu", + "error_message": "", + "id": 38413969, + "name": "ubuntu-18.04-minimal", + "regions": [], + "type": "custom", + "tags": [ + "base-image", + "prod" + ], + "status": "NEW" + } + } + } + } + }, + "existing_image": { + "description": "The response will be a JSON object with a key called `image`. The value of this will be an image object containing the standard image attributes.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "image": { + "$ref": "#/components/schemas/image" + } + }, + "required": [ + "image" + ] + }, + "example": { + "image": { + "id": 6918990, + "name": "14.04 x64", + "distribution": "Ubuntu", + "slug": "ubuntu-16-04-x64", + "public": true, + "regions": [ + "nyc1", + "ams1", + "sfo1", + "nyc2", + "ams2", + "sgp1", + "lon1", + "nyc3", + "ams3", + "nyc3" + ], + "created_at": "2014-10-17T20:24:33Z", + "min_disk_size": 20, + "size_gigabytes": 2.34, + "description": "", + "tags": [], + "status": "available", + "error_message": "" + } + } + } + } + }, + "updated_image": { + "description": "The response will be a JSON object with a key set to `image`. The value of this will be an image object containing the standard image attributes.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "image": { + "$ref": "#/components/schemas/image" + } + }, + "required": [ + "image" + ] + }, + "example": { + "image": { + "id": 7938391, + "name": "new-image-name", + "distribution": "Ubuntu", + "slug": null, + "public": false, + "regions": [ + "nyc3", + "nyc3" + ], + "created_at": "2014-11-14T16:44:03Z", + "min_disk_size": 20, + "size_gigabytes": 2.34, + "description": "", + "tags": [], + "status": "available", + "error_message": "" + } + } + } + } + }, + "get_image_actions_response": { + "description": "The results will be returned as a JSON object with an `actions` key. This will be set to an array filled with action objects containing the standard action attributes.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "actions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/action" + } + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ] + }, + "example": { + "actions": [ + { + "id": 29410565, + "status": "completed", + "type": "transfer", + "started_at": "2014-07-25T15:04:21Z", + "completed_at": "2014-07-25T15:10:20Z", + "resource_id": 7555620, + "resource_type": "image", + "region": { + "name": "New York 2", + "slug": "nyc2", + "sizes": [ + "s-1vcpu-3gb", + "m-1vcpu-8gb", + "s-3vcpu-1gb", + "s-1vcpu-2gb", + "s-2vcpu-2gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-1vcpu-1gb", + "c-1vcpu-2gb", + "s-24vcpu-128gb" + ], + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata", + "server_id", + "install_agent", + "storage", + "image_transfer" + ], + "available": true + }, + "region_slug": "nyc2" + } + ], + "links": { + "pages": { + "last": "https://api.digitalocean.com/v2/images/7555620/actions?page=5&per_page=1", + "next": "https://api.digitalocean.com/v2/images/7555620/actions?page=2&per_page=1" + } + }, + "meta": { + "total": 5 + } + } + } + } + }, + "post_image_action_response": { + "description": "The response will be a JSON object with a key called `action`. The value of this will be an object containing the standard image action attributes.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/action" + }, + "example": { + "action": { + "id": 36805527, + "status": "in-progress", + "type": "transfer", + "started_at": "2014-11-14T16:42:45Z", + "completed_at": null, + "resource_id": 7938269, + "resource_type": "image", + "region": { + "name": "New York 3", + "slug": "nyc3", + "sizes": [ + "s-1vcpu-3gb", + "m-1vcpu-8gb", + "s-3vcpu-1gb", + "s-1vcpu-2gb", + "s-2vcpu-2gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-1vcpu-1gb", + "c-1vcpu-2gb", + "s-24vcpu-128gb" + ], + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata", + "server_id", + "install_agent", + "storage", + "image_transfer" + ], + "available": true + }, + "region_slug": "nyc3" + } + } + } + } + }, + "get_image_action_response": { + "description": "The response will be an object with a key called `action`. The value of this will be an object that contains the standard image action attributes.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/action" + }, + "example": { + "action": { + "id": 36805527, + "status": "in-progress", + "type": "transfer", + "started_at": "2014-11-14T16:42:45Z", + "completed_at": null, + "resource_id": 7938269, + "resource_type": "image", + "region": { + "name": "New York 3", + "slug": "nyc3", + "sizes": [ + "s-1vcpu-3gb", + "m-1vcpu-8gb", + "s-3vcpu-1gb", + "s-1vcpu-2gb", + "s-2vcpu-2gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-1vcpu-1gb", + "c-1vcpu-2gb", + "s-24vcpu-128gb" + ], + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata", + "server_id", + "install_agent", + "storage", + "image_transfer" + ], + "available": true + }, + "region_slug": "nyc3" + } + } + } + } + }, + "all_clusters": { + "description": "The response will be a JSON object with a key called `kubernetes_clusters`.\nThis will be set to an array of objects, each of which will contain the\nstandard Kubernetes cluster attributes.\n", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "kubernetes_clusters": { + "type": "array", + "items": { + "$ref": "#/components/schemas/cluster" + } + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ] + }, + "examples": { + "All Kubernetes Clusters": { + "$ref": "#/components/examples/kubernetes_clusters_all" + } + } + } + } + }, + "cluster_create": { + "description": "The response will be a JSON object with a key called `kubernetes_cluster`. The\nvalue of this will be an object containing the standard attributes of a\nKubernetes cluster.\n\nThe IP address and cluster API server endpoint will not be available until the\ncluster has finished provisioning. The initial value of the cluster's\n`status.state` attribute will be `provisioning`. When the cluster is ready,\nthis will transition to `running`.\n", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "kubernetes_cluster": { + "$ref": "#/components/schemas/cluster" + } + } + }, + "examples": { + "Kubernetes Cluster Response": { + "$ref": "#/components/examples/kubernetes_clusters_create_basic_response" + }, + "Kubernetes Cluster with Multiple Node Pools Response": { + "$ref": "#/components/examples/kubernetes_clusters_multi_pool_response" + } + } + } + } + }, + "existing_cluster": { + "description": "The response will be a JSON object with a key called `kubernetes_cluster`. The\nvalue of this will be an object containing the standard attributes of a\nKubernetes cluster.\n", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "kubernetes_cluster": { + "$ref": "#/components/schemas/cluster" + } + } + }, + "examples": { + "Single Kubernetes Cluster": { + "$ref": "#/components/examples/kubernetes_single" + } + } + } + } + }, + "updated_cluster": { + "description": "The response will be a JSON object with a key called `kubernetes_cluster`. The\nvalue of this will be an object containing the standard attributes of a\nKubernetes cluster.\n", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "kubernetes_cluster": { + "$ref": "#/components/schemas/cluster" + } + } + }, + "examples": { + "Updated Kubernetes Cluster": { + "$ref": "#/components/examples/kubernetes_updated" + } + } + } + } + }, + "associated_kubernetes_resources_list": { + "description": "The response will be a JSON object containing `load_balancers`, `volumes`, and `volume_snapshots` keys. Each will be set to an array of objects containing the standard attributes for associated resources.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/associated_kubernetes_resources" + } + } + } + }, + "kubeconfig": { + "description": "A kubeconfig file for the cluster in YAML format.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/yaml": { + "example": "apiVersion: v1\nclusters:\n- cluster:\n certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURUxCUUF3TXpFVk1CTUdBMVVFQ2ftTVJHbG4KYVhSaGJFOWpaV0Z1TVJvd0dUSREERXhGck9ITmhZWE1nUTJ4MWMzUmxjaUJEUVRBZUZ3MHhPREV4TVRVeApOakF3TWpCYUZ3MHpPREV4TVRVeE5qQXdNakJhTURNeEZUQVRCZ05WQkFvVERFUnBaMmwwWVd4UFkyVmhiakVhCk1CZ0dBMVVFQXhNUmF6aHpZV0Z6SUVOc2RYTjBaWElnUTBFd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUIKRHdBd2dnRUtBb0lCQVFDK2Z0L05Nd3pNaUxFZlFvTFU2bDgrY0hMbWttZFVKdjl4SmlhZUpIU0dZOGhPZFVEZQpGd1Zoc0pDTnVFWkpJUFh5Y0orcGpkU3pYc1lFSE03WVNKWk9xNkdaYThPMnZHUlJjN2ZQaUFJaFBRK0ZpUmYzCmRhMHNIUkZlM2hCTmU5ZE5SeTliQ2VCSTRSUlQrSEwzRFR3L2I5KytmRkdZQkRoVTEvTTZUWWRhUHR3WU0rdWgKb1pKcWJZVGJZZTFhb3R1ekdnYUpXaXRhdFdHdnNJYU8xYWthdkh0WEIOOHFxa2lPemdrSDdvd3RVY3JYM05iawozdmlVeFU4TW40MmlJaGFyeHNvTnlwdGhHOWZLMi9OdVdKTXJJS2R0Mzhwc0tkdDBFbng0MWg5K0dsMjUzMzhWCk1mdjBDVDF6SG1JanYwblIrakNkcFd0eFVLRyt0YjYzZFhNbkFnTUJBQUdqUlRCRE1BNEdBMVVkRHdFQi93UUUKQXdJQmhqQVNCZ05WSFJNQkFmOEVDREFHQVFIL0FnRUFNQjBHQTFVZERnUVdCQlNQMmJrOXJiUGJpQnZOd1Z1NQpUL0dwTFdvOTdEQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFEVjFMSGZyc1JiYVdONHE5SnBFVDMxMlluRDZ6Cm5rM3BpU1ZSYVEvM09qWG8wdHJ6Z2N4KzlVTUQxeDRHODI1RnYxc0ROWUExZEhFc2dHUmNyRkVmdGZJQWUrUVYKTitOR3NMRnQrOGZrWHdnUlpoNEU4ZUJsSVlrdEprOWptMzFMT25vaDJYZno0aGs3VmZwYkdvVVlsbmVoak1JZApiL3ZMUk05Y2EwVTJlYTB5OTNveE5pdU9PcXdrZGFjU1orczJtb3JNdGZxc3VRSzRKZDA3SENIbUFIeWpXT2k4ClVOQVUyTnZnSnBKY2RiZ3VzN2I5S3ppR1ZERklFUk04cEo4U1Nob1ZvVFFJd3d5Y2xVTU9EUUJreFFHOHNVRk8KRDE3ZjRod1dNbW5qVHY2MEJBM0dxaTZRcjdsWVFSL3drSEtQcnZjMjhoNXB0NndPWEY1b1M4OUZkUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K\n server: https://bd5f5959-5e1e-4205-a714-a914373942af.k8s.ondigitalocean.com\n name: do-nyc1-prod-cluster-01\ncontexts:\n- context:\n cluster: do-nyc1-prod-cluster-01\n user: do-nyc1-prod-cluster-01-admin\n name: do-nyc1-prod-cluster-01\ncurrent-context: do-nyc1-prod-cluster-01\nkind: Config\npreferences: {}\nusers:\n- name: do-nyc1-prod-cluster-01-admin\n user:\n token: 403d085aaa80102277d8da97ffd2db2b6a4f129d0e2146098fdfb0cec624babc\n" + } + } + }, + "credentials": { + "description": "A JSON object containing credentials for a cluster.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/credentials" + } + } + } + }, + "available_upgrades": { + "description": "The response will be a JSON object with a key called\n`available_upgrade_versions`. The value of this will be an array of objects,\nrepresenting the upgrade versions currently available for this cluster.\n\nIf the cluster is up-to-date (i.e. there are no upgrades currently available)\n`available_upgrade_versions` will be `null`.\n", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "available_upgrade_versions": { + "type": "array", + "nullable": true, + "items": { + "$ref": "#/components/schemas/kubernetes_version" + } + } + } + } + } + } + }, + "all_node_pools": { + "description": "The response will be a JSON object with a key called `node_pools`. This will\nbe set to an array of objects, each of which will contain the standard node\npool attributes.\n", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "node_pools": { + "type": "array", + "items": { + "$ref": "#/components/schemas/kubernetes_node_pool" + } + } + } + }, + "example": { + "node_pools": [ + { + "id": "cdda885e-7663-40c8-bc74-3a036c66545d", + "name": "frontend-pool", + "size": "s-1vcpu-2gb", + "count": 3, + "tags": [ + "production", + "web-team", + "k8s", + "k8s:bd5f5959-5e1e-4205-a714-a914373942af", + "k8s:worker" + ], + "labels": null, + "auto_scale": false, + "min_nodes": 0, + "max_nodes": 0, + "nodes": [ + { + "id": "478247f8-b1bb-4f7a-8db9-2a5f8d4b8f8f", + "name": "adoring-newton-3niq", + "status": { + "state": "running" + }, + "droplet_id": "205545370", + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z" + }, + { + "id": "ad12e744-c2a9-473d-8aa9-be5680500eb1", + "name": "adoring-newton-3nim", + "status": { + "state": "running" + }, + "droplet_id": "205545371", + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z" + }, + { + "id": "e46e8d07-f58f-4ff1-9737-97246364400e", + "name": "adoring-newton-3ni7", + "status": { + "state": "running" + }, + "droplet_id": "205545372", + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z" + } + ] + }, + { + "id": "f49f4379-7e7f-4af5-aeb6-0354bd840778", + "name": "backend-pool", + "size": "g-4vcpu-16gb", + "count": 2, + "tags": [ + "production", + "web-team", + "k8s", + "k8s:bd5f5959-5e1e-4205-a714-a914373942af", + "k8s:worker" + ], + "labels": { + "service": "backend", + "priority": "high" + }, + "auto_scale": true, + "min_nodes": 2, + "max_nodes": 5, + "nodes": [ + { + "id": "3385619f-8ec3-42ba-bb23-8d21b8ba7518", + "name": "affectionate-nightingale-3nif", + "status": { + "state": "running" + }, + "droplet_id": "205545373", + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z" + }, + { + "id": "4b8f60ff-ba06-4523-a6a4-b8148244c7e6", + "name": "affectionate-nightingale-3niy", + "status": { + "state": "running" + }, + "droplet_id": "205545374", + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z" + } + ] + } + ] + } + } + } + }, + "node_pool_create": { + "description": "The response will be a JSON object with a key called `node_pool`. The value of\nthis will be an object containing the standard attributes of a node pool.\n", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "node_pool": { + "$ref": "#/components/schemas/kubernetes_node_pool" + } + }, + "example": { + "node_pool": { + "id": "cdda885e-7663-40c8-bc74-3a036c66545d", + "name": "new-pool", + "size": "s-1vcpu-2gb", + "count": 3, + "tags": [ + "production", + "web-team", + "front-end", + "k8s", + "k8s:bd5f5959-5e1e-4205-a714-a914373942af", + "k8s:worker" + ], + "labels": null, + "taints": [], + "auto_scale": true, + "min_nodes": 3, + "max_nodes": 6, + "nodes": [ + { + "id": "478247f8-b1bb-4f7a-8db9-2a5f8d4b8f8f", + "name": " ", + "status": { + "state": "provisioning" + }, + "droplet_id": " ", + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z" + }, + { + "id": "ad12e744-c2a9-473d-8aa9-be5680500eb1", + "name": " ", + "status": { + "state": "provisioning" + }, + "droplet_id": " ", + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z" + }, + { + "id": "e46e8d07-f58f-4ff1-9737-97246364400e", + "name": " ", + "status": { + "state": "provisioning" + }, + "droplet_id": " ", + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z" + } + ] + } + } + } + } + } + }, + "existing_node_pool": { + "description": "The response will be a JSON object with a key called `node_pool`. The value\nof this will be an object containing the standard attributes of a node pool.\n", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "node_pool": { + "$ref": "#/components/schemas/kubernetes_node_pool" + } + }, + "example": { + "node_pool": { + "id": "cdda885e-7663-40c8-bc74-3a036c66545d", + "name": "frontend-pool", + "size": "s-1vcpu-2gb", + "count": 3, + "tags": [ + "production", + "web-team", + "k8s", + "k8s:bd5f5959-5e1e-4205-a714-a914373942af", + "k8s:worker" + ], + "labels": { + "service": "backend", + "priority": "high" + }, + "taints": [ + { + "key": "priority", + "value": "high", + "effect": "NoSchedule" + } + ], + "auto_scale": false, + "min_nodes": 0, + "max_nodes": 0, + "nodes": [ + { + "id": "478247f8-b1bb-4f7a-8db9-2a5f8d4b8f8f", + "name": "adoring-newton-3niq", + "status": { + "state": "running" + }, + "droplet_id": "205545370", + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z" + }, + { + "id": "ad12e744-c2a9-473d-8aa9-be5680500eb1", + "name": "adoring-newton-3nim", + "status": { + "state": "running" + }, + "droplet_id": "205545371", + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z" + }, + { + "id": "e46e8d07-f58f-4ff1-9737-97246364400e", + "name": "adoring-newton-3ni7", + "status": { + "state": "running" + }, + "droplet_id": "205545372", + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z" + } + ] + } + } + } + } + } + }, + "node_pool_update": { + "description": "The response will be a JSON object with a key called `node_pool`. The value of\nthis will be an object containing the standard attributes of a node pool.\n", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "node_pool": { + "$ref": "#/components/schemas/kubernetes_node_pool" + } + }, + "example": { + "node_pool": { + "id": "cdda885e-7663-40c8-bc74-3a036c66545d", + "name": "renamed-pool", + "size": "s-1vcpu-2gb", + "count": 3, + "tags": [ + "production", + "web-team", + "front-end", + "new-tag", + "k8s", + "k8s:bd5f5959-5e1e-4205-a714-a914373942af", + "k8s:worker" + ], + "labels": null, + "taints": [], + "auto_scale": true, + "min_nodes": 3, + "max_nodes": 6, + "nodes": [ + { + "id": "478247f8-b1bb-4f7a-8db9-2a5f8d4b8f8f", + "name": "adoring-newton-3niq", + "status": { + "state": "running" + }, + "droplet_id": "205545370", + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z" + }, + { + "id": "ad12e744-c2a9-473d-8aa9-be5680500eb1", + "name": "adoring-newton-3nim", + "status": { + "state": "running" + }, + "droplet_id": "205545371", + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z" + }, + { + "id": "e46e8d07-f58f-4ff1-9737-97246364400e", + "name": "adoring-newton-3ni7", + "status": { + "state": "running" + }, + "droplet_id": "205545372", + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z" + } + ] + } + } + } + } + } + }, + "cluster_user": { + "description": "The response will be a JSON object with a key called `kubernetes_cluster_user`\ncontaining the username and in-cluster groups that it belongs to.\n", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/user" + } + } + } + }, + "all_options": { + "description": "The response will be a JSON object with a key called `options` which contains\n`regions`, `versions`, and `sizes` objects listing the available options and\nthe matching slugs for use when creating a new cluster.\n", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/kubernetes_options" + }, + "examples": { + "All Kubernetes Options": { + "$ref": "#/components/examples/kubernetes_options" + } + } + } + } + }, + "clusterlint_results": { + "description": "The response is a JSON object which contains the diagnostics on Kubernetes\nobjects in the cluster. Each diagnostic will contain some metadata information\nabout the object and feedback for users to act upon.\n", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/clusterlint_results" + } + } + } + }, + "clusterlint_run": { + "description": "The response is a JSON object with a key called `run_id` that you can later use to fetch the run results.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "run_id": { + "type": "string", + "example": "50c2f44c-011d-493e-aee5-361a4a0d1844", + "description": "ID of the clusterlint run that can be used later to fetch the diagnostics." + } + } + } + } + } + }, + "all_load_balancers": { + "description": "A JSON object with a key of `load_balancers`. This will be set to an array of objects, each of which will contain the standard load balancer attributes.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "load_balancers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/load_balancer" + } + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ] + }, + "examples": { + "All Load Balancers": { + "$ref": "#/components/examples/load_balancers_all" + } + } + } + } + }, + "load_balancer_create": { + "description": "Accepted", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "load_balancer": { + "$ref": "#/components/schemas/load_balancer" + } + } + }, + "examples": { + "Basic Create Response": { + "$ref": "#/components/examples/load_balancer_basic_response" + }, + "SSL Termination Create Response": { + "$ref": "#/components/examples/load_balancer_ssl_termination_response" + }, + "Create Response Using Droplet Tag": { + "$ref": "#/components/examples/load_balancer_using_tag_response" + }, + "Sticky Sessions and Custom Health Check": { + "$ref": "#/components/examples/load_balancer_sticky_sessions_and_health_check_response" + } + } + } + } + }, + "existing_load_balancer": { + "description": "The response will be a JSON object with a key called `load_balancer`. The\nvalue of this will be an object that contains the standard attributes\nassociated with a load balancer\n", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "load_balancer": { + "$ref": "#/components/schemas/load_balancer" + } + } + }, + "examples": { + "load_balancer_basic_response": { + "$ref": "#/components/examples/load_balancer_basic_response" + } + } + } + } + }, + "updated_load_balancer": { + "description": "The response will be a JSON object with a key called `load_balancer`. The\nvalue of this will be an object containing the standard attributes of a\nload balancer.\n", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "load_balancer": { + "$ref": "#/components/schemas/load_balancer" + } + } + }, + "examples": { + "load_balancer_update_response": { + "$ref": "#/components/examples/load_balancer_update_response" + } + } + } + } + }, + "list_alert_policy_response": { + "description": "A list of alert policies.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/list_alert_policy" + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ], + "example": { + "policies": [ + { + "alerts": { + "email": [ + "bob@example.com" + ], + "slack": [ + { + "channel": "Production Alerts", + "url": "https://hooks.slack.com/services/T1234567/AAAAAAAA/ZZZZZZ\"" + } + ] + }, + "compare": "GreaterThan", + "description": "CPU Alert", + "enabled": true, + "entities": [ + 192018292 + ], + "tags": [ + "production_droplets" + ], + "type": "v1/insights/droplet/cpu", + "uuid": "78b3da62-27e5-49ba-ac70-5db0b5935c64", + "value": 80, + "window": "5m" + } + ], + "links": { + "first": "https//api.digitalocean.com/v2/monitoring/alerts?page=1&per_page=10", + "prev": "https//api.digitalocean.com/v2/monitoring/alerts?page=2&per_page=10", + "next": "https//api.digitalocean.com/v2/monitoring/alerts?page=4&per_page=10", + "last": "https//api.digitalocean.com/v2/monitoring/alerts?page=5&per_page=10" + }, + "meta": { + "total": 50 + } + } + } + } + } + }, + "alert_policy_response": { + "description": "An alert policy.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "policy": { + "$ref": "#/components/schemas/alert_policy" + } + } + } + } + } + }, + "droplet_bandwidth_metric_response": { + "description": "The response will be a JSON object with a key called `data` and `status`.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/metrics" + }, + "examples": { + "Inbound Private Bandwidth": { + "$ref": "#/components/examples/inbound_private_droplet_bandwidth" + }, + "Inbound Public Bandwidth": { + "$ref": "#/components/examples/inbound_public_droplet_bandwidth" + }, + "Outbound Private Bandwidth": { + "$ref": "#/components/examples/outbound_private_droplet_bandwidth" + }, + "Outbound Public Bandwidth": { + "$ref": "#/components/examples/outbound_public_droplet_bandwidth" + } + } + } + } + }, + "droplet_cpu_metric_response": { + "description": "The response will be a JSON object with a key called `data` and `status`.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/metrics" + }, + "examples": { + "CPU": { + "$ref": "#/components/examples/droplet_cpu" + } + } + } + } + }, + "droplet_filesystem_metric_response": { + "description": "The response will be a JSON object with a key called `data` and `status`.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/metrics" + }, + "examples": { + "Filesystem": { + "$ref": "#/components/examples/droplet_filesystem" + } + } + } + } + }, + "metric_response": { + "description": "The response will be a JSON object with a key called `data` and `status`.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/metrics" + } + } + } + }, + "projects_list": { + "description": "The response will be a JSON object with a key called `projects`. The value of this will be an object with the standard project attributes", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "projects": { + "type": "array", + "items": { + "$ref": "#/components/schemas/project" + } + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ], + "example": { + "projects": [ + { + "id": "4e1bfbc3-dc3e-41f2-a18f-1b4d7ba71679", + "owner_uuid": "99525febec065ca37b2ffe4f852fd2b2581895e7", + "owner_id": 258992, + "name": "my-web-api", + "description": "My website API", + "purpose": "Service or API", + "environment": "Production", + "is_default": false, + "created_at": "2018-09-27T20:10:35Z", + "updated_at": "2018-09-27T20:10:35Z" + }, + { + "id": "addb4547-6bab-419a-8542-76263a033cf6", + "owner_uuid": "99525febec065ca37b2ffe4f852fd2b2581895e7", + "owner_id": 258992, + "name": "Default", + "description": "Default project", + "purpose": "Just trying out DigitalOcean", + "environment": "Development", + "is_default": true, + "created_at": "2017-10-19T21:44:20Z", + "updated_at": "2019-11-05T18:50:03Z" + } + ], + "links": { + "pages": { + "first": "https://api.digitalocean.com/v2/projects?page=1", + "last": "https://api.digitalocean.com/v2/projects?page=1" + } + }, + "meta": { + "total": 2 + } + } + } + } + } + }, + "existing_project": { + "description": "The response will be a JSON object with a key called `project`. The value of this will be an object with the standard project attributes", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "project": { + "$ref": "#/components/schemas/project" + } + } + } + } + } + }, + "default_project": { + "description": "The response will be a JSON object with a key called `project`. The value of this will be an object with the standard project attributes", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "project": { + "$ref": "#/components/schemas/project" + } + }, + "example": { + "project": { + "id": "addb4547-6bab-419a-8542-76263a033cf6", + "owner_uuid": "99525febec065ca37b2ffe4f852fd2b2581895e7", + "owner_id": 258992, + "name": "Default", + "description": "Default project", + "purpose": "Just trying out DigitalOcean", + "environment": "Development", + "is_default": true, + "created_at": "2017-10-19T21:44:20Z", + "updated_at": "2019-11-05T18:50:03Z" + } + } + } + } + } + }, + "precondition_failed": { + "description": "Only an empty project can be deleted.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error" + }, + "example": { + "id": "precondition_failed", + "message": "cannot delete a project with resources. move or remove the resources first" + } + } + } + }, + "resources_list": { + "description": "The response will be a JSON object with a key called `resources`. The value of this will be an object with the standard resource attributes.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "resources": { + "type": "array", + "items": { + "$ref": "#/components/schemas/resource" + } + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ], + "example": { + "resources": [ + { + "urn": "do:droplet:13457723", + "assigned_at": "2018-09-28T19:26:37Z", + "links": { + "self": "https://api.digitalocean.com/v2/droplets/13457723" + }, + "status": "ok" + }, + { + "urn": "do:domain:example.com", + "assigned_at": "2019-03-31T16:24:14Z", + "links": { + "self": "https://api.digitalocean.com/v2/domains/example.com" + }, + "status": "ok" + } + ], + "links": { + "pages": { + "first": "https://api.digitalocean.com/v2/projects/4e1bfbc3-dc3e-41f2-a18f-1b4d7ba71679/resources?page=1", + "last": "https://api.digitalocean.com/v2/projects/4e1bfbc3-dc3e-41f2-a18f-1b4d7ba71679/resources?page=1" + } + }, + "meta": { + "total": 2 + } + } + } + } + } + }, + "assigned_resources_list": { + "description": "The response will be a JSON object with a key called `resources`. The value of this will be an object with the standard resource attributes.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "resources": { + "type": "array", + "items": { + "$ref": "#/components/schemas/resource" + } + } + }, + "example": { + "resources": [ + { + "urn": "do:droplet:13457723", + "assigned_at": "2018-09-28T19:26:37Z", + "links": { + "self": "https://api.digitalocean.com/v2/droplets/13457723" + }, + "status": "ok" + }, + { + "urn": "do:domain:example.com", + "assigned_at": "2019-03-31T16:24:14Z", + "links": { + "self": "https://api.digitalocean.com/v2/domains/example.com" + }, + "status": "ok" + } + ] + } + } + } + } + }, + "all_regions": { + "description": "A JSON object with a key set to `regions`. The value is an array of `region` objects, each of which contain the standard `region` attributes.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "regions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/region" + } + } + }, + "required": [ + "regions" + ] + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ], + "example": { + "regions": [ + { + "name": "New York 3", + "slug": "nyc3", + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata", + "install_agent", + "storage", + "image_transfer" + ], + "available": true, + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192g" + ] + } + ], + "links": { + "pages": { + "last": "https://api.digitalocean.com/v2/regions?page=13&per_page=1", + "next": "https://api.digitalocean.com/v2/regions?page=2&per_page=1" + } + }, + "meta": { + "total": 13 + } + } + } + } + } + }, + "registry_info": { + "description": "The response will be a JSON object with the key `registry` containing information about your registry.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "registry": { + "$ref": "#/components/schemas/registry" + } + } + } + } + } + }, + "subscription_response": { + "description": "The response will be a JSON object with a key called `subscription` containing information about your subscription.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "subscription": { + "$ref": "#/components/schemas/subscription" + } + } + } + } + } + }, + "docker_credentials": { + "description": "A Docker `config.json` file for the container registry.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/docker_credentials" + } + } + } + }, + "all_repositories": { + "description": "The response body will be a JSON object with a key of `repositories`. This will be set to an array containing objects each representing a repository.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "repositories": { + "type": "array", + "items": { + "$ref": "#/components/schemas/repository" + } + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ], + "example": { + "repositories": [ + { + "registry_name": "example", + "name": "repo-1", + "latest_tag": { + "registry_name": "example", + "repository": "repo-1", + "tag": "latest", + "manifest_digest": "sha256:cb8a924afdf0229ef7515d9e5b3024e23b3eb03ddbba287f4a19c6ac90b8d221", + "compressed_size_bytes": 2803255, + "size_bytes": 5861888, + "updated_at": "2020-04-09T23:54:25Z" + }, + "tag_count": 1 + } + ], + "meta": { + "total": 1 + } + } + } + } + } + }, + "all_repositories_v2": { + "description": "The response body will be a JSON object with a key of `repositories`. This will be set to an array containing objects each representing a repository.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "repositories": { + "type": "array", + "items": { + "$ref": "#/components/schemas/repository_v2" + } + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ], + "example": { + "repositories": [ + { + "registry_name": "example", + "name": "repo-1", + "tag_count": 57, + "manifest_count": 82, + "latest_manifest": { + "digest": "sha256:cb8a924afdf0229ef7515d9e5b3024e23b3eb03ddbba287f4a19c6ac90b8d221", + "registry_name": "example", + "repository": "repo-1", + "compressed_size_bytes": 1972332, + "size_bytes": 2816445, + "updated_at": "2021-04-09T23:54:25Z", + "tags": [ + "v1", + "v2" + ], + "blobs": [ + { + "digest": "sha256:14119a10abf4669e8cdbdff324a9f9605d99697215a0d21c360fe8dfa8471bab", + "compressed_size_bytes": 1471 + }, + { + "digest": "sha256:a0d0a0d46f8b52473982a3c466318f479767577551a53ffc9074c9fa7035982e", + "compressed_size_byte": 2814446 + }, + { + "digest": "sha256:69704ef328d05a9f806b6b8502915e6a0a4faa4d72018dc42343f511490daf8a", + "compressed_size_bytes": 528 + } + ] + } + } + ], + "meta": { + "total": 5 + }, + "links": { + "pages": { + "next": "https://api.digitalocean.com/v2/registry/example/repositoriesV2?page=2&page_token=JPZmZzZXQiOjB9&per_page=1", + "last": "https://api.digitalocean.com/v2/registry/example/repositoriesV2?page=5&per_page=1" + } + } + } + } + } + } + }, + "repository_tags": { + "description": "The response body will be a JSON object with a key of `tags`. This will be set to an array containing objects each representing a tag.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "tags": { + "type": "array", + "items": { + "$ref": "#/components/schemas/repository_tag" + } + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ], + "example": { + "tags": [ + { + "registry_name": "example", + "repository": "repo-1", + "tag": "latest", + "manifest_digest": "sha256:cb8a924afdf0229ef7515d9e5b3024e23b3eb03ddbba287f4a19c6ac90b8d221", + "compressed_size_bytes": 2803255, + "size_bytes": 5861888, + "updated_at": "2020-04-09T23:54:25Z" + } + ], + "meta": { + "total": 1 + } + } + } + } + } + }, + "repository_manifests": { + "description": "The response body will be a JSON object with a key of `manifests`. This will be set to an array containing objects each representing a manifest.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "manifests": { + "type": "array", + "items": { + "$ref": "#/components/schemas/repository_manifest" + } + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ], + "example": { + "manifests": [ + { + "digest": "sha256:cb8a924afdf0229ef7515d9e5b3024e23b3eb03ddbba287f4a19c6ac90b8d221", + "registry_name": "example", + "repository": "repo-1", + "compressed_size_bytes": 1972332, + "size_bytes": 2816445, + "updated_at": "2021-04-09T23:54:25Z", + "tags": [ + "v1", + "v2" + ], + "blobs": [ + { + "digest": "sha256:14119a10abf4669e8cdbdff324a9f9605d99697215a0d21c360fe8dfa8471bab", + "compressed_size_bytes": 1471 + }, + { + "digest": "sha256:a0d0a0d46f8b52473982a3c466318f479767577551a53ffc9074c9fa7035982e", + "compressed_size_byte": 2814446 + }, + { + "digest": "sha256:69704ef328d05a9f806b6b8502915e6a0a4faa4d72018dc42343f511490daf8a", + "compressed_size_bytes": 528 + } + ] + } + ], + "meta": { + "total": 3 + }, + "links": { + "pages": { + "first": "https://api.digitalocean.com/v2/registry/example/repositories/repo-1/digests?page=1&per_page=1", + "prev": "https://api.digitalocean.com/v2/registry/example/repositories/repo-1/digests?page=1&per_page=1", + "next": "https://api.digitalocean.com/v2/registry/example/repositories/repo-1/digests?page=3&per_page=1", + "last": "https://api.digitalocean.com/v2/registry/example/repositories/repo-1/digests?page=3&per_page=1" + } + } + } + } + } + } + }, + "garbage_collection": { + "description": "The response will be a JSON object with a key of `garbage_collection`. This will be a json object with attributes representing the currently-active garbage collection.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "garbage_collection": { + "$ref": "#/components/schemas/garbage_collection" + } + } + } + } + } + }, + "garbage_collections": { + "description": "The response will be a JSON object with a key of `garbage_collections`. This will be set to an array containing objects representing each past garbage collection. Each will contain the standard Garbage Collection attributes.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "garbage_collections": { + "type": "array", + "items": { + "$ref": "#/components/schemas/garbage_collection" + } + } + } + }, + "example": { + "garbage_collections": [ + { + "uuid": "eff0feee-49c7-4e8f-ba5c-a320c109c8a8", + "registry_name": "example", + "status": "requested", + "created_at": "2020-10-30T21:03:24.000Z", + "updated_at": "2020-10-30T21:03:44.000Z", + "blobs_deleted": 42, + "freed_bytes": 667 + } + ], + "meta": { + "total": 1 + } + } + } + } + }, + "registry_options_response": { + "description": "The response will be a JSON object with a key called `options` which contains a key called `subscription_tiers` listing the available tiers.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "options": { + "type": "object", + "properties": { + "available_regions": { + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "nyc3" + ] + }, + "subscription_tiers": { + "type": "array", + "items": { + "allOf": [ + { + "$ref": "#/components/schemas/subscription_tier_base" + }, + { + "$ref": "#/components/schemas/subscription_tier_extended" + } + ] + } + } + } + } + } + }, + "example": { + "options": { + "available_regions": [ + "nyc3", + "sfo3", + "ams3", + "sgp1", + "fra1" + ], + "subscription_tiers": [ + { + "name": "Starter", + "slug": "starter", + "included_repositories": 1, + "included_storage_bytes": 524288000, + "allow_storage_overage": false, + "included_bandwidth_bytes": 524288000, + "monthly_price_in_cents": 0, + "eligible": false, + "eligibility_reasons": [ + "OverRepositoryLimit" + ] + }, + { + "name": "Basic", + "slug": "basic", + "included_repositories": 5, + "included_storage_bytes": 5368709120, + "allow_storage_overage": true, + "included_bandwidth_bytes": 5368709120, + "monthly_price_in_cents": 500, + "eligible": true + }, + { + "name": "Professional", + "slug": "professional", + "included_repositories": 0, + "included_storage_bytes": 107374182400, + "allow_storage_overage": true, + "included_bandwidth_bytes": 107374182400, + "monthly_price_in_cents": 2000, + "eligible": true + } + ] + } + } + } + } + }, + "droplet_neighbors_ids": { + "description": "A JSON object with an `neighbor_ids` key.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/neighbor_ids" + } + } + } + }, + "reserved_ip_list": { + "description": "The response will be a JSON object with a key called `reserved_ips`. This will be set to an array of reserved IP objects, each of which will contain the standard reserved IP attributes", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "reserved_ips": { + "type": "array", + "items": { + "$ref": "#/components/schemas/reserved_ip" + } + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ], + "example": { + "reserved_ips": [ + { + "ip": "45.55.96.47", + "droplet": null, + "region": { + "name": "New York 3", + "slug": "nyc3", + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata", + "install_agent", + "storage", + "image_transfer" + ], + "available": true, + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192g" + ] + }, + "locked": false, + "project_id": "746c6152-2fa2-11ed-92d3-27aaa54e4988" + } + ], + "links": {}, + "meta": { + "total": 1 + } + } + } + } + } + }, + "reserved_ip_created": { + "description": "The response will be a JSON object with a key called `reserved_ip`. The value of this will be an object that contains the standard attributes associated with a reserved IP.\nWhen assigning a reserved IP to a Droplet at same time as it created, the response's `links` object will contain links to both the Droplet and the assignment action. The latter can be used to check the status of the action.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "reserved_ip": { + "$ref": "#/components/schemas/reserved_ip" + }, + "links": { + "type": "object", + "properties": { + "droplets": { + "type": "array", + "items": { + "$ref": "#/components/schemas/action_link" + } + }, + "actions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/action_link" + } + } + } + } + } + }, + "examples": { + "reserved_ip_assigning": { + "$ref": "#/components/examples/reserved_ip_assigning" + }, + "reserved_ip_reserving": { + "$ref": "#/components/examples/reserved_ip_reserving" + } + } + } + } + }, + "reserved_ip": { + "description": "The response will be a JSON object with a key called `reserved_ip`. The value of this will be an object that contains the standard attributes associated with a reserved IP.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "reserved_ip": { + "$ref": "#/components/schemas/reserved_ip" + } + } + }, + "examples": { + "reserved_ip_assigned": { + "$ref": "#/components/examples/reserved_ip_assigned" + }, + "reserved_ip_reserved": { + "$ref": "#/components/examples/reserved_ip_reserved" + } + } + } + } + }, + "reserved_ip_actions": { + "description": "The results will be returned as a JSON object with an `actions` key. This will be set to an array filled with action objects containing the standard reserved IP action attributes.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "actions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/action" + } + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ], + "example": { + "actions": [ + { + "id": 72531856, + "status": "completed", + "type": "reserve_ip", + "started_at": "2015-11-21T21:51:09Z", + "completed_at": "2015-11-21T21:51:09Z", + "resource_id": 758604197, + "resource_type": "reserved_ip", + "region": { + "name": "New York 3", + "slug": "nyc3", + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192gb" + ], + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata" + ], + "available": true + }, + "region_slug": "nyc3" + } + ], + "links": {}, + "meta": { + "total": 1 + } + } + } + } + } + }, + "reserved_ip_action": { + "description": "The response will be an object with a key called `action`. The value of this will be an object that contains the standard reserved IP action attributes.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "action": { + "allOf": [ + { + "$ref": "#/components/schemas/action" + }, + { + "type": "object", + "properties": { + "project_id": { + "type": "string", + "format": "uuid", + "example": "746c6152-2fa2-11ed-92d3-27aaa54e4988", + "description": "The UUID of the project to which the reserved IP currently belongs." + } + } + } + ] + } + }, + "example": { + "action": { + "id": 72531856, + "status": "completed", + "type": "assign_ip", + "started_at": "2015-11-12T17:51:03Z", + "completed_at": "2015-11-12T17:51:14Z", + "resource_id": 758604968, + "resource_type": "reserved_ip", + "region": { + "name": "New York 3", + "slug": "nyc3", + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192gb" + ], + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata" + ], + "available": true + }, + "region_slug": "nyc3", + "project_id": "746c6152-2fa2-11ed-92d3-27aaa54e4988" + } + } + } + } + } + }, + "all_sizes": { + "description": "A JSON object with a key called `sizes`. The value of this will be an array of `size` objects each of which contain the standard size attributes.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "sizes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/size" + } + } + }, + "required": [ + "sizes" + ] + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ], + "example": { + "sizes": [ + { + "slug": "s-1vcpu-1gb", + "memory": 1024, + "vcpus": 1, + "disk": 25, + "transfer": 1, + "price_monthly": 5, + "price_hourly": 0.00743999984115362, + "regions": [ + "ams2", + "ams3", + "blr1", + "fra1", + "lon1", + "nyc1", + "nyc2", + "nyc3", + "sfo1", + "sfo2", + "sfo3", + "sgp1", + "tor1" + ], + "available": true, + "description": "Basic" + } + ], + "links": { + "pages": { + "last": "https://api.digitalocean.com/v2/sizes?page=64&per_page=1", + "next": "https://api.digitalocean.com/v2/sizes?page=2&per_page=1" + } + }, + "meta": { + "total": 64 + } + } + } + } + } + }, + "snapshots": { + "description": "A JSON object with a key of `snapshots`.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "snapshots": { + "type": "array", + "items": { + "$ref": "#/components/schemas/snapshots" + } + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ] + }, + "examples": { + "All Snapshots": { + "$ref": "#/components/examples/snapshots_all" + }, + "Droplets Snapshots": { + "$ref": "#/components/examples/snapshots_droplets_only" + }, + "Volume Snapshots": { + "$ref": "#/components/examples/snapshots_volumes_only" + } + } + } + } + }, + "snapshots_existing": { + "description": "A JSON object with a key called `snapshot`.\n", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "snapshot": { + "$ref": "#/components/schemas/snapshots" + } + } + } + } + } + }, + "tags_all": { + "description": "To list all of your tags, you can send a `GET` request to `/v2/tags`.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "tags": { + "type": "array", + "items": { + "$ref": "#/components/schemas/tags" + } + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ], + "example": { + "tags": [ + { + "name": "extra-awesome", + "resources": { + "count": 5, + "last_tagged_uri": "https://api.digitalocean.com/v2/images/7555620", + "droplets": { + "count": 1, + "last_tagged_uri": "https://api.digitalocean.com/v2/droplets/3164444" + }, + "images": { + "count": 1, + "last_tagged_uri": "https://api.digitalocean.com/v2/images/7555620" + }, + "volumes": { + "count": 1, + "last_tagged_uri": "https://api.digitalocean.com/v2/volumes/3d80cb72-342b-4aaa-b92e-4e4abb24a933" + }, + "volume_snapshots": { + "count": 1, + "last_tagged_uri": "https://api.digitalocean.com/v2/snapshots/1f6f46e8-6b60-11e9-be4e-0a58ac144519" + }, + "databases": { + "count": 1, + "last_tagged_uri": "https://api.digitalocean.com/v2/databases/b92438f6-ba03-416c-b642-e9236db91976" + } + } + } + ], + "links": {}, + "meta": { + "total": 1 + } + } + } + } + } + }, + "tags_new": { + "description": "The response will be a JSON object with a key called tag. The value of this will be a tag object containing the standard tag attributes", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "tag": { + "$ref": "#/components/schemas/tags" + } + }, + "example": { + "tag": { + "name": "extra-awesome", + "resources": { + "count": 0, + "droplets": { + "count": 0 + }, + "images": { + "count": 0 + }, + "volumes": { + "count": 0 + }, + "volume_snapshots": { + "count": 0 + }, + "databases": { + "count": 0 + } + } + } + } + } + } + } + }, + "tags_bad_request": { + "description": "Bad Request", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + }, + "x-request-id": { + "$ref": "#/components/headers/x-request-id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/error_with_root_causes" + }, + "examples": { + "InvalidCharacters": { + "value": { + "error": "Error validating resource tag: \\\"tag-name \\\\\\\"здорово\\\\\\\" contains invalid characters\\\"", + "messages": null, + "root_causes": [ + "rpc error: code = InvalidArgument desc = Error validating resource tag: \\\"tag-name \\\\\\\"здорово\\\\\\\" contains invalid characters\\\"" + ] + } + } + } + } + } + }, + "tags_existing": { + "description": "The response will be a JSON object with a key called `tag`. The value of this will be a tag object containing the standard tag attributes.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "tag": { + "$ref": "#/components/schemas/tags" + } + }, + "example": { + "tag": { + "tag": { + "name": "extra-awesome", + "resources": { + "count": 5, + "last_tagged_uri": "https://api.digitalocean.com/v2/images/7555620", + "droplets": { + "count": 1, + "last_tagged_uri": "https://api.digitalocean.com/v2/droplets/3164444" + }, + "images": { + "count": 1, + "last_tagged_uri": "https://api.digitalocean.com/v2/images/7555620" + }, + "volumes": { + "count": 1, + "last_tagged_uri": "https://api.digitalocean.com/v2/volumes/3d80cb72-342b-4aaa-b92e-4e4abb24a933" + }, + "volume_snapshots": { + "count": 1, + "last_tagged_uri": "https://api.digitalocean.com/v2/snapshots/1f6f46e8-6b60-11e9-be4e-0a58ac144519" + }, + "databases": { + "count": 1, + "last_tagged_uri": "https://api.digitalocean.com/v2/databases/b92438f6-ba03-416c-b642-e9236db91976" + } + } + } + } + } + } + } + } + }, + "volumes": { + "description": "The response will be a JSON object with a key called `volumes`. This will be set to an array of volume objects, each of which will contain the standard volume attributes.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "volumes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/volume_full" + }, + "description": "Array of volumes." + } + }, + "required": [ + "volumes" + ] + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ] + }, + "examples": { + "All Volumes": { + "$ref": "#/components/examples/volumes_all" + }, + "Filtered by Name": { + "$ref": "#/components/examples/volumes_filtered_by_name" + }, + "Filtered by Region": { + "$ref": "#/components/examples/volumes_filtered_by_region" + } + } + } + } + }, + "volume": { + "description": "The response will be a JSON object with a key called `volume`. The value will be an object containing the standard attributes associated with a volume.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "volume": { + "$ref": "#/components/schemas/volume_full" + } + }, + "example": { + "volume": { + "id": "506f78a4-e098-11e5-ad9f-000f53306ae1", + "region": { + "name": "New York 1", + "slug": "nyc1", + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192gb" + ], + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata" + ], + "available": true + }, + "droplet_ids": [], + "name": "example", + "description": "Block store for examples", + "size_gigabytes": 10, + "filesystem_type": "ext4", + "filesystem_label": "example", + "created_at": "2020-03-02T17:00:49Z" + } + } + } + } + } + }, + "volumeAction": { + "description": "The response will be an object with a key called `action`. The value of this will be an object that contains the standard volume action attributes", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "action": { + "$ref": "#/components/schemas/volumeAction" + } + } + }, + "examples": { + "volume_action_attach_response": { + "$ref": "#/components/examples/volume_action_attach_response" + }, + "VolumeActionDetachResponse": { + "$ref": "#/components/examples/volume_action_detach_response" + } + } + } + } + }, + "volumeSnapshot": { + "description": "You will get back a JSON object that has a `snapshot` key. This will contain the standard snapshot attributes", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "properties": { + "snapshot": { + "$ref": "#/components/schemas/snapshots" + } + }, + "example": { + "snapshot": { + "id": "8fa70202-873f-11e6-8b68-000f533176b1", + "name": "big-data-snapshot1475261774", + "regions": [ + "nyc1" + ], + "created_at": "2020-09-30T18:56:14Z", + "resource_id": "82a48a18-873f-11e6-96bf-000f53315a41", + "resource_type": "volume", + "min_disk_size": 10, + "size_gigabytes": 10, + "tags": [ + "aninterestingtag" + ] + } + } + } + } + } + }, + "volumeActions": { + "description": "The response will be an object with a key called `action`. The value of this will be an object that contains the standard volume action attributes.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "actions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/volumeAction" + } + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ], + "example": { + "actions": [ + { + "id": 72531856, + "status": "completed", + "type": "attach_volume", + "started_at": "2020-11-21T21:51:09Z", + "completed_at": "2020-11-21T21:51:09Z", + "resource_type": "volume", + "region": { + "name": "New York 1", + "slug": "nyc1", + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192gb" + ], + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata" + ], + "available": true + }, + "region_slug": "nyc1" + } + ], + "links": {}, + "meta": { + "total": 1 + } + } + } + } + } + }, + "volumeSnapshots": { + "description": "You will get back a JSON object that has a `snapshots` key. This will be set to an array of snapshot objects, each of which contain the standard snapshot attributes", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "snapshots": { + "type": "array", + "items": { + "$ref": "#/components/schemas/snapshots" + } + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ], + "example": { + "snapshots": [ + { + "id": "8eb4d51a-873f-11e6-96bf-000f53315a41", + "name": "big-data-snapshot1475261752", + "regions": [ + "nyc1" + ], + "created_at": "2020-09-30T18:56:12Z", + "resource_id": "82a48a18-873f-11e6-96bf-000f53315a41", + "resource_type": "volume", + "min_disk_size": 10, + "size_gigabytes": 0, + "tags": null + } + ], + "links": {}, + "meta": { + "total": 1 + } + } + } + } + } + }, + "all_vpcs": { + "description": "The response will be a JSON object with a key called `vpcs`. This will be set to an array of objects, each of which will contain the standard attributes associated with a VPC", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "vpcs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/vpc" + } + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ], + "example": { + "vpcs": [ + { + "name": "env.prod-vpc", + "description": "VPC for production environment", + "region": "nyc1", + "ip_range": "10.10.10.0/24", + "id": "5a4981aa-9653-4bd1-bef5-d6bff52042e4", + "urn": "do:vpc:5a4981aa-9653-4bd1-bef5-d6bff52042e4", + "default": false, + "created_at": "2020-03-13T19:20:47.442049222Z" + }, + { + "id": "e0fe0f4d-596a-465e-a902-571ce57b79fa", + "urn": "do:vpc:e0fe0f4d-596a-465e-a902-571ce57b79fa", + "name": "default-nyc1", + "description": "", + "region": "nyc1", + "ip_range": "10.102.0.0/20", + "created_at": "2020-03-13T19:29:20Z", + "default": true + }, + { + "id": "d455e75d-4858-4eec-8c95-da2f0a5f93a7", + "urn": "do:vpc:d455e75d-4858-4eec-8c95-da2f0a5f93a7", + "name": "default-nyc3", + "description": "", + "region": "nyc3", + "ip_range": "10.100.0.0/20", + "created_at": "2019-11-19T22:19:35Z", + "default": true + } + ], + "links": {}, + "meta": { + "total": 3 + } + } + } + } + } + }, + "existing_vpc": { + "description": "The response will be a JSON object with a key called `vpc`. The value of this will be an object that contains the standard attributes associated with a VPC.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "vpc": { + "$ref": "#/components/schemas/vpc" + } + } + } + } + } + }, + "vpc_members": { + "description": "The response will be a JSON object with a key called members. This will be set to an array of objects, each of which will contain the standard attributes associated with a VPC member.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "members": { + "type": "array", + "items": { + "$ref": "#/components/schemas/vpc_member" + } + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ], + "example": { + "members": [ + { + "urn": "do:loadbalancer:fb294d78-d193-4cb2-8737-ea620993591b", + "name": "nyc1-load-balancer-01", + "created_at": "2020-03-13T19:30:48Z" + }, + { + "urn": "do:dbaas:13f7a2f6-43df-4c4a-8129-8733267ddeea", + "name": "db-postgresql-nyc1-55986", + "created_at": "2020-03-13T19:30:18Z" + }, + { + "urn": "do:kubernetes:da39d893-96e1-4e4d-971d-1fdda33a46b1", + "name": "k8s-nyc1-1584127772221", + "created_at": "2020-03-13T19:30:16Z" + }, + { + "urn": "do:droplet:86e29982-03a7-4946-8a07-a0114dff8754", + "name": "ubuntu-s-1vcpu-1gb-nyc1-01", + "created_at": "2020-03-13T19:29:20Z" + } + ], + "links": {}, + "meta": { + "total": 4 + } + } + } + } + } + }, + "all_checks": { + "description": "The response will be a JSON object with a key called `checks`. This will be set to an array of objects, each of which will contain the standard attributes associated with an uptime check", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "checks": { + "type": "array", + "items": { + "$ref": "#/components/schemas/check" + } + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ] + } + } + } + }, + "existing_check": { + "description": "The response will be a JSON object with a key called `check`. The value of this will be an object that contains the standard attributes associated with an uptime check.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "check": { + "$ref": "#/components/schemas/check" + } + } + } + } + } + }, + "existing_check_state": { + "description": "The response will be a JSON object with a key called `state`. The value of this will be an object that contains the standard attributes associated with an uptime check's state.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "state": { + "$ref": "#/components/schemas/state" + } + } + } + } + } + }, + "all_alerts": { + "description": "The response will be a JSON object with a key called `alerts`. This will be set to an array of objects, each of which will contain the standard attributes associated with an uptime alert.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "type": "object", + "properties": { + "alerts": { + "type": "array", + "items": { + "$ref": "#/components/schemas/alert" + } + } + } + }, + { + "$ref": "#/components/schemas/pagination" + }, + { + "$ref": "#/components/schemas/meta" + } + ] + } + } + } + }, + "existing_alert": { + "description": "The response will be a JSON object with a key called `alert`. The value of this will be an object that contains the standard attributes associated with an uptime alert.", + "headers": { + "ratelimit-limit": { + "$ref": "#/components/headers/ratelimit-limit" + }, + "ratelimit-remaining": { + "$ref": "#/components/headers/ratelimit-remaining" + }, + "ratelimit-reset": { + "$ref": "#/components/headers/ratelimit-reset" + } + }, + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "alert": { + "$ref": "#/components/schemas/alert" + } + } + } + } + } + } + }, + "links": { + "sshKeys_get_by_id": { + "operationId": "sshKeys_get_by_id", + "parameters": { + "ssh_key_identifier": "$response.body#/ssh_key/id" + }, + "description": "The `id` value returned in the response can be used as the `ssh_key_identifier` parameter in `GET /v2/account/keys/{ssh_key_identifier}`." + }, + "sshKeys_get_by_fingerprint": { + "operationId": "sshKeys_get_by_fingerprint", + "parameters": { + "ssh_key_identifier": "$response.body#/ssh_key/fingerprint" + }, + "description": "The `fingerprint` value returned in the response can be used as the `ssh_key_identifier` parameter in `GET /v2/account/keys/{ssh_key_identifier}`." + }, + "sshKeys_delete_by_id": { + "operationId": "sshKeys_delete_by_id", + "parameters": { + "ssh_key_identifier": "$response.body#/ssh_key/id" + }, + "description": "The `id` value returned in the response can be used as the `ssh_key_identifier` parameter in `DELETE /v2/account/keys/{ssh_key_identifier}`." + }, + "sshKeys_delete_by_fingerprint": { + "operationId": "ssh_keys_delete_by_fingerprint", + "parameters": { + "ssh_key_identifier": "$response.body#/ssh_key/fingerprint" + }, + "description": "The `fingerprint` value returned in the response can be used as the `ssh_key_identifier` parameter in `DELETE /v2/account/keys/{ssh_key_identifier}`." + } + }, + "examples": { + "apps": { + "value": { + "apps": [ + { + "id": "4f6c71e2-1e90-4762-9fee-6cc4a0a9f2cf", + "owner_uuid": "ff36cbc6fd350fe12577f5123133bb5ba01a2419", + "spec": { + "name": "sample-php", + "services": [ + { + "name": "sample-php", + "git": { + "repo_clone_url": "https://github.com/digitalocean/sample-php.git", + "branch": "main" + }, + "run_command": "heroku-php-apache2", + "environment_slug": "php", + "instance_size_slug": "basic-xxs", + "instance_count": 1, + "http_port": 8080, + "routes": [ + { + "path": "/" + } + ] + } + ], + "domains": [ + { + "domain": "sample-php.example.com", + "type": "PRIMARY", + "zone": "example.com", + "minimum_tls_version": "1.3" + } + ] + }, + "default_ingress": "https://sample-php-iaj87.ondigitalocean.app", + "created_at": "2020-11-19T20:27:18Z", + "updated_at": "2020-12-01T00:42:16Z", + "active_deployment": { + "id": "3aa4d20e-5527-4c00-b496-601fbd22520a", + "spec": { + "name": "sample-php", + "services": [ + { + "name": "sample-php", + "git": { + "repo_clone_url": "https://github.com/digitalocean/sample-php.git", + "branch": "main" + }, + "run_command": "heroku-php-apache2", + "environment_slug": "php", + "instance_size_slug": "basic-xxs", + "instance_count": 1, + "http_port": 8080, + "routes": [ + { + "path": "/" + } + ] + } + ], + "region": "fra", + "domains": [ + { + "domain": "sample-php.example.com", + "type": "PRIMARY", + "zone": "example.com", + "minimum_tls_version": "1.3" + } + ] + }, + "services": [ + { + "name": "sample-php", + "source_commit_hash": "54d4a727f457231062439895000d45437c7bb405" + } + ], + "phase_last_updated_at": "2020-12-01T00:42:12Z", + "created_at": "2020-12-01T00:40:05Z", + "updated_at": "2020-12-01T00:42:12Z" + }, + "cause": "app spec updated", + "pending_deployment": { + "id": "3aa4d20e-5527-4c00-b496-601fbd22520a", + "spec": { + "name": "sample-php", + "services": [ + { + "name": "sample-php", + "git": { + "repo_clone_url": "https://github.com/digitalocean/sample-php.git", + "branch": "main" + }, + "run_command": "heroku-php-apache2", + "environment_slug": "php", + "instance_size_slug": "basic-xxs", + "instance_count": 1, + "http_port": 8080, + "routes": [ + { + "path": "/" + } + ] + } + ], + "region": "fra", + "domains": [ + { + "domain": "sample-php.example.com", + "type": "PRIMARY", + "zone": "example.com", + "minimum_tls_version": "1.3" + } + ] + }, + "services": [ + { + "name": "sample-php", + "source_commit_hash": "54d4a727f457231062439895000d45437c7bb405" + } + ], + "phase_last_updated_at": "2020-12-01T00:42:12Z", + "created_at": "2020-12-01T00:40:05Z", + "updated_at": "2020-12-01T00:42:12Z" + }, + "progress": { + "success_steps": 6, + "total_steps": 6, + "steps": [ + { + "name": "build", + "status": "SUCCESS", + "steps": [ + { + "name": "initialize", + "status": "SUCCESS", + "started_at": "2020-12-01T00:40:11.979305214Z", + "ended_at": "2020-12-01T00:40:12.470972033Z" + }, + { + "name": "components", + "status": "SUCCESS", + "steps": [ + { + "name": "sample-php", + "status": "SUCCESS", + "started_at": "0001-01-01T00:00:00Z", + "ended_at": "0001-01-01T00:00:00Z", + "component_name": "sample-php", + "message_base": "Building service" + } + ], + "started_at": "2020-12-01T00:40:12.470996857Z", + "ended_at": "2020-12-01T00:41:26.180360487Z" + } + ], + "started_at": "2020-12-01T00:40:11.979257919Z", + "ended_at": "2020-12-01T00:41:26.653989756Z" + } + ], + "phase": "ACTIVE", + "tier_slug": "basic" + }, + "last_deployment_created_at": "2020-12-01T00:40:05Z", + "live_url": "https://sample-php.example.com", + "region": { + "slug": "fra", + "label": "Frankfurt", + "flag": "germany", + "continent": "Europe", + "data_centers": [ + "fra1" + ] + }, + "tier_slug": "basic", + "live_url_base": "https://sample-php.example.com", + "live_domain": "sample-php.example.com", + "domains": [ + { + "id": "0831f444-a1a7-11ed-828c-ef59494480b5", + "phase": "ACTIVE", + "spec": { + "domain": "sample-php.example.com", + "type": "PRIMARY", + "zone": "example.com", + "minimum_tls_version": "1.3" + }, + "rotate_validation_records": false, + "certificate_expires_at": "2024-01-29T23:59:59Z", + "progress": { + "steps": [ + { + "ended_at": "0001-01-01T00:00:00Z", + "name": "default-ingress-ready", + "started_at": "2023-01-30T22:15:45.021896292Z", + "status": "SUCCESS" + }, + { + "ended_at": "0001-01-01T00:00:00Z", + "name": "ensure-zone", + "started_at": "2023-01-30T22:15:45.022017004Z", + "status": "SUCCESS" + }, + { + "ended_at": "2023-01-30T15:42:28.50752065Z", + "name": "ensure-ns-records", + "started_at": "2023-01-30T22:15:45.025567874Z", + "status": "SUCCESS" + }, + { + "ended_at": "0001-01-01T00:00:00Z", + "name": "verify-nameservers", + "started_at": "2023-01-30T22:15:45.033591906Z", + "status": "SUCCESS" + }, + { + "ended_at": "0001-01-01T00:00:00Z", + "name": "ensure-record", + "started_at": "2023-01-30T22:15:45.156750604Z", + "status": "SUCCESS" + }, + { + "ended_at": "2023-01-30T15:43:30.258626422Z", + "name": "ensure-alias-record", + "started_at": "2023-01-30T22:15:45.165933869Z", + "status": "SUCCESS" + }, + { + "ended_at": "2023-01-30T15:43:30.258808279Z", + "name": "ensure-wildcard-record", + "started_at": "2023-01-30T22:15:45.166093422Z", + "status": "SUCCESS" + }, + { + "ended_at": "0001-01-01T00:00:00Z", + "name": "verify-cname", + "started_at": "2023-01-30T22:15:45.166205559Z", + "status": "SUCCESS" + }, + { + "ended_at": "2023-01-30T15:43:30.475903785Z", + "name": "ensure-ssl-txt-record-saved", + "started_at": "2023-01-30T22:15:45.295237186Z", + "status": "SUCCESS" + }, + { + "ended_at": "2023-01-30T15:43:30.476017236Z", + "name": "ensure-ssl-txt-record", + "started_at": "2023-01-30T22:15:45.295315291Z", + "status": "SUCCESS" + }, + { + "ended_at": "2023-01-30T15:43:30.476094058Z", + "name": "ensure-renewal-email", + "started_at": "2023-01-30T22:15:45.295374087Z", + "status": "SUCCESS" + }, + { + "ended_at": "0001-01-01T00:00:00Z", + "name": "ensure-CA-authorization", + "started_at": "2023-01-30T22:15:45.295428101Z", + "status": "SUCCESS" + }, + { + "ended_at": "0001-01-01T00:00:00Z", + "name": "ensure-certificate", + "started_at": "2023-01-30T22:15:45.978756406Z", + "status": "SUCCESS" + }, + { + "ended_at": "2023-01-30T15:43:52.570612857Z", + "name": "create-deployment", + "started_at": "0001-01-01T00:00:00Z", + "status": "SUCCESS" + }, + { + "ended_at": "2023-01-30T15:43:31.333582377Z", + "name": "configuration-alert", + "started_at": "2023-01-30T22:15:46.278987808Z", + "status": "SUCCESS" + } + ] + } + } + ] + } + ], + "links": { + "pages": {} + }, + "meta": { + "total": 1 + } + } + }, + "app": { + "value": { + "app": { + "id": "c2a93513-8d9b-4223-9d61-5e7272c81cf5", + "owner_uuid": "a4e16f25-cdd1-4483-b246-d77f283c9209", + "spec": { + "name": "sample-golang", + "services": [ + { + "name": "web", + "github": { + "repo": "ChiefMateStarbuck/sample-golang", + "branch": "main" + }, + "run_command": "bin/sample-golang", + "environment_slug": "go", + "instance_size_slug": "basic-xxs", + "instance_count": 1, + "http_port": 8080, + "routes": [ + { + "path": "/" + } + ] + } + ], + "region": "ams", + "domains": [ + { + "domain": "sample-golang.example.com", + "zone": "example.com", + "minimum_tls_version": "1.3" + } + ] + }, + "default_ingress": "https://sample-golang-zyhgn.ondigitalocean.app", + "created_at": "2021-02-10T16:45:14Z", + "updated_at": "2021-02-10T17:06:56Z", + "active_deployment": { + "id": "991dfa59-6a23-459f-86d6-67dfa2c6f1e3", + "spec": { + "name": "sample-golang", + "services": [ + { + "name": "web", + "github": { + "repo": "ChiefMateStarbuck/sample-golang", + "branch": "main" + }, + "run_command": "bin/sample-golang", + "environment_slug": "go", + "instance_size_slug": "basic-xxs", + "instance_count": 1, + "http_port": 8080, + "routes": [ + { + "path": "/" + } + ] + } + ], + "region": "ams", + "domains": [ + { + "domain": "sample-golang.example.com", + "zone": "example.com", + "minimum_tls_version": "1.3" + } + ] + }, + "services": [ + { + "name": "web", + "source_commit_hash": "db6936cb46047c576962962eed81ad52c21f35d7" + } + ], + "phase_last_updated_at": "2021-02-10T17:06:53Z", + "created_at": "2021-02-10T17:05:30Z", + "updated_at": "2021-02-10T17:06:53Z", + "cause": "manual", + "progress": { + "success_steps": 6, + "total_steps": 6, + "steps": [ + { + "name": "build", + "status": "SUCCESS", + "steps": [ + { + "name": "initialize", + "status": "SUCCESS", + "started_at": "2021-02-10T17:05:35.572347485Z", + "ended_at": "2021-02-10T17:05:36.093995229Z" + }, + { + "name": "components", + "status": "SUCCESS", + "steps": [ + { + "name": "web", + "status": "SUCCESS", + "component_name": "web", + "message_base": "Building service" + } + ], + "started_at": "2021-02-10T17:05:36.094015928Z", + "ended_at": "2021-02-10T17:06:19.461737040Z" + } + ], + "started_at": "2021-02-10T17:05:35.572287990Z", + "ended_at": "2021-02-10T17:06:19.807834070Z" + }, + { + "name": "deploy", + "status": "SUCCESS", + "steps": [ + { + "name": "initialize", + "status": "SUCCESS", + "started_at": "2021-02-10T17:06:25.143957508Z", + "ended_at": "2021-02-10T17:06:26.120343872Z" + }, + { + "name": "components", + "status": "SUCCESS", + "steps": [ + { + "name": "web", + "status": "SUCCESS", + "steps": [ + { + "name": "deploy", + "status": "SUCCESS", + "component_name": "web", + "message_base": "Deploying service" + }, + { + "name": "wait", + "status": "SUCCESS", + "component_name": "web", + "message_base": "Waiting for service" + } + ], + "component_name": "web" + } + ], + "started_at": "2021-02-10T17:06:26.120385561Z", + "ended_at": "2021-02-10T17:06:50.029695913Z" + }, + { + "name": "finalize", + "status": "SUCCESS", + "started_at": "2021-02-10T17:06:50.348459495Z", + "ended_at": "2021-02-10T17:06:53.404065961Z" + } + ], + "started_at": "2021-02-10T17:06:25.143932418Z", + "ended_at": "2021-02-10T17:06:53.404104185Z" + } + ] + }, + "phase": "ACTIVE", + "tier_slug": "basic" + }, + "last_deployment_created_at": "2021-02-10T17:05:30Z", + "live_url": "https://sample-golang-zyhgn.ondigitalocean.app", + "pending_deployment": { + "id": "3aa4d20e-5527-4c00-b496-601fbd22520a", + "spec": { + "name": "sample-php", + "services": [ + { + "name": "sample-php", + "git": { + "repo_clone_url": "https://github.com/digitalocean/sample-php.git", + "branch": "main" + }, + "run_command": "heroku-php-apache2", + "environment_slug": "php", + "instance_size_slug": "basic-xxs", + "instance_count": 1, + "http_port": 8080, + "routes": [ + { + "path": "/" + } + ] + } + ], + "region": "fra", + "domains": [ + { + "domain": "sample-php.example.com", + "type": "PRIMARY", + "zone": "example.com", + "minimum_tls_version": "1.3" + } + ] + } + }, + "region": { + "slug": "ams", + "label": "Amsterdam", + "flag": "netherlands", + "continent": "Europe", + "data_centers": [ + "ams3" + ] + }, + "tier_slug": "basic", + "live_url_base": "https://sample-golang-zyhgn.ondigitalocean.app", + "live_domain": "sample-golang-zyhgn.ondigitalocean.app", + "project_id": "88b72d1a-b78a-4d9f-9090-b53c4399073f", + "domains": [ + { + "id": "e206c64e-a1a3-11ed-9e6e-9b7b6dc9a52b", + "phase": "CONFIGURING", + "spec": { + "domain": "sample-golang.example.com", + "type": "PRIMARY", + "zone": "example.com", + "minimum_tls_version": "1.3" + }, + "rotate_validation_records": false, + "certificate_expires_at": "2024-01-29T23:59:59Z", + "progress": { + "steps": [ + { + "ended_at": "0001-01-01T00:00:00Z", + "name": "default-ingress-ready", + "started_at": "2023-01-30T22:15:45.021896292Z", + "status": "SUCCESS" + }, + { + "ended_at": "0001-01-01T00:00:00Z", + "name": "ensure-zone", + "started_at": "2023-01-30T22:15:45.022017004Z", + "status": "SUCCESS" + }, + { + "ended_at": "2023-01-30T15:42:28.50752065Z", + "name": "ensure-ns-records", + "started_at": "2023-01-30T22:15:45.025567874Z", + "status": "SUCCESS" + }, + { + "ended_at": "0001-01-01T00:00:00Z", + "name": "verify-nameservers", + "started_at": "2023-01-30T22:15:45.033591906Z", + "status": "SUCCESS" + }, + { + "ended_at": "0001-01-01T00:00:00Z", + "name": "ensure-record", + "started_at": "2023-01-30T22:15:45.156750604Z", + "status": "SUCCESS" + }, + { + "ended_at": "2023-01-30T15:43:30.258626422Z", + "name": "ensure-alias-record", + "started_at": "2023-01-30T22:15:45.165933869Z", + "status": "SUCCESS" + }, + { + "ended_at": "2023-01-30T15:43:30.258808279Z", + "name": "ensure-wildcard-record", + "started_at": "2023-01-30T22:15:45.166093422Z", + "status": "SUCCESS" + }, + { + "ended_at": "0001-01-01T00:00:00Z", + "name": "verify-cname", + "started_at": "2023-01-30T22:15:45.166205559Z", + "status": "SUCCESS" + }, + { + "ended_at": "2023-01-30T15:43:30.475903785Z", + "name": "ensure-ssl-txt-record-saved", + "started_at": "2023-01-30T22:15:45.295237186Z", + "status": "SUCCESS" + }, + { + "ended_at": "2023-01-30T15:43:30.476017236Z", + "name": "ensure-ssl-txt-record", + "started_at": "2023-01-30T22:15:45.295315291Z", + "status": "SUCCESS" + }, + { + "ended_at": "2023-01-30T15:43:30.476094058Z", + "name": "ensure-renewal-email", + "started_at": "2023-01-30T22:15:45.295374087Z", + "status": "SUCCESS" + }, + { + "ended_at": "0001-01-01T00:00:00Z", + "name": "ensure-CA-authorization", + "started_at": "2023-01-30T22:15:45.295428101Z", + "status": "SUCCESS" + }, + { + "ended_at": "0001-01-01T00:00:00Z", + "name": "ensure-certificate", + "started_at": "2023-01-30T22:15:45.978756406Z", + "status": "RUNNING" + }, + { + "ended_at": "0001-01-01T00:00:00", + "name": "create-deployment", + "started_at": "0001-01-01T00:00:00Z", + "status": "PENDING" + }, + { + "ended_at": "0001-01-01T00:00:00", + "name": "configuration-alert", + "started_at": "0001-01-01T00:00:00", + "status": "PENDING" + } + ] + } + } + ] + } + } + }, + "logs": { + "value": { + "live_url": "https://logs-example/build.log", + "url": "https://logs/build.log", + "historic_logs": [ + "https://logs-example/archive/build.log" + ] + } + }, + "deployments": { + "value": { + "deployments": [ + { + "id": "b6bdf840-2854-4f87-a36c-5f231c617c84", + "spec": { + "name": "sample-golang", + "services": [ + { + "name": "web", + "github": { + "repo": "digitalocean/sample-golang", + "branch": "branch" + }, + "run_command": "bin/sample-golang", + "environment_slug": "go", + "instance_size_slug": "basic-xxs", + "instance_count": 2, + "routes": [ + { + "path": "/" + } + ] + } + ], + "region": "ams" + }, + "services": [ + { + "name": "web", + "source_commit_hash": "9a4df0b8e161e323bc3cdf1dc71878080fe144fa" + } + ], + "phase_last_updated_at": "0001-01-01T00:00:00Z", + "created_at": "2020-07-28T18:00:00Z", + "updated_at": "2020-07-28T18:00:00Z", + "cause": "commit 9a4df0b pushed to github/digitalocean/sample-golang", + "progress": { + "pending_steps": 6, + "total_steps": 6, + "steps": [ + { + "name": "build", + "status": "PENDING", + "steps": [ + { + "name": "initialize", + "status": "PENDING" + }, + { + "name": "components", + "status": "PENDING", + "steps": [ + { + "name": "web", + "status": "PENDING", + "component_name": "web", + "message_base": "Building service" + } + ] + } + ] + }, + { + "name": "deploy", + "status": "PENDING", + "steps": [ + { + "name": "initialize", + "status": "PENDING" + }, + { + "name": "components", + "status": "PENDING", + "steps": [ + { + "name": "web", + "status": "PENDING", + "steps": [ + { + "name": "deploy", + "status": "PENDING", + "component_name": "web", + "message_base": "Deploying service" + }, + { + "name": "wait", + "status": "PENDING", + "component_name": "web", + "message_base": "Waiting for service" + } + ], + "component_name": "web" + } + ] + }, + { + "name": "finalize", + "status": "PENDING" + } + ] + } + ] + }, + "phase": "PENDING_BUILD", + "tier_slug": "basic" + } + ], + "links": { + "pages": {} + }, + "meta": { + "total": 1 + } + } + }, + "deployment": { + "value": { + "deployment": { + "id": "b6bdf840-2854-4f87-a36c-5f231c617c84", + "spec": { + "name": "sample-golang", + "services": [ + { + "name": "web", + "github": { + "repo": "digitalocean/sample-golang", + "branch": "branch" + }, + "run_command": "bin/sample-golang", + "environment_slug": "go", + "instance_size_slug": "basic-xxs", + "instance_count": 2, + "routes": [ + { + "path": "/" + } + ] + } + ], + "region": "ams" + }, + "services": [ + { + "name": "web", + "source_commit_hash": "9a4df0b8e161e323bc3cdf1dc71878080fe144fa" + } + ], + "phase_last_updated_at": "0001-01-01T00:00:00Z", + "created_at": "2020-07-28T18:00:00Z", + "updated_at": "2020-07-28T18:00:00Z", + "cause": "commit 9a4df0b pushed to github/digitalocean/sample-golang", + "progress": { + "pending_steps": 6, + "total_steps": 6, + "steps": [ + { + "name": "build", + "status": "PENDING", + "steps": [ + { + "name": "initialize", + "status": "PENDING" + }, + { + "name": "components", + "status": "PENDING", + "steps": [ + { + "name": "web", + "status": "PENDING", + "component_name": "web", + "message_base": "Building service" + } + ] + } + ] + }, + { + "name": "deploy", + "status": "PENDING", + "steps": [ + { + "name": "initialize", + "status": "PENDING" + }, + { + "name": "components", + "status": "PENDING", + "steps": [ + { + "name": "web", + "status": "PENDING", + "steps": [ + { + "name": "deploy", + "status": "PENDING", + "component_name": "web", + "message_base": "Deploying service" + }, + { + "name": "wait", + "status": "PENDING", + "component_name": "web", + "message_base": "Waiting for service" + } + ], + "component_name": "web" + } + ] + }, + { + "name": "finalize", + "status": "PENDING" + } + ] + } + ] + }, + "phase": "PENDING_BUILD", + "tier_slug": "basic" + } + } + }, + "tiers": { + "value": { + "tiers": [ + { + "name": "Starter", + "slug": "starter", + "egress_bandwidth_bytes": "1073741824", + "build_seconds": "6000" + }, + { + "name": "Basic", + "slug": "basic", + "egress_bandwidth_bytes": "42949672960", + "build_seconds": "24000" + }, + { + "name": "Professional", + "slug": "professional", + "egress_bandwidth_bytes": "107374182400", + "build_seconds": "60000" + } + ] + } + }, + "tier": { + "value": { + "tier": { + "name": "Basic", + "slug": "basic", + "egress_bandwidth_bytes": "42949672960", + "build_seconds": "24000" + } + } + }, + "instance_sizes": { + "value": { + "instance_sizes": [ + { + "name": "Basic XXS", + "slug": "basic-xxs", + "cpu_type": "SHARED", + "cpus": "1", + "memory_bytes": "536870912", + "usd_per_month": "5.00", + "usd_per_second": "0.000002066799", + "tier_slug": "basic", + "tier_upgrade_to": "professional-xs" + }, + { + "name": "Basic XS", + "slug": "basic-xs", + "cpu_type": "SHARED", + "cpus": "1", + "memory_bytes": "1073741824", + "usd_per_month": "10.00", + "usd_per_second": "0.000004133598", + "tier_slug": "basic", + "tier_upgrade_to": "professional-xs" + }, + { + "name": "Basic S", + "slug": "basic-s", + "cpu_type": "SHARED", + "cpus": "1", + "memory_bytes": "2147483648", + "usd_per_month": "20.00", + "usd_per_second": "0.000008267196", + "tier_slug": "basic", + "tier_upgrade_to": "professional-s" + }, + { + "name": "Basic M", + "slug": "basic-m", + "cpu_type": "SHARED", + "cpus": "2", + "memory_bytes": "4294967296", + "usd_per_month": "40.00", + "usd_per_second": "0.000016534392", + "tier_slug": "basic", + "tier_upgrade_to": "professional-m" + }, + { + "name": "Professional XS", + "slug": "professional-xs", + "cpu_type": "SHARED", + "cpus": "1", + "memory_bytes": "1073741824", + "usd_per_month": "12.00", + "usd_per_second": "0.000004960317", + "tier_slug": "professional", + "tier_downgrade_to": "basic-xs" + }, + { + "name": "Professional S", + "slug": "professional-s", + "cpu_type": "SHARED", + "cpus": "1", + "memory_bytes": "2147483648", + "usd_per_month": "25.00", + "usd_per_second": "0.000010333995", + "tier_slug": "professional", + "tier_downgrade_to": "basic-s" + }, + { + "name": "Professional M", + "slug": "professional-m", + "cpu_type": "SHARED", + "cpus": "2", + "memory_bytes": "4294967296", + "usd_per_month": "50.00", + "usd_per_second": "0.000020667989", + "tier_slug": "professional", + "tier_downgrade_to": "basic-s" + }, + { + "name": "Professional 1L", + "slug": "professional-1l", + "cpu_type": "DEDICATED", + "cpus": "1", + "memory_bytes": "4294967296", + "usd_per_month": "75.00", + "usd_per_second": "0.000031001984", + "tier_slug": "professional", + "tier_downgrade_to": "basic-m" + }, + { + "name": "Professional L", + "slug": "professional-l", + "cpu_type": "DEDICATED", + "cpus": "2", + "memory_bytes": "8589934592", + "usd_per_month": "150.00", + "usd_per_second": "0.000062003968", + "tier_slug": "professional", + "tier_downgrade_to": "basic-s" + }, + { + "name": "Professional XL", + "slug": "professional-xl", + "cpu_type": "DEDICATED", + "cpus": "4", + "memory_bytes": "17179869184", + "usd_per_month": "300.00", + "usd_per_second": "0.000124007937", + "tier_slug": "professional", + "tier_downgrade_to": "basic-s" + } + ] + } + }, + "instance_size": { + "value": { + "instance_size": { + "name": "Basic XXS", + "slug": "basic-xxs", + "cpu_type": "SHARED", + "cpus": "1", + "memory_bytes": "536870912", + "usd_per_month": "5.00", + "usd_per_second": "0.000002066799", + "tier_slug": "basic", + "tier_upgrade_to": "professional-xs" + } + } + }, + "regions": { + "value": { + "regions": [ + { + "slug": "ams", + "label": "Amsterdam", + "flag": "netherlands", + "continent": "Europe", + "data_centers": [ + "ams3" + ] + }, + { + "slug": "nyc", + "label": "New York", + "flag": "usa", + "continent": "North America", + "data_centers": [ + "nyc1", + "nyc3" + ], + "default": true + }, + { + "slug": "fra", + "label": "Frankfurt", + "flag": "germany", + "continent": "Europe", + "data_centers": [ + "fra1" + ] + }, + { + "slug": "sfo", + "label": "San Francisco", + "flag": "usa", + "continent": "North America", + "data_centers": [ + "sfo3" + ] + }, + { + "slug": "sgp", + "label": "Singapore", + "flag": "singapore", + "continent": "Asia", + "data_centers": [ + "sgp1" + ] + }, + { + "slug": "blr", + "label": "Bangalore", + "flag": "india", + "continent": "Asia", + "data_centers": [ + "blr1" + ] + }, + { + "slug": "tor", + "label": "Toronto", + "flag": "canada", + "continent": "North America", + "data_centers": [ + "tor1" + ] + }, + { + "slug": "lon", + "label": "London", + "flag": "uk", + "continent": "Europe", + "data_centers": [ + "lon1" + ] + } + ] + } + }, + "propose": { + "value": { + "app_name_available": true, + "existing_static_apps": "2", + "max_free_static_apps": "3", + "spec": { + "name": "sample-golang", + "services": [ + { + "name": "web", + "github": { + "repo": "digitalocean/sample-golang", + "branch": "branch" + }, + "run_command": "bin/sample-golang", + "environment_slug": "go", + "instance_size_slug": "basic-xxs", + "instance_count": 1, + "http_port": 8080, + "routes": [ + { + "path": "/" + } + ] + } + ], + "region": "ams" + }, + "app_cost": 5, + "app_tier_upgrade_cost": 17 + } + }, + "alerts": { + "value": { + "alerts": [ + { + "id": "e552e1f9-c1b0-4e6d-8777-ad6f27767306", + "spec": { + "rule": "DEPLOYMENT_FAILED" + }, + "emails": [ + "sammy@digitalocean.com" + ], + "phase": "ACTIVE", + "progress": { + "steps": [ + { + "name": "alert-configure-insight-alert", + "status": "SUCCESS", + "started_at": "2020-07-28T18:00:00Z", + "ended_at": "2020-07-28T18:00:00Z" + } + ] + } + }, + { + "id": "b58cc9d4-0702-4ffd-ab45-4c2a8d979527", + "spec": { + "rule": "CPU_UTILIZATION", + "operator": "GREATER_THAN", + "value": 85, + "window": "FIVE_MINUTES" + }, + "emails": [ + "sammy@digitalocean.com" + ], + "phase": "ACTIVE", + "progress": { + "steps": [ + { + "name": "alert-configure-insight-alert", + "status": "SUCCESS", + "started_at": "2020-07-28T18:00:00Z", + "ended_at": "2020-07-28T18:00:00Z" + } + ] + } + } + ] + } + }, + "alert": { + "value": { + "alert": { + "id": "e552e1f9-c1b0-4e6d-8777-ad6f27767306", + "spec": { + "rule": "DEPLOYMENT_FAILED" + }, + "emails": [ + "sammy@digitalocean.com" + ], + "phase": "ACTIVE", + "progress": { + "steps": [ + { + "name": "alert-configure-insight-alert", + "status": "SUCCESS", + "started_at": "2020-07-28T18:00:00Z", + "ended_at": "2020-07-28T18:00:00Z" + } + ] + } + } + } + }, + "app_bandwidth_usage": { + "value": { + "app_bandwidth_usage": [ + { + "app_id": "4f6c71e2-1e90-4762-9fee-6cc4a0a9f2cf", + "bandwidth_bytes": "513668" + } + ], + "date": "2023-01-17T00:00:00Z" + } + }, + "app_bandwidth_usage_multiple": { + "value": { + "app_bandwidth_usage": [ + { + "app_id": "4f6c71e2-1e90-4762-9fee-6cc4a0a9f2cf", + "bandwidth_bytes": "513668" + }, + { + "app_id": "c2a93513-8d9b-4223-9d61-5e7272c81cf5", + "bandwidth_bytes": "254847" + } + ], + "date": "2023-01-17T00:00:00Z" + } + }, + "certificates_all": { + "value": { + "certificates": [ + { + "id": "892071a0-bb95-49bc-8021-3afd67a210bf", + "name": "web-cert-01", + "not_after": "2017-02-22T00:23:00Z", + "sha1_fingerprint": "dfcc9f57d86bf58e321c2c6c31c7a971be244ac7", + "created_at": "2017-02-08T16:02:37Z", + "dns_names": [ + "" + ], + "state": "verified", + "type": "custom" + }, + { + "id": "ba9b9c18-6c59-46c2-99df-70da170a42ba", + "name": "web-cert-02", + "not_after": "2018-06-07T17:44:12Z", + "sha1_fingerprint": "479c82b5c63cb6d3e6fac4624d58a33b267e166c", + "created_at": "2018-03-09T18:44:11Z", + "dns_names": [ + "www.example.com", + "example.com" + ], + "state": "verified", + "type": "lets_encrypt" + } + ], + "links": {}, + "meta": { + "total": 2 + } + } + }, + "certificates_custom": { + "value": { + "certificate": { + "id": "892071a0-bb95-49bc-8021-3afd67a210bf", + "name": "web-cert-01", + "not_after": "2017-02-22T00:23:00Z", + "sha1_fingerprint": "dfcc9f57d86bf58e321c2c6c31c7a971be244ac7", + "created_at": "2017-02-08T16:02:37Z", + "dns_names": [ + "" + ], + "state": "verified", + "type": "custom" + } + } + }, + "certificates_lets_encrypt_pending": { + "value": { + "certificate": { + "id": "ba9b9c18-6c59-46c2-99df-70da170a42ba", + "name": "web-cert-02", + "not_after": "2018-06-07T17:44:12Z", + "sha1_fingerprint": "479c82b5c63cb6d3e6fac4624d58a33b267e166c", + "created_at": "2018-03-09T18:44:11Z", + "dns_names": [ + "www.example.com", + "example.com" + ], + "state": "pending", + "type": "lets_encrypt" + } + } + }, + "certificates_lets_encrypt": { + "value": { + "certificate": { + "id": "ba9b9c18-6c59-46c2-99df-70da170a42ba", + "name": "web-cert-02", + "not_after": "2018-06-07T17:44:12Z", + "sha1_fingerprint": "479c82b5c63cb6d3e6fac4624d58a33b267e166c", + "created_at": "2018-03-09T18:44:11Z", + "dns_names": [ + "www.example.com", + "example.com" + ], + "state": "verified", + "type": "lets_encrypt" + } + } + }, + "domain_records_all": { + "value": { + "domain_records": [ + { + "id": 28448429, + "type": "NS", + "name": "@", + "data": "ns1.digitalocean.com", + "priority": null, + "port": null, + "ttl": 1800, + "weight": null, + "flags": null, + "tag": null + }, + { + "id": 28448430, + "type": "NS", + "name": "@", + "data": "ns2.digitalocean.com", + "priority": null, + "port": null, + "ttl": 1800, + "weight": null, + "flags": null, + "tag": null + }, + { + "id": 28448431, + "type": "NS", + "name": "@", + "data": "ns3.digitalocean.com", + "priority": null, + "port": null, + "ttl": 1800, + "weight": null, + "flags": null, + "tag": null + }, + { + "id": 28448432, + "type": "A", + "name": "@", + "data": "1.2.3.4", + "priority": null, + "port": null, + "ttl": 1800, + "weight": null, + "flags": null, + "tag": null + } + ], + "links": {}, + "meta": { + "total": 4 + } + } + }, + "droplets_all": { + "value": { + "droplets": [ + { + "id": 3164444, + "name": "example.com", + "memory": 1024, + "vcpus": 1, + "disk": 25, + "locked": false, + "status": "active", + "kernel": null, + "created_at": "2020-07-21T18:37:44Z", + "features": [ + "backups", + "private_networking", + "ipv6" + ], + "backup_ids": [ + 53893572 + ], + "next_backup_window": { + "start": "2020-07-30T00:00:00Z", + "end": "2020-07-30T23:00:00Z" + }, + "snapshot_ids": [ + 67512819 + ], + "image": { + "id": 63663980, + "name": "20.04 (LTS) x64", + "distribution": "Ubuntu", + "slug": "ubuntu-20-04-x64", + "public": true, + "regions": [ + "ams2", + "ams3", + "blr1", + "fra1", + "lon1", + "nyc1", + "nyc2", + "nyc3", + "sfo1", + "sfo2", + "sfo3", + "sgp1", + "tor1" + ], + "created_at": "2020-05-15T05:47:50Z", + "type": "snapshot", + "min_disk_size": 20, + "size_gigabytes": 2.36, + "description": "", + "tags": [], + "status": "available", + "error_message": "" + }, + "volume_ids": [], + "size": { + "slug": "s-1vcpu-1gb", + "memory": 1024, + "vcpus": 1, + "disk": 25, + "transfer": 1, + "price_monthly": 5, + "price_hourly": 0.00743999984115362, + "regions": [ + "ams2", + "ams3", + "blr1", + "fra1", + "lon1", + "nyc1", + "nyc2", + "nyc3", + "sfo1", + "sfo2", + "sfo3", + "sgp1", + "tor1" + ], + "available": true, + "description": "Basic" + }, + "size_slug": "s-1vcpu-1gb", + "networks": { + "v4": [ + { + "ip_address": "10.128.192.124", + "netmask": "255.255.0.0", + "gateway": "nil", + "type": "private" + }, + { + "ip_address": "192.241.165.154", + "netmask": "255.255.255.0", + "gateway": "192.241.165.1", + "type": "public" + } + ], + "v6": [ + { + "ip_address": "2604:a880:0:1010::18a:a001", + "netmask": 64, + "gateway": "2604:a880:0:1010::1", + "type": "public" + } + ] + }, + "region": { + "name": "New York 3", + "slug": "nyc3", + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata", + "install_agent", + "storage", + "image_transfer" + ], + "available": true, + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192g" + ] + }, + "tags": [ + "web", + "env:prod" + ], + "vpc_uuid": "760e09ef-dc84-11e8-981e-3cfdfeaae000" + }, + { + "id": 3164459, + "name": "assets.example.com", + "memory": 1024, + "vcpus": 1, + "disk": 25, + "locked": false, + "status": "active", + "kernel": null, + "created_at": "2020-07-21T18:42:27Z", + "features": [ + "private_networking" + ], + "backup_ids": [], + "next_backup_window": { + "start": "2020-07-30T00:00:00Z", + "end": "2020-07-30T23:00:00Z" + }, + "snapshot_ids": [], + "image": { + "id": 63663980, + "name": "20.04 (LTS) x64", + "distribution": "Ubuntu", + "slug": "ubuntu-20-04-x64", + "public": true, + "regions": [ + "ams2", + "ams3", + "blr1", + "fra1", + "lon1", + "nyc1", + "nyc2", + "nyc3", + "sfo1", + "sfo2", + "sfo3", + "sgp1", + "tor1" + ], + "created_at": "2020-05-15T05:47:50Z", + "type": "snapshot", + "min_disk_size": 20, + "size_gigabytes": 2.36, + "description": "", + "tags": [], + "status": "available", + "error_message": "" + }, + "volume_ids": [ + "506f78a4-e098-11e5-ad9f-000f53306ae1" + ], + "size": { + "slug": "s-1vcpu-1gb", + "memory": 1024, + "vcpus": 1, + "disk": 25, + "transfer": 1, + "price_monthly": 5, + "price_hourly": 0.00743999984115362, + "regions": [ + "ams2", + "ams3", + "blr1", + "fra1", + "lon1", + "nyc1", + "nyc2", + "nyc3", + "sfo1", + "sfo2", + "sfo3", + "sgp1", + "tor1" + ], + "available": true, + "description": "Basic" + }, + "size_slug": "s-1vcpu-1gb", + "networks": { + "v4": [ + { + "ip_address": "10.128.192.138", + "netmask": "255.255.0.0", + "gateway": "nil", + "type": "private" + }, + { + "ip_address": "162.243.0.4", + "netmask": "255.255.255.0", + "gateway": "162.243.0.1", + "type": "public" + } + ], + "v6": [] + }, + "region": { + "name": "New York 3", + "slug": "nyc3", + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata", + "install_agent", + "storage", + "image_transfer" + ], + "available": true, + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192g" + ] + }, + "tags": [ + "storage", + "env:prod" + ], + "vpc_uuid": "760e09ef-dc84-11e8-981e-3cfdfeaae000" + }, + { + "id": 3164412, + "name": "stage.example.com", + "memory": 1024, + "vcpus": 1, + "disk": 25, + "locked": false, + "status": "active", + "kernel": null, + "created_at": "2020-07-21T18:32:55Z", + "features": [ + "private_networking" + ], + "backup_ids": [], + "next_backup_window": { + "start": "2020-07-30T00:00:00Z", + "end": "2020-07-30T23:00:00Z" + }, + "snapshot_ids": [], + "image": { + "id": 63663980, + "name": "20.04 (LTS) x64", + "distribution": "Ubuntu", + "slug": "ubuntu-20-04-x64", + "public": true, + "regions": [ + "ams2", + "ams3", + "blr1", + "fra1", + "lon1", + "nyc1", + "nyc2", + "nyc3", + "sfo1", + "sfo2", + "sfo3", + "sgp1", + "tor1" + ], + "created_at": "2020-05-15T05:47:50Z", + "type": "snapshot", + "min_disk_size": 20, + "size_gigabytes": 2.36, + "description": "", + "tags": [], + "status": "available", + "error_message": "" + }, + "volume_ids": [ + "7724db7c-e098-11e5-b522-000f53304e51" + ], + "size": { + "slug": "s-1vcpu-1gb", + "memory": 1024, + "vcpus": 1, + "disk": 25, + "transfer": 1, + "price_monthly": 5, + "price_hourly": 0.00743999984115362, + "regions": [ + "ams2", + "ams3", + "blr1", + "fra1", + "lon1", + "nyc1", + "nyc2", + "nyc3", + "sfo1", + "sfo2", + "sfo3", + "sgp1", + "tor1" + ], + "available": true, + "description": "Basic" + }, + "size_slug": "s-1vcpu-1gb", + "networks": { + "v4": [ + { + "ip_address": "10.128.192.125", + "netmask": "255.255.0.0", + "gateway": "nil", + "type": "private" + }, + { + "ip_address": "192.241.247.248", + "netmask": "255.255.255.0", + "gateway": "192.241.247.1", + "type": "public" + } + ], + "v6": [] + }, + "region": { + "name": "New York 3", + "slug": "nyc3", + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata", + "install_agent", + "storage", + "image_transfer" + ], + "available": true, + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192g" + ] + }, + "tags": [ + "env:stage" + ], + "vpc_uuid": "5a4981aa-9653-4bd1-bef5-d6bff52042e4" + } + ], + "links": { + "pages": {} + }, + "meta": { + "total": 3 + } + } + }, + "droplets_tagged": { + "value": { + "droplets": [ + { + "id": 3164444, + "name": "example.com", + "memory": 1024, + "vcpus": 1, + "disk": 25, + "locked": false, + "status": "active", + "kernel": null, + "created_at": "2020-07-21T18:37:44Z", + "features": [ + "backups", + "private_networking", + "ipv6" + ], + "backup_ids": [ + 53893572 + ], + "next_backup_window": { + "start": "2020-07-30T00:00:00Z", + "end": "2020-07-30T23:00:00Z" + }, + "snapshot_ids": [ + 67512819 + ], + "image": { + "id": 63663980, + "name": "20.04 (LTS) x64", + "distribution": "Ubuntu", + "slug": "ubuntu-20-04-x64", + "public": true, + "regions": [ + "ams2", + "ams3", + "blr1", + "fra1", + "lon1", + "nyc1", + "nyc2", + "nyc3", + "sfo1", + "sfo2", + "sfo3", + "sgp1", + "tor1" + ], + "created_at": "2020-05-15T05:47:50Z", + "type": "snapshot", + "min_disk_size": 20, + "size_gigabytes": 2.36, + "description": "", + "tags": [], + "status": "available", + "error_message": "" + }, + "volume_ids": [], + "size": { + "slug": "s-1vcpu-1gb", + "memory": 1024, + "vcpus": 1, + "disk": 25, + "transfer": 1, + "price_monthly": 5, + "price_hourly": 0.00743999984115362, + "regions": [ + "ams2", + "ams3", + "blr1", + "fra1", + "lon1", + "nyc1", + "nyc2", + "nyc3", + "sfo1", + "sfo2", + "sfo3", + "sgp1", + "tor1" + ], + "available": true, + "description": "Basic" + }, + "size_slug": "s-1vcpu-1gb", + "networks": { + "v4": [ + { + "ip_address": "10.128.192.124", + "netmask": "255.255.0.0", + "gateway": "nil", + "type": "private" + }, + { + "ip_address": "192.241.165.154", + "netmask": "255.255.255.0", + "gateway": "192.241.165.1", + "type": "public" + } + ], + "v6": [ + { + "ip_address": "2604:a880:0:1010::18a:a001", + "netmask": 64, + "gateway": "2604:a880:0:1010::1", + "type": "public" + } + ] + }, + "region": { + "name": "New York 3", + "slug": "nyc3", + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata", + "install_agent", + "storage", + "image_transfer" + ], + "available": true, + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192g" + ] + }, + "tags": [ + "web", + "env:prod" + ], + "vpc_uuid": "760e09ef-dc84-11e8-981e-3cfdfeaae000" + }, + { + "id": 3164459, + "name": "assets.example.com", + "memory": 1024, + "vcpus": 1, + "disk": 25, + "locked": false, + "status": "active", + "kernel": null, + "created_at": "2020-07-21T18:42:27Z", + "features": [ + "private_networking" + ], + "backup_ids": [], + "next_backup_window": { + "start": "2020-07-30T00:00:00Z", + "end": "2020-07-30T23:00:00Z" + }, + "snapshot_ids": [], + "image": { + "id": 63663980, + "name": "20.04 (LTS) x64", + "distribution": "Ubuntu", + "slug": "ubuntu-20-04-x64", + "public": true, + "regions": [ + "ams2", + "ams3", + "blr1", + "fra1", + "lon1", + "nyc1", + "nyc2", + "nyc3", + "sfo1", + "sfo2", + "sfo3", + "sgp1", + "tor1" + ], + "created_at": "2020-05-15T05:47:50Z", + "type": "snapshot", + "min_disk_size": 20, + "size_gigabytes": 2.36, + "description": "", + "tags": [], + "status": "available", + "error_message": "" + }, + "volume_ids": [ + "506f78a4-e098-11e5-ad9f-000f53306ae1" + ], + "size": { + "slug": "s-1vcpu-1gb", + "memory": 1024, + "vcpus": 1, + "disk": 25, + "transfer": 1, + "price_monthly": 5, + "price_hourly": 0.00743999984115362, + "regions": [ + "ams2", + "ams3", + "blr1", + "fra1", + "lon1", + "nyc1", + "nyc2", + "nyc3", + "sfo1", + "sfo2", + "sfo3", + "sgp1", + "tor1" + ], + "available": true, + "description": "Basic" + }, + "size_slug": "s-1vcpu-1gb", + "networks": { + "v4": [ + { + "ip_address": "10.128.192.138", + "netmask": "255.255.0.0", + "gateway": "nil", + "type": "private" + }, + { + "ip_address": "162.243.0.4", + "netmask": "255.255.255.0", + "gateway": "162.243.0.1", + "type": "public" + } + ], + "v6": [] + }, + "region": { + "name": "New York 3", + "slug": "nyc3", + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata", + "install_agent", + "storage", + "image_transfer" + ], + "available": true, + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192g" + ] + }, + "tags": [ + "storage", + "env:prod" + ], + "vpc_uuid": "760e09ef-dc84-11e8-981e-3cfdfeaae000" + } + ], + "links": { + "pages": {} + }, + "meta": { + "total": 2 + } + } + }, + "droplet_create_request": { + "value": { + "name": "example.com", + "region": "nyc3", + "size": "s-1vcpu-1gb", + "image": "ubuntu-20-04-x64", + "ssh_keys": [ + 289794, + "3b:16:e4:bf:8b:00:8b:b8:59:8c:a9:d3:f0:19:fa:45" + ], + "backups": true, + "ipv6": true, + "monitoring": true, + "tags": [ + "env:prod", + "web" + ], + "user_data": "#cloud-config\nruncmd:\n - touch /test.txt\n", + "vpc_uuid": "760e09ef-dc84-11e8-981e-3cfdfeaae000" + } + }, + "droplet_multi_create_request": { + "value": { + "names": [ + "sub-01.example.com", + "sub-02.example.com" + ], + "region": "nyc3", + "size": "s-1vcpu-1gb", + "image": "ubuntu-20-04-x64", + "ssh_keys": [ + 289794, + "3b:16:e4:bf:8b:00:8b:b8:59:8c:a9:d3:f0:19:fa:45" + ], + "backups": true, + "ipv6": true, + "monitoring": true, + "tags": [ + "env:prod", + "web" + ], + "user_data": "#cloud-config\nruncmd:\n - touch /test.txt\n", + "vpc_uuid": "760e09ef-dc84-11e8-981e-3cfdfeaae000" + } + }, + "droplet_create_response": { + "value": { + "droplet": { + "id": 3164444, + "name": "example.com", + "memory": 1024, + "vcpus": 1, + "disk": 25, + "locked": false, + "status": "new", + "kernel": null, + "created_at": "2020-07-21T18:37:44Z", + "features": [ + "backups", + "private_networking", + "ipv6", + "monitoring" + ], + "backup_ids": [], + "next_backup_window": null, + "snapshot_ids": [], + "image": { + "id": 63663980, + "name": "20.04 (LTS) x64", + "distribution": "Ubuntu", + "slug": "ubuntu-20-04-x64", + "public": true, + "regions": [ + "ams2", + "ams3", + "blr1", + "fra1", + "lon1", + "nyc1", + "nyc2", + "nyc3", + "sfo1", + "sfo2", + "sfo3", + "sgp1", + "tor1" + ], + "created_at": "2020-05-15T05:47:50Z", + "type": "snapshot", + "min_disk_size": 20, + "size_gigabytes": 2.36, + "description": "", + "tags": [], + "status": "available", + "error_message": "" + }, + "volume_ids": [], + "size": { + "slug": "s-1vcpu-1gb", + "memory": 1024, + "vcpus": 1, + "disk": 25, + "transfer": 1, + "price_monthly": 5, + "price_hourly": 0.00743999984115362, + "regions": [ + "ams2", + "ams3", + "blr1", + "fra1", + "lon1", + "nyc1", + "nyc2", + "nyc3", + "sfo1", + "sfo2", + "sfo3", + "sgp1", + "tor1" + ], + "available": true, + "description": "Basic" + }, + "size_slug": "s-1vcpu-1gb", + "networks": { + "v4": [], + "v6": [] + }, + "region": { + "name": "New York 3", + "slug": "nyc3", + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata", + "install_agent", + "storage", + "image_transfer" + ], + "available": true, + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192g" + ] + }, + "tags": [ + "web", + "env:prod" + ] + }, + "links": { + "actions": [ + { + "id": 7515, + "rel": "create", + "href": "https://api.digitalocean.com/v2/actions/7515" + } + ] + } + } + }, + "droplet_multi_create_response": { + "value": { + "droplets": [ + { + "id": 3164444, + "name": "sub-01.example.com", + "memory": 1024, + "vcpus": 1, + "disk": 25, + "locked": false, + "status": "new", + "kernel": null, + "created_at": "2020-07-21T18:37:44Z", + "features": [ + "backups", + "private_networking", + "ipv6", + "monitoring" + ], + "backup_ids": [], + "next_backup_window": null, + "snapshot_ids": [], + "image": { + "id": 63663980, + "name": "20.04 (LTS) x64", + "distribution": "Ubuntu", + "slug": "ubuntu-20-04-x64", + "public": true, + "regions": [ + "ams2", + "ams3", + "blr1", + "fra1", + "lon1", + "nyc1", + "nyc2", + "nyc3", + "sfo1", + "sfo2", + "sfo3", + "sgp1", + "tor1" + ], + "created_at": "2020-05-15T05:47:50Z", + "type": "snapshot", + "min_disk_size": 20, + "size_gigabytes": 2.36, + "description": "", + "tags": [], + "status": "available", + "error_message": "" + }, + "volume_ids": [], + "size": { + "slug": "s-1vcpu-1gb", + "memory": 1024, + "vcpus": 1, + "disk": 25, + "transfer": 1, + "price_monthly": 5, + "price_hourly": 0.00743999984115362, + "regions": [ + "ams2", + "ams3", + "blr1", + "fra1", + "lon1", + "nyc1", + "nyc2", + "nyc3", + "sfo1", + "sfo2", + "sfo3", + "sgp1", + "tor1" + ], + "available": true, + "description": "Basic" + }, + "size_slug": "s-1vcpu-1gb", + "networks": { + "v4": [], + "v6": [] + }, + "region": { + "name": "New York 3", + "slug": "nyc3", + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata", + "install_agent", + "storage", + "image_transfer" + ], + "available": true, + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192g" + ] + }, + "tags": [ + "web", + "env:prod" + ] + }, + { + "id": 3164445, + "name": "sub-02.example.com", + "memory": 1024, + "vcpus": 1, + "disk": 25, + "locked": false, + "status": "new", + "kernel": null, + "created_at": "2020-07-21T18:37:44Z", + "features": [ + "backups", + "private_networking", + "ipv6", + "monitoring" + ], + "backup_ids": [], + "next_backup_window": null, + "snapshot_ids": [], + "image": { + "id": 63663980, + "name": "20.04 (LTS) x64", + "distribution": "Ubuntu", + "slug": "ubuntu-20-04-x64", + "public": true, + "regions": [ + "ams2", + "ams3", + "blr1", + "fra1", + "lon1", + "nyc1", + "nyc2", + "nyc3", + "sfo1", + "sfo2", + "sfo3", + "sgp1", + "tor1" + ], + "created_at": "2020-05-15T05:47:50Z", + "type": "snapshot", + "min_disk_size": 20, + "size_gigabytes": 2.36, + "description": "", + "tags": [], + "status": "available", + "error_message": "" + }, + "volume_ids": [], + "size": { + "slug": "s-1vcpu-1gb", + "memory": 1024, + "vcpus": 1, + "disk": 25, + "transfer": 1, + "price_monthly": 5, + "price_hourly": 0.00743999984115362, + "regions": [ + "ams2", + "ams3", + "blr1", + "fra1", + "lon1", + "nyc1", + "nyc2", + "nyc3", + "sfo1", + "sfo2", + "sfo3", + "sgp1", + "tor1" + ], + "available": true, + "description": "Basic" + }, + "size_slug": "s-1vcpu-1gb", + "networks": { + "v4": [], + "v6": [] + }, + "region": { + "name": "New York 3", + "slug": "nyc3", + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata", + "install_agent", + "storage", + "image_transfer" + ], + "available": true, + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192g" + ] + }, + "tags": [ + "web", + "env:prod" + ] + } + ], + "links": { + "actions": [ + { + "id": 7515, + "rel": "create", + "href": "https://api.digitalocean.com/v2/actions/7515" + }, + { + "id": 7516, + "rel": "create", + "href": "https://api.digitalocean.com/v2/actions/7516" + } + ] + } + } + }, + "droplet_single": { + "value": { + "droplet": { + "id": 3164444, + "name": "example.com", + "memory": 1024, + "vcpus": 1, + "disk": 25, + "locked": false, + "status": "active", + "kernel": null, + "created_at": "2020-07-21T18:37:44Z", + "features": [ + "backups", + "private_networking", + "ipv6" + ], + "backup_ids": [ + 53893572 + ], + "next_backup_window": { + "start": "2020-07-30T00:00:00Z", + "end": "2020-07-30T23:00:00Z" + }, + "snapshot_ids": [ + 67512819 + ], + "image": { + "id": 63663980, + "name": "20.04 (LTS) x64", + "distribution": "Ubuntu", + "slug": "ubuntu-20-04-x64", + "public": true, + "regions": [ + "ams2", + "ams3", + "blr1", + "fra1", + "lon1", + "nyc1", + "nyc2", + "nyc3", + "sfo1", + "sfo2", + "sfo3", + "sgp1", + "tor1" + ], + "created_at": "2020-05-15T05:47:50Z", + "type": "snapshot", + "min_disk_size": 20, + "size_gigabytes": 2.36, + "description": "", + "tags": [], + "status": "available", + "error_message": "" + }, + "volume_ids": [], + "size": { + "slug": "s-1vcpu-1gb", + "memory": 1024, + "vcpus": 1, + "disk": 25, + "transfer": 1, + "price_monthly": 5, + "price_hourly": 0.00743999984115362, + "regions": [ + "ams2", + "ams3", + "blr1", + "fra1", + "lon1", + "nyc1", + "nyc2", + "nyc3", + "sfo1", + "sfo2", + "sfo3", + "sgp1", + "tor1" + ], + "available": true, + "description": "Basic" + }, + "size_slug": "s-1vcpu-1gb", + "networks": { + "v4": [ + { + "ip_address": "10.128.192.124", + "netmask": "255.255.0.0", + "gateway": "nil", + "type": "private" + }, + { + "ip_address": "192.241.165.154", + "netmask": "255.255.255.0", + "gateway": "192.241.165.1", + "type": "public" + } + ], + "v6": [ + { + "ip_address": "2604:a880:0:1010::18a:a001", + "netmask": 64, + "gateway": "2604:a880:0:1010::1", + "type": "public" + } + ] + }, + "region": { + "name": "New York 3", + "slug": "nyc3", + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata", + "install_agent", + "storage", + "image_transfer" + ], + "available": true, + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192g" + ] + }, + "tags": [ + "web", + "env:prod" + ], + "vpc_uuid": "760e09ef-dc84-11e8-981e-3cfdfeaae000" + } + } + }, + "floating_ip_assigning": { + "summary": "Assigning to Droplet", + "value": { + "floating_ip": { + "ip": "45.55.96.47", + "droplet": null, + "region": { + "name": "New York 3", + "slug": "nyc3", + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata", + "install_agent", + "storage", + "image_transfer" + ], + "available": true, + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192g" + ] + }, + "locked": true, + "project_id": "746c6152-2fa2-11ed-92d3-27aaa54e4988" + }, + "links": { + "droplets": [ + { + "id": 213939433, + "rel": "droplet", + "href": "https://api.digitalocean.com/v2/droplets/213939433" + } + ], + "actions": [ + { + "id": 1088924622, + "rel": "assign_ip", + "href": "https://api.digitalocean.com/v2/actions/1088924622" + } + ] + } + } + }, + "floating_ip_reserving": { + "summary": "Reserving to Region", + "value": { + "floating_ip": { + "ip": "45.55.96.47", + "droplet": null, + "region": { + "name": "New York 3", + "slug": "nyc3", + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata", + "install_agent", + "storage", + "image_transfer" + ], + "available": true, + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192g" + ] + }, + "locked": false, + "project_id": "746c6152-2fa2-11ed-92d3-27aaa54e4988" + }, + "links": {} + } + }, + "floating_ip_assigned": { + "summary": "Assigned to Droplet", + "value": { + "floating_ip": { + "ip": "45.55.96.47", + "droplet": { + "id": 3164444, + "name": "example.com", + "memory": 1024, + "vcpus": 1, + "disk": 25, + "locked": false, + "status": "active", + "kernel": null, + "created_at": "2020-07-21T18:37:44Z", + "features": [ + "backups", + "private_networking", + "ipv6" + ], + "backup_ids": [ + 53893572 + ], + "next_backup_window": { + "start": "2020-07-30T00:00:00Z", + "end": "2020-07-30T23:00:00Z" + }, + "snapshot_ids": [ + 67512819 + ], + "image": { + "id": 63663980, + "name": "20.04 (LTS) x64", + "type": "base", + "distribution": "Ubuntu", + "slug": "ubuntu-20-04-x64", + "public": true, + "regions": [ + "ams2", + "ams3", + "blr1", + "fra1", + "lon1", + "nyc1", + "nyc2", + "nyc3", + "sfo1", + "sfo2", + "sfo3", + "sgp1", + "tor1" + ], + "created_at": "2020-05-15T05:47:50Z", + "min_disk_size": 20, + "size_gigabytes": 2.36, + "description": "", + "tags": [], + "status": "available", + "error_message": "" + }, + "volume_ids": [], + "size": { + "slug": "s-1vcpu-1gb", + "memory": 1024, + "vcpus": 1, + "disk": 25, + "transfer": 1, + "price_monthly": 5, + "price_hourly": 0.00743999984115362, + "regions": [ + "ams2", + "ams3", + "blr1", + "fra1", + "lon1", + "nyc1", + "nyc2", + "nyc3", + "sfo1", + "sfo2", + "sfo3", + "sgp1", + "tor1" + ], + "available": true, + "description": "Basic" + }, + "size_slug": "s-1vcpu-1gb", + "networks": { + "v4": [ + { + "ip_address": "10.128.192.124", + "netmask": "255.255.0.0", + "gateway": "nil", + "type": "private" + }, + { + "ip_address": "192.241.165.154", + "netmask": "255.255.255.0", + "gateway": "192.241.165.1", + "type": "public" + } + ], + "v6": [ + { + "ip_address": "2604:a880:0:1010::18a:a001", + "netmask": 64, + "gateway": "2604:a880:0:1010::1", + "type": "public" + } + ] + }, + "region": { + "name": "New York 3", + "slug": "nyc3", + "features": [ + "backups", + "ipv6", + "metadata", + "install_agent", + "storage", + "image_transfer" + ], + "available": true, + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192g" + ] + }, + "tags": [ + "web", + "env:prod" + ], + "vpc_uuid": "760e09ef-dc84-11e8-981e-3cfdfeaae000" + }, + "region": { + "name": "New York 3", + "slug": "nyc3", + "features": [ + "backups", + "ipv6", + "metadata", + "install_agent", + "storage", + "image_transfer" + ], + "available": true, + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192g" + ] + }, + "locked": false, + "project_id": "746c6152-2fa2-11ed-92d3-27aaa54e4988" + } + } + }, + "floating_ip_reserved": { + "summary": "Reserved to Region", + "value": { + "floating_ip": { + "ip": "45.55.96.47", + "droplet": null, + "region": { + "name": "New York 3", + "slug": "nyc3", + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata", + "install_agent", + "storage", + "image_transfer" + ], + "available": true, + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192g" + ] + }, + "locked": false, + "project_id": "746c6152-2fa2-11ed-92d3-27aaa54e4988" + } + } + }, + "images_all": { + "value": { + "images": [ + { + "id": 7555620, + "name": "Nifty New Snapshot", + "distribution": "Ubuntu", + "slug": null, + "public": false, + "regions": [ + "nyc2", + "nyc3" + ], + "created_at": "2014-11-04T22:23:02Z", + "type": "snapshot", + "min_disk_size": 20, + "size_gigabytes": 2.34, + "description": "", + "tags": [], + "status": "available", + "error_message": "" + }, + { + "id": 7555621, + "name": "Another Snapshot", + "distribution": "Ubuntu", + "slug": null, + "public": false, + "regions": [ + "nyc2" + ], + "created_at": "2014-11-04T22:23:02Z", + "type": "snapshot", + "min_disk_size": 20, + "size_gigabytes": 2.34, + "description": "", + "tags": [], + "status": "available", + "error_message": "" + }, + { + "id": 63663980, + "name": "20.04 (LTS) x64", + "distribution": "Ubuntu", + "slug": "ubuntu-20-04-x64", + "public": true, + "regions": [ + "nyc2", + "nyc3" + ], + "created_at": "2020-05-15T05:47:50Z", + "type": "snapshot", + "min_disk_size": 20, + "size_gigabytes": 2.36, + "description": "", + "tags": [], + "status": "available", + "error_message": "" + }, + { + "id": 7555621, + "name": "A custom image", + "distribution": "Arch Linux", + "slug": null, + "public": false, + "regions": [ + "nyc3" + ], + "created_at": "2014-11-04T22:23:02Z", + "type": "custom", + "min_disk_size": 20, + "size_gigabytes": 2.34, + "description": "", + "tags": [], + "status": "available", + "error_message": "" + }, + { + "id": 7555621, + "name": "An APP image", + "distribution": "Fedora", + "slug": null, + "public": false, + "regions": [ + "nyc2", + "nyc3" + ], + "created_at": "2014-11-04T22:23:02Z", + "type": "snapshot", + "min_disk_size": 20, + "size_gigabytes": 2.34, + "description": "", + "tags": [], + "status": "available", + "error_message": "" + }, + { + "id": 7555621, + "name": "A simple tagged image", + "distribution": "CentOS", + "slug": null, + "public": false, + "regions": [ + "nyc2", + "nyc3" + ], + "created_at": "2014-11-04T22:23:02Z", + "type": "snapshot", + "min_disk_size": 20, + "size_gigabytes": 2.34, + "description": "", + "tags": [ + "simple-image" + ], + "status": "available", + "error_message": "" + } + ], + "links": { + "pages": {} + }, + "meta": { + "total": 6 + } + } + }, + "images_snapshots": { + "value": { + "images": [ + { + "id": 7555620, + "name": "Nifty New Snapshot", + "distribution": "Ubuntu", + "slug": null, + "public": false, + "regions": [ + "nyc2", + "nyc3" + ], + "created_at": "2014-11-04T22:23:02Z", + "type": "snapshot", + "min_disk_size": 20, + "size_gigabytes": 2.34, + "description": "", + "tags": [], + "status": "available", + "error_message": "" + }, + { + "id": 7555621, + "name": "Another Snapshot", + "distribution": "Ubuntu", + "slug": null, + "public": false, + "regions": [ + "nyc2" + ], + "created_at": "2014-11-04T22:23:02Z", + "type": "snapshot", + "min_disk_size": 20, + "size_gigabytes": 2.34, + "description": "", + "tags": [], + "status": "available", + "error_message": "" + } + ], + "links": { + "pages": {} + }, + "meta": { + "total": 2 + } + } + }, + "images_distribution": { + "description": "**Important:** \nThe `type` query parameter is not directly related to the `type` attribute.\nThe main thing to remember here is that DigitalOcean-produced distribution images will have `snapshot` as the type attribute. \n", + "value": { + "images": [ + { + "id": 63663980, + "name": "20.04 (LTS) x64", + "distribution": "Ubuntu", + "slug": "ubuntu-20-04-x64", + "public": true, + "regions": [ + "nyc2", + "nyc3" + ], + "created_at": "2020-05-15T05:47:50Z", + "type": "snapshot", + "min_disk_size": 20, + "size_gigabytes": 2.36, + "description": "", + "tags": [], + "status": "available", + "error_message": "" + } + ], + "links": { + "pages": {} + }, + "meta": { + "total": 1 + } + } + }, + "images_custom": { + "value": { + "images": [ + { + "id": 7555621, + "name": "A custom image", + "distribution": "Arch Linux", + "slug": null, + "public": false, + "regions": [ + "nyc3" + ], + "created_at": "2014-11-04T22:23:02Z", + "type": "custom", + "min_disk_size": 20, + "size_gigabytes": 2.34, + "description": "", + "tags": [], + "status": "available", + "error_message": "" + } + ], + "links": { + "pages": {} + }, + "meta": { + "total": 1 + } + } + }, + "images_application": { + "description": "**Important:** \nThe `type` query parameter is not directly related to the `type` attribute.\n", + "value": { + "images": [ + { + "id": 7555621, + "name": "An APP image", + "distribution": "Fedora", + "slug": null, + "public": false, + "regions": [ + "nyc2", + "nyc3" + ], + "created_at": "2014-11-04T22:23:02Z", + "type": "snapshot", + "min_disk_size": 20, + "size_gigabytes": 2.34, + "description": "", + "tags": [], + "status": "available", + "error_message": "" + } + ], + "links": { + "pages": {} + }, + "meta": { + "total": 1 + } + } + }, + "images_tagged": { + "value": { + "images": [ + { + "id": 7555621, + "name": "A simple tagged image", + "distribution": "CentOS", + "slug": null, + "public": false, + "regions": [ + "nyc2", + "nyc3" + ], + "created_at": "2014-11-04T22:23:02Z", + "type": "snapshot", + "min_disk_size": 20, + "size_gigabytes": 2.34, + "description": "", + "tags": [ + "simple-image" + ], + "status": "available", + "error_message": "" + } + ], + "links": { + "pages": {} + }, + "meta": { + "total": 1 + } + } + }, + "kubernetes_clusters_all": { + "value": { + "kubernetes_clusters": [ + { + "id": "bd5f5959-5e1e-4205-a714-a914373942af", + "name": "prod-cluster-01", + "region": "nyc1", + "version": "1.18.6-do.0", + "cluster_subnet": "10.244.0.0/16", + "service_subnet": "10.245.0.0/16", + "vpc_uuid": "c33931f2-a26a-4e61-b85c-4e95a2ec431b", + "ipv4": "68.183.121.157", + "endpoint": "https://bd5f5959-5e1e-4205-a714-a914373942af.k8s.ondigitalocean.com", + "tags": [ + "production", + "web-team", + "k8s", + "k8s:bd5f5959-5e1e-4205-a714-a914373942af" + ], + "node_pools": [ + { + "id": "cdda885e-7663-40c8-bc74-3a036c66545d", + "name": "frontend-pool", + "size": "s-1vcpu-2gb", + "count": 3, + "tags": [ + "production", + "web-team", + "k8s", + "k8s:bd5f5959-5e1e-4205-a714-a914373942af", + "k8s:worker" + ], + "labels": null, + "taints": [], + "auto_scale": false, + "min_nodes": 0, + "max_nodes": 0, + "nodes": [ + { + "id": "478247f8-b1bb-4f7a-8db9-2a5f8d4b8f8f", + "name": "adoring-newton-3niq", + "status": { + "state": "provisioning" + }, + "droplet_id": "205545370", + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z" + }, + { + "id": "ad12e744-c2a9-473d-8aa9-be5680500eb1", + "name": "adoring-newton-3nim", + "status": { + "state": "provisioning" + }, + "droplet_id": "205545371", + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z" + }, + { + "id": "e46e8d07-f58f-4ff1-9737-97246364400e", + "name": "adoring-newton-3ni7", + "status": { + "state": "provisioning" + }, + "droplet_id": "205545372", + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z" + } + ] + }, + { + "id": "f49f4379-7e7f-4af5-aeb6-0354bd840778", + "name": "backend-pool", + "size": "g-4vcpu-16gb", + "count": 2, + "tags": [ + "production", + "web-team", + "k8s", + "k8s:bd5f5959-5e1e-4205-a714-a914373942af", + "k8s:worker" + ], + "labels": { + "service": "backend", + "priority": "high" + }, + "taints": [], + "auto_scale": true, + "min_nodes": 2, + "max_nodes": 5, + "nodes": [ + { + "id": "3385619f-8ec3-42ba-bb23-8d21b8ba7518", + "name": "affectionate-nightingale-3nif", + "status": { + "state": "provisioning" + }, + "droplet_id": "205545373", + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z" + }, + { + "id": "4b8f60ff-ba06-4523-a6a4-b8148244c7e6", + "name": "affectionate-nightingale-3niy", + "status": { + "state": "provisioning" + }, + "droplet_id": "205545374", + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z" + } + ] + } + ], + "maintenance_policy": { + "start_time": "00:00", + "duration": "4h0m0s", + "day": "any" + }, + "auto_upgrade": false, + "status": { + "state": "provisioning", + "message": "provisioning" + }, + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z", + "surge_upgrade": false, + "registry_enabled": false, + "ha": false + } + ], + "meta": { + "total": 1 + } + } + }, + "kubernetes_clusters_basic_request": { + "value": { + "name": "prod-cluster-01", + "region": "nyc1", + "version": "1.18.6-do.0", + "node_pools": [ + { + "size": "s-1vcpu-2gb", + "count": 3, + "name": "worker-pool" + } + ] + } + }, + "kubernetes_clusters_multi_pool_request": { + "description": "This example request creates a Kubernetes cluster with two node pools. It\nalso demonstrates setting tags, labels, auto scaling, and a maintenance\npolicy.\n", + "value": { + "name": "prod-cluster-01", + "region": "nyc1", + "version": "1.18.6-do.0", + "tags": [ + "production", + "web-team" + ], + "node_pools": [ + { + "size": "s-1vcpu-2gb", + "count": 3, + "name": "frontend-pool", + "tags": [ + "frontend" + ] + }, + { + "size": "g-4vcpu-16gb", + "count": 2, + "name": "backend-pool", + "labels": { + "service": "backend", + "priority": "high" + }, + "auto_scale": true, + "min_nodes": 2, + "max_nodes": 5 + } + ], + "maintenance_policy": { + "start_time": "12:00", + "day": "any" + } + } + }, + "kubernetes_clusters_create_basic_response": { + "value": { + "kubernetes_cluster": { + "id": "bd5f5959-5e1e-4205-a714-a914373942af", + "name": "prod-cluster-01", + "region": "nyc1", + "version": "1.18.6-do.0", + "cluster_subnet": "10.244.0.0/16", + "service_subnet": "10.245.0.0/16", + "vpc_uuid": "c33931f2-a26a-4e61-b85c-4e95a2ec431b", + "ipv4": "", + "endpoint": "", + "tags": [ + "k8s", + "k8s:bd5f5959-5e1e-4205-a714-a914373942af" + ], + "node_pools": [ + { + "id": "cdda885e-7663-40c8-bc74-3a036c66545d", + "name": "worker-pool", + "size": "s-1vcpu-2gb", + "count": 3, + "tags": [ + "k8s", + "k8s:bd5f5959-5e1e-4205-a714-a914373942af", + "k8s:worker" + ], + "labels": null, + "taints": [], + "auto_scale": false, + "min_nodes": 0, + "max_nodes": 0, + "nodes": [ + { + "id": "478247f8-b1bb-4f7a-8db9-2a5f8d4b8f8f", + "name": "", + "status": { + "state": "provisioning" + }, + "droplet_id": "", + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z" + }, + { + "id": "ad12e744-c2a9-473d-8aa9-be5680500eb1", + "name": "", + "status": { + "state": "provisioning" + }, + "droplet_id": "", + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z" + }, + { + "id": "e46e8d07-f58f-4ff1-9737-97246364400e", + "name": "", + "status": { + "state": "provisioning" + }, + "droplet_id": "", + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z" + } + ] + } + ], + "maintenance_policy": { + "start_time": "00:00", + "duration": "4h0m0s", + "day": "any" + }, + "auto_upgrade": false, + "status": { + "state": "provisioning", + "message": "provisioning" + }, + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z", + "surge_upgrade": false, + "registry_enabled": false, + "ha": false + } + } + }, + "kubernetes_clusters_multi_pool_response": { + "value": { + "kubernetes_clusters": { + "id": "bd5f5959-5e1e-4205-a714-a914373942af", + "name": "prod-cluster-01", + "region": "nyc1", + "version": "1.18.6-do.0", + "cluster_subnet": "10.244.0.0/16", + "service_subnet": "10.245.0.0/16", + "vpc_uuid": "c33931f2-a26a-4e61-b85c-4e95a2ec431b", + "ipv4": "", + "endpoint": "", + "tags": [ + "production", + "web-team", + "k8s", + "k8s:bd5f5959-5e1e-4205-a714-a914373942af" + ], + "node_pools": [ + { + "id": "cdda885e-7663-40c8-bc74-3a036c66545d", + "name": "frontend-pool", + "size": "s-1vcpu-2gb", + "count": 3, + "tags": [ + "production", + "web-team", + "frontend", + "k8s", + "k8s:bd5f5959-5e1e-4205-a714-a914373942af", + "k8s:worker" + ], + "labels": null, + "taints": [], + "auto_scale": false, + "min_nodes": 0, + "max_nodes": 0, + "nodes": [ + { + "id": "478247f8-b1bb-4f7a-8db9-2a5f8d4b8f8f", + "name": "", + "status": { + "state": "provisioning" + }, + "droplet_id": "", + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z" + }, + { + "id": "ad12e744-c2a9-473d-8aa9-be5680500eb1", + "name": "", + "status": { + "state": "provisioning" + }, + "droplet_id": "", + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z" + }, + { + "id": "e46e8d07-f58f-4ff1-9737-97246364400e", + "name": "", + "status": { + "state": "provisioning" + }, + "droplet_id": "", + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z" + } + ] + }, + { + "id": "f49f4379-7e7f-4af5-aeb6-0354bd840778", + "name": "backend-pool", + "size": "g-4vcpu-16gb", + "count": 2, + "tags": [ + "production", + "web-team", + "k8s", + "k8s:bd5f5959-5e1e-4205-a714-a914373942af", + "k8s:worker" + ], + "labels": { + "service": "backend", + "priority": "high" + }, + "taints": [], + "auto_scale": true, + "min_nodes": 2, + "max_nodes": 5, + "nodes": [ + { + "id": "3385619f-8ec3-42ba-bb23-8d21b8ba7518", + "name": "", + "status": { + "state": "provisioning" + }, + "droplet_id": "", + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z" + }, + { + "id": "4b8f60ff-ba06-4523-a6a4-b8148244c7e6", + "name": "", + "status": { + "state": "provisioning" + }, + "droplet_id": "", + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z" + } + ] + } + ], + "maintenance_policy": { + "start_time": "12:00", + "duration": "4h0m0s", + "day": "any" + }, + "auto_upgrade": false, + "status": { + "state": "provisioning", + "message": "provisioning" + }, + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z", + "surge_upgrade": false, + "registry_enabled": false, + "ha": false + } + } + }, + "kubernetes_single": { + "value": { + "kubernetes_cluster": { + "id": "bd5f5959-5e1e-4205-a714-a914373942af", + "name": "prod-cluster-01", + "region": "nyc1", + "version": "1.18.6-do.0", + "cluster_subnet": "10.244.0.0/16", + "service_subnet": "10.245.0.0/16", + "vpc_uuid": "c33931f2-a26a-4e61-b85c-4e95a2ec431b", + "ipv4": "68.183.121.157", + "endpoint": "https://bd5f5959-5e1e-4205-a714-a914373942af.k8s.ondigitalocean.com", + "tags": [ + "production", + "web-team", + "k8s", + "k8s:bd5f5959-5e1e-4205-a714-a914373942af" + ], + "node_pools": [ + { + "id": "cdda885e-7663-40c8-bc74-3a036c66545d", + "name": "frontend-pool", + "size": "s-1vcpu-2gb", + "count": 3, + "tags": [ + "production", + "web-team", + "k8s", + "k8s:bd5f5959-5e1e-4205-a714-a914373942af", + "k8s:worker" + ], + "labels": null, + "taints": [], + "auto_scale": false, + "min_nodes": 0, + "max_nodes": 0, + "nodes": [ + { + "id": "478247f8-b1bb-4f7a-8db9-2a5f8d4b8f8f", + "name": "adoring-newton-3niq", + "status": { + "state": "running" + }, + "droplet_id": "205545370", + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z" + }, + { + "id": "ad12e744-c2a9-473d-8aa9-be5680500eb1", + "name": "adoring-newton-3nim", + "status": { + "state": "running" + }, + "droplet_id": "205545371", + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z" + }, + { + "id": "e46e8d07-f58f-4ff1-9737-97246364400e", + "name": "adoring-newton-3ni7", + "status": { + "state": "running" + }, + "droplet_id": "205545372", + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z" + } + ] + }, + { + "id": "f49f4379-7e7f-4af5-aeb6-0354bd840778", + "name": "backend-pool", + "size": "g-4vcpu-16gb", + "count": 2, + "tags": [ + "production", + "web-team", + "k8s", + "k8s:bd5f5959-5e1e-4205-a714-a914373942af", + "k8s:worker" + ], + "labels": { + "service": "backend", + "priority": "high" + }, + "taints": [], + "auto_scale": true, + "min_nodes": 2, + "max_nodes": 5, + "nodes": [ + { + "id": "3385619f-8ec3-42ba-bb23-8d21b8ba7518", + "name": "affectionate-nightingale-3nif", + "status": { + "state": "running" + }, + "droplet_id": "205545373", + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z" + }, + { + "id": "4b8f60ff-ba06-4523-a6a4-b8148244c7e6", + "name": "affectionate-nightingale-3niy", + "status": { + "state": "running" + }, + "droplet_id": "205545374", + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z" + } + ] + } + ], + "maintenance_policy": { + "start_time": "00:00", + "duration": "4h0m0s", + "day": "any" + }, + "auto_upgrade": false, + "status": { + "state": "running" + }, + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z", + "surge_upgrade": false, + "registry_enabled": false, + "ha": false + } + } + }, + "kubernetes_updated": { + "value": { + "kubernetes_cluster": { + "id": "bd5f5959-5e1e-4205-a714-a914373942af", + "name": "prod-cluster-01", + "region": "nyc1", + "version": "1.18.6-do.0", + "cluster_subnet": "10.244.0.0/16", + "service_subnet": "10.245.0.0/16", + "vpc_uuid": "c33931f2-a26a-4e61-b85c-4e95a2ec431b", + "ipv4": "68.183.121.157", + "endpoint": "https://bd5f5959-5e1e-4205-a714-a914373942af.k8s.ondigitalocean.com", + "tags": [ + "production", + "web-team", + "k8s", + "k8s:bd5f5959-5e1e-4205-a714-a914373942af" + ], + "node_pools": [ + { + "id": "cdda885e-7663-40c8-bc74-3a036c66545d", + "name": "frontend-pool", + "size": "s-1vcpu-2gb", + "count": 3, + "tags": [ + "production", + "web-team", + "k8s", + "k8s:bd5f5959-5e1e-4205-a714-a914373942af", + "k8s:worker" + ], + "labels": null, + "taints": [], + "auto_scale": false, + "min_nodes": 0, + "max_nodes": 0, + "nodes": [ + { + "id": "478247f8-b1bb-4f7a-8db9-2a5f8d4b8f8f", + "name": "adoring-newton-3niq", + "status": { + "state": "running" + }, + "droplet_id": "205545370", + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z" + }, + { + "id": "ad12e744-c2a9-473d-8aa9-be5680500eb1", + "name": "adoring-newton-3nim", + "status": { + "state": "running" + }, + "droplet_id": "205545371", + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z" + }, + { + "id": "e46e8d07-f58f-4ff1-9737-97246364400e", + "name": "adoring-newton-3ni7", + "status": { + "state": "running" + }, + "droplet_id": "205545372", + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z" + } + ] + }, + { + "id": "f49f4379-7e7f-4af5-aeb6-0354bd840778", + "name": "backend-pool", + "size": "g-4vcpu-16gb", + "count": 2, + "tags": [ + "production", + "web-team", + "k8s", + "k8s:bd5f5959-5e1e-4205-a714-a914373942af", + "k8s:worker" + ], + "labels": { + "service": "backend", + "priority": "high" + }, + "taints": [], + "auto_scale": true, + "min_nodes": 2, + "max_nodes": 5, + "nodes": [ + { + "id": "3385619f-8ec3-42ba-bb23-8d21b8ba7518", + "name": "affectionate-nightingale-3nif", + "status": { + "state": "running" + }, + "droplet_id": "205545373", + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z" + }, + { + "id": "4b8f60ff-ba06-4523-a6a4-b8148244c7e6", + "name": "affectionate-nightingale-3niy", + "status": { + "state": "running" + }, + "droplet_id": "205545374", + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z" + } + ] + } + ], + "maintenance_policy": { + "start_time": "00:00", + "duration": "4h0m0s", + "day": "any" + }, + "auto_upgrade": true, + "status": { + "state": "running" + }, + "created_at": "2018-11-15T16:00:11Z", + "updated_at": "2018-11-15T16:00:11Z", + "surge_upgrade": true, + "registry_enabled": false, + "ha": false + } + } + }, + "kubernetes_options": { + "value": { + "options": { + "regions": [ + { + "name": "New York 1", + "slug": "nyc1" + }, + { + "name": "Singapore 1", + "slug": "sgp1" + }, + { + "name": "London 1", + "slug": "lon1" + }, + { + "name": "New York 3", + "slug": "nyc3" + }, + { + "name": "Amsterdam 3", + "slug": "ams3" + }, + { + "name": "Frankfurt 1", + "slug": "fra1" + }, + { + "name": "Toronto 1", + "slug": "tor1" + }, + { + "name": "San Francisco 2", + "slug": "sfo2" + }, + { + "name": "Bangalore 1", + "slug": "blr1" + }, + { + "name": "San Francisco 3", + "slug": "sfo3" + } + ], + "versions": [ + { + "slug": "1.18.8-do.0", + "kubernetes_version": "1.18.8", + "supported_features": [ + "cluster-autoscaler", + "docr-integration", + "token-authentication" + ] + }, + { + "slug": "1.17.11-do.0", + "kubernetes_version": "1.17.11", + "supported_features": [ + "cluster-autoscaler", + "docr-integration", + "token-authentication" + ] + }, + { + "slug": "1.16.14-do.0", + "kubernetes_version": "1.16.14", + "supported_features": [ + "cluster-autoscaler", + "docr-integration", + "token-authentication" + ] + } + ], + "sizes": [ + { + "name": "s-1vcpu-2gb", + "slug": "s-1vcpu-2gb" + }, + { + "name": "s-2vcpu-2gb", + "slug": "s-2vcpu-2gb" + }, + { + "name": "s-1vcpu-3gb", + "slug": "s-1vcpu-3gb" + }, + { + "name": "s-2vcpu-4gb", + "slug": "s-2vcpu-4gb" + }, + { + "name": "s-4vcpu-8gb", + "slug": "s-4vcpu-8gb" + }, + { + "name": "c-2-4GiB", + "slug": "c-2" + }, + { + "name": "g-2vcpu-8gb", + "slug": "g-2vcpu-8gb" + }, + { + "name": "gd-2vcpu-8gb", + "slug": "gd-2vcpu-8gb" + }, + { + "name": "s-8vcpu-16gb", + "slug": "s-8vcpu-16gb" + }, + { + "name": "s-6vcpu-16gb", + "slug": "s-6vcpu-16gb" + }, + { + "name": "c-4-8GiB", + "slug": "c-4" + }, + { + "name": "m-2vcpu-16gb", + "slug": "m-2vcpu-16gb" + }, + { + "name": "m3-2vcpu-16gb", + "slug": "m3-2vcpu-16gb" + }, + { + "name": "g-4vcpu-16gb", + "slug": "g-4vcpu-16gb" + }, + { + "name": "gd-4vcpu-16gb", + "slug": "gd-4vcpu-16gb" + }, + { + "name": "m6-2vcpu-16gb", + "slug": "m6-2vcpu-16gb" + }, + { + "name": "s-8vcpu-32gb", + "slug": "s-8vcpu-32gb" + }, + { + "name": "c-8-16GiB", + "slug": "c-8" + }, + { + "name": "m-4vcpu-32gb", + "slug": "m-4vcpu-32gb" + }, + { + "name": "m3-4vcpu-32gb", + "slug": "m3-4vcpu-32gb" + }, + { + "name": "g-8vcpu-32gb", + "slug": "g-8vcpu-32gb" + }, + { + "name": "s-12vcpu-48gb", + "slug": "s-12vcpu-48gb" + }, + { + "name": "gd-8vcpu-32gb", + "slug": "gd-8vcpu-32gb" + }, + { + "name": "m6-4vcpu-32gb", + "slug": "m6-4vcpu-32gb" + }, + { + "name": "s-16vcpu-64gb", + "slug": "s-16vcpu-64gb" + }, + { + "name": "c-16", + "slug": "c-16" + }, + { + "name": "m-8vcpu-64gb", + "slug": "m-8vcpu-64gb" + }, + { + "name": "m3-8vcpu-64gb", + "slug": "m3-8vcpu-64gb" + }, + { + "name": "g-16vcpu-64gb", + "slug": "g-16vcpu-64gb" + }, + { + "name": "s-20vcpu-96gb", + "slug": "s-20vcpu-96gb" + }, + { + "name": "gd-16vcpu-64gb", + "slug": "gd-16vcpu-64gb" + }, + { + "name": "m6-8vcpu-64gb", + "slug": "m6-8vcpu-64gb" + }, + { + "name": "s-24vcpu-128gb", + "slug": "s-24vcpu-128gb" + }, + { + "name": "c-32-64GiB", + "slug": "c-32" + }, + { + "name": "m-16vcpu-128gb", + "slug": "m-16vcpu-128gb" + }, + { + "name": "m3-16vcpu-128gb", + "slug": "m3-16vcpu-128gb" + }, + { + "name": "g-32vcpu-128gb", + "slug": "g-32vcpu-128gb" + }, + { + "name": "s-32vcpu-192gb", + "slug": "s-32vcpu-192gb" + }, + { + "name": "gd-32vcpu-128gb", + "slug": "gd-32vcpu-128gb" + }, + { + "name": "m-24vcpu-192gb", + "slug": "m-24vcpu-192gb" + }, + { + "name": "m6-16vcpu-128gb", + "slug": "m6-16vcpu-128gb" + }, + { + "name": "g-40vcpu-160gb", + "slug": "g-40vcpu-160gb" + }, + { + "name": "gd-40vcpu-160gb", + "slug": "gd-40vcpu-160gb" + }, + { + "name": "m3-24vcpu-192gb", + "slug": "m3-24vcpu-192gb" + }, + { + "name": "m-32vcpu-256gb", + "slug": "m-32vcpu-256gb" + }, + { + "name": "m6-24vcpu-192gb", + "slug": "m6-24vcpu-192gb" + }, + { + "name": "m3-32vcpu-256gb", + "slug": "m3-32vcpu-256gb" + }, + { + "name": "m6-32vcpu-256gb", + "slug": "m6-32vcpu-256gb" + } + ] + } + } + }, + "load_balancers_all": { + "value": { + "load_balancers": [ + { + "id": "4de7ac8b-495b-4884-9a69-1050c6793cd6", + "name": "example-lb-01", + "ip": "104.131.186.241", + "size": "lb-small", + "algorithm": "round_robin", + "status": "new", + "created_at": "2017-02-01T22:22:58Z", + "forwarding_rules": [ + { + "entry_protocol": "http", + "entry_port": 80, + "target_protocol": "http", + "target_port": 80, + "certificate_id": "", + "tls_passthrough": false + }, + { + "entry_protocol": "https", + "entry_port": 443, + "target_protocol": "https", + "target_port": 443, + "certificate_id": "", + "tls_passthrough": true + } + ], + "health_check": { + "protocol": "http", + "port": 80, + "path": "/", + "check_interval_seconds": 10, + "response_timeout_seconds": 5, + "healthy_threshold": 5, + "unhealthy_threshold": 3 + }, + "sticky_sessions": { + "type": "none" + }, + "region": { + "name": "New York 3", + "slug": "nyc3", + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192gb" + ], + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata", + "install_agent" + ], + "available": true + }, + "tag": "", + "droplet_ids": [ + 3164444, + 3164445 + ], + "redirect_http_to_https": false, + "enable_proxy_protocol": false, + "enable_backend_keepalive": false, + "vpc_uuid": "c33931f2-a26a-4e61-b85c-4e95a2ec431b", + "disable_lets_encrypt_dns_records": false, + "firewall": { + "deny": [ + "cidr:1.2.0.0/16", + "ip:2.3.4.5" + ], + "allow": [ + "ip:1.2.3.4", + "cidr:2.3.4.0/24" + ] + } + }, + { + "id": "56775c3f-04ab-4fb3-a7ed-40ef9bc8eece", + "name": "prod-web-lb-01", + "ip": "45.55.125.24", + "size": "lb-small", + "algorithm": "round_robin", + "status": "active", + "created_at": "2020-09-08T18:58:04Z", + "forwarding_rules": [ + { + "entry_protocol": "https", + "entry_port": 443, + "target_protocol": "http", + "target_port": 8080, + "certificate_id": "892071a0-bb95-49bc-8021-3afd67a210bf", + "tls_passthrough": false + } + ], + "health_check": { + "protocol": "https", + "port": 443, + "path": "/", + "check_interval_seconds": 10, + "response_timeout_seconds": 5, + "healthy_threshold": 5, + "unhealthy_threshold": 3 + }, + "sticky_sessions": { + "type": "cookies", + "cookie_name": "DO-LB", + "cookie_ttl_seconds": 300 + }, + "region": { + "name": "New York 3", + "slug": "nyc3", + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192gb" + ], + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata", + "install_agent" + ], + "available": true + }, + "tag": "prod:web", + "droplet_ids": [ + 55806512, + 55806515, + 55806524 + ], + "redirect_http_to_https": true, + "enable_proxy_protocol": false, + "enable_backend_keepalive": false, + "vpc_uuid": "587d698c-de84-11e8-80bc-3cfdfea9fcd1", + "disable_lets_encrypt_dns_records": false, + "project_id": "9cc10173-e9ea-4176-9dbc-a4cee4c4ff30", + "http_idle_timeout_seconds": 60, + "firewall": { + "deny": [ + "cidr:1.2.0.0/16", + "ip:2.3.4.5" + ], + "allow": [ + "ip:1.2.3.4", + "cidr:2.3.4.0/24" + ] + } + } + ], + "links": {}, + "meta": { + "total": 2 + } + } + }, + "load_balancer_basic_create_request": { + "description": "Passing requests directly through to 80 and 443.", + "value": { + "name": "example-lb-01", + "region": "nyc3", + "forwarding_rules": [ + { + "entry_protocol": "http", + "entry_port": 80, + "target_protocol": "http", + "target_port": 80 + }, + { + "entry_protocol": "https", + "entry_port": 443, + "target_protocol": "https", + "target_port": 443, + "tls_passthrough": true + } + ], + "droplet_ids": [ + 3164444, + 3164445 + ], + "project_id": "9cc10173-e9ea-4176-9dbc-a4cee4c4ff30", + "http_idle_timeout_seconds": 60, + "firewall": { + "deny": [ + "cidr:1.2.0.0/16", + "ip:2.3.4.5" + ], + "allow": [ + "ip:1.2.3.4", + "cidr:2.3.4.0/24" + ] + } + } + }, + "load_balancer_ssl_termination_create_request": { + "description": "Terminating SSL at the load balancer using a managed SSL certificate specifying Droplets using `droplet_ids`.", + "value": { + "name": "example-lb-01", + "region": "nyc3", + "forwarding_rules": [ + { + "entry_protocol": "https", + "entry_port": 443, + "target_protocol": "http", + "target_port": 8080, + "certificate_id": "892071a0-bb95-49bc-8021-3afd67a210bf" + } + ], + "droplet_ids": [ + 3164444, + 3164445 + ] + } + }, + "load_balancer_using_tag_create_request": { + "description": "Terminating SSL at the load balancer using a managed SSL certificate specifying Droplets using `tag`.", + "value": { + "name": "example-lb-01", + "region": "nyc3", + "forwarding_rules": [ + { + "entry_protocol": "https", + "entry_port": 443, + "target_protocol": "http", + "target_port": 8080, + "certificate_id": "892071a0-bb95-49bc-8021-3afd67a210bf" + } + ], + "tag": "prod:web" + } + }, + "load_balancer_sticky_sessions_and_health_check_create_request": { + "description": "Terminating SSL at the load balancer using a managed SSL certificate specifying Droplets using `tag`.", + "value": { + "name": "example-lb-01", + "region": "nyc3", + "forwarding_rules": [ + { + "entry_protocol": "https", + "entry_port": 443, + "target_protocol": "http", + "target_port": 8080, + "certificate_id": "892071a0-bb95-49bc-8021-3afd67a210bf" + } + ], + "health_check": { + "protocol": "http", + "port": 8080, + "path": "/health", + "check_interval_seconds": 10, + "response_timeout_seconds": 5, + "healthy_threshold": 5, + "unhealthy_threshold": 3 + }, + "sticky_sessions": { + "type": "cookies", + "cookie_name": "LB_COOKIE", + "cookie_ttl_seconds": 300 + }, + "tag": "prod:web" + } + }, + "load_balancer_basic_response": { + "value": { + "load_balancer": { + "id": "4de7ac8b-495b-4884-9a69-1050c6793cd6", + "name": "example-lb-01", + "ip": "104.131.186.241", + "size": "lb-small", + "algorithm": "round_robin", + "status": "new", + "created_at": "2017-02-01T22:22:58Z", + "forwarding_rules": [ + { + "entry_protocol": "http", + "entry_port": 80, + "target_protocol": "http", + "target_port": 80, + "certificate_id": "", + "tls_passthrough": false + }, + { + "entry_protocol": "https", + "entry_port": 443, + "target_protocol": "https", + "target_port": 443, + "certificate_id": "", + "tls_passthrough": true + } + ], + "health_check": { + "protocol": "http", + "port": 80, + "path": "/", + "check_interval_seconds": 10, + "response_timeout_seconds": 5, + "healthy_threshold": 5, + "unhealthy_threshold": 3 + }, + "sticky_sessions": { + "type": "none" + }, + "region": { + "name": "New York 3", + "slug": "nyc3", + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192gb" + ], + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata", + "install_agent" + ], + "available": true + }, + "tag": "", + "droplet_ids": [ + 3164444, + 3164445 + ], + "redirect_http_to_https": false, + "enable_proxy_protocol": false, + "enable_backend_keepalive": false, + "vpc_uuid": "c33931f2-a26a-4e61-b85c-4e95a2ec431b", + "disable_lets_encrypt_dns_records": false, + "project_id": "9cc10173-e9ea-4176-9dbc-a4cee4c4ff30", + "http_idle_timeout_seconds": 60, + "firewall": { + "deny": [ + "cidr:1.2.0.0/16", + "ip:2.3.4.5" + ], + "allow": [ + "ip:1.2.3.4", + "cidr:2.3.4.0/24" + ] + } + } + } + }, + "load_balancer_ssl_termination_response": { + "value": { + "load_balancer": { + "id": "4de7ac8b-495b-4884-9a69-1050c6793cd6", + "name": "example-lb-01", + "ip": "104.131.186.241", + "size": "lb-small", + "algorithm": "round_robin", + "status": "new", + "created_at": "2017-02-01T22:22:58Z", + "forwarding_rules": [ + { + "entry_protocol": "https", + "entry_port": 443, + "target_protocol": "http", + "target_port": 8080, + "certificate_id": "892071a0-bb95-49bc-8021-3afd67a210bf" + } + ], + "health_check": { + "protocol": "http", + "port": 80, + "path": "/", + "check_interval_seconds": 10, + "response_timeout_seconds": 5, + "healthy_threshold": 5, + "unhealthy_threshold": 3 + }, + "sticky_sessions": { + "type": "none" + }, + "region": { + "name": "New York 3", + "slug": "nyc3", + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192gb" + ], + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata", + "install_agent" + ], + "available": true + }, + "tag": "", + "droplet_ids": [ + 3164444, + 3164445 + ], + "redirect_http_to_https": false, + "enable_proxy_protocol": false, + "enable_backend_keepalive": false, + "vpc_uuid": "c33931f2-a26a-4e61-b85c-4e95a2ec431b", + "disable_lets_encrypt_dns_records": false + } + } + }, + "load_balancer_using_tag_response": { + "value": { + "load_balancer": { + "id": "4de7ac8b-495b-4884-9a69-1050c6793cd6", + "name": "example-lb-01", + "ip": "104.131.186.241", + "size": "lb-small", + "algorithm": "round_robin", + "status": "new", + "created_at": "2017-02-01T22:22:58Z", + "forwarding_rules": [ + { + "entry_protocol": "https", + "entry_port": 443, + "target_protocol": "http", + "target_port": 8080, + "certificate_id": "892071a0-bb95-49bc-8021-3afd67a210bf" + } + ], + "health_check": { + "protocol": "http", + "port": 80, + "path": "/", + "check_interval_seconds": 10, + "response_timeout_seconds": 5, + "healthy_threshold": 5, + "unhealthy_threshold": 3 + }, + "sticky_sessions": { + "type": "none" + }, + "region": { + "name": "New York 3", + "slug": "nyc3", + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192gb" + ], + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata", + "install_agent" + ], + "available": true + }, + "tag": "prod:web", + "droplet_ids": [ + 3164444, + 3164445 + ], + "redirect_http_to_https": false, + "enable_proxy_protocol": false, + "enable_backend_keepalive": false, + "vpc_uuid": "c33931f2-a26a-4e61-b85c-4e95a2ec431b", + "disable_lets_encrypt_dns_records": false, + "project_id": "9cc10173-e9ea-4176-9dbc-a4cee4c4ff30" + } + } + }, + "load_balancer_sticky_sessions_and_health_check_response": { + "value": { + "load_balancer": { + "id": "4de7ac8b-495b-4884-9a69-1050c6793cd6", + "name": "example-lb-01", + "ip": "104.131.186.241", + "size": "lb-small", + "algorithm": "round_robin", + "status": "new", + "created_at": "2017-02-01T22:22:58Z", + "forwarding_rules": [ + { + "entry_protocol": "https", + "entry_port": 443, + "target_protocol": "http", + "target_port": 8080, + "certificate_id": "892071a0-bb95-49bc-8021-3afd67a210bf" + } + ], + "health_check": { + "protocol": "http", + "port": 8080, + "path": "/health", + "check_interval_seconds": 10, + "response_timeout_seconds": 5, + "healthy_threshold": 5, + "unhealthy_threshold": 3 + }, + "sticky_sessions": { + "type": "cookies", + "cookie_name": "LB_COOKIE", + "cookie_ttl_seconds": 300 + }, + "region": { + "name": "New York 3", + "slug": "nyc3", + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192gb" + ], + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata", + "install_agent" + ], + "available": true + }, + "tag": "prod:web", + "droplet_ids": [ + 3164444, + 3164445 + ], + "redirect_http_to_https": false, + "enable_proxy_protocol": false, + "enable_backend_keepalive": false, + "vpc_uuid": "c33931f2-a26a-4e61-b85c-4e95a2ec431b", + "disable_lets_encrypt_dns_records": false, + "project_id": "9cc10173-e9ea-4176-9dbc-a4cee4c4ff30" + } + } + }, + "load_balancer_update_request": { + "value": { + "name": "updated-example-lb-01", + "region": "nyc3", + "droplet_ids": [ + 3164444, + 3164445 + ], + "algorithm": "round_robin", + "forwarding_rules": [ + { + "entry_protocol": "http", + "entry_port": 80, + "target_protocol": "http", + "target_port": 80, + "certificate_id": "", + "tls_passthrough": false + }, + { + "entry_protocol": "https", + "entry_port": 443, + "target_protocol": "https", + "target_port": 443, + "certificate_id": "", + "tls_passthrough": true + } + ], + "health_check": { + "protocol": "http", + "port": 80, + "path": "/", + "check_interval_seconds": 10, + "response_timeout_seconds": 5, + "healthy_threshold": 5, + "unhealthy_threshold": 3 + }, + "sticky_sessions": { + "type": "none" + }, + "redirect_http_to_https": false, + "enable_proxy_protocol": true, + "enable_backend_keepalive": true, + "vpc_uuid": "c33931f2-a26a-4e61-b85c-4e95a2ec431b", + "project_id": "9cc10173-e9ea-4176-9dbc-a4cee4c4ff30", + "http_idle_timeout_seconds": 60, + "firewall": { + "deny": [ + "cidr:1.2.0.0/16", + "ip:2.3.4.5" + ], + "allow": [ + "ip:1.2.3.4", + "cidr:2.3.4.0/24" + ] + } + } + }, + "load_balancer_update_response": { + "value": { + "load_balancer": { + "id": "4de7ac8b-495b-4884-9a69-1050c6793cd6", + "name": "updated-example-lb-01", + "ip": "104.131.186.241", + "size": "lb-small", + "algorithm": "round_robin", + "status": "new", + "created_at": "2017-02-01T22:22:58Z", + "forwarding_rules": [ + { + "entry_protocol": "http", + "entry_port": 80, + "target_protocol": "http", + "target_port": 80, + "certificate_id": "", + "tls_passthrough": false + }, + { + "entry_protocol": "https", + "entry_port": 443, + "target_protocol": "https", + "target_port": 443, + "certificate_id": "", + "tls_passthrough": true + } + ], + "health_check": { + "protocol": "http", + "port": 80, + "path": "/", + "check_interval_seconds": 10, + "response_timeout_seconds": 5, + "healthy_threshold": 5, + "unhealthy_threshold": 3 + }, + "sticky_sessions": { + "type": "none" + }, + "region": { + "name": "New York 3", + "slug": "nyc3", + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192gb" + ], + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata", + "install_agent" + ], + "available": true + }, + "tag": "", + "droplet_ids": [ + 3164444, + 3164445 + ], + "redirect_http_to_https": false, + "enable_proxy_protocol": true, + "enable_backend_keepalive": true, + "vpc_uuid": "c33931f2-a26a-4e61-b85c-4e95a2ec431b", + "disable_lets_encrypt_dns_records": false, + "project_id": "9cc10173-e9ea-4176-9dbc-a4cee4c4ff30", + "http_idle_timeout_seconds": 60, + "firewall": { + "deny": [ + "cidr:1.2.0.0/16", + "ip:2.3.4.5" + ], + "allow": [ + "ip:1.2.3.4", + "cidr:2.3.4.0/24" + ] + } + } + } + }, + "inbound_private_droplet_bandwidth": { + "value": { + "status": "success", + "data": { + "resultType": "matrix", + "result": [ + { + "metric": { + "direction": "inbound", + "host_id": "222651441", + "interface": "private" + }, + "values": [ + [ + 1634052360, + "0.016600450090265357" + ], + [ + 1634052480, + "0.015085955677299055" + ], + [ + 1634052600, + "0.014941163855322308" + ], + [ + 1634052720, + "0.016214285714285712" + ] + ] + } + ] + } + } + }, + "inbound_public_droplet_bandwidth": { + "value": { + "status": "success", + "data": { + "resultType": "matrix", + "result": [ + { + "metric": { + "direction": "inbound", + "host_id": "222651441", + "interface": "public" + }, + "values": [ + [ + 1634052360, + "0.016600450090265357" + ], + [ + 1634052480, + "0.015085955677299055" + ], + [ + 1634052600, + "0.014941163855322308" + ], + [ + 1634052720, + "0.016214285714285712" + ] + ] + } + ] + } + } + }, + "outbound_private_droplet_bandwidth": { + "value": { + "status": "success", + "data": { + "resultType": "matrix", + "result": [ + { + "metric": { + "direction": "outbound", + "host_id": "222651441", + "interface": "private" + }, + "values": [ + [ + 1634052360, + "0.016600450090265357" + ], + [ + 1634052480, + "0.015085955677299055" + ], + [ + 1634052600, + "0.014941163855322308" + ], + [ + 1634052720, + "0.016214285714285712" + ] + ] + } + ] + } + } + }, + "outbound_public_droplet_bandwidth": { + "value": { + "status": "success", + "data": { + "resultType": "matrix", + "result": [ + { + "metric": { + "direction": "outbound", + "host_id": "222651441", + "interface": "public" + }, + "values": [ + [ + 1634052360, + "0.016600450090265357" + ], + [ + 1634052480, + "0.015085955677299055" + ], + [ + 1634052600, + "0.014941163855322308" + ], + [ + 1634052720, + "0.016214285714285712" + ] + ] + } + ] + } + } + }, + "droplet_cpu": { + "value": { + "status": "success", + "data": { + "resultType": "matrix", + "result": [ + { + "metric": { + "host_id": "222651441", + "mode": "idle" + }, + "values": [ + [ + 1635386880, + "122901.18" + ], + [ + 1635387000, + "123020.92" + ], + [ + 1635387120, + "123140.8" + ] + ] + }, + { + "metric": { + "host_id": "222651441", + "mode": "iowait" + }, + "values": [ + [ + 1635386880, + "14.99" + ], + [ + 1635387000, + "15.01" + ], + [ + 1635387120, + "15.01" + ] + ] + }, + { + "metric": { + "host_id": "222651441", + "mode": "irq" + }, + "values": [ + [ + 1635386880, + "0" + ], + [ + 1635387000, + "0" + ], + [ + 1635387120, + "0" + ] + ] + }, + { + "metric": { + "host_id": "222651441", + "mode": "nice" + }, + "values": [ + [ + 1635386880, + "66.35" + ], + [ + 1635387000, + "66.35" + ], + [ + 1635387120, + "66.35" + ] + ] + }, + { + "metric": { + "host_id": "222651441", + "mode": "softirq" + }, + "values": [ + [ + 1635386880, + "2.13" + ], + [ + 1635387000, + "2.13" + ], + [ + 1635387120, + "2.13" + ] + ] + }, + { + "metric": { + "host_id": "222651441", + "mode": "steal" + }, + "values": [ + [ + 1635386880, + "7.89" + ], + [ + 1635387000, + "7.9" + ], + [ + 1635387120, + "7.91" + ] + ] + }, + { + "metric": { + "host_id": "222651441", + "mode": "system" + }, + "values": [ + [ + 1635386880, + "140.09" + ], + [ + 1635387000, + "140.2" + ], + [ + 1635387120, + "140.23" + ] + ] + }, + { + "metric": { + "host_id": "222651441", + "mode": "user" + }, + "values": [ + [ + 1635386880, + "278.57" + ], + [ + 1635387000, + "278.65" + ], + [ + 1635387120, + "278.69" + ] + ] + } + ] + } + } + }, + "droplet_filesystem": { + "value": { + "status": "success", + "data": { + "resultType": "matrix", + "result": [ + { + "metric": { + "device": "/dev/vda1", + "fstype": "ext4", + "host_id": "222651441", + "mountpoint": "/" + }, + "values": [ + [ + 1635386880, + "25832407040" + ], + [ + 1635387000, + "25832407040" + ], + [ + 1635387120, + "25832407040" + ] + ] + } + ] + } + } + }, + "reserved_ip_assigning": { + "summary": "Assigning to Droplet", + "value": { + "reserved_ip": { + "ip": "45.55.96.47", + "droplet": null, + "region": { + "name": "New York 3", + "slug": "nyc3", + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata", + "install_agent", + "storage", + "image_transfer" + ], + "available": true, + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192g" + ] + }, + "locked": true, + "project_id": "746c6152-2fa2-11ed-92d3-27aaa54e4988" + }, + "links": { + "droplets": [ + { + "id": 213939433, + "rel": "droplet", + "href": "https://api.digitalocean.com/v2/droplets/213939433" + } + ], + "actions": [ + { + "id": 1088924622, + "rel": "assign_ip", + "href": "https://api.digitalocean.com/v2/actions/1088924622" + } + ] + } + } + }, + "reserved_ip_reserving": { + "summary": "Reserving to Region", + "value": { + "reserved_ip": { + "ip": "45.55.96.47", + "droplet": null, + "region": { + "name": "New York 3", + "slug": "nyc3", + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata", + "install_agent", + "storage", + "image_transfer" + ], + "available": true, + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192g" + ] + }, + "locked": false, + "project_id": "746c6152-2fa2-11ed-92d3-27aaa54e4988" + }, + "links": {} + } + }, + "reserved_ip_assigned": { + "summary": "Assigned to Droplet", + "value": { + "reserved_ip": { + "ip": "45.55.96.47", + "droplet": { + "id": 3164444, + "name": "example.com", + "memory": 1024, + "vcpus": 1, + "disk": 25, + "locked": false, + "status": "active", + "kernel": null, + "created_at": "2020-07-21T18:37:44Z", + "features": [ + "backups", + "private_networking", + "ipv6" + ], + "backup_ids": [ + 53893572 + ], + "next_backup_window": { + "start": "2020-07-30T00:00:00Z", + "end": "2020-07-30T23:00:00Z" + }, + "snapshot_ids": [ + 67512819 + ], + "image": { + "id": 63663980, + "name": "20.04 (LTS) x64", + "type": "base", + "distribution": "Ubuntu", + "slug": "ubuntu-20-04-x64", + "public": true, + "regions": [ + "ams2", + "ams3", + "blr1", + "fra1", + "lon1", + "nyc1", + "nyc2", + "nyc3", + "sfo1", + "sfo2", + "sfo3", + "sgp1", + "tor1" + ], + "created_at": "2020-05-15T05:47:50Z", + "min_disk_size": 20, + "size_gigabytes": 2.36, + "description": "", + "tags": [], + "status": "available", + "error_message": "" + }, + "volume_ids": [], + "size": { + "slug": "s-1vcpu-1gb", + "memory": 1024, + "vcpus": 1, + "disk": 25, + "transfer": 1, + "price_monthly": 5, + "price_hourly": 0.00743999984115362, + "regions": [ + "ams2", + "ams3", + "blr1", + "fra1", + "lon1", + "nyc1", + "nyc2", + "nyc3", + "sfo1", + "sfo2", + "sfo3", + "sgp1", + "tor1" + ], + "available": true, + "description": "Basic" + }, + "size_slug": "s-1vcpu-1gb", + "networks": { + "v4": [ + { + "ip_address": "10.128.192.124", + "netmask": "255.255.0.0", + "gateway": "nil", + "type": "private" + }, + { + "ip_address": "192.241.165.154", + "netmask": "255.255.255.0", + "gateway": "192.241.165.1", + "type": "public" + } + ], + "v6": [ + { + "ip_address": "2604:a880:0:1010::18a:a001", + "netmask": 64, + "gateway": "2604:a880:0:1010::1", + "type": "public" + } + ] + }, + "region": { + "name": "New York 3", + "slug": "nyc3", + "features": [ + "backups", + "ipv6", + "metadata", + "install_agent", + "storage", + "image_transfer" + ], + "available": true, + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192g" + ] + }, + "tags": [ + "web", + "env:prod" + ], + "vpc_uuid": "760e09ef-dc84-11e8-981e-3cfdfeaae000" + }, + "region": { + "name": "New York 3", + "slug": "nyc3", + "features": [ + "backups", + "ipv6", + "metadata", + "install_agent", + "storage", + "image_transfer" + ], + "available": true, + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192g" + ] + }, + "locked": false, + "project_id": "746c6152-2fa2-11ed-92d3-27aaa54e4988" + } + } + }, + "reserved_ip_reserved": { + "summary": "Reserved to Region", + "value": { + "reserved_ip": { + "ip": "45.55.96.47", + "droplet": null, + "region": { + "name": "New York 3", + "slug": "nyc3", + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata", + "install_agent", + "storage", + "image_transfer" + ], + "available": true, + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192g" + ] + }, + "locked": false, + "project_id": "746c6152-2fa2-11ed-92d3-27aaa54e4988" + } + } + }, + "snapshots_all": { + "value": { + "snapshots": [ + { + "id": "6372321", + "name": "web-01-1595954862243", + "created_at": "2020-07-28T16:47:44Z", + "regions": [ + "nyc3", + "sfo3" + ], + "resource_id": "200776916", + "resource_type": "droplet", + "min_disk_size": 25, + "size_gigabytes": 2.34, + "tags": [ + "web", + "env:prod" + ] + }, + { + "id": "fbe805e8-866b-11e6-96bf-000f53315a41", + "name": "pvc-01-1595954862243", + "created_at": "2019-09-28T23:14:30Z", + "regions": [ + "nyc1" + ], + "resource_id": "89bcc42f-85cf-11e6-a004-000f53315871", + "resource_type": "volume", + "min_disk_size": 2, + "size_gigabytes": 0.1008, + "tags": [ + "k8s" + ] + } + ], + "links": {}, + "meta": { + "total": 2 + } + } + }, + "snapshots_droplets_only": { + "value": { + "snapshots": [ + { + "id": "6372321", + "name": "web-01-1595954862243", + "created_at": "2020-07-28T16:47:44Z", + "regions": [ + "nyc3", + "sfo3" + ], + "resource_id": "200776916", + "resource_type": "droplet", + "min_disk_size": 25, + "size_gigabytes": 2.34, + "tags": [ + "web", + "env:prod" + ] + } + ], + "links": {}, + "meta": { + "total": 1 + } + } + }, + "snapshots_volumes_only": { + "value": { + "snapshots": [ + { + "id": "fbe805e8-866b-11e6-96bf-000f53315a41", + "name": "pvc-01-1595954862243", + "created_at": "2019-09-28T23:14:30Z", + "regions": [ + "nyc1" + ], + "resource_id": "89bcc42f-85cf-11e6-a004-000f53315871", + "resource_type": "volume", + "min_disk_size": 2, + "size_gigabytes": 0.1008, + "tags": [ + "k8s" + ] + } + ], + "links": {}, + "meta": { + "total": 1 + } + } + }, + "volumes_all": { + "value": { + "volumes": [ + { + "id": "506f78a4-e098-11e5-ad9f-000f53306ae1", + "region": { + "name": "New York 1", + "slug": "nyc1", + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192gb" + ], + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata" + ], + "available": true + }, + "droplet_ids": [], + "name": "example", + "description": "Block store for examples", + "size_gigabytes": 10, + "created_at": "2016-03-02T17:00:49Z", + "filesystem_type": "ext4", + "filesystem_label": "example", + "tags": [ + "aninterestingtag" + ] + }, + { + "id": "506f78a4-e098-11e5-ad9f-000f53305eb2", + "region": { + "name": "New York 3", + "slug": "nyc3", + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192gb" + ], + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata" + ], + "available": true + }, + "droplet_ids": [], + "name": "example", + "description": "Block store for examples", + "size_gigabytes": 10, + "created_at": "2016-03-02T17:01:49Z", + "filesystem_type": "ext4", + "filesystem_label": "example", + "tags": [ + "aninterestingtag" + ] + } + ], + "links": {}, + "meta": { + "total": 2 + } + } + }, + "volumes_filtered_by_name": { + "value": { + "volumes": [ + { + "id": "506f78a4-e098-11e5-ad9f-000f53306ae1", + "region": { + "name": "New York 1", + "slug": "nyc1", + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192gb" + ], + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata" + ], + "available": true + }, + "droplet_ids": [], + "name": "example", + "description": "Block store for examples", + "size_gigabytes": 10, + "created_at": "2016-03-02T17:00:49Z", + "filesystem_type": "ext4", + "filesystem_label": "example", + "tags": [ + "aninterestingtag" + ] + } + ], + "links": {}, + "meta": { + "total": 1 + } + } + }, + "volumes_filtered_by_region": { + "value": { + "volumes": [ + { + "id": "506f78a4-e098-11e5-ad9f-000f53306ae1", + "region": { + "name": "New York 1", + "slug": "nyc1", + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192gb" + ], + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata" + ], + "available": true + }, + "droplet_ids": [], + "name": "example", + "description": "Block store for examples", + "size_gigabytes": 10, + "created_at": "2016-03-02T17:00:49Z", + "filesystem_type": "ext4", + "filesystem_label": "example", + "tags": [ + "aninterestingtag" + ] + } + ], + "links": {}, + "meta": { + "total": 1 + } + } + }, + "volume_action_attach_response": { + "value": { + "action": { + "id": 72531856, + "status": "completed", + "type": "attach_volume", + "started_at": "2020-11-12T17:51:03Z", + "completed_at": "2020-11-12T17:51:14Z", + "resource_type": "volume", + "region": { + "name": "New York 1", + "slug": "nyc1", + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192gb" + ], + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata" + ], + "available": true + }, + "region_slug": "nyc1" + } + } + }, + "volume_action_detach_response": { + "value": { + "action": { + "id": 68212773, + "status": "in-progress", + "type": "detach_volume", + "started_at": "2015-10-15T17:46:15Z", + "completed_at": null, + "resource_id": null, + "resource_type": "backend", + "region": { + "name": "New York 1", + "slug": "nyc1", + "sizes": [ + "s-1vcpu-1gb", + "s-1vcpu-2gb", + "s-1vcpu-3gb", + "s-2vcpu-2gb", + "s-3vcpu-1gb", + "s-2vcpu-4gb", + "s-4vcpu-8gb", + "s-6vcpu-16gb", + "s-8vcpu-32gb", + "s-12vcpu-48gb", + "s-16vcpu-64gb", + "s-20vcpu-96gb", + "s-24vcpu-128gb", + "s-32vcpu-192gb" + ], + "features": [ + "private_networking", + "backups", + "ipv6", + "metadata" + ], + "available": true + }, + "region_slug": "nyc1" + } + } + } + } + }, + "security": [ + { + "bearer_auth": [] + } + ] +} diff --git a/api/D/digitalocean.com/digitalocean.com/index.md b/api/D/digitalocean.com/digitalocean.com/index.md index 6d8952045..21d33c71a 100644 --- a/api/D/digitalocean.com/digitalocean.com/index.md +++ b/api/D/digitalocean.com/digitalocean.com/index.md @@ -6,3 +6,4 @@ description: "DigitalOcean API" tags: - "cloud" stubs: "digitalocean.com-stubs.json" +swagger: "digitalocean.com-swagger.json"