Projects API
The project allows multi-tenancy in the application from a user perspective.
POST
POST URL: /v2/projects POST BODY: { "metadata": { "name": "<name>", "description": "<description>", "userData1": "<user data>", "userData2": "<user data>" } } RETURN STATUS: 201 RETURN BODY: { "metadata": { "name": ""<name>", "description": "<description>", "userData1": "<user data>", "userData2": "<user data>" } }
GET, DELETE
GET URL: /v2/projects/{project-name} RETURN STATUS: 200 RETURN BODY: { "metadata": { "name": "<name>", "description": "<description>", "userData1": "<user data>", "userData2": "<user data>" } } DELETE URL: /v2/projects/{project-name} RETURN STATUS: 204
GET URL: /v2/projects/{project-name} RETURN STATUS: 200 RETURN BODY: { "metadata": { "name": "<name>", "description": "<description>", "userData1": "<user data>", "userData2": "<user data>" } } DELETE URL: /v2/projects/{project-name} RETURN STATUS: 204
Composite Application API
Composite Application names are unique within a Project. Composite application resource represents a collection of applications and each application is represented by helm charts. Each Helm chart is wrapped in tar.gz format.
POST
URL: /v2/projects/{project-name}/composite-apps POST BODY: { "metadata":{ "name":"<name>", "description":"<description>", "userData1":"<user data>", "userData2":"<user data>" }, "spec":{ "version":"<version of the composite app>" } } RETURN STATUS: 201 RETURN BODY: { "metadata":{ "name":"<name>", "description":"<description>", "userData1":"<user data>", "userData2":"<user data>" }, "spec":{ "version":"<version of the composite app>" } }
GET, DELETE
GET URL: /v2/projects/{project-name}/composite-apps/{composite-app-name}/{version} RETURN STATUS: 200 RETURN BODY: { "metadata":{ "name":"<name>", "description":"<description>", "userData1":"<user data>", "userData2":"<user data>" }, "spec":{ "version":"<version of the composite app>" } } DELETE URL: /v2/projects/{project-name}/composite-apps/{composite-app-name}/{version} RETURN STATUS: 204
Adding applications to composite app
Format of the Helm chart for the application wrapped in tar.gz
|
POST
This POST is a multipart POST. With the POST body containing the data about the application and the tar.gz uploaded in multipart form.
URL: /v2/projects/{project-name}/composite-apps/{composite-app-name}/{version}/apps POST BODY: { "metadata":{ "name":"<name>", "description":"<description>", "userData1":"<user data>", "userData2":"<user data>" } } RETURN STATUS: 201 RETURN BODY: { "metadata":{ "name":"<name>", "description":"<description>", "userData1":"<user data>", "userData2":"<user data>" } }
GET, DELETE
GET URL: /v2/projects/{project-name}/composite-apps/{composite-app-name}/{version}/apps/{app-name} RETURN STATUS: 200 RETURN BODY: { "metadata":{ "name":"<name>", "description":"<description>", "userData1":"<user data>", "userData2":"<user data>" } } Multipart response containing the tar.gz of the Helm chart for the app DELETE URL: /v2/projects/{project-name}/composite-apps/{composite-app-name}/{version}/apps/{app-name} RETURN STATUS: 204
Profile API
Once the definitions for applications are created, profiles are created to customize the applications. Later on, they are instantiated in Kubernetes by the instantiation API.
POST
URL: /v2/projects/{project-name}/composite-apps/{composite-app-name}/{verison}/composite-profiles POST BODY: { "metadata":{ "name":"<name>", "description":"<description>", "userData1":"<user data>", "userData2":"<user data>" } } RETURN STATUS: 201 RETURN BODY: { "metadata":{ "name":"<name>", "description":"<description>", "userData1":"<user data>", "userData2":"<user data>" } }
GET, DELETE
GET URL: /v2/project/{project-name}/composite-apps/{composite-app-name}/{version}/composite-profiles/{composite-profile-name} RETURN STATUS: 200 RETURN BODY: { "metadata":{ "name":"<name>", "description":"<description>", "userData1":"<user data>", "userData2":"<user data>" } } DELETE URL: /v2/projects/{project-name}/composite-apps/{app-name}/{app-version}/composite-profiles/{composite-profile-name} RETURN STATUS: 204
Adding profile per application
A per application profile contains the following:
- manifest.yaml
- Contains the details for the profile and everything contained within
- A HELM values override yaml file.
- It can have any name as long as it matches the corresponding entry in the manifest.yaml
- Any number of files organized in a folder structure
- All these files should have a corresponding entry in manifest.yaml file
Sample Profile is described below:
Create the profile artifact
Creating a Profile Artifact
1 |
|
The manifest file contains the following:
manifest.yaml
1 |
|
POST
This POST is a multipart POST. With the POST body containing the data about the profile and the profile tar.gz uploaded in multipart form.
URL: /v2/projects/{project-name}/composite-apps/{composite-app-name}/{verison}/composite-profiles/{composite-profile-name}/profiles POST BODY: { "metadata":{ "name":"<name>", "description":"<description>", "userData1":"<user data>", "userData2":"<user data>" }, "spec":{ "app-name": "<name>", // Must match the name given in composite-apps/apps API } } Multipart request containg tar.gz of the profile RETURN STATUS: 201 RETURN BODY: { "metadata":{ "name":"<name>", "description":"<description>", "userData1":"<user data>", "userData2":"<user data>" }, "spec":{ "app-name": "<name>", // Must match the name given in composite-apps/apps API } }
GET, DELETE
GET URL: /v2/project/{project-name}/composite-apps/{composite-app-name}/{version}/composite-profiles/{composite-profile-name}/profiles/{profile-name} RETURN STATUS: 200 RETURN BODY: { "metadata":{ "name":"<name>", "description":"<description>", "userData1":"<user data>", "userData2":"<user data>" }, "spec":{ "app-name": "<name>", // Must match the name given in composite-apps/apps API } } Multipart response containing the tar.gz of the profile DELETE URL: /v2/project/{project-name}/composite-apps/{composite-app-name}/{version}/composite-profiles/{composite-profile-name}/profiles/{profile-name} RETURN STATUS: 204
Generic Placement Intent API
Generic Placement Intent API is used to create generic placement intents for sub-applications in an application. Intent created using this API will be added to an Intent Group for use during instantiation.
POST
URL: /v2/projects/{project-name}/composite-apps/{composite-app-name}/{version}/generic-placement-intents POST BODY: { "metadata":{ "name":"<name>", "description":"<description>", "userData1":"<user data>", "userData2":"<user data>" }, "spec":{ "logical-cloud": "logical-cloud-name" //name of logical cloud to use for instantiation. The DCM API will provide the list of clusters that are part of the logical-cloud } } RETURN STATUS: 201 RETURN BODY: { "metadata":{ "name":"<name>", "description":"<description>", "userData1":"<user data>", "userData2":"<user data>" }, "spec":{ "logical-cloud": "logical-cloud-name" //name of logical cloud to use for instantiation. The DCM API will provide the list of clusters that are part of the logical-cloud } }
GET, DELETE
GET URL: /v2/projects/{project-name}/composite-apps/{composite-app-name}/{version}/generic-placement-intents/{intent-name} RETURN STATUS: 200 RETURN BODY: { "metadata":{ "name":"<name>", "description":"<description>", "userData1":"<user data>", "userData2":"<user data>" }, "spec":{ "logical-cloud": "logical-cloud-name" //name of logical cloud to use for instantiation. The DCM API will provide the list of clusters that are part of the logical-cloud } } DELETE URL: /v2/project/{project-name}/composite-apps/{composite-app-name}/{version}/generic-placement-intent/{intent-name} RETURN STATUS: 204
Adding placement intent for each application in the composite-app
POST
URL: /v2/project/{project-name}/composite-apps/{composite-app-name}/{version}/generic-placement-intent/{intent-name}/app-intents POST BODY: { "metadata":{ "name":"<name>", "description":"<description>", "userData1":"<user data>", "userData2":"<user data>" }, "spec":{ "app-name":"name", "intent":{ "allOf":[ { "cluster-name":"edge1" }, { "cluster-name":"edge2" }, { "anyOf":[ { "cluster-label-name":"east-us1" }, { "cluster-label-name":"east-us2" } ] } ] } } } RETURN STATUS: 201 RETURN BODY: { "metadata":{ "name":"<name>", "description":"<description>", "userData1":"<user data>", "userData2":"<user data>" }, "spec":{ "app-name":"name", "intent":{ "allOf":[ { "cluster-name":"edge1" }, { "cluster-name":"edge2" }, { "anyOf":[ { "cluster-label-name":"east-us1" }, { "cluster-label-name":"east-us2" } ] } ] } } }
GET, DELETE
GET URL: /v2/project/{project-name}/composite-apps/{composite-app-name}/{version}/generic-placement-intent/{intent-name}/app-intents RETURN STATUS: 200 RETURN BODY: { "applications":[ { "name":"app1", "anyOf":[ { "cluster-name":"edge1" }, { "cluster-name":"edge2" } ] }, { "name":"app2", "allOf":[ { "cluster-name":"edge1" }, { "cluster-name":"edge2" } ] }, { "name":"app3", "allOf":[ { "cluster-name":"edge1" }, { "cluster-name":"edge2" }, { "anyOf":[ { "cluster-label-name":"east-us1" }, { "cluster-label-name":"east-us2" } ] } ] } ] } GET URL: /v2/project/{project-name}/composite-apps/{composite-app-name}/{version}/generic-placement-intent/{intent-name}/app-intents/{intent-name} RETURN STATUS: 200 RETURN BODY: { "metadata":{ "name":"<name>", "description":"<description>", "userData1":"<user data>", "userData2":"<user data>" }, "spec":{ "app-name":"name", "intent":{ "allOf":[ { "cluster-name":"edge1" }, { "cluster-name":"edge2" }, { "anyOf":[ { "cluster-label-name":"east-us1" }, { "cluster-label-name":"east-us2" } ] } ] } } } DELETE URL: /v2/project/{project-name}/composite-apps/{composite-app-name}/{version}/generic-placement-intent/{intent-name}/apps-intents/{intent-name} RETURN STATUS: 204
Deployment Intent Group API
Deployment Intent Group API is used to create Intent Groups that can then will be used at instantiation time. Some intents that can be part of an Intent Group are Generic Placement Intent, HPA Intent, and traffic controller Intent.
POST
URL: /v2/projects/{project-name}/composite-apps/{composite-app-name}/{version}/deployment-intent-groups POST BODY: { "metadata":{ "name":"<name>", "description":"<description>", "userData1":"<user data>", "userData2":"<user data>" }, "spec":{ "profile":"<profile-name>", "version":"<version of the deployment>", "override-values":[ { "app-name":"<name>", "values":[ { "imageRepository":"registry.hub.docker.com" } ] }, { "app-name":"<name>", "values":[ { "imageRepository":"registry.hub.docker.com" } ] } ] } } RETURN STATUS: 201 RETURN BODY: { "metadata":{ "name":"<name>", "description":"<description>", "userData1":"<user data>", "userData2":"<user data>" }, "spec":{ "profile":"<profile-name>", "version":"<version of the deployment>", "override-values":[ { "app-name":"<name>", "values":[ { "imageRepository":"registry.hub.docker.com" } ] }, { "app-name":"<name>", "values":[ { "imageRepository":"registry.hub.docker.com" } ] } ] } }
GET, DELETE
GET URL: /v2/projects/{project-name}/composite-apps/{composite-app-name}/{version}/deployment-intent-groups/{deployment-intent-group-name} RETURN STATUS: 200 RETURN BODY: { "metadata":{ "name":"<name>", "description":"<description>", "userData1":"<user data>", "userData2":"<user data>" }, "spec":{ "profile":"<profile-name>", "version":"<version of the deployment>", "override-values":[ { "app-name":"<name>", "values":[ { "imageRepository":"registry.hub.docker.com" } ] }, { "app-name":"<name>", "values":[ { "imageRepository":"registry.hub.docker.com" } ] } ] } } DELETE URL: /v2/projects/{project-name}/composite-apps/{composite-app-name}/{version}/deployment-intent-groups/{deployment-intent-group-name} RETURN STATUS: 204
Adding intents to an Intent group
POST
URL: v2/projects/{project-name}/composite-apps/{composite-app-name}/{version}/deployment-intent-groups/{deployment-intent-group-name}/intents POST BODY: { "metadata":{ "name":"<name>", "description":"<description>", "userData1":"<user data>", "userData2":"<user data>" }, "spec":{ "intent":{ "generic-placement-intent":"xyz-generic-placement-intent" } } } RETURN STATUS: 201 RETURN BODY: { "metadata":{ "name":"<name>", "description":"<description>", "userData1":"<user data>", "userData2":"<user data>" }, "spec":{ "intent":{ "generic-placement-intent":"xyz-generic-placement-intent" } } }
GET, DELETE
GET URL: /v2/projects/{project-name}/composite-apps/{composite-app-name}/{version}/deployment-intent-groups/{deployment-intent-group-name}/intents/{intent-name} { "metadata":{ "name":"<name>", "description":"<description>", "userData1":"<user data>", "userData2":"<user data>" }, "spec":{ "intent":{ "generic-placement-intent":"xyz-generic-placement-intent" } } } GET URL: /v2/projects/{project-name}/composite-apps/{composite-app-name}/{version}/deployment-intent-groups/{deployment-intent-group-name}/intents RETURN STATUS: 200 RETURN BODY: { "intent":[ { "generic-placement-intent":"generic-placement-intent-name" }, { "hpa-placement-intent":"hpa-placement-intent-name" }, { "traffic-intent":"traffic-intent-name" } ] } DELETE URL: /v2/projects/{project-name}/composite-apps/{composite-app-name}/{version}/deployment-intent-groups/{deployment-intent-group-name}/intents/{intent-name} RETURN STATUS: 204
Instantiation, Destroy, Status API
Instantiation API to instantiate composite app based on intent-group. Destroy API deletes the app and Status API returns the resources
POST
URL: /v2/projects/{project-name}/composite-apps/{composite-app-name}/{version}/deployment-intent-groups/{deployment-intent-group-name}/approve POST BODY: { } RETURN STATUS: 201 RETURN BODY: { } URL: /v2/projects/{project-name}/composite-apps/{composite-app-name}/{version}/deployment-intent-groups/{deployment-intent-group-name}/initantiate POST BODY: { } RETURN STATUS: 201 RETURN BODY: { } URL: /v2/projects/{project-name}/composite-apps/{composite-app-name}/{version}/deployment-intent-groups/{deployment-intent-group-name}/status POST BODY: { } RETURN STATUS: 201 RETURN BODY: { "name": "<name>", "composite-app-name": "test-app", "composite-app-version": "v1", "profile-name": "test-app-profile", "intent-group": "intent-group-1" "namespace": "testinstallns", "resources": [ { "GVK": { "Group": "", "Version": "v1", "Kind": "Service" }, "cluster-name": "cluster1", "Name": "mongo", "status": "Running" }, { "GVK": { "Group": "", "Version": "v1", "Kind": "Service" }, "cluster-name": "cluster2", "Name": "mongo-read", "status": "Terminated" } ] } URL: /v2/projects/{project-name}/composite-apps/{composite-app-name}/{version}/deployment-intent-groups/{deployment-intent-group-name}/destroy POST BODY: { } RETURN STATUS: 201 RETURN BODY: { }
Cluster Registration API
API to support Reachability for a Kubernetes Cloud. This API will be used to upload configuration information for the cluster
POST
URL: /v2/cluster-providers POST BODY: { "metadata":{ "name":"<name>", "description":"<description>", "userData1":"<user data>", "userData2":"<user data>" } } RETURN STATUS: 201 RETURN BODY: { "metadata":{ "name":"<name>", "description":"<description>", "userData1":"<user data>", "userData2":"<user data>" } }
GET, DELETE
GET URL: /v2/cluster-providers/{provider-name} RETURN STATUS: 200 RETURN BODY: { "metadata":{ "name":"<name>", "description":"<description>", "userData1":"<user data>", "userData2":"<user data>" } } DELETE URL: /v2/cluster-providers/{provider-name} RETURN STATUS: 204
POST
This POST is a multipart POST. With the POST body containing the data about the cluster and the kubeconfig uploaded in multipart form.
URL: /v2/cluster-providers/{provider-name}/clusters POST BODY: { "metadata":{ "name":"<name>", "description":"<description>", "userData1":"<user data>", "userData2":"<user data>" } } RETURN STATUS: 201 RETURN BODY: { "metadata":{ "name":"<name>", "description":"<description>", "userData1":"<user data>", "userData2":"<user data>" } }
GET, DELETE
GET URL: /v2/cluster-providers/{provider-name}/clusters/{cluster-name} RETURN STATUS: 200 RETURN BODY: { "metadata":{ "name":"<name>", "description":"<description>", "userData1":"<user data>", "userData2":"<user data>" } } DELETE URL: /v2/cluster-providers/{provider-name}/clusters/{cluster-name} RETURN STATUS: 204
Add Label to a cluster
POST
URL: /v2/cluster-providers/{provider-name}/clusters/{cluster-name}/labels POST BODY: { “label-name” : “<label>” } RETURN STATUS: 201 RETURN BODY: { “label-name” : “<label>” }
GET, DELETE
GET URL: /v2/cluster-providers/{provider-name}/clusters/{cluster-name}/labels/<label> RETURN STATUS: 200 RETURN BODY: { “label-name” : “<label>” } GET URL: /v2/cluster-providers/{provider-name}/clusters?label=<label> RETURN STATUS: 200 RETURN BODY: { [<list of clusters>] } DELETE URL: /v2/cluster-providers/{provider-name}/clusters/{cluster-name}/labels/<label> RETURN STATUS: 204
Add key-value pair to a cluster
Add property to a cluster without the need for change to the API.
POST
URL: /v2/cluster-providers/{provider-name}/clusters/{cluster-name}/kv-pairs POST BODY: { "metadata":{ "name":"<name>", "description":"<description>", "userData1":"<user data>", "userData2":"<user data>" }, "spec":{ "kv":[ { "key1":"val1" }, { "key2":"val2" } ] } } RETURN STATUS: 201 RETURN BODY: { "metadata":{ "name":"<name>", "description":"<description>", "userData1":"<user data>", "userData2":"<user data>" }, "spec":{ "kv":[ { "key1":"val1" }, { "key2":"val2" } ] } }
GET, DELETE
GET URL: /v2/cluster-providers/{provider-name}/clusters/{cluster-name}/kv-pairs/<name> RETURN STATUS: 200 RETURN BODY: { "metadata":{ "name":"<name>", "description":"<description>", "userData1":"<user data>", "userData2":"<user data>" }, "spec":{ "kv":[ { "key1":"val1" }, { "key2":"val2" } ] } } GET URL: /v2/cluster-providers/{provider-name}/clusters/{cluster-name}/kv-pairs/key/<key> RETURN STATUS: 200 RETURN BODY: { "value": "<value>" } DELETE URL: /v2/cluster-providers/{provider-name}/clusters/{cluster-name}/kv-pairs/<name> RETURN STATUS: 204
Orchestrator Controller Registration API
This API allows controllers to register themselves as gRPC servers consumed by the orchestrator.
IN-PROGRESS
POST
POST/PUT URL: /v2/controllers POST BODY: { "name": "HPA-Placement-Controller", "host": "10.7.100.4", "port": 8800 }
GET, DELETE
GET URL: /v2/controllers/{controller-name} RETURN STATUS: 200 RETURN BODY: { "name": "HPA-Placement-Controller", "host": "10.7.100.4", "port": 8800 } DELETE URL: /v2/controllers/{controller-name} RETURN STATUS: 204