Skip to content

Commit

Permalink
Changes to support orphan snapshot detection/deletion in CNS manager (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
vdkotkar authored Feb 13, 2024
1 parent cd2afa3 commit 006604e
Show file tree
Hide file tree
Showing 30 changed files with 2,469 additions and 419 deletions.
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ Example:
* Invoke `/registercluster` API on CNS manager by uploading the kubeconfig file. You may also modify other input parameters for the API based on your cluster configuration.
The API can also be invoked from command line. Here is an example:
```
curl -X 'POST' "http://CNS-MANAGER-ENDPOINT/1.0.0/registercluster?csiDriverSecretName=vsphere-config-secret&csiDriverSecretNamespace=vmware-system-csi" -H 'accept: application/json' -H 'Content-Type: multipart/form-data' -F 'clusterKubeConfigFile=@output_file_name' -u "Admistrator:Admin123@"
curl -X 'POST' "http://CNS-MANAGER-ENDPOINT/1.0.0/registercluster?csiDriverSecretName=vsphere-config-secret&csiDriverNamespace=vmware-system-csi" -H 'accept: application/json' -H 'Content-Type: multipart/form-data' -F 'clusterKubeConfigFile=@output_file_name' -u "Admistrator:Admin123@"
```
* Once the cluster is registered, you may delete this file from the machine.

Expand All @@ -66,3 +66,6 @@ This feature allows migrating volumes from one datastore to another. Read [here]

* **Orphan volumes detection & deletion**
This feature allows detecting/deleting orphan volumes that are not being used in any of the registered Kubernetes clusters on the vCenter. Read [here](docs/book/features/orphan_volumes.md) for more details about this feature.

* **Orphan snapshots detection & deletion**
This feature allows detecting/deleting orphan snapshots that are not being used in any of the registered Kubernetes clusters on the vCenter. Read [here](docs/book/features/orphan_snapshots.md) for more details about this feature.
149 changes: 75 additions & 74 deletions client-sdk/go/client/api_cluster_record_keeping.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
Expand All @@ -20,9 +20,8 @@ import (
"io/ioutil"
"net/http"
"net/url"
"os"
"strings"

"os"
"github.com/antihax/optional"
)

Expand All @@ -32,7 +31,6 @@ var (
)

type ClusterRecordKeepingApiService service

/*
ClusterRecordKeepingApiService Deregister a cluster with the CNS Manager.
The API takes unique clusterID as input and de-registers the cluster from CNS Manager.
Expand All @@ -42,10 +40,10 @@ The API takes unique clusterID as input and de-registers the cluster from CNS Ma
*/
func (a *ClusterRecordKeepingApiService) Deregistercluster(ctx context.Context, clusterId string) (DeregisterClusterResult, *http.Response, error) {
var (
localVarHttpMethod = strings.ToUpper("Post")
localVarPostBody interface{}
localVarFileName string
localVarFileBytes []byte
localVarHttpMethod = strings.ToUpper("Post")
localVarPostBody interface{}
localVarFileName string
localVarFileBytes []byte
localVarReturnValue DeregisterClusterResult
)

Expand Down Expand Up @@ -92,43 +90,42 @@ func (a *ClusterRecordKeepingApiService) Deregistercluster(ctx context.Context,

if localVarHttpResponse.StatusCode < 300 {
// If we succeed, return the data, otherwise pass on to decode error.
err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
if err == nil {
err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
if err == nil {
return localVarReturnValue, localVarHttpResponse, err
}
}

if localVarHttpResponse.StatusCode >= 300 {
newErr := GenericSwaggerError{
body: localVarBody,
body: localVarBody,
error: localVarHttpResponse.Status,
}
if localVarHttpResponse.StatusCode == 200 {
var v DeregisterClusterResult
err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
if err != nil {
newErr.error = err.Error()
err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
if err != nil {
newErr.error = err.Error()
return localVarReturnValue, localVarHttpResponse, newErr
}
newErr.model = v
return localVarReturnValue, localVarHttpResponse, newErr
}
newErr.model = v
return localVarReturnValue, localVarHttpResponse, newErr
}
if localVarHttpResponse.StatusCode == 0 {
var v ModelError
err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
if err != nil {
newErr.error = err.Error()
err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
if err != nil {
newErr.error = err.Error()
return localVarReturnValue, localVarHttpResponse, newErr
}
newErr.model = v
return localVarReturnValue, localVarHttpResponse, newErr
}
newErr.model = v
return localVarReturnValue, localVarHttpResponse, newErr
}
return localVarReturnValue, localVarHttpResponse, newErr
}

return localVarReturnValue, localVarHttpResponse, nil
}

/*
ClusterRecordKeepingApiService Get the list of registered k8s clusters from CNS manager inventory.
CNS manager does a record keeping of all the clusters in a vCenter. The registered cluster config is stored in the CNS manager inventory by using ClusterId as the key. The listregisteredclusters API will return the list of all the registered clusterIds as an array.
Expand All @@ -137,10 +134,10 @@ CNS manager does a record keeping of all the clusters in a vCenter. The register
*/
func (a *ClusterRecordKeepingApiService) Listregisteredclusters(ctx context.Context) ([]string, *http.Response, error) {
var (
localVarHttpMethod = strings.ToUpper("Get")
localVarPostBody interface{}
localVarFileName string
localVarFileBytes []byte
localVarHttpMethod = strings.ToUpper("Get")
localVarPostBody interface{}
localVarFileName string
localVarFileBytes []byte
localVarReturnValue []string
)

Expand Down Expand Up @@ -186,66 +183,67 @@ func (a *ClusterRecordKeepingApiService) Listregisteredclusters(ctx context.Cont

if localVarHttpResponse.StatusCode < 300 {
// If we succeed, return the data, otherwise pass on to decode error.
err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
if err == nil {
err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
if err == nil {
return localVarReturnValue, localVarHttpResponse, err
}
}

if localVarHttpResponse.StatusCode >= 300 {
newErr := GenericSwaggerError{
body: localVarBody,
body: localVarBody,
error: localVarHttpResponse.Status,
}
if localVarHttpResponse.StatusCode == 200 {
var v []string
err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
if err != nil {
newErr.error = err.Error()
err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
if err != nil {
newErr.error = err.Error()
return localVarReturnValue, localVarHttpResponse, newErr
}
newErr.model = v
return localVarReturnValue, localVarHttpResponse, newErr
}
newErr.model = v
return localVarReturnValue, localVarHttpResponse, newErr
}
if localVarHttpResponse.StatusCode == 0 {
var v ModelError
err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
if err != nil {
newErr.error = err.Error()
err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
if err != nil {
newErr.error = err.Error()
return localVarReturnValue, localVarHttpResponse, newErr
}
newErr.model = v
return localVarReturnValue, localVarHttpResponse, newErr
}
newErr.model = v
return localVarReturnValue, localVarHttpResponse, newErr
}
return localVarReturnValue, localVarHttpResponse, newErr
}

return localVarReturnValue, localVarHttpResponse, nil
}

/*
ClusterRecordKeepingApiService Register a cluster with the CNS Manager.
The API takes kubeconfig of a given cluster as an input. Make sure to copy the contents of the Cluster KubeConfig to a file. The kubeconfig is stored securely inside a k8s secret on the cluster where CNS manager is deployed. The API additionally takes optional params to read cluster-id set for CSI driver from the CSI secret.
ClusterRecordKeepingApiService Register a Kubernetes cluster with CNS Manager.
The API takes kubeconfig of a given cluster as an input. Make sure to copy the contents of the Cluster KubeConfig to a file. The kubeconfig is stored securely inside a k8s secret on the cluster where CNS manager is deployed. The API additionally takes optional params like CSI driver clusterId or CSI driver namespace and config secret name to read cluster-id from the CSI secret.
* @param ctx context.Context - for authentication, logging, cancellation, deadlines, tracing, etc. Passed from http.Request or context.Background().
* @param optional nil or *ClusterRecordKeepingApiRegisterclusterOpts - Optional Parameters:
* @param "ClusterKubeConfigFile" (optional.*os.File) - A file with cluster kubeconfig content.
* @param "ClusterKubeConfigFile" (optional.*os.File) -
* @param "CsiDriverSecretName" (optional.String) - (Optional) Refers to the name of the config secret of vsphere-csi-driver.
* @param "CsiDriverSecretNamespace" (optional.String) - (Optional) Refers to the namespace of the config secret of vsphere-csi-driver.
* @param "CsiDriverNamespace" (optional.String) - (Optional) Refers to the namespace of vsphere-csi-driver.
* @param "ClusterId" (optional.String) - (Optional) Cluster Id of the cluster to be registered with the CNS Manager. This cluster Id needs to be the same that&#x27;s used in the vSphere CSI driver config of the Kubernetes cluster. For vanilla Kubernetes distributions deployed using [VMware&#x27;s recommended way](https://docs.vmware.com/en/VMware-vSphere-Container-Storage-Plug-in/2.0/vmware-vsphere-csp-getting-started/GUID-BFF39F1D-F70A-4360-ABC9-85BDAFBE8864.html), it will be present in the CSI secret and will be auto-computed from the provided kubeConfig. For other Kubernetes distributions, please check their docs to determine how they&#x27;re configuring clusterId for the vSphere CSI driver in the Kubernetes cluster.
@return RegisterClusterResult
*/

type ClusterRecordKeepingApiRegisterclusterOpts struct {
ClusterKubeConfigFile optional.Interface
CsiDriverSecretName optional.String
CsiDriverSecretNamespace optional.String
ClusterKubeConfigFile optional.Interface
CsiDriverSecretName optional.String
CsiDriverNamespace optional.String
ClusterId optional.String
}

func (a *ClusterRecordKeepingApiService) Registercluster(ctx context.Context, localVarOptionals *ClusterRecordKeepingApiRegisterclusterOpts) (RegisterClusterResult, *http.Response, error) {
var (
localVarHttpMethod = strings.ToUpper("Post")
localVarPostBody interface{}
localVarFileName string
localVarFileBytes []byte
localVarHttpMethod = strings.ToUpper("Post")
localVarPostBody interface{}
localVarFileName string
localVarFileBytes []byte
localVarReturnValue RegisterClusterResult
)

Expand All @@ -259,8 +257,11 @@ func (a *ClusterRecordKeepingApiService) Registercluster(ctx context.Context, lo
if localVarOptionals != nil && localVarOptionals.CsiDriverSecretName.IsSet() {
localVarQueryParams.Add("csiDriverSecretName", parameterToString(localVarOptionals.CsiDriverSecretName.Value(), ""))
}
if localVarOptionals != nil && localVarOptionals.CsiDriverSecretNamespace.IsSet() {
localVarQueryParams.Add("csiDriverSecretNamespace", parameterToString(localVarOptionals.CsiDriverSecretNamespace.Value(), ""))
if localVarOptionals != nil && localVarOptionals.CsiDriverNamespace.IsSet() {
localVarQueryParams.Add("csiDriverNamespace", parameterToString(localVarOptionals.CsiDriverNamespace.Value(), ""))
}
if localVarOptionals != nil && localVarOptionals.ClusterId.IsSet() {
localVarQueryParams.Add("clusterId", parameterToString(localVarOptionals.ClusterId.Value(), ""))
}
// to determine the Content-Type header
localVarHttpContentTypes := []string{"multipart/form-data"}
Expand All @@ -279,12 +280,12 @@ func (a *ClusterRecordKeepingApiService) Registercluster(ctx context.Context, lo
if localVarHttpHeaderAccept != "" {
localVarHeaderParams["Accept"] = localVarHttpHeaderAccept
}
var localVarFile *os.File
var localVarFile *os.File
if localVarOptionals != nil && localVarOptionals.ClusterKubeConfigFile.IsSet() {
localVarFileOk := false
localVarFile, localVarFileOk = localVarOptionals.ClusterKubeConfigFile.Value().(*os.File)
if !localVarFileOk {
return localVarReturnValue, nil, reportError("clusterKubeConfigFile should be *os.File")
return localVarReturnValue, nil, reportError("clusterKubeConfigFile should be *os.File")
}
}
if localVarFile != nil {
Expand All @@ -311,36 +312,36 @@ func (a *ClusterRecordKeepingApiService) Registercluster(ctx context.Context, lo

if localVarHttpResponse.StatusCode < 300 {
// If we succeed, return the data, otherwise pass on to decode error.
err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
if err == nil {
err = a.client.decode(&localVarReturnValue, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
if err == nil {
return localVarReturnValue, localVarHttpResponse, err
}
}

if localVarHttpResponse.StatusCode >= 300 {
newErr := GenericSwaggerError{
body: localVarBody,
body: localVarBody,
error: localVarHttpResponse.Status,
}
if localVarHttpResponse.StatusCode == 200 {
var v RegisterClusterResult
err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
if err != nil {
newErr.error = err.Error()
err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
if err != nil {
newErr.error = err.Error()
return localVarReturnValue, localVarHttpResponse, newErr
}
newErr.model = v
return localVarReturnValue, localVarHttpResponse, newErr
}
newErr.model = v
return localVarReturnValue, localVarHttpResponse, newErr
}
if localVarHttpResponse.StatusCode == 0 {
var v ModelError
err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"))
if err != nil {
newErr.error = err.Error()
err = a.client.decode(&v, localVarBody, localVarHttpResponse.Header.Get("Content-Type"));
if err != nil {
newErr.error = err.Error()
return localVarReturnValue, localVarHttpResponse, newErr
}
newErr.model = v
return localVarReturnValue, localVarHttpResponse, newErr
}
newErr.model = v
return localVarReturnValue, localVarHttpResponse, newErr
}
return localVarReturnValue, localVarHttpResponse, newErr
}
Expand Down
Loading

0 comments on commit 006604e

Please sign in to comment.