github.com/thetreep/go-swagger@v0.0.0-20240223100711-35af64f14f01/fixtures/bugs/1621/fixture-1621.yaml (about) 1 swagger: "2.0" 2 info: 3 title: The Giant Swarm API v4 4 description: | 5 This is the documentation for the Giant Swarm API starting at version `v4`. 6 7 For an introduction to Giant Swarm, refer to the [documentation site](https://docs.giantswarm.io/). 8 9 The Giant Swarm API attempts to behave in a __restful__ way. As a developer, you access resources using the `GET` method and, for example, delete them using the same path and the `DELETE` method. 10 11 Accessing resources via GET usually returns all information available about a resource, while collections, like for example the list of all clusters you have access to, only contain a selected few attributes of each member item. 12 13 Some requests, like for example the request to create a new cluster, don't return the resource itself. Instead, the response delivers a standard message body, showing a `code` and a `message` part. The `message` contains information for you or a client's end user. The `code` attribute contains some string (example: `RESOURCE_CREATED`) that is supposed to give you details on the state of the operation, in addition to standard HTTP status codes. This message format is also used in the case of errors. We provide a [list of all response codes](https://github.com/giantswarm/api-spec/blob/master/details/RESPONSE_CODES.md) outside this documentation. 14 15 Feedback on the API as well as this documentation is welcome via `support@giantswarm.io` or on IRC channel [#giantswarm](irc://irc.freenode.org:6667/#giantswarm) on freenode. 16 17 ## Source 18 19 The source of this documentation is available on [GitHub](https://github.com/giantswarm/api-spec). 20 21 termsOfService: https://giantswarm.io/terms/ 22 version: 4.0.0 23 license: 24 name: Apache 2.0 25 url: http://www.apache.org/licenses/LICENSE-2.0.html 26 consumes: 27 - application/json 28 produces: 29 - application/json 30 tags: 31 - name: auth tokens 32 description: | 33 Auth Tokens are your way of authenticating against this API. You can create one by passing your email and base64 encoded password to the create auth token endpoint. The auth token never expires, in case you want to invalidate it you need to delete it (logout). 34 - name: clusters 35 description: | 36 Clusters are a central resource of the Giant Swarm API. As a user or team using Giant Swarm, you set up Kubernetes clusters to run your own workloads. 37 38 The API currently provides operations to create and delete clusters, as well as list all available clusters and get details on specific clusters. 39 - name: info 40 description: Information about the Giant Swarm installation 41 - name: key pairs 42 description: A key pair is a unique combination of a X.509 certificate and a private key. Key pairs are used to access the Kubernetes API of a cluster, both using `kubectl` and any standard web browser. 43 externalDocs: 44 url: https://docs.giantswarm.io/guides/accessing-services-from-the-outside/ 45 description: "User guide: Accessing Pods and Services from the Outside" 46 - name: organizations 47 description: Organizations are groups of users who own resources like clusters. 48 - name: users 49 description: A user represents a person that should have access to the Giant Swarm API. Users can belong to many groups, and are identified by email address. 50 - name: releases 51 description: | 52 A release is a software bundle that constitutes a cluster. 53 54 Releases are identified by their 55 [semantic version number](http://semver.org/) in the `MAJOR.MINOR.PATCH` 56 format. 57 58 A release provides _components_, like for example Kubernetes. For each 59 release the contained components are listed. Changes in components are 60 detailed in the _changelog_ of a release. 61 securityDefinitions: 62 AuthorizationHeaderToken: 63 description: | 64 Clients authenticate by passing an auth token via the `Authorization` 65 header with a value of the format `giantswarm <token>`. Auth tokens can be 66 obtained using the [createAuthToken](#operation/createAuthToken) 67 operation. 68 type: apiKey 69 name: Authorization 70 in: header 71 72 security: 73 - AuthorizationHeaderToken: [] 74 75 paths: 76 /v4/info/: 77 get: 78 operationId: getInfo 79 tags: 80 - info 81 summary: Get information on the installation 82 description: | 83 Returns a set of details on the installation. The output varies based 84 on the provider used in the installation. 85 86 This information is useful for example when creating new cluster, to 87 prevent creating clusters with more worker nodes than possible. 88 89 ### Example for an AWS-based installation 90 91 ```json 92 { 93 "general": { 94 "installation_name": "shire", 95 "provider": "aws", 96 "datacenter": "eu-central-1" 97 }, 98 "workers": { 99 "count_per_cluster": { 100 "max": 20, 101 "default": 3 102 }, 103 "instance_type": { 104 "options": [ 105 "m3.medium", "m3.large", "m3.xlarge" 106 ], 107 "default": "m3.large" 108 } 109 } 110 } 111 ``` 112 113 ### Example for a KVM-based installation 114 115 ```json 116 { 117 "general": { 118 "installation_name": "isengard", 119 "provider": "kvm", 120 "datacenter": "string" 121 }, 122 "workers": { 123 "count_per_cluster": { 124 "max": 8, 125 "default": 3 126 }, 127 } 128 } 129 ``` 130 parameters: 131 - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' 132 - $ref: './parameters.yaml#/parameters/XRequestIDHeader' 133 - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' 134 - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' 135 responses: 136 "200": 137 description: Information 138 schema: 139 $ref: "./definitions.yaml#/definitions/V4InfoResponse" 140 examples: 141 application/json: 142 { 143 "general": { 144 "installation_name": "shire", 145 "provider": "aws", 146 "datacenter": "eu-central-1" 147 }, 148 "workers": { 149 "count_per_cluster": { 150 "max": 20, 151 "default": 3 152 }, 153 "instance_type": { 154 "options": [ 155 "m3.medium", "m3.large", "m3.xlarge" 156 ], 157 "default": "m3.large" 158 } 159 } 160 } 161 "401": 162 $ref: "./responses.yaml#/responses/V4Generic401Response" 163 default: 164 description: Error 165 schema: 166 $ref: "./definitions.yaml#/definitions/V4GenericResponse" 167 168 /v4/auth-tokens/: 169 post: 170 operationId: createAuthToken 171 tags: 172 - auth tokens 173 summary: Create Auth Token (Login) 174 description: | 175 Creates a Auth Token for a given user. Must authenticate with email and password. 176 parameters: 177 - $ref: './parameters.yaml#/parameters/XRequestIDHeader' 178 - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' 179 - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' 180 - name: body 181 in: body 182 required: true 183 description: Create Auth Token Request 184 schema: 185 $ref: 'definitions.yaml#/definitions/V4CreateAuthTokenRequest' 186 x-examples: 187 application/json: 188 { 189 "email": "developer@example.com", 190 "password_base64": "cGFzc3dvcmQ=" 191 } 192 responses: 193 "200": 194 description: Success 195 schema: 196 $ref: "./definitions.yaml#/definitions/V4CreateAuthTokenResponse" 197 examples: 198 application/json: 199 { 200 "auth_token": "e5239484-2299-41df-b901-d0568db7e3f9" 201 } 202 "401": 203 $ref: "./responses.yaml#/responses/V4Generic401Response" 204 205 delete: 206 operationId: deleteAuthToken 207 tags: 208 - auth tokens 209 summary: Delete Auth Token (Logout) 210 description: | 211 Deletes the authentication token provided in the Authorization header. This effectively logs you out. 212 parameters: 213 - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' 214 - $ref: './parameters.yaml#/parameters/XRequestIDHeader' 215 - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' 216 - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' 217 responses: 218 "200": 219 description: Success 220 schema: 221 $ref: "./definitions.yaml#/definitions/V4GenericResponse" 222 examples: 223 application/json: 224 { 225 "code": "RESOURCE_DELETED", 226 "message": "The authentication token has been succesfully deleted." 227 } 228 "401": 229 $ref: "./responses.yaml#/responses/V4Generic401Response" 230 231 /v4/users/: 232 get: 233 operationId: getUsers 234 tags: 235 - users 236 summary: Get users 237 description: | 238 Returns a list of all users in the system. Currently this endpoint is only available to users with admin permissions. 239 parameters: 240 - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' 241 - $ref: './parameters.yaml#/parameters/XRequestIDHeader' 242 - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' 243 - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' 244 responses: 245 "200": 246 description: Success 247 schema: 248 type: array 249 items: 250 $ref: "./definitions.yaml#/definitions/V4UserListItem" 251 examples: 252 application/json: 253 [ 254 {"email": "andy@example.com", "created": "2017-01-15T12:00:00Z", "expiry": "2019-01-15T00:00:00Z"}, 255 {"email": "bob@example.com", "created": "2017-02-15T12:30:00Z", "expiry": "2020-01-15T00:00:00Z"}, 256 {"email": "charles@example.com", "created": "2017-03-15T13:00:00Z", "expiry": "2021-01-15T00:00:00Z"} 257 ] 258 "401": 259 $ref: "./responses.yaml#/responses/V4Generic401Response" 260 default: 261 description: Error 262 schema: 263 $ref: "./definitions.yaml#/definitions/V4GenericResponse" 264 265 /v4/user/: 266 get: 267 operationId: getCurrentUser 268 tags: 269 - users 270 summary: Get current user 271 description: | 272 Returns details about the currently authenticated user 273 parameters: 274 - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' 275 - $ref: './parameters.yaml#/parameters/XRequestIDHeader' 276 - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' 277 - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' 278 responses: 279 "200": 280 description: Success 281 schema: 282 $ref: "./definitions.yaml#/definitions/V4UserListItem" 283 examples: 284 application/json: 285 {"email": "andy@example.com", "created": "2017-01-15T12:00:00Z", "expiry": "2019-01-15T00:00:00Z"} 286 "401": 287 $ref: "./responses.yaml#/responses/V4Generic401Response" 288 default: 289 description: Error 290 schema: 291 $ref: "./definitions.yaml#/definitions/V4GenericResponse" 292 293 /v4/users/{email}/: 294 get: 295 operationId: getUser 296 parameters: 297 - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' 298 - $ref: './parameters.yaml#/parameters/XRequestIDHeader' 299 - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' 300 - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' 301 - $ref: "./parameters.yaml#/parameters/UserEmailPathParameter" 302 tags: 303 - users 304 summary: Get user 305 description: | 306 Returns details about a specific user 307 responses: 308 "200": 309 description: Success 310 schema: 311 $ref: "./definitions.yaml#/definitions/V4UserListItem" 312 examples: 313 application/json: 314 {"email": "andy@example.com", "created": "2017-01-15T12:00:00Z", "expiry": "2019-01-15T00:00:00Z"} 315 "401": 316 $ref: "./responses.yaml#/responses/V4Generic401Response" 317 "404": 318 description: User not found 319 schema: 320 $ref: "./definitions.yaml#/definitions/V4GenericResponse" 321 examples: 322 application/json: 323 { 324 "code": "RESOURCE_NOT_FOUND", 325 "message": "The user could not be found. (not found: user with email 'bob@example.com' could not be found)" 326 } 327 default: 328 description: Error 329 schema: 330 $ref: "./definitions.yaml#/definitions/V4GenericResponse" 331 332 put: 333 operationId: createUser 334 parameters: 335 - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' 336 - $ref: './parameters.yaml#/parameters/XRequestIDHeader' 337 - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' 338 - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' 339 - $ref: "./parameters.yaml#/parameters/UserEmailPathParameter" 340 - name: body 341 in: body 342 required: true 343 description: User account details 344 schema: 345 $ref: "./definitions.yaml#/definitions/V4CreateUserRequest" 346 x-examples: 347 application/json: 348 { 349 "password": "cGFzc3dvcmQ=", 350 "expiry": "2020-01-01T12:00:00.000Z" 351 } 352 tags: 353 - users 354 summary: Create user 355 description: | 356 Creates a users in the system. Currently this endpoint is only available to users with admin permissions. 357 responses: 358 "201": 359 description: User created 360 schema: 361 $ref: "./definitions.yaml#/definitions/V4GenericResponse" 362 examples: 363 application/json: 364 { 365 "code": "RESOURCE_CREATED", 366 "message": "The user with email 'bob@example.com' has been created." 367 } 368 "400": 369 description: User already exists 370 schema: 371 $ref: "./definitions.yaml#/definitions/V4GenericResponse" 372 examples: 373 application/json: 374 { 375 "code": "RESOURCE_ALREADY_EXISTS", 376 "message": "The user could not be created. (invalid input: email 'bob@example.com' already exists)" 377 } 378 "401": 379 $ref: "./responses.yaml#/responses/V4Generic401Response" 380 default: 381 description: Error 382 schema: 383 $ref: "./definitions.yaml#/definitions/V4GenericResponse" 384 385 delete: 386 operationId: deleteUser 387 parameters: 388 - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' 389 - $ref: './parameters.yaml#/parameters/XRequestIDHeader' 390 - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' 391 - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' 392 - $ref: "./parameters.yaml#/parameters/UserEmailPathParameter" 393 tags: 394 - users 395 summary: Delete user 396 description: | 397 Deletes a users in the system. Currently this endpoint is only available 398 to users with admin permissions. 399 responses: 400 "200": 401 description: User deleted 402 schema: 403 $ref: "./definitions.yaml#/definitions/V4GenericResponse" 404 examples: 405 application/json: 406 { 407 "code": "RESOURCE_DELETED", 408 "message": "The user with email 'bob@example.com' has been deleted." 409 } 410 "401": 411 $ref: "./responses.yaml#/responses/V4Generic401Response" 412 "404": 413 description: User not found 414 schema: 415 $ref: "./definitions.yaml#/definitions/V4GenericResponse" 416 examples: 417 application/json: 418 { 419 "code": "RESOURCE_NOT_FOUND", 420 "message": "The user could not be deleted. (not found: user with email 'bob@example.com' could not be found)" 421 } 422 default: 423 description: Error 424 schema: 425 $ref: "./definitions.yaml#/definitions/V4GenericResponse" 426 427 /v4/clusters/: 428 get: 429 operationId: getClusters 430 tags: 431 - clusters 432 summary: Get clusters 433 description: | 434 This operation fetches a list of clusters. 435 436 The result depends on the permissions of the user. 437 A normal user will get all the clusters the user has access 438 to, via organization membership. 439 A user with admin permission will receive a list of all existing 440 clusters. 441 442 The result array items are sparse representations of the cluster objects. 443 To fetch more details on a cluster, use the [getCluster](#operation/getCluster) 444 operation. 445 parameters: 446 - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' 447 - $ref: './parameters.yaml#/parameters/XRequestIDHeader' 448 - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' 449 - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' 450 responses: 451 "200": 452 description: Success 453 schema: 454 type: array 455 items: 456 $ref: "./definitions.yaml#/definitions/V4ClusterListItem" 457 examples: 458 application/json: 459 [ 460 { 461 "id": "g8s3o", 462 "create_date": "2017-06-08T12:31:47.215Z", 463 "name": "Staging Cluster", 464 "owner": "acme" 465 }, 466 { 467 "id": "3dkr6", 468 "create_date": "2017-05-22T13:58:02.024Z", 469 "name": "Test Cluster", 470 "owner": "testorg" 471 } 472 ] 473 "401": 474 $ref: "./responses.yaml#/responses/V4Generic401Response" 475 default: 476 description: Error 477 schema: 478 $ref: "./definitions.yaml#/definitions/V4GenericResponse" 479 post: 480 operationId: addCluster 481 tags: 482 - clusters 483 summary: Create cluster 484 description: | 485 This operation is used to create a new Kubernetes cluster for an 486 organization. The desired configuration can be specified using the 487 __cluster definition format__ (see 488 [external documentation](https://github.com/giantswarm/api-spec/blob/master/details/CLUSTER_DEFINITION.md) 489 for details). 490 491 The cluster definition format allows to set a number of optional 492 configuration details, like memory size and number of CPU cores. 493 However, one attribute is __mandatory__ upon creation: The `owner` 494 attribute must carry the name of the organization the cluster will 495 belong to. Note that the acting user must be a member of that 496 organization in order to create a cluster. 497 498 It is *recommended* to also specify the `name` attribute to give the 499 cluster a friendly name, like e. g. "Development Cluster". 500 501 Additional definition attributes can be used. Where attributes are 502 omitted, default configuration values will be applied. For example, if 503 no `release_version` is specified, the most recent version is used. 504 505 The `workers` attribute, if present, must contain an array of node 506 definition objects. The number of objects given determines the number 507 of workers created. 508 509 For example, requesting three worker nodes with default configuration 510 can be achieved by submitting an array of three empty objects: 511 512 ```"workers": [{}, {}, {}]``` 513 514 For clusters on AWS, note that all worker nodes must use the same instance type. 515 516 parameters: 517 - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' 518 - $ref: './parameters.yaml#/parameters/XRequestIDHeader' 519 - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' 520 - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' 521 - name: body 522 in: body 523 required: true 524 description: New cluster definition 525 schema: 526 $ref: "./definitions.yaml#/definitions/V4AddClusterRequest" 527 x-examples: 528 application/json: 529 { 530 "owner": "myteam", 531 "release_version": "1.4.2", 532 "name": "Example cluster with 3 default worker nodes", 533 "workers": [{}, {}, {}] 534 } 535 responses: 536 "201": 537 description: Cluster created 538 headers: 539 Location: 540 type: string 541 description: URI to obtain details on the new cluster using the [getCluster](#operation/getCluster) operation 542 schema: 543 $ref: "./definitions.yaml#/definitions/V4GenericResponse" 544 examples: 545 application/json: 546 { 547 "code": "RESOURCE_CREATED", 548 "message": "A new cluster has been created with ID 'wqtlq'" 549 } 550 "401": 551 $ref: "./responses.yaml#/responses/V4Generic401Response" 552 default: 553 description: error 554 schema: 555 $ref: "./definitions.yaml#/definitions/V4GenericResponse" 556 557 /v4/clusters/{cluster_id}/: 558 get: 559 operationId: getCluster 560 tags: 561 - clusters 562 parameters: 563 - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' 564 - $ref: './parameters.yaml#/parameters/XRequestIDHeader' 565 - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' 566 - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' 567 - $ref: "./parameters.yaml#/parameters/ClusterIdPathParameter" 568 summary: Get cluster details 569 description: | 570 This operation allows to obtain all available details on a particular cluster. 571 responses: 572 "200": 573 description: Cluster details 574 schema: 575 $ref: "./definitions.yaml#/definitions/V4ClusterDetailsResponse" 576 examples: 577 application/json: 578 { 579 "id": "wqtlq", 580 "create_date": "2017-03-03T10:50:45.949270905Z", 581 "api_endpoint": "https://api.wqtlq.example.com", 582 "name": "Just a Standard Cluster", 583 "release_version": "2.5.16", 584 "kubernetes_version": "", 585 "owner": "acme", 586 "workers": [ 587 { 588 "memory": {"size_gb": 2.0}, 589 "storage": {"size_gb": 20.0}, 590 "cpu": {"cores": 4}, 591 "labels": { 592 "beta.kubernetes.io/arch": "amd64", 593 "beta.kubernetes.io/os": "linux", 594 "ip": "10.3.11.2", 595 "kubernetes.io/hostname": "worker-1.x882ofna.k8s.gigantic.io", 596 "nodetype": "hicpu" 597 } 598 }, 599 { 600 "memory": {"size_gb": 8.0}, 601 "storage": {"size_gb": 20.0}, 602 "cpu": {"cores": 2}, 603 "labels": { 604 "beta.kubernetes.io/arch": "amd64", 605 "beta.kubernetes.io/os": "linux", 606 "ip": "10.3.62.2", 607 "kubernetes.io/hostname": "worker-2.x882ofna.k8s.gigantic.io", 608 "nodetype": "hiram" 609 } 610 } 611 ], 612 "kvm": { 613 "port_mappings": [ 614 { 615 "port": 30020, 616 "protocol": "http" 617 }, 618 { 619 "port": 30021, 620 "protocol": "https" 621 }, 622 ] 623 } 624 } 625 "401": 626 $ref: "./responses.yaml#/responses/V4Generic401Response" 627 "404": 628 description: Cluster not found 629 schema: 630 $ref: "./definitions.yaml#/definitions/V4GenericResponse" 631 examples: 632 application/json: 633 { 634 "code": "RESOURCE_NOT_FOUND", 635 "message": "The cluster with ID 'wqtlq' could not be found, or perhaps you do not have access to it. Please make sure the cluster ID is correct, and that you are a member of the organization that it belongs to." 636 } 637 default: 638 description: error 639 schema: 640 $ref: "./definitions.yaml#/definitions/V4GenericResponse" 641 patch: 642 operationId: modifyCluster 643 tags: 644 - clusters 645 parameters: 646 - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' 647 - $ref: './parameters.yaml#/parameters/XRequestIDHeader' 648 - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' 649 - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' 650 - name: body 651 in: body 652 required: true 653 description: Merge-patch body 654 schema: 655 $ref: "./definitions.yaml#/definitions/V4ModifyClusterRequest" 656 x-examples: 657 application/merge-patch+json: 658 { 659 "name": "New cluster name" 660 } 661 - $ref: "./parameters.yaml#/parameters/ClusterIdPathParameter" 662 summary: Modify cluster 663 description: | 664 This operation allows to modify an existing cluster. 665 666 A cluster modification is performed by submitting a `PATCH` request 667 to the cluster resource (as described in the 668 [addCluster](#operation/addCluster) and [getCluster](#operation/getCluster)) 669 in form of a [JSON Patch Merge 670 (RFC 7386)](https://tools.ietf.org/html/rfc7386). This means, only the 671 attributes to be modified have to be contained in the request body. 672 673 The following attributes can be modified: 674 675 - `name`: Rename the cluster to something more fitting. 676 677 - `owner`: Changing the owner organization name means to change cluster 678 ownership from one organization to another. The user performing the 679 request has to be a member of both organizations. 680 681 - `release_version`: By changing this attribute you can upgrade a 682 cluster to a newer 683 [release](https://docs.giantswarm.io/api/#tag/releases). 684 685 - `workers`: By modifying the array of workers, nodes can be added to 686 increase the cluster's capacity. See details below. 687 688 ### Adding and Removing Worker Nodes (Scaling) 689 690 Adding worker nodes to a cluster or removing worker nodes from a cluster 691 works by submitting the `workers` attribute, which contains a (sparse) 692 array of worker node defintions. 693 694 _Sparse_ here means that all configuration details are optional. In the 695 case that worker nodes are added to a cluster, wherever a configuration 696 detail is missing, defaults will be applied. See 697 [Creating a cluster](#operation/addCluster) for details. 698 699 When modifying the cluster resource, you describe the desired state. 700 For scaling, this means that the worker node array submitted must 701 contain as many elements as the cluster should have worker nodes. 702 If your cluster currently has five nodes and you submit a workers 703 array with four elements, this means that one worker node will be removed. 704 If your submitted workers array has six elements, this means one will 705 be added. 706 707 As an example, this request body could be used to scale a cluster to 708 three worker nodes: 709 710 ```json 711 { 712 "workers": [{}, {}, {}] 713 } 714 ``` 715 716 If the scaled cluster had four worker nodes before, one would be removed. 717 If it had two worker nodes before, one with default settings would be 718 added. 719 720 ### Limitations 721 722 - As of now, existing worker nodes cannot be modified. 723 - When removing nodes (scaling down), it is not possible to determine 724 which nodes will be removed. 725 - On AWS based clusters, all worker nodes must use the same EC2 instance 726 type (`instance_type` node attribute). By not setting an `instance_type` 727 when submitting a PATCH request, you ensure that the right instance type 728 is used automatically. 729 730 responses: 731 "200": 732 description: Cluster modified 733 schema: 734 $ref: "./definitions.yaml#/definitions/V4ClusterDetailsResponse" 735 "401": 736 $ref: "./responses.yaml#/responses/V4Generic401Response" 737 "404": 738 description: Cluster not found 739 schema: 740 $ref: "./definitions.yaml#/definitions/V4GenericResponse" 741 examples: 742 application/json: 743 { 744 "code": "RESOURCE_NOT_FOUND", 745 "message": "The cluster with ID 'wqtlq' could not be found, or perhaps you do not have access to it. Please make sure the cluster ID is correct, and that you are a member of the organization that it belongs to." 746 } 747 default: 748 description: error 749 schema: 750 $ref: "./definitions.yaml#/definitions/V4GenericResponse" 751 delete: 752 operationId: deleteCluster 753 tags: 754 - clusters 755 parameters: 756 - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' 757 - $ref: './parameters.yaml#/parameters/XRequestIDHeader' 758 - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' 759 - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' 760 - $ref: "./parameters.yaml#/parameters/ClusterIdPathParameter" 761 summary: Delete cluster 762 description: | 763 This operation allows to delete a cluster. 764 765 __Caution:__ Deleting a cluster causes the termination of all workloads running on the cluster. Data stored on the worker nodes will be lost. There is no way to undo this operation. 766 767 The response is sent as soon as the request is validated. 768 At that point, workloads might still be running on the cluster and may be accessible for a little wile, until the cluster is actually deleted. 769 responses: 770 "202": 771 description: Deleting cluster 772 schema: 773 $ref: "./definitions.yaml#/definitions/V4GenericResponse" 774 examples: 775 application/json: 776 { 777 "code": "RESOURCE_DELETION_STARTED", 778 "message": "The cluster with ID 'wqtlq' is being deleted." 779 } 780 "401": 781 $ref: "./responses.yaml#/responses/V4Generic401Response" 782 "404": 783 description: Cluster not found 784 schema: 785 $ref: "./definitions.yaml#/definitions/V4GenericResponse" 786 examples: 787 application/json: 788 { 789 "code": "RESOURCE_NOT_FOUND", 790 "message": "The cluster with ID 'wqtlq' could not be found, or perhaps you do not have access to it. Please make sure the cluster ID is correct, and that you are a member of the organization that it belongs to." 791 } 792 default: 793 description: error 794 schema: 795 $ref: "./definitions.yaml#/definitions/V4GenericResponse" 796 797 /v4/clusters/{cluster_id}/key-pairs/: 798 get: 799 operationId: getKeyPairs 800 tags: 801 - key pairs 802 summary: Get key pairs 803 description: | 804 Returns a list of information on all key pairs of a cluster as an array. 805 806 The individual array items contain metadata on the key pairs, but neither the key nor the certificate. These can only be obtained upon creation, using the [addKeypair](#operation/addKeyPair) operation. 807 parameters: 808 - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' 809 - $ref: './parameters.yaml#/parameters/XRequestIDHeader' 810 - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' 811 - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' 812 - $ref: "./parameters.yaml#/parameters/ClusterIdPathParameter" 813 responses: 814 "200": 815 description: Key pairs 816 schema: 817 $ref: "./definitions.yaml#/definitions/V4GetKeyPairsResponse" 818 "401": 819 $ref: "./responses.yaml#/responses/V4Generic401Response" 820 default: 821 description: error 822 schema: 823 $ref: "./definitions.yaml#/definitions/V4GenericResponse" 824 post: 825 operationId: addKeyPair 826 tags: 827 - key pairs 828 summary: Create key pair 829 parameters: 830 - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' 831 - $ref: './parameters.yaml#/parameters/XRequestIDHeader' 832 - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' 833 - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' 834 - $ref: "./parameters.yaml#/parameters/ClusterIdPathParameter" 835 - name: body 836 in: body 837 required: true 838 description: | 839 While the `ttl_hours` attribute is optional and will be set to a default value when omitted, the `description` is mandatory. 840 schema: 841 $ref: "./definitions.yaml#/definitions/V4AddKeyPairRequest" 842 x-examples: 843 application/json: 844 { 845 "description": "Admin key pair lasting twelve hours", 846 "ttl_hours": 12, 847 "certificate_organizations": "system:masters" 848 } 849 description: | 850 This operation allows to create a new key pair for accessing a specific cluster. 851 852 A key pair consists of an unencrypted private RSA key and an X.509 certificate. In addition, when obtaining a key pair for a cluster, the cluster's certificate authority file (CA certificate) is delivered, which is required by TLS clients to establish trust to the cluster. 853 854 In addition to the credentials itself, a key pair has some metadata like a unique ID, a creation timestamp and a free text `description` that you can use at will, for example to note for whom a key pair has been issued. 855 856 ### Customizing the certificate's subject for K8s RBAC 857 858 It is possible to set the Common Name and Organization fields of the generated certificate's subject. 859 860 - `cn_prefix`: The certificate's common name uses this format: `<cn_prefix>.user.<clusterdomain>`. 861 862 `clusterdomain` is specific to your cluster and is not editable. 863 864 The `cn_prefix` however is editable. When left blank it will default 865 to the email address of the Giant Swarm user that is performing the 866 create key pair request. 867 868 The common name is used as the username for requests to the Kubernetes API. This allows you 869 to set up role-based access controls. 870 871 872 - `certificate_organizations`: This will set the certificate's `organization` fields. Use a comma separated list of values. 873 The Kubernetes API will use these values as group memberships. 874 875 __Note:__ The actual credentials coming with the key pair (key, certificate) can only be accessed once, as the result of the `POST` request that triggers their creation. This restriction exists to minimize the risk of credentials being leaked. If you fail to capture the credentials upon creation, you'll have to repeat the creation request. 876 responses: 877 "200": 878 description: Success 879 schema: 880 $ref: "./definitions.yaml#/definitions/V4AddKeyPairResponse" 881 examples: 882 application/json: 883 { 884 "certificate_authority_data": "-----BEGIN CERTIFICATE-----...-----END CERTIFICATE-----", 885 "client_key_data": "-----BEGIN RSA PRIVATE KEY-----...-----END RSA PRIVATE KEY-----", 886 "client_certificate_data": "-----BEGIN CERTIFICATE-----...-----END CERTIFICATE-----", 887 "create_date": "2016-06-01T12:00:00.000Z", 888 "description": "Key pair description", 889 "id": "02:cc:da:f9:fb:ce:c3:e5:e1:f6:27:d8:43:48:0d:37:4a:ee:b9:67", 890 "ttl_hours": 8640 891 } 892 "401": 893 $ref: "./responses.yaml#/responses/V4Generic401Response" 894 895 /v4/organizations/: 896 get: 897 operationId: getOrganizations 898 tags: 899 - organizations 900 summary: Get organizations 901 description: | 902 This operation allows to fetch a list of organizations the user is a 903 member of. In the case of an admin user, the result includes all 904 existing organizations. 905 parameters: 906 - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' 907 - $ref: './parameters.yaml#/parameters/XRequestIDHeader' 908 - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' 909 - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' 910 responses: 911 "200": 912 description: Success 913 schema: 914 type: array 915 items: 916 $ref: "./definitions.yaml#/definitions/V4OrganizationListItem" 917 examples: 918 application/json: 919 [ 920 {"id": "acme"}, 921 {"id": "giantswarm"}, 922 {"id": "testorg"} 923 ] 924 "401": 925 $ref: "./responses.yaml#/responses/V4Generic401Response" 926 default: 927 description: Error 928 schema: 929 $ref: "./definitions.yaml#/definitions/V4GenericResponse" 930 931 /v4/organizations/{organization_id}/: 932 get: 933 operationId: getOrganization 934 tags: 935 - organizations 936 summary: Get organization details 937 description: | 938 This operation fetches organization details. 939 parameters: 940 - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' 941 - $ref: './parameters.yaml#/parameters/XRequestIDHeader' 942 - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' 943 - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' 944 - $ref: "./parameters.yaml#/parameters/OrganizationIdPathParameter" 945 responses: 946 "200": 947 description: Organization details 948 schema: 949 $ref: "./definitions.yaml#/definitions/V4Organization" 950 examples: 951 application/json: 952 { 953 "id": "acme", 954 "members": [ 955 {"email": "user1@example.com"}, 956 {"email": "user2@example.com"} 957 ] 958 } 959 "401": 960 $ref: "./responses.yaml#/responses/V4Generic401Response" 961 "404": 962 description: Organization not found 963 schema: 964 $ref: "./definitions.yaml#/definitions/V4GenericResponse" 965 examples: 966 application/json: 967 { 968 "code": "RESOURCE_NOT_FOUND", 969 "message": "The organization could not be found. (not found: the organization with id 'acme' could not be found)" 970 } 971 default: 972 description: Error 973 schema: 974 $ref: "./definitions.yaml#/definitions/V4GenericResponse" 975 put: 976 operationId: addOrganization 977 tags: 978 - organizations 979 summary: Create an organization 980 description: | 981 This operation allows a user to create an organization. 982 parameters: 983 - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' 984 - $ref: './parameters.yaml#/parameters/XRequestIDHeader' 985 - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' 986 - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' 987 - $ref: "./parameters.yaml#/parameters/OrganizationIdPathParameter" 988 - name: body 989 in: body 990 required: true 991 schema: 992 $ref: "./definitions.yaml#/definitions/V4Organization" 993 x-examples: 994 application/json: 995 { 996 "id": "string", 997 "members": [ 998 {"email": "myself@example.com"}, 999 {"email": "colleague@example.com"} 1000 ] 1001 } 1002 responses: 1003 "201": 1004 description: Organization created 1005 schema: 1006 $ref: "./definitions.yaml#/definitions/V4Organization" 1007 examples: 1008 application/json: 1009 { 1010 "id": "acme", 1011 "members": [ 1012 {"email": "user1@example.com"}, 1013 {"email": "user2@example.com"} 1014 ] 1015 } 1016 "401": 1017 $ref: "./responses.yaml#/responses/V4Generic401Response" 1018 "409": 1019 description: Organization already exists 1020 schema: 1021 $ref: "./definitions.yaml#/definitions/V4GenericResponse" 1022 examples: 1023 application/json: 1024 { 1025 "code": "RESOURCE_ALREADY_EXISTS", 1026 "message": "The organization could not be created. (org already exists)" 1027 } 1028 default: 1029 description: Error 1030 schema: 1031 $ref: "./definitions.yaml#/definitions/V4GenericResponse" 1032 patch: 1033 operationId: modifyOrganization 1034 tags: 1035 - organizations 1036 parameters: 1037 - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' 1038 - $ref: './parameters.yaml#/parameters/XRequestIDHeader' 1039 - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' 1040 - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' 1041 - $ref: "./parameters.yaml#/parameters/OrganizationIdPathParameter" 1042 - name: body 1043 in: body 1044 required: true 1045 schema: 1046 type: object 1047 properties: 1048 members: 1049 type: array 1050 description: List of members that belong to this organization 1051 items: 1052 $ref: "./definitions.yaml#/definitions/V4OrganizationMember" 1053 x-examples: 1054 application/merge-patch+json: 1055 { 1056 "members": [{"email": "myself@example.com"}] 1057 } 1058 1059 summary: Modify organization 1060 description: | 1061 This operation allows you to modify an existing organization. You must be 1062 a member of the organization or an admin in order to use this endpoint. 1063 1064 The following attributes can be modified: 1065 1066 - `members`: By modifying the array of members, members can be added to or removed from the organization 1067 1068 The request body must conform with the [JSON Patch Merge (RFC 7386)](https://tools.ietf.org/html/rfc7386) standard. 1069 Requests have to be sent with the `Content-Type: application/merge-patch+json` header. 1070 1071 The full request must be valid before it will be executed, currently this 1072 means every member you attempt to add to the organization must actually 1073 exist in the system. If any member you attempt to add is invalid, the entire 1074 patch operation will fail, no members will be added or removed, and an error message 1075 will explain which members in your request are invalid. 1076 responses: 1077 "200": 1078 description: Organization modified 1079 schema: 1080 $ref: "./definitions.yaml#/definitions/V4Organization" 1081 "400": 1082 description: Invalid input 1083 schema: 1084 $ref: "./definitions.yaml#/definitions/V4GenericResponse" 1085 examples: 1086 application/json: 1087 { 1088 "code": "INVALID_INPUT", 1089 "message": "The organization could not be modified. (invalid input: user 'invalid-email' does not exist or is invalid)" 1090 } 1091 "401": 1092 $ref: "./responses.yaml#/responses/V4Generic401Response" 1093 "404": 1094 description: Organization not found 1095 schema: 1096 $ref: "./definitions.yaml#/definitions/V4GenericResponse" 1097 examples: 1098 application/json: 1099 { 1100 "code": "RESOURCE_NOT_FOUND", 1101 "message": "The organization could not be modified. (not found: the organization with id 'acme' could not be found)" 1102 } 1103 default: 1104 description: error 1105 schema: 1106 $ref: "./definitions.yaml#/definitions/V4GenericResponse" 1107 delete: 1108 operationId: deleteOrganization 1109 tags: 1110 - organizations 1111 summary: Delete an organization 1112 description: | 1113 This operation allows a user to delete an organization that they are a member of. 1114 Admin users can delete any organization. 1115 parameters: 1116 - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' 1117 - $ref: './parameters.yaml#/parameters/XRequestIDHeader' 1118 - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' 1119 - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' 1120 - $ref: "./parameters.yaml#/parameters/OrganizationIdPathParameter" 1121 responses: 1122 "200": 1123 description: Organization deleted 1124 schema: 1125 $ref: "./definitions.yaml#/definitions/V4GenericResponse" 1126 examples: 1127 application/json: 1128 { 1129 "code": "RESOURCE_DELETED", 1130 "message": "The organization with ID 'acme' has been deleted." 1131 } 1132 "401": 1133 $ref: "./responses.yaml#/responses/V4Generic401Response" 1134 "404": 1135 description: Organization not found 1136 schema: 1137 $ref: "./definitions.yaml#/definitions/V4GenericResponse" 1138 examples: 1139 application/json: 1140 { 1141 "code": "RESOURCE_NOT_FOUND", 1142 "message": "The organization could not be deleted. (not found: the organization with id 'acme' could not be found)" 1143 } 1144 default: 1145 description: Error 1146 schema: 1147 $ref: "./definitions.yaml#/definitions/V4GenericResponse" 1148 1149 /v4/organizations/{organization_id}/credentials/: 1150 post: 1151 operationId: addCredentials 1152 tags: 1153 - organizations 1154 summary: Set credentials 1155 description: | 1156 Add a set of credentials to the organization allowing the creation and 1157 operation of clusters within a cloud provider account/subscription. 1158 1159 The actual type of these credentials depends on the cloud provider the 1160 installation is running on. Currently, only AWS is supported, with 1161 support for Azure being planned for the near future. 1162 1163 Credentials in an organization are immutable. Each organization can only 1164 have one set of credentials. 1165 1166 Once credentials have been set for an organization, they are used for 1167 every new cluster that will be created for the organization. 1168 1169 ### Example request body for AWS 1170 1171 ```json 1172 { 1173 "provider": "aws", 1174 "aws": { 1175 "roles": { 1176 "admin": "arn:aws:iam::123456789012:role/GiantSwarmAdmin", 1177 "awsoperator": "arn:aws:iam::123456789012:role/GiantSwarmAWSOperator" 1178 } 1179 } 1180 } 1181 ``` 1182 parameters: 1183 - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' 1184 - $ref: './parameters.yaml#/parameters/XRequestIDHeader' 1185 - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' 1186 - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' 1187 - $ref: "./parameters.yaml#/parameters/OrganizationIdPathParameter" 1188 - name: body 1189 in: body 1190 required: true 1191 schema: 1192 $ref: "./definitions.yaml#/definitions/V4AddCredentialsRequest" 1193 x-examples: 1194 application/json: 1195 { 1196 "provider": "aws", 1197 "aws": { 1198 "roles": { 1199 "admin": "arn:aws:iam::123456789012:role/GiantSwarmAdmin", 1200 "awsoperator": "arn:aws:iam::123456789012:role/GiantSwarmAWSOperator" 1201 } 1202 } 1203 } 1204 responses: 1205 "201": 1206 description: Credentials created 1207 headers: 1208 Location: 1209 type: string 1210 description: URI of the new credentials resource 1211 schema: 1212 $ref: "./definitions.yaml#/definitions/V4GenericResponse" 1213 examples: 1214 application/json: 1215 { 1216 "code": "RESOURCE_CREATED", 1217 "message": "A new set of credentials has been created with ID '5d9h4'" 1218 } 1219 "401": 1220 $ref: "./responses.yaml#/responses/V4Generic401Response" 1221 "409": 1222 description: Conflict 1223 schema: 1224 $ref: "./definitions.yaml#/definitions/V4GenericResponse" 1225 examples: 1226 application/json: 1227 { 1228 "code": "RESOURCE_ALREADY_EXISTS", 1229 "message": "The organisation already has a set of credentials" 1230 } 1231 default: 1232 description: error 1233 schema: 1234 $ref: "./definitions.yaml#/definitions/V4GenericResponse" 1235 1236 /v4/releases/: 1237 get: 1238 operationId: getReleases 1239 tags: 1240 - releases 1241 summary: Get releases 1242 description: | 1243 Lists all releases available for new clusters or for upgrading existing 1244 clusters. Might also serve as an archive to obtain details on older 1245 releases. 1246 parameters: 1247 - $ref: './parameters.yaml#/parameters/RequiredGiantSwarmAuthorizationHeader' 1248 - $ref: './parameters.yaml#/parameters/XRequestIDHeader' 1249 - $ref: './parameters.yaml#/parameters/XGiantSwarmActivityHeader' 1250 - $ref: './parameters.yaml#/parameters/XGiantSwarmCmdLineHeader' 1251 responses: 1252 "200": 1253 description: Releases list 1254 schema: 1255 type: array 1256 items: 1257 $ref: "./definitions.yaml#/definitions/V4ReleaseListItem" 1258 examples: 1259 application/json: 1260 [ 1261 { 1262 "version": "1.14.9", 1263 "timestamp": "2017-09-21T08:14:03.37759Z", 1264 "changelog": [ 1265 { 1266 "component": "kubernetes", 1267 "description": "Security fixes" 1268 }, 1269 { 1270 "component": "calico", 1271 "description": "Security fixes" 1272 } 1273 ], 1274 "components": [ 1275 { 1276 "name": "kubernetes", 1277 "version": "1.5.8" 1278 }, 1279 { 1280 "name": "calico", 1281 "version": "0.9.1" 1282 } 1283 ], 1284 "active": false 1285 }, 1286 { 1287 "version": "2.8.4", 1288 "timestamp": "2017-11-11T12:24:56.59969Z", 1289 "changelog": [ 1290 { 1291 "component": "calico", 1292 "description": "Bugfix" 1293 } 1294 ], 1295 "components": [ 1296 { 1297 "name": "kubernetes", 1298 "version": "1.7.3" 1299 }, 1300 { 1301 "name": "calico", 1302 "version": "1.1.1" 1303 } 1304 ], 1305 "active": true 1306 } 1307 ] 1308 "401": 1309 $ref: "./responses.yaml#/responses/V4Generic401Response" 1310