Background
The DCM is one of the components of ONAP4K8s. It will run as a microservice exposing Rest APIs, external components will use REST to communicate with the DCM while other microservices will use gRPC. The DCM will perform the following functions;
...
- Main DCM Microservice (contains the service mesh controller Module(formally Logical Cloud Controller), User Controller Module and Namespace ControllerModule, Quota Controller Module(Limits resources available to each logical cloud))
- CA Key Distribution Controller ( Generate intermediate CA key for each edge which is signed by an root or intermediate key)
Design Overview
draw.io Diagram |
---|
border | true |
---|
viewerToolbar | true |
---|
| |
---|
fitWindow | false |
---|
diagramDisplayName | |
---|
lbox | true |
---|
revision | 917 |
---|
diagramName | DCM |
---|
simpleViewer | false |
---|
width | 1000 |
---|
links | auto |
---|
tbstyle | top |
---|
diagramWidth | 1131721 |
---|
|
Fig 1: DCM ComponentsSample
DCM
...
Sequence
- Client creates logical cloud using logical cloud creation API and the following documents are created in the DCM collection
- The core module parses the Json and creates a new document for the logical cloud in the mongodb DCM collection.
- The core module also creates a cluster document in the DCM collection
- The user module parses the Json and creates a new document for user
The namespace module parses the Json and creates a new document for namespace
- Associates logical cloud with clusters (this API is called multiple times)
- Updates the cluster document with the cluster name, loadbalancer ip every time its called
- Add quota for logical cloud
- The quota module creates a quota document containing the quota details
- Apply API is called
- Service mesh module gets CA bundle from CA controller via gRPC
- Service mesh module gets names of logical cloud and creates a new namespace name using name of logical cloud name
- Service mesh module creates helm template/istioctl manifest (WIP)
- Service mesh module creates service mesh document in the DCM collection and stores the above (CA bundle contents, istio namespace, istioctl manifest) in the document
- DCM informs the resource synchronizer to start the logical cloud creation via gRPC and the resource synchronizer starts reading from the DB
- The DCM gets status from the resource synchronizer via gRPC
- When the logical cloud creation is complete, the resource synchronizer will store the modified kubeconfig file for each cluster in the cluster document of the logical cloud
The details of the DCM Data Model can be found in DCM MongoDB Data Model
DCM Source Code Directory Structure
dcm
├── core
│ └── main.go
├── namespace-controller
│ └── namespace.go
├── quota-controller
│ └── quota.go
├── service-mesh-controller
│ └── service-mesh.go
└── user-controller
└── user.go
GO API
Code Block |
---|
|
func createNamespace(logicalCloudName Namespace string) error //Stores the namespace for the logical cloud in the database
func createUser(user logicalCloudName string permissions []map[string]map[string][]string) error //Stores the user details for the logical cloud in the database
func createKVpair(name description string userData map[string]string kvPair []map[string]string) error //Stores a new key value pair in the database
func addCluster(cluster logicalCloudName string) error //Associates a new cluster with the logical cloud
func addUserPermissions(user permissionName string apiGroups resources verbs []string) error
func applyConfig(logicalCloudName string) error //Talks to the Resource Synchronizer to start the actual creation of all the resources for the logical cloud
func getKVPair(name string) ([]map[string]string error)
func getClusterConfig(cluster logicalCloudName string) ([]byte, error) //Returns Kubeconfig for the cluster in JSON format
func getNamespace(logicalCloudName string) (string error)
func getUser(logicalCloudName string) (string error)
func getClusters(logicalCloudName string) ([]string error)
func getUserPermissions(user string) (([]map[string]map[string][]string) error) //Sample output [{"permission-1": {"apiGroups": ["stable.example.com"], "resources" : ["secrets", "pods"], "verbs" : ["get", "watch", "list", "create"] }},
{"permission-2": {"apiGroups": [""], "resources" : ["configmaps"], "verbs" : ["*"] }}]
|
Service Mesh API
Code Block |
---|
language | vb |
---|
title | Service Mesh API |
---|
|
func create_mesh () {
func get_lc_clusters() (map[string]string) //Returns a map containing a mapping of cluster names to load balancer ip address
func create_mesh_namespace(logical-cloud-name, []clusters)
func create_ca_secrets(logical-cloud-name){
func get_ca_certs(url)
}
func install_helm([] clusters) (or install istioctl)
func create_helm_chart() (or istioctl manifest)
}
|
REST API
API to Create Logical Cloud Name and Associate some components
Create Logical cloud name for new logical cloud, add user name, namespace and user permissions
Code Block |
---|
language | js |
---|
title | Logical Cloud Creation API |
---|
|
URL: /v2/projects/<project-name>/logical-clouds
POST BODY:
{
"metadata" : {
"name": "lc-1", //unique name for the record
"description": "logical cloud for walmart finance department", //description for the logical cloud
"userData1":"<user data>",
"userData2":"<user data>"
},
"spec" : {
"namespace" : "ns-1", // one namespace per logical cloud
"user" : {
"user-name" : "user-1", //name of user for this cloud (username and logical cloud name would be used as subject for the user key)
"type" : "certificate", //type of authentication credentials used by user (certificate, Token, UNPW)
"user-permissions" : [
{ "permission-name" : "permission-1",
"apiGroups" : ["stable.example.com"],
"resources" : ["secrets", "pods"],
"verbs" : ["get", "watch", "list", "create"]
},
{ "permission-name" : "permission-2",
"apiGroups" : [""],
"resources" : ["configmaps"],
"verbs" : ["*"]
}
]
}
}
}
Return Status: 201
Return Body:
{
"name" : "logical-cloud-1",
"logical-cloud-name" : "logical-cloud-1",
"namespace" : "ns-1",
"user-name" : "user-1"
} |
PUT (Change logical cloud contents)
Code Block |
---|
language | js |
---|
title | PUT Logical Cloud |
---|
|
URL: /v2/projects/<project-name>/logical-clouds/<logical-cloud-name>
PUT BODY:
{
"metadata" : {
"name": "lc-1",
"description": "logical cloud for walmart finance department", //description for the logical cloud
"userData1":"<user data>",
"userData2":"<user data>"
},
"spec" : {
"namespace" : "ns-1", // one namespace per logical cloud
"user" : {
"user-name" : "user-1", //name of user for this cloud (username and logical cloud name would be used as subject for the user key)
"type" : "certificate", //type of authentication credentials used by user (certificate, Token, UNPW)
"user-permissions" : [
{ "permission-name" : "permission-1",
"apiGroups" : ["stable.example.com"],
"resources" : ["secrets", "pods"],
"verbs" : ["get", "watch", "list", "create"]
},
{ "permission-name" : "permission-2",
"apiGroups" : [""],
"resources" : ["configmaps"],
"verbs" : ["*"]
}
]
}
}
}
Return Status: 200 (OK)
Return Body:
{
"name" : "logical-cloud-1",
"logical-cloud-name" : "logical-cloud-1",
"namespace" : "ns-1",
"user" : "user-1"
}
|
GET Logical Cloud
Code Block |
---|
language | js |
---|
title | GET Logical Cloud |
---|
|
GET
URL: /v2/projects/<project-name>/logical-clouds/<logical-cloud-name>
RESPONSE BODY:
{
"metadata" : {
"name": "lc-1", //unique name for the record
"description": "logical cloud for walmart finance department", //description for the logical cloud
"userData1":"<user data>",
"userData2":"<user data>"
},
"spec" : {
"namespace" : "ns-1", // one namespace per logical cloud
"user" : {
"user-name" : "user-1", //name of user for this cloud (username and logical cloud name would be used as subject for the user key)
"type" : "certificate", //type of authentication credentials used by user (certificate, Token, UNPW)
"user-permissions" : [
{ "permission-name" : "permission-1",
"apiGroups" : ["stable.example.com"],
"resources" : ["secrets", "pods"],
"verbs" : ["get", "watch", "list", "create"]
},
{ "permission-name" : "permission-2",
"apiGroups" : [""],
"resources" : ["configmaps"],
"verbs" : ["*"]
}
],
"clusters" : ["cluster-1", "cluster-2", "cluster-3]
}
}
}
|
DELETE Logical Cloud
Code Block |
---|
language | js |
---|
title | DELETE Logical Cloud |
---|
|
DELETE
URL: /v2/projects/<project-name>/logical-clouds/<logical-cloud-name>
|
Logical Cloud Cluster API
POST (Associate cluster with logical cloud )
Code Block |
---|
language | js |
---|
title | Associate logical cloud with cluster |
---|
|
URL: /v2/projects/<project-name>/logical-clouds/<logical-cloud-name>/cluster-references/
POST BODY:
{
"metadata" : {
"name": "lc-cl-1",
"description": "desc",
"userData1":"<user data>",
"userData2":"<user data>"
},
"spec" : {
"cluster-provider": "cp-1",
"cluster-name": "c1", //name of the cluster,
"loadbalancer-ip" : "0.0.0.0" //IP address of the istio loadbalancer for the logical cloud control plane in the cluster
}
}
}
Return Status: 200 (OK)
Return Body:
{
"cluster-name" : "cluster-1"
"loadbalancer-ip" : "0.0.0.0"
}
|
PUT
Code Block |
---|
language | js |
---|
title | Update cluster in logical cloud |
---|
|
...
Image Removed
Fig 2: Showing Logical Clouds spanning multiple edge location. Istio Replicated Control planes are used and in each cluster, there is an istio control plane per logical cloud
DCM Source Code Directory Structure
dcm
├── core
│ └── main.go
├── namespace-controller
│ └── namespace.go
├── quota-controller
│ └── quota.go
├── service-mesh-controller
│ └── service-mesh.go
└── user-controller
└── user.go
API
1. Create Logical Cloud
Code Block |
---|
language | js |
---|
title | Logical Cloud Creation API |
---|
|
URL: /v2/projects/<project-name>/logical-clouds
POST BODY:
{
"name": "lc-1", //unique name for the record
"logical-cloud-name" : "logical-cloud-1",
"namespace" : "ns-1", // one namespace per logical cloud
"description": "logical cloud for walmart finance department", //description for the logical cloud
"user" : {
"user/<logical-cloud-name>/cluster-references/cluster-name
PUT BODY:
{
"loadbalancer-ip" : "0.0.0.0" //IP address of the istio loadbalancer for the logical cloud control plane in the cluster
}
Return Status: 200 (OK)
Return Body:
{
"cluster-name" : "usercluster-1",
//name of user for this cloud (username and logical cloud name would be used as subject for the user key)
"type"loadbalancer-ip" : "0.0.0.0"
} |
GET
Code Block |
---|
language | js |
---|
title | Get Clusters Associated with logical clouds |
---|
|
GET
URL: /v2/projects/<project-name>/logical-clouds/<logical-cloud-name>/cluster-references/
RESPONSE BODY:
{ cluster-references : [
{ "cluster-name" : "certificatec1", //type of authentication credentials used by user (certificate, Token, UNPW)
"userloadbalancer-permissionsip" : ["0.0.0.0
},
{ "permissioncluster-name" : "permission-1c2",
"loadbalancer-ip" : "x.x.x.x
}
]
}
|
DELETE (Delete cluster from Logical cloud)
Code Block |
---|
language | js |
---|
title | Delete Cluster from logical cloud |
---|
|
DELETE
URL: /v2/projects/<project-name>/logical-clouds/<logical-cloud-name>/cluster-references/<cluster-name>
RESPONSE STATUS: 204
}
|
Logical Cloud User Permissions API
Add user permissions
Code Block |
---|
language | js |
---|
title | Add User permissions |
---|
|
URL: /v2/projects/<project-name>/logical-clouds/<logical-cloud-name>/user-permissions
POST BODY: "apiGroups" : ["stable.example.com"],
"resources" : ["secrets", "pods"],
"verbs" : ["get", "watch", "list", "create"]
},
{ "permission-name" : "permission-23",
"apiGroups" : [""],
"resources" : ["configmapsjobs"],
,
"verbs" : ["*list"]
}
]
}
}
Return Status: 201200 (OK)
Return Body:
{
"name" : "logicalpermission-cloud-13",
"logical-cloud-nameapiGroups" : ["logical-cloud-1"],
"namespaceresources" : ["ns-1jobs"],
"user-nameverbs" : ["user-1list"
} |
Kubeconfig will be generated for the logical cloud
GET User Permissions2. Get Logical Cloud kubeconfig
Code Block |
---|
language | js |
---|
title | Get Logical cloud kubeconfigUser permissions |
---|
|
URL: /v2/projects/<project-name>/logical-clouds/<logical-cloud-name>/kubeconfig?cluster-reference=cluster-1
GET
Return Status: 201user-permissions
GET:
Return Body :
{
{"apiVersionpermissions": "v1",
"clusters": [
{
"name" : "permission-1",
"clusterapiGroups" : {
["stable.example.com"],
"resources" : "certificate-authority-data": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJd01ERXhOakl5TlRReU1sb1hEVE13TURFeE16SXlOVFF5TWxvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTXZ5ClpSMmtHZ201OHJtRUYxZ0VVNDlwR281TjR5WlZzbUtsemJxeitHcmp3MWY4ZHBaa01JN1RYbm1xaXdjbmpiZksKdlZDYmFKblBwRm9Wc0gyMTFMRVYxa1pqQ2RZakgrQnA4VUNadFpOZnJha1o1TU91RW40MXlpbDRxVTFxRnBYcgpvMnAvTTJNSTc0bzdYSis5V2VUNmZ1MFJ0RjRjK1p6K3IzbWY3YWFnem9weEo1TzcyN010WkN5bzJHaWNJdzgyCk1uSmUrbHBnNDdEdTNwK0JzOVZ4cENNVjhUTFBDWWFxVUZHZWZ1U25zTHpCOWFHUGJaMi9kWlMrQll6VGJ1dWIKZ0pzbmxKd1o2Z1orVkJKWGtxcFN4ZmJTWFE3V2VLR1BkMkptYk04THFtd2UxcEtIMnNnVEs0cnBuM3dKdzk1Uwp5c01LZWp5aS9TcmZWci9ZdmRNQ0F3RUFBYU1qTUNFd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFIRkJ3VUJrRE56MDV3cGlVVkhaeld3Z0JWWTgKTFRIV2RZYUliaTZzeCthTUhIOFF3cERhSUIvME9KUlZmc01XNXd2eldTWE05d28zR2ltMlYxNnBsN0E3ZXRkLwo3OWZiT0FaTTh0bUFHMVlraFlJbjc0NzRvaE5GZjhLdjFqY3ZIUStIREZZRTRHdTBXUXhBQU9sRmh2SUNKc1VDCmRrN25mREpMRTIwa1E0M1ZIMnc3Ukg3clFVcUVNVnhVU2VTTWdid0xEQms5bWFQNm83RjdsT0ZqQnJibmhaVlgKNDA3U3Z2aTFRM0x6eCtubklhY3RidkZaUGFDRlpPMlkvS0dpcFpYM3o0R3hiR0sxM3VweExuSllHZEI4eFBrRApmK3FISFYvMHVVV2Yzb2JpSUNTT09qUjF5VnB3eXdIVFcrTHhyM1BZcXQ5b0NTRXErYitPUDE2SVV5az0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo="["secrets", "pods"],
"verbs" : "server": "https://1.2.3.4:6443"
["get", "watch", "list", "create"]
},
{ "name" : "kubernetes"
}permission-2",
],
"contextsapiGroups" : [""],
{
"resources" : ["configmaps"],
"contextverbs" : {["*"]
},
{ "clustername" : "clusterpermission-13",
"userapiGroups" : ["user-1"],
"resources" }: ["jobs"],
"nameverbs" : ["user-1-contextlist"]
}
],
"current-context": "user-1-context",
"kind": "Config",
"users": [
}
|
PUT (Update User permissions)
Code Block |
---|
language | js |
---|
title | Update User permissions |
---|
|
URL: /v2/projects/<project-name>/logical-clouds/<logical-cloud-name>/user-permissions/permission-3
POST BODY:
{
"apiGroups" : [""],
"name""resources" : ["user-1pvc"],
"verbs" "user": {: ["list"]
}
Return Status: 200 (OK)
Return Body:
{ "name" : "permission-3",
"client-certificate-dataapiGroups" : ["LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM4akNDQWRxZ0F3SUJBZ0lJZVovY05tQVE5NGd3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TURBeE1UWXlNalUwTWpKYUZ3MHlNVEF4TVRVeU1qVTBNamhhTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQW0zblA0eTdURjNrZldaZFoKaFdaV2RTSWZlNlpkbTdWK1BpcER6UWFHMTVuU0ZNSVRSeFVyYkhHdWlzakZQRlAzbUIyT09yN3BSQjJab3VDegppOFlYS21iYjJ6K2tjeWZxT1drcHhmTzlHQlV6SlYxL1BoUGU2dGRaSEp3c3FtNlhYZ2xkcTEvNjBSTWNwUVUxCi9LOXNZNHhWQ1djSkN4SEkvTnp4VDY0TU5zQlF3VldONXZWTTJOUDJtZDFOa2x2S3J2bnFRUERXTGxVWEx2THIKK2NESk50VytxcFc4dzVreXF5YWp1ZHQ4ZGw0dzZSY3FnL3VnbXRVMHRnVEdxcFdSYm5yZlFMSzBsaGJKejVMTgpmK1pNTjRCYllxWGRBZ2hFMTNEeHhYd2tHUHdnL3h0aFhManBaQzhjeTNlV0hCenV2cWY1aWJ2S0hRQ20zRmFjCjhBTlVpUUlEQVFBQm95Y3dKVEFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFDV3BuY1RhTWowOWZDL25CQTF1NWhkbFQrQmdhc3NZSFVEeQplM2tQUXJlUXdseUhYTGtWdDdiSkIxT0l6Y1V3K2M5MVF6Mm9lRFBaNzZGNGlQMTd5RUgrUFZrMVVUSzBLRU9jCjM2cVpXTUdMK0ptZy9wTnFBNXRsNG1EUTVneFhHTENpa2JiYzRTM0oxL0FicmFVakRtM1FEOTd6UEhSUkZnN2oKN2VXMnB2V3ZEakRTWDZGejY0dEorRHB2NUpGZGRHNU5lQVErZ0hNOWFPVUdCVG1oZlYzZnl1NzkzV0cyUGlxMgpMMlZQU0YycU5DRG96Y3Z3am84VHkxbUpXSzIvTkVjN2ZMd24wbml3UTd3aXpMWHU0N1hvL3Frb2pBMUN6MW9YCkhid1JQMjZXdVNDTGpnNnpHVUh3VnBZWmV4Z3pkY05CRERQTnlPem94RTFwUVlXRXkrZz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo="],
"client-key-data "resources" : ["LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBbTNuUDR5N1RGM2tmV1pkWmhXWldkU0lmZTZaZG03VitQaXBEelFhRzE1blNGTUlUClJ4VXJiSEd1aXNqRlBGUDNtQjJPT3I3cFJCMlpvdUN6aThZWEttYmIyeitrY3lmcU9Xa3B4Zk85R0JVekpWMS8KUGhQZTZ0ZFpISndzcW02WFhnbGRxMS82MFJNY3BRVTEvSzlzWTR4VkNXY0pDeEhJL056eFQ2NE1Oc0JRd1ZXTgo1dlZNMk5QMm1kMU5rbHZLcnZucVFQRFdMbFVYTHZMcitjREpOdFcrcXBXOHc1a3lxeWFqdWR0OGRsNHc2UmNxCmcvdWdtdFUwdGdUR3FwV1JibnJmUUxLMGxoYkp6NUxOZitaTU40QmJZcVhkQWdoRTEzRHh4WHdrR1B3Zy94dGgKWExqcFpDOGN5M2VXSEJ6dXZxZjVpYnZLSFFDbTNGYWM4QU5VaVFJREFRQUJBb0lCQURSeCs3RTd5MU1ndFhXSQpPMWRuZFFTZ0ZSU2x3dS9TWWhwZ01XeklwZFcyZW9vc0NVcXlGbXJIVWtSWWcwZmRYeWk5MTR0emVNWlVZYzN5CmxENHkvUDk5b080dFlyREJweDNrbm9XNnVXK1ZQeUo4am42SFAydmlacG5qQ0tJWkdoQkxnb0JicVFTN3VLN2wKdWhkWnFXdFBIQ1JHMEdNZWhiamVZcndwRHMrc3V5Y0tUNlh2OGR0am9PRGlSenpodTBBWjErSDBMbC9MaUp5NgpubUF1M3IzUDN2dGt1ZndoOXB2SjA2TjhHVWhRZFlvVENBMHQ4c0lEN0Q0ZUZGcXdjM2FVTmlyVGdtcllmcVFkCnJQMnRUMkYxbEE5bEJ1bUJmNDBCUFMrejR0MS92Tk5XSEtseFFzaDRkTnNJczlFbHB1YkVTMlovbmJkUHpEOXUKUHlmWmNCMENnWUVBemZEZ21TVVZ2REpJMEZWWnNENWszNWxRWFpmQ3ZLZWpaaU5ScTZzaDlROUhBcTdaN3dESwo3RmNHSGZFQVhNZ1YyQ2VibUtkbFZ4aFJMQUVQb0todzNCbG94RlhiNC9ESytYdmV0ek4vUnQzQ0VGN29jZTFECko0eXVTS0pYR25RVW82NXV6RVBJMmVVdi81Njh5dEdDdXlNRmdIZDNTRHBxeUZqSjhlVXp3RGNDZ1lFQXdVU2kKVVpkMTEzVnFWeEpUQytSeTlsRzNIeGZFekhBbUdkMXNQNFdmYm9nZ3hjbmZrZk9ndU1ua0dzVVNnNGZjN3BKNworVDd2dFg2QVRXQkUzeUV1SHdMcytJd2VQT2RFeDNBZytSYnBKU25pTEc2WmUxdER0K2NtdTdObGZGRWRuR0l2CkUvTkt1c3FLdmduN3FzK216OHR5UmwxZ0pYMGdjT3J1TFVnbnNUOENnWUVBaGlUdUY3TnBXZ0lqSGRsS3A1dXMKMTEwbFZTR2lqb0pmMUFzVGlzL1pPYWh1NTlkL1M4aG5aZFUxdmRFYkhGU1VyZ3oydEZQdGxmTFlCT0xZREIxTQpEb0phbFBFY1gzaWNyaSs2bmZqa1lnUFhBaFRnTWoyTExicmNWNkd2UFNMNXdyaS9vVHhTRzJUSGhDa2c3cmZVCkFSUEo1S2xzd0ZhVThkV3NEVzN2N0xjQ2dZQlhlZGc2TStLcmpjSisvSlZJR2JPTEY3dFp3R2xiMnhyenRBdk4KeUk0NytqTlRNcWNWcVg3Q2hPYlEwd2dwTG5KcUxUVWR3RVhCRVN2RFdlSnlWOU5IU0F5NEJydWM5MVJqTExaUAo1L1hJMDJkQ2t5QzIrN3p2M1JqajlqUG1DOVRxTm1wMmpqVHh6TUQxZVJGRzQ4dnQyM2l5cm9yWkRRU0U5MkNzCmNDOC9Bd0tCZ1FDamRrVTNOcWFPZHUzMlpkWm5IK0cxY0NwbGtRK1VFZXNmTlcrWjdiWWtocng2Z2l6eCtjY0UKS3FhNTRxTmJkQVdLQXRzSU5lZ3pQU0toV0g0eXFnaWYrNmQ1aVVZUlFoUUhNVG0yTHpEQ2xGQ001N2FPdmQ3YQpNUEZxR3BNV2tqVmlnZjlwdHV3YW1qWkYwbm5MUVE5dWIzMlB3Zjk0Yzl4NFBEdkpmdTQrUHc9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=pvc"],
"verbs" : ["list"]
}
}
}
]
}
|
Delete User Permissions
Code Block |
---|
language | js |
---|
title | Delete User permissions |
---|
|
DELETE
URL: /v2/projects/<project-name>/logical-clouds/<logical-cloud-name>/user-permissions/<permission-name>
RETURN STATUS: 204
|
Logical Cloud Quota API
Create logical cloud Quota ( quota will be applied to each cluster in the logical cloud)
This allows resources to be tuned for the logical cloud3. PUT (Change logical cloud contents)
Code Block |
---|
language | js |
---|
title | PUT Create Logical Cloudcloud quota |
---|
|
URL: /v2/projects/<project-name>/logical-clouds/<name>
PUT/<logical-cloud-name>/cluster-quotas
POST BODY:
{
"logical-cloud- "metadata" : {
"name" : "logicalquota-cloud-1",
"namespacedescription" : "ns-1", // one namespace per logical cloud
"description": "logical cloud for walmart finance department", //description for the logical cloud
"user" : {desc"
},
"spec" : {
"limits.cpu": "400",
"limits.memory": "1000Gi",
"user-name" "requests.cpu": "user-1300",
//name of user for this cloud
"requests.memory": "900Gi",
"typerequests.storage" : "certificate500Gi",
//type of authentication credentials used by user (certificate, Token, UNPW)
"requests.ephemeral-storage": "",
"userlimits.ephemeral-permissionsstorage" : ["",
{ "permission-name"persistentvolumeclaims" : "permission-1 ",
"apiGroupspods" : ["stable.example.com500"],
"resourcesconfigmaps" : ["secrets", "pods"],
"verbsreplicationcontrollers" : ["get",
"watchresourcequotas", "list",: "create"],
}"services": "",
{ "permission-name"services.loadbalancers" : "permission-2",
"apiGroups"services.nodeports" : [""],
"resourcessecrets" : ["configmaps"],
"verbs"count/replicationcontrollers" : ["*"],
"count/deployments.apps" : }"",
]
}
}
Return Status: 200 (OK)
Return Body:
{
"name "count/replicasets.apps" : "",
"count/statefulsets.apps" : "logical-cloud-1",
"logical-cloud-name "count/jobs.batch" : "logical-cloud-1",
"namespace "count/cronjobs.batch" : "ns-1",
"usercount/deployments.extensions" : "user-1""
}
}
RETURN STATUS: 201 |
GET logical cloud Quota4. POST (Associate cluster with logical cloud )
Code Block |
---|
language | js |
---|
title | Associate logical cloud with cluster | Get Logical cloud quota |
---|
|
GET
URL: /v2/projects/<project-name>/logical-clouds/<logical-cloud-name>/cluster-referencesquotas/<quota-name>
POSTRETURN BODY:
{
"namemetadata" : "cluster-reference-1", //cluster reference record
"description{
"name" : "edge a cluster", //cluster description
"cluster-name" : "cluster-1" //Name of the cluster
}
Return Status: 200 (OK)
Return Body:
{
"name" : "cluster-reference-1",
"cluster-name" : "cluster-1"
}
"quota-1",
"description": "desc"
},
"spec" : {
"cpu": "400",
"memory": "1000Gi",
"pods": "500"
}
}
|
Update Logical Cloud Quota5. GET Logical Cloud
Code Block |
---|
language | js |
---|
title | GET Update Logical Cloudcloud quota |
---|
|
GET
URL: /v2/projects/<project-name>/logical-clouds/<name>
RESPONSE<logical-cloud-name>/cluster-quotas/<quota-name>
PUT BODY:
{
"metadata" : {
"description": "desc"
},
"spec" : {
"cpu": "400",
"memory": "1000Gi",
"pods": "500"
}
}
RETURN STATUS: 201 |
Delete Logical Cloud Quota
Code Block |
---|
language | js |
---|
title | Update Logical cloud quota |
---|
|
DELETE
URL: /v2/projects/<project-name>/logical-clouds/<logical-cloud-name>/cluster-quotas/<quota-name>
RETURN STATUS: 204 |
Logical Cloud Key Value API
16. Add Key Value pair to logical cloud database
Code Block |
---|
language | js |
---|
title | Add KV pair |
---|
|
URL: /v2/projects/<project-name>/logical-clouds/<logical-cloud-name>/kv-pairs
POST BODY
{
"metadata":{"logical-cloud-name" : "logical-cloud-1",
"namespace" : "ns-1", // one namespace per logical cloud
"description": "logical cloud for walmart finance department", //description for the logical cloud
"user" : {
"user-name" : "user-1", //name of user for this cloud
"type" : "certificate", //type of authentication credentials used by user (certificate, Token, UNPW)
"user-permissions" : [
{ "permission-name" : "permission-1<name>",
"description":"<description>",
"apiGroupsuserData1" :"<user ["stable.example.com"]data>",
"userData2":"<user data>"
},
"resourcesspec" : ["secrets", "pods"],:{
"kv":[
"verbs"{
: ["get", "watch", "list", "create"]
},"key1":"val1"
{ "permission-name" : "permission-2" },
{
"apiGroups" : [""],
"resourceskey2" : ["configmapsval2"],
"verbs" : ["*"]
}
]
}
}
RETURN STATUS: ]201
RETURN BODY:
{
"clustersmetadata" : ["cluster-1", "cluster-2", "cluster-3]
}
}
|
6. DELETE Logical Cloud
Code Block |
---|
language | js |
---|
title | DELETE Logical Cloud |
---|
|
DELETE
URL: /v2/projects/<project-name>/logical-clouds/<name>
RESPONSE STATUS: 204
|
7. Add user permissions
Code Block |
---|
language | js |
---|
title | Add User permissions |
---|
|
URL: /v2/projects/<project-name>/logical-clouds/<logical-cloud-name>/user-permissions
POST BODY:
:{
"name":"<name>",
"description":"<description>",
"userData1":"<user data>",
"userData2":"<user data>"
},
"spec":{
"kv":[
{{
"namekey1" : "permission-3val1",
"apiGroups" : [""]},
"resources" : ["jobs"],
"verbs" : ["list"]
}
{
Return Status: 200 (OK)
Return Body:
{ "namekey2" : "permission-3val2",
"apiGroups" : [""],
"resources" : ["jobs"],
"verbs" : ["list"]
}
|
...
17. PUT (Update kv pair)
Code Block |
---|
language | js |
---|
title | Get User permissionsUpdate KV pair |
---|
|
URL: /v2/projects/<project-name>/logical-clouds/<logical-cloud-name>/user-permissions
GET:
Return Body:/kv-pairs/<kv-pair-name>
PUT BODY
{
"metadata":{
"description":"<description>",
"userData1":"<user data>",
"userData2":"<user data>"
},
"spec":{
{"permissionskv" : [
{
"name" : "permission-1",
"apiGroupskey1" : ["stable.example.com"],
"val3"
},
"resources" : ["secrets", "pods"],
{
"verbs" : ["getkey2", :"watchval4",
"list", "create"]
},
]
{ "name" : "permission-2", }
}
RETURN STATUS: 201
RETURN BODY:
{
"metadata":{
"apiGroupsdescription" : ["<description>"],
"userData1":"<user data>",
"resourcesuserData2" :"<user ["configmaps"]data>"
},
"spec":{
"verbskv" : ["*"]
}, {
{ "namekey1" : "permission-3val3",
"apiGroups" : [""]},
"resources" : ["jobs"],
{
"verbskey2" : ["listval4"]
}
]
}
} |
...
18. GET KV pair
Code Block |
---|
language | js |
---|
title | Update User permissionsGet KV pair |
---|
|
URL: /v2/projects/<project-name>/logical-clouds/<logical-cloud-name>/userkv-permissionspairs/permission-3
POST BODY:<kv-pair-name>
RETURN STATUS: 200
RETURN BODY:
{
"metadata":{
"name":"<name>",
"description":"<description>",
"userData1":"<user
{
data>",
"apiGroupsuserData2" :"<user [""]data>"
},
"resources" : ["pvc"],
"verbs" : ["list"]
}
spec":{
"kv":[
{
"key1":"val1"
},
Return Status: 200 (OK)
Return Body:
{ "name" : "permission-3",
"apiGroups" : [""],
"resources" : ["pvc"],
"verbs" : ["list"]
}
|
10. Delete Permissions
Code Block |
---|
language | js |
---|
title | Delete User permissions |
---|
|
DELETE
URL: /v2/projects/<project-name>/logical-clouds/<logical-cloud-name>/user-permissions/<permission-name>
RETURN STATUS: 204
|
11. Create logical cloud Quota
...
19. DELETE KV pair
Code Block |
---|
language | js |
---|
title | Create Logical cloud quotaDelete KV pair |
---|
|
URL: /v2/projects/<project-name>/logical-clouds/<logical-cloud-name>/quotas
POST BODY:
{
"cpu": "400",
"memory": "1000Gi",
"pods": "500"
}
RETURN STATUS: 201kv-pairs/<kv-pair-name>
RETURN STATUS: 204
|
Kubeconfig API (WORK IN PROGRESS)
Important points to Note
- cluster CA and cluster CRT will be gotten when a cluster is registered and this will be used to create the user crt after the user csr and user key are created
Kubeconfig will be put in the mongoDB
2. Get Logical Cloud kubeconfig12. GET logical cloud Quota
Code Block |
---|
language | js |
---|
title | Get Logical cloud quotakubeconfig |
---|
|
GET
URL: /v2/projects/<project-name>/logical-clouds/<logical-cloud-name>/quotas
RETURN BODY:
kubeconfig?cluster-reference=cluster-1
GET
Return Status: 201
Return Body :
{
"cpuapiVersion": "400v1",
"memoryclusters": [
{
"cluster": {
"certificate-authority-data": "1000Gi",
"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJd01ERXhOakl5TlRReU1sb1hEVE13TURFeE16SXlOVFF5TWxvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTXZ5ClpSMmtHZ201OHJtRUYxZ0VVNDlwR281TjR5WlZzbUtsemJxeitHcmp3MWY4ZHBaa01JN1RYbm1xaXdjbmpiZksKdlZDYmFKblBwRm9Wc0gyMTFMRVYxa1pqQ2RZakgrQnA4VUNadFpOZnJha1o1TU91RW40MXlpbDRxVTFxRnBYcgpvMnAvTTJNSTc0bzdYSis5V2VUNmZ1MFJ0RjRjK1p6K3IzbWY3YWFnem9weEo1TzcyN010WkN5bzJHaWNJdzgyCk1uSmUrbHBnNDdEdTNwK0JzOVZ4cENNVjhUTFBDWWFxVUZHZWZ1U25zTHpCOWFHUGJaMi9kWlMrQll6VGJ1dWIKZ0pzbmxKd1o2Z1orVkJKWGtxcFN4ZmJTWFE3V2VLR1BkMkptYk04THFtd2UxcEtIMnNnVEs0cnBuM3dKdzk1Uwp5c01LZWp5aS9TcmZWci9ZdmRNQ0F3RUFBYU1qTUNFd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFIRkJ3VUJrRE56MDV3cGlVVkhaeld3Z0JWWTgKTFRIV2RZYUliaTZzeCthTUhIOFF3cERhSUIvME9KUlZmc01XNXd2eldTWE05d28zR2ltMlYxNnBsN0E3ZXRkLwo3OWZiT0FaTTh0bUFHMVlraFlJbjc0NzRvaE5GZjhLdjFqY3ZIUStIREZZRTRHdTBXUXhBQU9sRmh2SUNKc1VDCmRrN25mREpMRTIwa1E0M1ZIMnc3Ukg3clFVcUVNVnhVU2VTTWdid0xEQms5bWFQNm83RjdsT0ZqQnJibmhaVlgKNDA3U3Z2aTFRM0x6eCtubklhY3RidkZaUGFDRlpPMlkvS0dpcFpYM3o0R3hiR0sxM3VweExuSllHZEI4eFBrRApmK3FISFYvMHVVV2Yzb2JpSUNTT09qUjF5VnB3eXdIVFcrTHhyM1BZcXQ5b0NTRXErYitPUDE2SVV5az0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=",
"pods": "500"
}
|
13. Update Logical Cloud Quota
Code Block |
---|
language | js |
---|
title | Update Logical cloud quota |
---|
|
URL: /v2/projects/<project-name>/logical-clouds/<logical-cloud-name>/quotas
PUT BODY:
{
"cpu": "400",
"memory": "1000Gi""server": "https://1.2.3.4:6443"
},
"pods": "500"
}
RETURN STATUS: 201 |
14. POST (Apply all the created configuration, this creates the K8s resources)
Code Block |
---|
language | js |
---|
title | Apply configuration |
---|
|
URL: /v2/projects/<project-name>/logical-clouds/<logical-cloud-name>/apply
Return Status: 200 (OK)
Return Body:
{
"logical-cloud-name" : "logical-cloud-1",
"namespace" : "ns-1", // one namespace per logical cloud
"description": "logical cloud for walmart finance department", //description for the logical cloud
"user" "name": "kubernetes"
}
],
"contexts": [
{
"context": {
"cluster": "cluster-1",
"user": "user-1",
}
|
15. GET (Check status of operation)
Code Block |
---|
language | js |
---|
title | Get Operation status |
---|
|
URL: /v2/projects/<project-name>/logical-clouds/<logical-cloud-name>
GET BODY:
GET
Return Status: 201
Return Body :
{
"name" : "logical-cloud-1"
"user" : "user-1",
"status": "Creation in Progress " //Created, Creation Failed
} |
16. Add Key Value pair to logical cloud database
Code Block |
---|
language | js |
---|
title | Add KV pair |
---|
|
URL: /v2/projects/<project-name>/logical-clouds/<logical-cloud-name>/kv-pairs
POST BODY
{
},
"name": "user-1-context"
}
],
"current-context": "user-1-context",
"kind": "Config",
"users": [
{
"name" : "<name>user-1",
"description" : "<description>",
"kvuser":[ {
{
"key1client-certificate-data" : "val1LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM4akNDQWRxZ0F3SUJBZ0lJZVovY05tQVE5NGd3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TURBeE1UWXlNalUwTWpKYUZ3MHlNVEF4TVRVeU1qVTBNamhhTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQW0zblA0eTdURjNrZldaZFoKaFdaV2RTSWZlNlpkbTdWK1BpcER6UWFHMTVuU0ZNSVRSeFVyYkhHdWlzakZQRlAzbUIyT09yN3BSQjJab3VDegppOFlYS21iYjJ6K2tjeWZxT1drcHhmTzlHQlV6SlYxL1BoUGU2dGRaSEp3c3FtNlhYZ2xkcTEvNjBSTWNwUVUxCi9LOXNZNHhWQ1djSkN4SEkvTnp4VDY0TU5zQlF3VldONXZWTTJOUDJtZDFOa2x2S3J2bnFRUERXTGxVWEx2THIKK2NESk50VytxcFc4dzVreXF5YWp1ZHQ4ZGw0dzZSY3FnL3VnbXRVMHRnVEdxcFdSYm5yZlFMSzBsaGJKejVMTgpmK1pNTjRCYllxWGRBZ2hFMTNEeHhYd2tHUHdnL3h0aFhManBaQzhjeTNlV0hCenV2cWY1aWJ2S0hRQ20zRmFjCjhBTlVpUUlEQVFBQm95Y3dKVEFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFDV3BuY1RhTWowOWZDL25CQTF1NWhkbFQrQmdhc3NZSFVEeQplM2tQUXJlUXdseUhYTGtWdDdiSkIxT0l6Y1V3K2M5MVF6Mm9lRFBaNzZGNGlQMTd5RUgrUFZrMVVUSzBLRU9jCjM2cVpXTUdMK0ptZy9wTnFBNXRsNG1EUTVneFhHTENpa2JiYzRTM0oxL0FicmFVakRtM1FEOTd6UEhSUkZnN2oKN2VXMnB2V3ZEakRTWDZGejY0dEorRHB2NUpGZGRHNU5lQVErZ0hNOWFPVUdCVG1oZlYzZnl1NzkzV0cyUGlxMgpMMlZQU0YycU5DRG96Y3Z3am84VHkxbUpXSzIvTkVjN2ZMd24wbml3UTd3aXpMWHU0N1hvL3Frb2pBMUN6MW9YCkhid1JQMjZXdVNDTGpnNnpHVUh3VnBZWmV4Z3pkY05CRERQTnlPem94RTFwUVlXRXkrZz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=",
"client-key-data" },: "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBbTNuUDR5N1RGM2tmV1pkWmhXWldkU0lmZTZaZG03VitQaXBEelFhRzE1blNGTUlUClJ4VXJiSEd1aXNqRlBGUDNtQjJPT3I3cFJCMlpvdUN6aThZWEttYmIyeitrY3lmcU9Xa3B4Zk85R0JVekpWMS8KUGhQZTZ0ZFpISndzcW02WFhnbGRxMS82MFJNY3BRVTEvSzlzWTR4VkNXY0pDeEhJL056eFQ2NE1Oc0JRd1ZXTgo1dlZNMk5QMm1kMU5rbHZLcnZucVFQRFdMbFVYTHZMcitjREpOdFcrcXBXOHc1a3lxeWFqdWR0OGRsNHc2UmNxCmcvdWdtdFUwdGdUR3FwV1JibnJmUUxLMGxoYkp6NUxOZitaTU40QmJZcVhkQWdoRTEzRHh4WHdrR1B3Zy94dGgKWExqcFpDOGN5M2VXSEJ6dXZxZjVpYnZLSFFDbTNGYWM4QU5VaVFJREFRQUJBb0lCQURSeCs3RTd5MU1ndFhXSQpPMWRuZFFTZ0ZSU2x3dS9TWWhwZ01XeklwZFcyZW9vc0NVcXlGbXJIVWtSWWcwZmRYeWk5MTR0emVNWlVZYzN5CmxENHkvUDk5b080dFlyREJweDNrbm9XNnVXK1ZQeUo4am42SFAydmlacG5qQ0tJWkdoQkxnb0JicVFTN3VLN2wKdWhkWnFXdFBIQ1JHMEdNZWhiamVZcndwRHMrc3V5Y0tUNlh2OGR0am9PRGlSenpodTBBWjErSDBMbC9MaUp5NgpubUF1M3IzUDN2dGt1ZndoOXB2SjA2TjhHVWhRZFlvVENBMHQ4c0lEN0Q0ZUZGcXdjM2FVTmlyVGdtcllmcVFkCnJQMnRUMkYxbEE5bEJ1bUJmNDBCUFMrejR0MS92Tk5XSEtseFFzaDRkTnNJczlFbHB1YkVTMlovbmJkUHpEOXUKUHlmWmNCMENnWUVBemZEZ21TVVZ2REpJMEZWWnNENWszNWxRWFpmQ3ZLZWpaaU5ScTZzaDlROUhBcTdaN3dESwo3RmNHSGZFQVhNZ1YyQ2VibUtkbFZ4aFJMQUVQb0todzNCbG94RlhiNC9ESytYdmV0ek4vUnQzQ0VGN29jZTFECko0eXVTS0pYR25RVW82NXV6RVBJMmVVdi81Njh5dEdDdXlNRmdIZDNTRHBxeUZqSjhlVXp3RGNDZ1lFQXdVU2kKVVpkMTEzVnFWeEpUQytSeTlsRzNIeGZFekhBbUdkMXNQNFdmYm9nZ3hjbmZrZk9ndU1ua0dzVVNnNGZjN3BKNworVDd2dFg2QVRXQkUzeUV1SHdMcytJd2VQT2RFeDNBZytSYnBKU25pTEc2WmUxdER0K2NtdTdObGZGRWRuR0l2CkUvTkt1c3FLdmduN3FzK216OHR5UmwxZ0pYMGdjT3J1TFVnbnNUOENnWUVBaGlUdUY3TnBXZ0lqSGRsS3A1dXMKMTEwbFZTR2lqb0pmMUFzVGlzL1pPYWh1NTlkL1M4aG5aZFUxdmRFYkhGU1VyZ3oydEZQdGxmTFlCT0xZREIxTQpEb0phbFBFY1gzaWNyaSs2bmZqa1lnUFhBaFRnTWoyTExicmNWNkd2UFNMNXdyaS9vVHhTRzJUSGhDa2c3cmZVCkFSUEo1S2xzd0ZhVThkV3NEVzN2N0xjQ2dZQlhlZGc2TStLcmpjSisvSlZJR2JPTEY3dFp3R2xiMnhyenRBdk4KeUk0NytqTlRNcWNWcVg3Q2hPYlEwd2dwTG5KcUxUVWR3RVhCRVN2RFdlSnlWOU5IU0F5NEJydWM5MVJqTExaUAo1L1hJMDJkQ2t5QzIrN3p2M1JqajlqUG1DOVRxTm1wMmpqVHh6TUQxZVJGRzQ4dnQyM2l5cm9yWkRRU0U5MkNzCmNDOC9Bd0tCZ1FDamRrVTNOcWFPZHUzMlpkWm5IK0cxY0NwbGtRK1VFZXNmTlcrWjdiWWtocng2Z2l6eCtjY0UKS3FhNTRxTmJkQVdLQXRzSU5lZ3pQU0toV0g0eXFnaWYrNmQ1aVVZUlFoUUhNVG0yTHpEQ2xGQ001N2FPdmQ3YQpNUEZxR3BNV2tqVmlnZjlwdHV3YW1qWkYwbm5MUVE5dWIzMlB3Zjk0Yzl4NFBEdkpmdTQrUHc9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo="
{
}
"key2":"val2"
}
]
}
RETURN STATUS: 201
RETURN BODY |
Apply API
When the API is called, the resource synchronizer is called and the resource creation in the cluster begins
Apply all the created configuration, this creates the K8s resources
Code Block |
---|
language | js |
---|
title | Apply configuration |
---|
|
URL: /v2/projects/<project-name>/logical-clouds/<logical-cloud-name>/apply
Return Status: 200 (OK)
Return Body:
{
"logical-cloud-name" : "<name>logical-cloud-1",
"descriptionnamespace" : "<description>ns-1",
// "kv":[
{
"key1":"val1"
},
{
"key2":"val2"
}
]
} |
...
one namespace per logical cloud
"description": "logical cloud for walmart finance department", //description for the logical cloud
"user" : "user-1",
"clusters" : ["cluster1", "cluster2", "cluster3"]
"quota-name" : "quota-1"
}
|
Status API
GET (Check status of operation)
Code Block |
---|
language | js |
---|
title | Update KV pair | Get Operation status |
---|
|
GET
URL: /v2/projects/<project-name>/logical-clouds/<logical-cloud-name>/kv-pairs/<name>
PUT BODYstatus
GET BODY:
Return Body :
{
"descriptionmetadata" : "<description>",{
"kvname" :[
{
"logical-cloud-1"
"key1description" : "val3<description>",
},
{
"key2clusters" :"val4"
} [
]
}
RETURN STATUS: 201
RETURN BODY:
"cluster-1" : {
"key1namespace-status" : "val10<status>"
} |
18. GET KV pair
Code Block |
---|
language | js |
---|
title | Get KV pair |
---|
|
URL: /v2/projects/<project-name>/logical-clouds/<logical-cloud-name>/kv-pairs/<name>
RETURN STATUS: 200
RETURN BODY:
{
,
"namerole-status" : "<name><status>",
"description "role-binding-status" : "<description><status>",
"kv":[
}
"cluster-2" : {
"key1namespace-status" : "val1<status>",
"role-status" : }"<status>",
{
"role-binding-status" : "<status>"
"key2control-plane-status" : "val2<status>"
}
]
} |
19. DELETE KV pair
Code Block |
---|
language | js |
---|
title | Delete KV pair |
---|
|
URL: /v2/projects/<project-name>/logical-clouds/<logical-cloud-name>/kv-pairs/<name>
RETURN STATUS: 204
,
"status": "Creation in Progress " //Created, Creation Failed
} |