From cb9e576d30e6815dbe63f8a8cccab34296ccd871 Mon Sep 17 00:00:00 2001 From: Diogo Recharte Date: Fri, 12 Jan 2024 15:55:26 +0000 Subject: [PATCH 1/8] EVEREST-757 Create list namespaces endpoint --- api/namespace.go | 20 ++++++++++++++++++++ deploy/quickstart-k8s.yaml | 3 +++ docs/spec/openapi.yml | 16 ++++++++++++++++ pkg/kubernetes/client/client.go | 7 +++++++ pkg/kubernetes/kubernetes.go | 19 +++++++++++++++++++ 5 files changed, 65 insertions(+) create mode 100644 api/namespace.go diff --git a/api/namespace.go b/api/namespace.go new file mode 100644 index 00000000..191f0894 --- /dev/null +++ b/api/namespace.go @@ -0,0 +1,20 @@ +package api + +import ( + "net/http" + + "github.com/AlekSi/pointer" + "github.com/labstack/echo/v4" +) + +// ListNamespaces returns the current version information. +func (e *EverestServer) ListNamespaces(ctx echo.Context) error { + namespaces, err := e.kubeClient.GetPersistedNamespaces(ctx.Request().Context(), e.kubeClient.Namespace()) + if err != nil { + e.l.Error(err) + return ctx.JSON(http.StatusInternalServerError, Error{ + Message: pointer.ToString("Failed to list namespaces"), + }) + } + return ctx.JSON(http.StatusOK, namespaces) +} diff --git a/deploy/quickstart-k8s.yaml b/deploy/quickstart-k8s.yaml index e7c9ebb2..767f9f5d 100644 --- a/deploy/quickstart-k8s.yaml +++ b/deploy/quickstart-k8s.yaml @@ -17,6 +17,9 @@ rules: - apiGroups: [""] resources: ["namespaces", "secrets"] verbs: ["*"] + - apiGroups: [""] + resources: ["configmaps"] + verbs: ["get"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole diff --git a/docs/spec/openapi.yml b/docs/spec/openapi.yml index 34c62f8b..27d97ce8 100644 --- a/docs/spec/openapi.yml +++ b/docs/spec/openapi.yml @@ -24,6 +24,18 @@ tags: description: Everything related to the Backup storage paths: + '/namespaces': + get: + summary: Get all namespaces managed by Everest + description: Get all namespaces managed by Everest + operationId: listNamespaces + responses: + '200': + description: Successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/NamespaceList' '/version': get: summary: Get Everest Backend version info @@ -1155,6 +1167,10 @@ components: properties: message: type: string + NamespaceList: + type: array + items: + type: string CreateBackupStorageParams: type: object description: Backup storage parameters diff --git a/pkg/kubernetes/client/client.go b/pkg/kubernetes/client/client.go index 1041525e..756c9bfa 100644 --- a/pkg/kubernetes/client/client.go +++ b/pkg/kubernetes/client/client.go @@ -17,10 +17,12 @@ package client import ( + "context" "errors" "os" "time" + corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" @@ -269,3 +271,8 @@ func (c *Client) helperForGVK(gvk schema.GroupVersionKind) (*resource.Helper, er return resource.NewHelper(cli, mapping), nil } + +// GetConfigMap fetches the config map in the provided namespace. +func (c *Client) GetConfigMap(ctx context.Context, namespace, name string) (*corev1.ConfigMap, error) { + return c.clientset.CoreV1().ConfigMaps(namespace).Get(ctx, name, metav1.GetOptions{}) +} diff --git a/pkg/kubernetes/kubernetes.go b/pkg/kubernetes/kubernetes.go index 5872f277..42faaaa4 100644 --- a/pkg/kubernetes/kubernetes.go +++ b/pkg/kubernetes/kubernetes.go @@ -18,6 +18,7 @@ package kubernetes import ( "context" + "errors" "strings" "go.uber.org/zap" @@ -40,6 +41,8 @@ const ( ClusterTypeEKS ClusterType = "eks" // ClusterTypeGeneric is a generic type. ClusterTypeGeneric ClusterType = "generic" + + configMapName = "everest-configuration" ) // Kubernetes is a client for Kubernetes. @@ -104,3 +107,19 @@ func (k *Kubernetes) GetClusterType(ctx context.Context) (ClusterType, error) { } return ClusterTypeGeneric, nil } + +// GetPersistedNamespaces returns list of persisted namespaces. +func (k *Kubernetes) GetPersistedNamespaces(ctx context.Context, namespace string) ([]string, error) { + var namespaces []string + cMap, err := k.client.GetConfigMap(ctx, namespace, configMapName) + if err != nil { + return namespaces, err + } + // FIXME: If we decide to separate the installation and the namespaces this key can be empty/nonexistent + v, ok := cMap.Data["namespaces"] + if !ok { + return namespaces, errors.New("`namespaces` key does not exist in the configmap") + } + namespaces = strings.Split(v, ",") + return namespaces, nil +} From e0633010e5bca7cd9fd463ec30fb1a5c8509e96c Mon Sep 17 00:00:00 2001 From: Diogo Recharte Date: Fri, 12 Jan 2024 15:56:02 +0000 Subject: [PATCH 2/8] EVEREST-757 Autogen API code --- api/everest-server.gen.go | 281 ++++++------- client/everest-client.gen.go | 369 +++++++++++------- pkg/kubernetes/client/kubeclient_interface.go | 2 + .../client/mock_kube_client_connector.go | 30 ++ 4 files changed, 418 insertions(+), 264 deletions(-) diff --git a/api/everest-server.gen.go b/api/everest-server.gen.go index 98b3a4f0..fec33fc7 100644 --- a/api/everest-server.gen.go +++ b/api/everest-server.gen.go @@ -699,6 +699,9 @@ type MonitoringInstanceUpdateParamsType string // MonitoringInstancesList defines model for MonitoringInstancesList. type MonitoringInstancesList = []MonitoringInstance +// NamespaceList defines model for NamespaceList. +type NamespaceList = []string + // UpdateBackupStorageParams Backup storage parameters type UpdateBackupStorageParams struct { AccessKey *string `json:"accessKey,omitempty"` @@ -1361,6 +1364,9 @@ type ServerInterface interface { // Update the specified Monitoring instance // (PATCH /monitoring-instances/{name}) UpdateMonitoringInstance(ctx echo.Context, name string) error + // Get all namespaces managed by Everest + // (GET /namespaces) + ListNamespaces(ctx echo.Context) error // Get the capacity and available resources of a kubernetes cluster // (GET /resources) GetKubernetesClusterResources(ctx echo.Context) error @@ -1793,6 +1799,15 @@ func (w *ServerInterfaceWrapper) UpdateMonitoringInstance(ctx echo.Context) erro return err } +// ListNamespaces converts echo context to params. +func (w *ServerInterfaceWrapper) ListNamespaces(ctx echo.Context) error { + var err error + + // Invoke the callback with all the unmarshaled arguments + err = w.Handler.ListNamespaces(ctx) + return err +} + // GetKubernetesClusterResources converts echo context to params. func (w *ServerInterfaceWrapper) GetKubernetesClusterResources(ctx echo.Context) error { var err error @@ -1869,144 +1884,146 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL router.DELETE(baseURL+"/monitoring-instances/:name", wrapper.DeleteMonitoringInstance) router.GET(baseURL+"/monitoring-instances/:name", wrapper.GetMonitoringInstance) router.PATCH(baseURL+"/monitoring-instances/:name", wrapper.UpdateMonitoringInstance) + router.GET(baseURL+"/namespaces", wrapper.ListNamespaces) router.GET(baseURL+"/resources", wrapper.GetKubernetesClusterResources) router.GET(baseURL+"/version", wrapper.VersionInfo) } // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", + "53p190/vP/1vAAAA//+KCpT/AvQAAA==", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/client/everest-client.gen.go b/client/everest-client.gen.go index e40a25a1..f28eccba 100644 --- a/client/everest-client.gen.go +++ b/client/everest-client.gen.go @@ -700,6 +700,9 @@ type MonitoringInstanceUpdateParamsType string // MonitoringInstancesList defines model for MonitoringInstancesList. type MonitoringInstancesList = []MonitoringInstance +// NamespaceList defines model for NamespaceList. +type NamespaceList = []string + // UpdateBackupStorageParams Backup storage parameters type UpdateBackupStorageParams struct { AccessKey *string `json:"accessKey,omitempty"` @@ -1455,6 +1458,9 @@ type ClientInterface interface { UpdateMonitoringInstance(ctx context.Context, name string, body UpdateMonitoringInstanceJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + // ListNamespaces request + ListNamespaces(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) + // GetKubernetesClusterResources request GetKubernetesClusterResources(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -1966,6 +1972,18 @@ func (c *Client) UpdateMonitoringInstance(ctx context.Context, name string, body return c.Client.Do(req) } +func (c *Client) ListNamespaces(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewListNamespacesRequest(c.Server) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + func (c *Client) GetKubernetesClusterResources(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { req, err := NewGetKubernetesClusterResourcesRequest(c.Server) if err != nil { @@ -3110,6 +3128,33 @@ func NewUpdateMonitoringInstanceRequestWithBody(server string, name string, cont return req, nil } +// NewListNamespacesRequest generates requests for ListNamespaces +func NewListNamespacesRequest(server string) (*http.Request, error) { + var err error + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/namespaces") + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("GET", queryURL.String(), nil) + if err != nil { + return nil, err + } + + return req, nil +} + // NewGetKubernetesClusterResourcesRequest generates requests for GetKubernetesClusterResources func NewGetKubernetesClusterResourcesRequest(server string) (*http.Request, error) { var err error @@ -3322,6 +3367,9 @@ type ClientWithResponsesInterface interface { UpdateMonitoringInstanceWithResponse(ctx context.Context, name string, body UpdateMonitoringInstanceJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateMonitoringInstanceResponse, error) + // ListNamespacesWithResponse request + ListNamespacesWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*ListNamespacesResponse, error) + // GetKubernetesClusterResourcesWithResponse request GetKubernetesClusterResourcesWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetKubernetesClusterResourcesResponse, error) @@ -4080,6 +4128,28 @@ func (r UpdateMonitoringInstanceResponse) StatusCode() int { return 0 } +type ListNamespacesResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *NamespaceList +} + +// Status returns HTTPResponse.Status +func (r ListNamespacesResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r ListNamespacesResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + type GetKubernetesClusterResourcesResponse struct { Body []byte HTTPResponse *http.Response @@ -4493,6 +4563,15 @@ func (c *ClientWithResponses) UpdateMonitoringInstanceWithResponse(ctx context.C return ParseUpdateMonitoringInstanceResponse(rsp) } +// ListNamespacesWithResponse request returning *ListNamespacesResponse +func (c *ClientWithResponses) ListNamespacesWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*ListNamespacesResponse, error) { + rsp, err := c.ListNamespaces(ctx, reqEditors...) + if err != nil { + return nil, err + } + return ParseListNamespacesResponse(rsp) +} + // GetKubernetesClusterResourcesWithResponse request returning *GetKubernetesClusterResourcesResponse func (c *ClientWithResponses) GetKubernetesClusterResourcesWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetKubernetesClusterResourcesResponse, error) { rsp, err := c.GetKubernetesClusterResources(ctx, reqEditors...) @@ -5800,6 +5879,31 @@ func ParseUpdateMonitoringInstanceResponse(rsp *http.Response) (*UpdateMonitorin return response, nil } +// ParseListNamespacesResponse parses an HTTP response from a ListNamespacesWithResponse call +func ParseListNamespacesResponse(rsp *http.Response) (*ListNamespacesResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &ListNamespacesResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest NamespaceList + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + } + + return response, nil +} + // ParseGetKubernetesClusterResourcesResponse parses an HTTP response from a GetKubernetesClusterResourcesWithResponse call func ParseGetKubernetesClusterResourcesResponse(rsp *http.Response) (*GetKubernetesClusterResourcesResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) @@ -5867,138 +5971,139 @@ func ParseVersionInfoResponse(rsp *http.Response) (*VersionInfoResponse, error) // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", + "53p190/vP/1vAAAA//+KCpT/AvQAAA==", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/pkg/kubernetes/client/kubeclient_interface.go b/pkg/kubernetes/client/kubeclient_interface.go index 0fa4b29f..e7b2e6bd 100644 --- a/pkg/kubernetes/client/kubeclient_interface.go +++ b/pkg/kubernetes/client/kubeclient_interface.go @@ -44,6 +44,8 @@ type KubeClientConnector interface { ListObjects(gvk schema.GroupVersionKind, into runtime.Object) error // GetObject retrieves an object by provided group, version, kind and name. GetObject(gvk schema.GroupVersionKind, name string, into runtime.Object) error + // GetConfigMap fetches the config map in the provided namespace. + GetConfigMap(ctx context.Context, namespace, name string) (*corev1.ConfigMap, error) // ListDatabaseClusters returns list of managed database clusters. ListDatabaseClusters(ctx context.Context, options metav1.ListOptions) (*everestv1alpha1.DatabaseClusterList, error) // GetDatabaseCluster returns database clusters by provided name. diff --git a/pkg/kubernetes/client/mock_kube_client_connector.go b/pkg/kubernetes/client/mock_kube_client_connector.go index c040af08..66473fac 100644 --- a/pkg/kubernetes/client/mock_kube_client_connector.go +++ b/pkg/kubernetes/client/mock_kube_client_connector.go @@ -245,6 +245,36 @@ func (_m *MockKubeClientConnector) GetBackupStorage(ctx context.Context, name st return r0, r1 } +// GetConfigMap provides a mock function with given fields: ctx, namespace, name +func (_m *MockKubeClientConnector) GetConfigMap(ctx context.Context, namespace string, name string) (*v1.ConfigMap, error) { + ret := _m.Called(ctx, namespace, name) + + if len(ret) == 0 { + panic("no return value specified for GetConfigMap") + } + + var r0 *v1.ConfigMap + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string) (*v1.ConfigMap, error)); ok { + return rf(ctx, namespace, name) + } + if rf, ok := ret.Get(0).(func(context.Context, string, string) *v1.ConfigMap); ok { + r0 = rf(ctx, namespace, name) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*v1.ConfigMap) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, string, string) error); ok { + r1 = rf(ctx, namespace, name) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // GetDatabaseCluster provides a mock function with given fields: ctx, name func (_m *MockKubeClientConnector) GetDatabaseCluster(ctx context.Context, name string) (*v1alpha1.DatabaseCluster, error) { ret := _m.Called(ctx, name) From fd2d3060c068c6c98111b443bac1daee69757aaf Mon Sep 17 00:00:00 2001 From: Diogo Recharte Date: Mon, 15 Jan 2024 21:57:39 +0000 Subject: [PATCH 3/8] EVEREST-757 Prepare proxy for multi-namespaces --- api/database_cluster.go | 14 ++++++++----- api/database_cluster_backup.go | 12 +++++++---- api/database_cluster_restore.go | 14 ++++++++----- api/database_engine.go | 10 ++++++--- api/everest_test.go | 37 +++++++++++++++++++-------------- api/proxy.go | 23 ++++++++------------ 6 files changed, 63 insertions(+), 47 deletions(-) diff --git a/api/database_cluster.go b/api/database_cluster.go index 88733b70..b10b70f1 100644 --- a/api/database_cluster.go +++ b/api/database_cluster.go @@ -28,6 +28,10 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) +const ( + databaseClusterKind = "databaseclusters" +) + // CreateDatabaseCluster creates a new db cluster inside the given k8s cluster. func (e *EverestServer) CreateDatabaseCluster(ctx echo.Context) error { dbc := &DatabaseCluster{} @@ -42,22 +46,22 @@ func (e *EverestServer) CreateDatabaseCluster(ctx echo.Context) error { return ctx.JSON(http.StatusBadRequest, Error{Message: pointer.ToString(err.Error())}) } - return e.proxyKubernetes(ctx, "") + return e.proxyKubernetes(ctx, "", databaseClusterKind, "") } // ListDatabaseClusters lists the created database clusters on the specified kubernetes cluster. func (e *EverestServer) ListDatabaseClusters(ctx echo.Context) error { - return e.proxyKubernetes(ctx, "") + return e.proxyKubernetes(ctx, "", databaseClusterKind, "") } // DeleteDatabaseCluster deletes a database cluster on the specified kubernetes cluster. func (e *EverestServer) DeleteDatabaseCluster(ctx echo.Context, name string) error { - return e.proxyKubernetes(ctx, name) + return e.proxyKubernetes(ctx, "", databaseClusterKind, name) } // GetDatabaseCluster retrieves the specified database cluster on the specified kubernetes cluster. func (e *EverestServer) GetDatabaseCluster(ctx echo.Context, name string) error { - return e.proxyKubernetes(ctx, name) + return e.proxyKubernetes(ctx, "", databaseClusterKind, name) } // UpdateDatabaseCluster replaces the specified database cluster on the specified kubernetes cluster. @@ -82,7 +86,7 @@ func (e *EverestServer) UpdateDatabaseCluster(ctx echo.Context, name string) err return ctx.JSON(http.StatusBadRequest, Error{Message: pointer.ToString(err.Error())}) } - return e.proxyKubernetes(ctx, name) + return e.proxyKubernetes(ctx, "", databaseClusterKind, name) } // GetDatabaseClusterCredentials returns credentials for the specified database cluster. diff --git a/api/database_cluster_backup.go b/api/database_cluster_backup.go index 1c8887c9..33a187a9 100644 --- a/api/database_cluster_backup.go +++ b/api/database_cluster_backup.go @@ -26,6 +26,10 @@ import ( "github.com/labstack/echo/v4" ) +const ( + databaseClusterBackupKind = "databaseclusterbackups" +) + // ListDatabaseClusterBackups returns list of the created database cluster backups on the specified kubernetes cluster. func (e *EverestServer) ListDatabaseClusterBackups(ctx echo.Context, name string) error { req := ctx.Request() @@ -42,7 +46,7 @@ func (e *EverestServer) ListDatabaseClusterBackups(ctx echo.Context, name string path = strings.TrimSuffix(path, name) path = strings.ReplaceAll(path, "database-clusters", "database-cluster-backups") req.URL.Path = path - return e.proxyKubernetes(ctx, "") + return e.proxyKubernetes(ctx, "", databaseClusterBackupKind, "") } // CreateDatabaseClusterBackup creates a database cluster backup on the specified kubernetes cluster. @@ -59,15 +63,15 @@ func (e *EverestServer) CreateDatabaseClusterBackup(ctx echo.Context) error { e.l.Error(err) return ctx.JSON(http.StatusBadRequest, Error{Message: pointer.ToString(err.Error())}) } - return e.proxyKubernetes(ctx, "") + return e.proxyKubernetes(ctx, "", databaseClusterBackupKind, "") } // DeleteDatabaseClusterBackup deletes the specified cluster backup on the specified kubernetes cluster. func (e *EverestServer) DeleteDatabaseClusterBackup(ctx echo.Context, name string) error { - return e.proxyKubernetes(ctx, name) + return e.proxyKubernetes(ctx, "", databaseClusterBackupKind, name) } // GetDatabaseClusterBackup returns the specified cluster backup on the specified kubernetes cluster. func (e *EverestServer) GetDatabaseClusterBackup(ctx echo.Context, name string) error { - return e.proxyKubernetes(ctx, name) + return e.proxyKubernetes(ctx, "", databaseClusterBackupKind, name) } diff --git a/api/database_cluster_restore.go b/api/database_cluster_restore.go index 349bd41d..0c05b01f 100644 --- a/api/database_cluster_restore.go +++ b/api/database_cluster_restore.go @@ -27,6 +27,10 @@ import ( everestv1alpha1 "github.com/percona/everest-operator/api/v1alpha1" ) +const ( + databaseClusterRestoreKind = "databaseclusterrestores" +) + // ListDatabaseClusterRestores List of the created database cluster restores on the specified kubernetes cluster. func (e *EverestServer) ListDatabaseClusterRestores(ctx echo.Context, name string) error { req := ctx.Request() @@ -43,7 +47,7 @@ func (e *EverestServer) ListDatabaseClusterRestores(ctx echo.Context, name strin path = strings.TrimSuffix(path, name) path = strings.ReplaceAll(path, "database-clusters", "database-cluster-restores") req.URL.Path = path - return e.proxyKubernetes(ctx, "") + return e.proxyKubernetes(ctx, "", databaseClusterRestoreKind, "") } // CreateDatabaseClusterRestore Create a database cluster restore on the specified kubernetes cluster. @@ -75,17 +79,17 @@ func (e *EverestServer) CreateDatabaseClusterRestore(ctx echo.Context) error { }) } - return e.proxyKubernetes(ctx, "") + return e.proxyKubernetes(ctx, "", databaseClusterRestoreKind, "") } // DeleteDatabaseClusterRestore Delete the specified cluster restore on the specified kubernetes cluster. func (e *EverestServer) DeleteDatabaseClusterRestore(ctx echo.Context, name string) error { - return e.proxyKubernetes(ctx, name) + return e.proxyKubernetes(ctx, "", databaseClusterRestoreKind, name) } // GetDatabaseClusterRestore Returns the specified cluster restore on the specified kubernetes cluster. func (e *EverestServer) GetDatabaseClusterRestore(ctx echo.Context, name string) error { - return e.proxyKubernetes(ctx, name) + return e.proxyKubernetes(ctx, "", databaseClusterRestoreKind, name) } // UpdateDatabaseClusterRestore Replace the specified cluster restore on the specified kubernetes cluster. @@ -103,5 +107,5 @@ func (e *EverestServer) UpdateDatabaseClusterRestore(ctx echo.Context, name stri Message: pointer.ToString(err.Error()), }) } - return e.proxyKubernetes(ctx, name) + return e.proxyKubernetes(ctx, "", databaseClusterRestoreKind, name) } diff --git a/api/database_engine.go b/api/database_engine.go index c6a242cb..55f287ed 100644 --- a/api/database_engine.go +++ b/api/database_engine.go @@ -18,17 +18,21 @@ package api import "github.com/labstack/echo/v4" +const ( + databaseEngineKind = "databaseengines" +) + // ListDatabaseEngines List of the available database engines on the specified kubernetes cluster. func (e *EverestServer) ListDatabaseEngines(ctx echo.Context) error { - return e.proxyKubernetes(ctx, "") + return e.proxyKubernetes(ctx, "", databaseEngineKind, "") } // GetDatabaseEngine Get the specified database cluster on the specified kubernetes cluster. func (e *EverestServer) GetDatabaseEngine(ctx echo.Context, name string) error { - return e.proxyKubernetes(ctx, name) + return e.proxyKubernetes(ctx, "", databaseEngineKind, name) } // UpdateDatabaseEngine Get the specified database cluster on the specified kubernetes cluster. func (e *EverestServer) UpdateDatabaseEngine(ctx echo.Context, name string) error { - return e.proxyKubernetes(ctx, name) + return e.proxyKubernetes(ctx, "", databaseEngineKind, name) } diff --git a/api/everest_test.go b/api/everest_test.go index 4b28c424..b67cdefc 100644 --- a/api/everest_test.go +++ b/api/everest_test.go @@ -23,31 +23,36 @@ import ( func TestBuildProxiedUrl(t *testing.T) { t.Parallel() type tCase struct { - url string - resourceName string - expected string + url string + kind string + name string + expected string } cases := []tCase{ { - url: "/v1/database-clusters", - resourceName: "", - expected: "/apis/everest.percona.com/v1alpha1/namespaces/percona-everest/databaseclusters", + url: "/v1/database-clusters", + kind: "databaseclusters", + name: "", + expected: "/apis/everest.percona.com/v1alpha1/namespaces/percona-everest/databaseclusters", }, { - url: "/v1/database-clusters/snake_case_name", - resourceName: "snake_case_name", - expected: "/apis/everest.percona.com/v1alpha1/namespaces/percona-everest/databaseclusters/snake_case_name", + url: "/v1/database-clusters/snake_case_name", + kind: "databaseclusters", + name: "snake_case_name", + expected: "/apis/everest.percona.com/v1alpha1/namespaces/percona-everest/databaseclusters/snake_case_name", }, { - url: "/v1/database-clusters/kebab-case-name", - resourceName: "kebab-case-name", - expected: "/apis/everest.percona.com/v1alpha1/namespaces/percona-everest/databaseclusters/kebab-case-name", + url: "/v1/database-clusters/kebab-case-name", + kind: "databaseclusters", + name: "kebab-case-name", + expected: "/apis/everest.percona.com/v1alpha1/namespaces/percona-everest/databaseclusters/kebab-case-name", }, { - url: "/v1/database-cluster-restores/kebab-case-name", - resourceName: "kebab-case-name", - expected: "/apis/everest.percona.com/v1alpha1/namespaces/percona-everest/databaseclusterrestores/kebab-case-name", + url: "/v1/database-cluster-restores/kebab-case-name", + kind: "databaseclusterrestores", + name: "kebab-case-name", + expected: "/apis/everest.percona.com/v1alpha1/namespaces/percona-everest/databaseclusterrestores/kebab-case-name", }, } @@ -55,7 +60,7 @@ func TestBuildProxiedUrl(t *testing.T) { tc := testCase t.Run(tc.url, func(t *testing.T) { t.Parallel() - require.Equal(t, tc.expected, buildProxiedURL(tc.url, tc.resourceName, "percona-everest")) + require.Equal(t, tc.expected, buildProxiedURL(tc.url, "percona-everest", tc.kind, tc.name)) }) } } diff --git a/api/proxy.go b/api/proxy.go index 29b7f684..10948f53 100644 --- a/api/proxy.go +++ b/api/proxy.go @@ -53,7 +53,7 @@ var ( } ) -func (e *EverestServer) proxyKubernetes(ctx echo.Context, resourceName string) error { +func (e *EverestServer) proxyKubernetes(ctx echo.Context, namespace, kind, name string) error { config := e.kubeClient.Config() reverseProxy := httputil.NewSingleHostReverseProxy( &url.URL{ @@ -74,27 +74,22 @@ func (e *EverestServer) proxyKubernetes(ctx echo.Context, resourceName string) e // All requests to Everest are protected by authorization. // We need to remove the header, otherwise Kubernetes returns 401 unauthorized response. req.Header.Del("Authorization") - req.URL.Path = buildProxiedURL(ctx.Request().URL.Path, resourceName, e.kubeClient.Namespace()) + if namespace == "" { + namespace = e.kubeClient.Namespace() + } + req.URL.Path = buildProxiedURL(ctx.Request().URL.Path, namespace, kind, name) reverseProxy.ServeHTTP(ctx.Response(), req) return nil } -func buildProxiedURL(uri, resourceName, namespace string) string { - // cut the /kubernetes part - uri = strings.TrimPrefix(uri, "/v1/") - - // cut the resource name if present - uri = strings.TrimSuffix(uri, resourceName) - - // remove kebab-case - uri = strings.ReplaceAll(uri, "-", "") +func buildProxiedURL(uri, namespace, kind, name string) string { proxiedURL := fmt.Sprintf( "/apis/everest.percona.com/v1alpha1/namespaces/%s/%s", url.PathEscape(strings.ReplaceAll(namespace, "/", "")), - url.PathEscape(strings.ReplaceAll(uri, "/", "")), + url.PathEscape(strings.ReplaceAll(kind, "/", "")), ) - if resourceName != "" { - proxiedURL += fmt.Sprintf("/%s", url.PathEscape(strings.ReplaceAll(resourceName, "/", ""))) + if name != "" { + proxiedURL += fmt.Sprintf("/%s", url.PathEscape(strings.ReplaceAll(name, "/", ""))) } return proxiedURL } From 5f52ebf5e48c369265219065253ae9ffcebef3c8 Mon Sep 17 00:00:00 2001 From: Diogo Recharte Date: Mon, 15 Jan 2024 21:59:03 +0000 Subject: [PATCH 4/8] EVEREST-757 Implement namespaced dbengine endpoints --- api/database_engine.go | 18 +++++++++--------- docs/spec/openapi.yml | 23 +++++++++++++++++++++-- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/api/database_engine.go b/api/database_engine.go index 55f287ed..44af1368 100644 --- a/api/database_engine.go +++ b/api/database_engine.go @@ -22,17 +22,17 @@ const ( databaseEngineKind = "databaseengines" ) -// ListDatabaseEngines List of the available database engines on the specified kubernetes cluster. -func (e *EverestServer) ListDatabaseEngines(ctx echo.Context) error { - return e.proxyKubernetes(ctx, "", databaseEngineKind, "") +// ListDatabaseEngines List of the available database engines on the specified namespace. +func (e *EverestServer) ListDatabaseEngines(ctx echo.Context, namespace string) error { + return e.proxyKubernetes(ctx, namespace, databaseEngineKind, "") } -// GetDatabaseEngine Get the specified database cluster on the specified kubernetes cluster. -func (e *EverestServer) GetDatabaseEngine(ctx echo.Context, name string) error { - return e.proxyKubernetes(ctx, "", databaseEngineKind, name) +// GetDatabaseEngine Get the specified database engine on the specified namespace. +func (e *EverestServer) GetDatabaseEngine(ctx echo.Context, namespace string, name string) error { + return e.proxyKubernetes(ctx, namespace, databaseEngineKind, name) } -// UpdateDatabaseEngine Get the specified database cluster on the specified kubernetes cluster. -func (e *EverestServer) UpdateDatabaseEngine(ctx echo.Context, name string) error { - return e.proxyKubernetes(ctx, "", databaseEngineKind, name) +// UpdateDatabaseEngine Update the specified database engine on the specified namespace. +func (e *EverestServer) UpdateDatabaseEngine(ctx echo.Context, namespace string, name string) error { + return e.proxyKubernetes(ctx, namespace, databaseEngineKind, name) } diff --git a/docs/spec/openapi.yml b/docs/spec/openapi.yml index 27d97ce8..b86d864e 100644 --- a/docs/spec/openapi.yml +++ b/docs/spec/openapi.yml @@ -435,13 +435,20 @@ paths: application/json: schema: $ref: '#/components/schemas/Error' - '/database-engines': + '/namespaces/{namespace}/database-engines': get: tags: - databaseEngine summary: List of the available database engines description: List of available database engines operationId: listDatabaseEngines + parameters: + - name: namespace + in: path + description: Name of the namespace + required: true + schema: + type: string responses: '200': description: Successful operation @@ -461,7 +468,7 @@ paths: application/json: schema: $ref: '#/components/schemas/Error' - '/database-engines/{name}': + '/namespaces/{namespace}/database-engines/{name}': get: tags: - databaseEngine @@ -469,6 +476,12 @@ paths: description: Get the specified database engine operationId: getDatabaseEngine parameters: + - name: namespace + in: path + description: Name of the namespace + required: true + schema: + type: string - name: name in: path description: Name of the database engine @@ -501,6 +514,12 @@ paths: description: Update the specified database engine operationId: updateDatabaseEngine parameters: + - name: namespace + in: path + description: Name of the namespace + required: true + schema: + type: string - name: name in: path description: Name of the database engine From 81b852fba30a52092a8833b1e7a9009b9c36c152 Mon Sep 17 00:00:00 2001 From: Diogo Recharte Date: Mon, 15 Jan 2024 22:00:16 +0000 Subject: [PATCH 5/8] EVEREST-757 Autogen API code --- api/everest-server.gen.go | 151 +++++---- client/everest-client.gen.go | 581 ++++++++++++++++++----------------- 2 files changed, 388 insertions(+), 344 deletions(-) diff --git a/api/everest-server.gen.go b/api/everest-server.gen.go index fec33fc7..b7754e8e 100644 --- a/api/everest-server.gen.go +++ b/api/everest-server.gen.go @@ -826,15 +826,15 @@ type CreateDatabaseClusterJSONRequestBody = DatabaseCluster // UpdateDatabaseClusterJSONRequestBody defines body for UpdateDatabaseCluster for application/json ContentType. type UpdateDatabaseClusterJSONRequestBody = DatabaseCluster -// UpdateDatabaseEngineJSONRequestBody defines body for UpdateDatabaseEngine for application/json ContentType. -type UpdateDatabaseEngineJSONRequestBody = DatabaseEngine - // CreateMonitoringInstanceJSONRequestBody defines body for CreateMonitoringInstance for application/json ContentType. type CreateMonitoringInstanceJSONRequestBody = MonitoringInstanceCreateParams // UpdateMonitoringInstanceJSONRequestBody defines body for UpdateMonitoringInstance for application/json ContentType. type UpdateMonitoringInstanceJSONRequestBody = MonitoringInstanceUpdateParams +// UpdateDatabaseEngineJSONRequestBody defines body for UpdateDatabaseEngine for application/json ContentType. +type UpdateDatabaseEngineJSONRequestBody = DatabaseEngine + // AsDatabaseClusterSpecEngineResourcesCpu0 returns the union data inside the DatabaseCluster_Spec_Engine_Resources_Cpu as a DatabaseClusterSpecEngineResourcesCpu0 func (t DatabaseCluster_Spec_Engine_Resources_Cpu) AsDatabaseClusterSpecEngineResourcesCpu0() (DatabaseClusterSpecEngineResourcesCpu0, error) { var body DatabaseClusterSpecEngineResourcesCpu0 @@ -1340,15 +1340,6 @@ type ServerInterface interface { // List of the created database cluster restores // (GET /database-clusters/{name}/restores) ListDatabaseClusterRestores(ctx echo.Context, name string) error - // List of the available database engines - // (GET /database-engines) - ListDatabaseEngines(ctx echo.Context) error - // Get the specified database engine - // (GET /database-engines/{name}) - GetDatabaseEngine(ctx echo.Context, name string) error - // Update the specified database engine - // (PUT /database-engines/{name}) - UpdateDatabaseEngine(ctx echo.Context, name string) error // List of the created monitoring instances // (GET /monitoring-instances) ListMonitoringInstances(ctx echo.Context) error @@ -1367,6 +1358,15 @@ type ServerInterface interface { // Get all namespaces managed by Everest // (GET /namespaces) ListNamespaces(ctx echo.Context) error + // List of the available database engines + // (GET /namespaces/{namespace}/database-engines) + ListDatabaseEngines(ctx echo.Context, namespace string) error + // Get the specified database engine + // (GET /namespaces/{namespace}/database-engines/{name}) + GetDatabaseEngine(ctx echo.Context, namespace string, name string) error + // Update the specified database engine + // (PUT /namespaces/{namespace}/database-engines/{name}) + UpdateDatabaseEngine(ctx echo.Context, namespace string, name string) error // Get the capacity and available resources of a kubernetes cluster // (GET /resources) GetKubernetesClusterResources(ctx echo.Context) error @@ -1692,17 +1692,26 @@ func (w *ServerInterfaceWrapper) ListDatabaseClusterRestores(ctx echo.Context) e return err } -// ListDatabaseEngines converts echo context to params. -func (w *ServerInterfaceWrapper) ListDatabaseEngines(ctx echo.Context) error { +// ListMonitoringInstances converts echo context to params. +func (w *ServerInterfaceWrapper) ListMonitoringInstances(ctx echo.Context) error { var err error // Invoke the callback with all the unmarshaled arguments - err = w.Handler.ListDatabaseEngines(ctx) + err = w.Handler.ListMonitoringInstances(ctx) return err } -// GetDatabaseEngine converts echo context to params. -func (w *ServerInterfaceWrapper) GetDatabaseEngine(ctx echo.Context) error { +// CreateMonitoringInstance converts echo context to params. +func (w *ServerInterfaceWrapper) CreateMonitoringInstance(ctx echo.Context) error { + var err error + + // Invoke the callback with all the unmarshaled arguments + err = w.Handler.CreateMonitoringInstance(ctx) + return err +} + +// DeleteMonitoringInstance converts echo context to params. +func (w *ServerInterfaceWrapper) DeleteMonitoringInstance(ctx echo.Context) error { var err error // ------------- Path parameter "name" ------------- var name string @@ -1713,12 +1722,12 @@ func (w *ServerInterfaceWrapper) GetDatabaseEngine(ctx echo.Context) error { } // Invoke the callback with all the unmarshaled arguments - err = w.Handler.GetDatabaseEngine(ctx, name) + err = w.Handler.DeleteMonitoringInstance(ctx, name) return err } -// UpdateDatabaseEngine converts echo context to params. -func (w *ServerInterfaceWrapper) UpdateDatabaseEngine(ctx echo.Context) error { +// GetMonitoringInstance converts echo context to params. +func (w *ServerInterfaceWrapper) GetMonitoringInstance(ctx echo.Context) error { var err error // ------------- Path parameter "name" ------------- var name string @@ -1729,47 +1738,62 @@ func (w *ServerInterfaceWrapper) UpdateDatabaseEngine(ctx echo.Context) error { } // Invoke the callback with all the unmarshaled arguments - err = w.Handler.UpdateDatabaseEngine(ctx, name) + err = w.Handler.GetMonitoringInstance(ctx, name) return err } -// ListMonitoringInstances converts echo context to params. -func (w *ServerInterfaceWrapper) ListMonitoringInstances(ctx echo.Context) error { +// UpdateMonitoringInstance converts echo context to params. +func (w *ServerInterfaceWrapper) UpdateMonitoringInstance(ctx echo.Context) error { var err error + // ------------- Path parameter "name" ------------- + var name string + + err = runtime.BindStyledParameterWithLocation("simple", false, "name", runtime.ParamLocationPath, ctx.Param("name"), &name) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter name: %s", err)) + } // Invoke the callback with all the unmarshaled arguments - err = w.Handler.ListMonitoringInstances(ctx) + err = w.Handler.UpdateMonitoringInstance(ctx, name) return err } -// CreateMonitoringInstance converts echo context to params. -func (w *ServerInterfaceWrapper) CreateMonitoringInstance(ctx echo.Context) error { +// ListNamespaces converts echo context to params. +func (w *ServerInterfaceWrapper) ListNamespaces(ctx echo.Context) error { var err error // Invoke the callback with all the unmarshaled arguments - err = w.Handler.CreateMonitoringInstance(ctx) + err = w.Handler.ListNamespaces(ctx) return err } -// DeleteMonitoringInstance converts echo context to params. -func (w *ServerInterfaceWrapper) DeleteMonitoringInstance(ctx echo.Context) error { +// ListDatabaseEngines converts echo context to params. +func (w *ServerInterfaceWrapper) ListDatabaseEngines(ctx echo.Context) error { var err error - // ------------- Path parameter "name" ------------- - var name string + // ------------- Path parameter "namespace" ------------- + var namespace string - err = runtime.BindStyledParameterWithLocation("simple", false, "name", runtime.ParamLocationPath, ctx.Param("name"), &name) + err = runtime.BindStyledParameterWithLocation("simple", false, "namespace", runtime.ParamLocationPath, ctx.Param("namespace"), &namespace) if err != nil { - return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter name: %s", err)) + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter namespace: %s", err)) } // Invoke the callback with all the unmarshaled arguments - err = w.Handler.DeleteMonitoringInstance(ctx, name) + err = w.Handler.ListDatabaseEngines(ctx, namespace) return err } -// GetMonitoringInstance converts echo context to params. -func (w *ServerInterfaceWrapper) GetMonitoringInstance(ctx echo.Context) error { +// GetDatabaseEngine converts echo context to params. +func (w *ServerInterfaceWrapper) GetDatabaseEngine(ctx echo.Context) error { var err error + // ------------- Path parameter "namespace" ------------- + var namespace string + + err = runtime.BindStyledParameterWithLocation("simple", false, "namespace", runtime.ParamLocationPath, ctx.Param("namespace"), &namespace) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter namespace: %s", err)) + } + // ------------- Path parameter "name" ------------- var name string @@ -1779,13 +1803,21 @@ func (w *ServerInterfaceWrapper) GetMonitoringInstance(ctx echo.Context) error { } // Invoke the callback with all the unmarshaled arguments - err = w.Handler.GetMonitoringInstance(ctx, name) + err = w.Handler.GetDatabaseEngine(ctx, namespace, name) return err } -// UpdateMonitoringInstance converts echo context to params. -func (w *ServerInterfaceWrapper) UpdateMonitoringInstance(ctx echo.Context) error { +// UpdateDatabaseEngine converts echo context to params. +func (w *ServerInterfaceWrapper) UpdateDatabaseEngine(ctx echo.Context) error { var err error + // ------------- Path parameter "namespace" ------------- + var namespace string + + err = runtime.BindStyledParameterWithLocation("simple", false, "namespace", runtime.ParamLocationPath, ctx.Param("namespace"), &namespace) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter namespace: %s", err)) + } + // ------------- Path parameter "name" ------------- var name string @@ -1795,16 +1827,7 @@ func (w *ServerInterfaceWrapper) UpdateMonitoringInstance(ctx echo.Context) erro } // Invoke the callback with all the unmarshaled arguments - err = w.Handler.UpdateMonitoringInstance(ctx, name) - return err -} - -// ListNamespaces converts echo context to params. -func (w *ServerInterfaceWrapper) ListNamespaces(ctx echo.Context) error { - var err error - - // Invoke the callback with all the unmarshaled arguments - err = w.Handler.ListNamespaces(ctx) + err = w.Handler.UpdateDatabaseEngine(ctx, namespace, name) return err } @@ -1876,15 +1899,15 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL router.GET(baseURL+"/database-clusters/:name/credentials", wrapper.GetDatabaseClusterCredentials) router.GET(baseURL+"/database-clusters/:name/pitr", wrapper.GetDatabaseClusterPitr) router.GET(baseURL+"/database-clusters/:name/restores", wrapper.ListDatabaseClusterRestores) - router.GET(baseURL+"/database-engines", wrapper.ListDatabaseEngines) - router.GET(baseURL+"/database-engines/:name", wrapper.GetDatabaseEngine) - router.PUT(baseURL+"/database-engines/:name", wrapper.UpdateDatabaseEngine) router.GET(baseURL+"/monitoring-instances", wrapper.ListMonitoringInstances) router.POST(baseURL+"/monitoring-instances", wrapper.CreateMonitoringInstance) router.DELETE(baseURL+"/monitoring-instances/:name", wrapper.DeleteMonitoringInstance) router.GET(baseURL+"/monitoring-instances/:name", wrapper.GetMonitoringInstance) router.PATCH(baseURL+"/monitoring-instances/:name", wrapper.UpdateMonitoringInstance) router.GET(baseURL+"/namespaces", wrapper.ListNamespaces) + router.GET(baseURL+"/namespaces/:namespace/database-engines", wrapper.ListDatabaseEngines) + router.GET(baseURL+"/namespaces/:namespace/database-engines/:name", wrapper.GetDatabaseEngine) + router.PUT(baseURL+"/namespaces/:namespace/database-engines/:name", wrapper.UpdateDatabaseEngine) router.GET(baseURL+"/resources", wrapper.GetKubernetesClusterResources) router.GET(baseURL+"/version", wrapper.VersionInfo) } @@ -2012,18 +2035,18 @@ var swaggerSpec = []string{ "LB/Z3zI4WnZ0tKykcK/42NajspYbeF0qu+i1u+mzg/NkoJ/VzpONaKl3Hv5aOmn7TAYieVw5OlBBV1b/", "hiSwgTNkLRl4vSH/XZTwTLXgZ+DoGKj3obwKD6YQ7lVSTrd2LyDXSQ8vw3HRdBB+W2W8DK6Tx3OdVBB5", "m+yXgqgiQaAgF07k2oMz3USNqt2s1ydPaq0H6tqQusrtG6jrMZTMBjZvKa4yqsRakrrglKkxZeNrmhIk", - "SFIQe3mR/C6W24WexEBiG5MY7NtAXFsT1654vSXNVXM6t9cRi156KImXZduByLaL3w5q4iOqiRVc3iya", - "a6/7XktJ5TU9zZvCV5LPadHm0bGtckn6gGU7YdlKWDfRy95H7kerSpBnU5PD9LBK9zl1LTbnyEXnfxZW", - "6m59HxD7Ae2AAgs6cbrD1Wx8xhtibt3R/KyQ9/EcxN14+7z9wwO9bUtvPWljpRgpaxaM3VWtm+n6nrv2", - "/XqK56rXx9RVum6WHfDsQdTiDrA7XEs9wO7OPzvydVeWZQeOJNEHzVA/lNfVhTfsGEsSu/uU3HtzDUNG", - "IkUXBN2SpangXL+rkhESy1pfV3k0R1iOEJ2arg5RlqYf7A2CH/Tf0Fn1S3sPTOxqRNfGCDuroHpuLX4c", - "2bDmKvIOWXHeDYzPl1Tnu+l5IOWdKqN2E91aSu4SHdummnlQriPbzEs7vTW71DvOl1449Vsz18cd3sdV", - "GFfGRff8U8f8GLpO3vU0xdMe6P89Ubvh/vkT4v7A9wfC6uMgSLeiqo5ys157qI9kMR8+a8nyFLqh2YbV", - "umG6Tjf8LLVjBybx38MkNqDi9TqqJjaZ4VVODc2UcJKgsilKocQjXN1j79TxejR+Ljt/RNwuRtnMfdFi", - "vOvXCDtW3ie3tuovznBE1RJqvJaBjKKDnar+XlautXu60r/lqINtuX393+3xol0mdVHeB9mJjO7eq2Mc", - "3RIWuzsh4RqzFrLZSyQfu6q0u8dye3pduSro1sDCKCa5SILDYG9xEGh9we5jc7N0l0s111zUJZDYa8Uq", - "1WwrJ4KtxqKh8WnUvzPn2fd01cw+2arbMtLd6NWFEnaYK6qkn/jnXJyR32WUMhPaP4grcLfBGMfN8u62", - "53p190/vP/1vAAAA//+KCpT/AvQAAA==", + "SFIQe3mR/C6W24WexEBiG5MY7NtAXFsT1654vSXNVXM6t9cRi156KImXZduByLaL3w5q4iOqiRVc7hXN", + "LU8Fjt1laJtRk+c2Wz8heS5Te8ywbtfdbQPiPQjidYDd4VzqAXZ3hPfIeydyUfgUWJlEHzTr+lBeCBPe", + "sGMsSexuLHDvTaHjjESKLgi6JUtTI7F+GxQjJJa1vq7yaI6wHCE6NV0doixNP9g7ej7ov6Gz6pe20nrs", + "qjDWxgg764x57gV8HPfcmss+O7x1593A+Hxha99digMp71R7rJvo1lJyl+jYNpjrQbmOeK6XdnqrYql3", + "nC+9NNm3Zq6PO7yPqzCujBL8/IOzfgxdJ+96+tfSHuj/PVG74f75E+L+wPcHwurjiku3oqqOgm4mgruF", + "ZDEfPmvJ8hS6Ye227g7dMF2nG36W6mwDk/jvYRIbUPF6HZW5u9VXR7twkqCyKUqhiBIUx7dV670ejZ/L", + "zh8Rt+vXw/dG6xbjXb/Gxo4ZXR7+/lS6YAmbUdbDR1Re51z4qNynq9ysp0Wb3py3mGU3v3Wvn5db1Kx1", + "8Ert7pVaiWxNP6jZ9haDWInuFbt205C56WFV7O7Utfi8KD/qFcMolvNnCT7Y3R0o7CEj5wUWdBJXR3Km", + "V7qvo5V6auYXTi6Pl8TZTSnPO4dzoPAH1bU3IHItQcsr/tYWYsYZjqhaQtndUmQXHexUiPmyctPg01Vj", + "LkcdsG/7kszb40W7cu2ivKKzExndVWTHOLolLHbXdMLNci1ks/d6Pnahb3e16PYG3spVQbcGFkZa5iIJ", + "DoO9xUGgxYrdx+Zm6S6Xaq7NbpfTY296qxQYrhzStoJNQ6MtH7s7c4zc01UzIWirbkujstGrkxw7zBVV", + "MoL8cy7KFuwySpmc7h/E1RzcYIzjZsV923O94P6n95/+NwAA//8tOd+llfUAAA==", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/client/everest-client.gen.go b/client/everest-client.gen.go index f28eccba..9f74a215 100644 --- a/client/everest-client.gen.go +++ b/client/everest-client.gen.go @@ -827,15 +827,15 @@ type CreateDatabaseClusterJSONRequestBody = DatabaseCluster // UpdateDatabaseClusterJSONRequestBody defines body for UpdateDatabaseCluster for application/json ContentType. type UpdateDatabaseClusterJSONRequestBody = DatabaseCluster -// UpdateDatabaseEngineJSONRequestBody defines body for UpdateDatabaseEngine for application/json ContentType. -type UpdateDatabaseEngineJSONRequestBody = DatabaseEngine - // CreateMonitoringInstanceJSONRequestBody defines body for CreateMonitoringInstance for application/json ContentType. type CreateMonitoringInstanceJSONRequestBody = MonitoringInstanceCreateParams // UpdateMonitoringInstanceJSONRequestBody defines body for UpdateMonitoringInstance for application/json ContentType. type UpdateMonitoringInstanceJSONRequestBody = MonitoringInstanceUpdateParams +// UpdateDatabaseEngineJSONRequestBody defines body for UpdateDatabaseEngine for application/json ContentType. +type UpdateDatabaseEngineJSONRequestBody = DatabaseEngine + // AsDatabaseClusterSpecEngineResourcesCpu0 returns the union data inside the DatabaseCluster_Spec_Engine_Resources_Cpu as a DatabaseClusterSpecEngineResourcesCpu0 func (t DatabaseCluster_Spec_Engine_Resources_Cpu) AsDatabaseClusterSpecEngineResourcesCpu0() (DatabaseClusterSpecEngineResourcesCpu0, error) { var body DatabaseClusterSpecEngineResourcesCpu0 @@ -1428,17 +1428,6 @@ type ClientInterface interface { // ListDatabaseClusterRestores request ListDatabaseClusterRestores(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*http.Response, error) - // ListDatabaseEngines request - ListDatabaseEngines(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) - - // GetDatabaseEngine request - GetDatabaseEngine(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*http.Response, error) - - // UpdateDatabaseEngineWithBody request with any body - UpdateDatabaseEngineWithBody(ctx context.Context, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - - UpdateDatabaseEngine(ctx context.Context, name string, body UpdateDatabaseEngineJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - // ListMonitoringInstances request ListMonitoringInstances(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -1461,6 +1450,17 @@ type ClientInterface interface { // ListNamespaces request ListNamespaces(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) + // ListDatabaseEngines request + ListDatabaseEngines(ctx context.Context, namespace string, reqEditors ...RequestEditorFn) (*http.Response, error) + + // GetDatabaseEngine request + GetDatabaseEngine(ctx context.Context, namespace string, name string, reqEditors ...RequestEditorFn) (*http.Response, error) + + // UpdateDatabaseEngineWithBody request with any body + UpdateDatabaseEngineWithBody(ctx context.Context, namespace string, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + UpdateDatabaseEngine(ctx context.Context, namespace string, name string, body UpdateDatabaseEngineJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + // GetKubernetesClusterResources request GetKubernetesClusterResources(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -1840,8 +1840,8 @@ func (c *Client) ListDatabaseClusterRestores(ctx context.Context, name string, r return c.Client.Do(req) } -func (c *Client) ListDatabaseEngines(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewListDatabaseEnginesRequest(c.Server) +func (c *Client) ListMonitoringInstances(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewListMonitoringInstancesRequest(c.Server) if err != nil { return nil, err } @@ -1852,8 +1852,8 @@ func (c *Client) ListDatabaseEngines(ctx context.Context, reqEditors ...RequestE return c.Client.Do(req) } -func (c *Client) GetDatabaseEngine(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewGetDatabaseEngineRequest(c.Server, name) +func (c *Client) CreateMonitoringInstanceWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewCreateMonitoringInstanceRequestWithBody(c.Server, contentType, body) if err != nil { return nil, err } @@ -1864,8 +1864,8 @@ func (c *Client) GetDatabaseEngine(ctx context.Context, name string, reqEditors return c.Client.Do(req) } -func (c *Client) UpdateDatabaseEngineWithBody(ctx context.Context, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewUpdateDatabaseEngineRequestWithBody(c.Server, name, contentType, body) +func (c *Client) CreateMonitoringInstance(ctx context.Context, body CreateMonitoringInstanceJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewCreateMonitoringInstanceRequest(c.Server, body) if err != nil { return nil, err } @@ -1876,8 +1876,8 @@ func (c *Client) UpdateDatabaseEngineWithBody(ctx context.Context, name string, return c.Client.Do(req) } -func (c *Client) UpdateDatabaseEngine(ctx context.Context, name string, body UpdateDatabaseEngineJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewUpdateDatabaseEngineRequest(c.Server, name, body) +func (c *Client) DeleteMonitoringInstance(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDeleteMonitoringInstanceRequest(c.Server, name) if err != nil { return nil, err } @@ -1888,8 +1888,8 @@ func (c *Client) UpdateDatabaseEngine(ctx context.Context, name string, body Upd return c.Client.Do(req) } -func (c *Client) ListMonitoringInstances(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewListMonitoringInstancesRequest(c.Server) +func (c *Client) GetMonitoringInstance(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewGetMonitoringInstanceRequest(c.Server, name) if err != nil { return nil, err } @@ -1900,8 +1900,8 @@ func (c *Client) ListMonitoringInstances(ctx context.Context, reqEditors ...Requ return c.Client.Do(req) } -func (c *Client) CreateMonitoringInstanceWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewCreateMonitoringInstanceRequestWithBody(c.Server, contentType, body) +func (c *Client) UpdateMonitoringInstanceWithBody(ctx context.Context, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewUpdateMonitoringInstanceRequestWithBody(c.Server, name, contentType, body) if err != nil { return nil, err } @@ -1912,8 +1912,8 @@ func (c *Client) CreateMonitoringInstanceWithBody(ctx context.Context, contentTy return c.Client.Do(req) } -func (c *Client) CreateMonitoringInstance(ctx context.Context, body CreateMonitoringInstanceJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewCreateMonitoringInstanceRequest(c.Server, body) +func (c *Client) UpdateMonitoringInstance(ctx context.Context, name string, body UpdateMonitoringInstanceJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewUpdateMonitoringInstanceRequest(c.Server, name, body) if err != nil { return nil, err } @@ -1924,8 +1924,8 @@ func (c *Client) CreateMonitoringInstance(ctx context.Context, body CreateMonito return c.Client.Do(req) } -func (c *Client) DeleteMonitoringInstance(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewDeleteMonitoringInstanceRequest(c.Server, name) +func (c *Client) ListNamespaces(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewListNamespacesRequest(c.Server) if err != nil { return nil, err } @@ -1936,8 +1936,8 @@ func (c *Client) DeleteMonitoringInstance(ctx context.Context, name string, reqE return c.Client.Do(req) } -func (c *Client) GetMonitoringInstance(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewGetMonitoringInstanceRequest(c.Server, name) +func (c *Client) ListDatabaseEngines(ctx context.Context, namespace string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewListDatabaseEnginesRequest(c.Server, namespace) if err != nil { return nil, err } @@ -1948,8 +1948,8 @@ func (c *Client) GetMonitoringInstance(ctx context.Context, name string, reqEdit return c.Client.Do(req) } -func (c *Client) UpdateMonitoringInstanceWithBody(ctx context.Context, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewUpdateMonitoringInstanceRequestWithBody(c.Server, name, contentType, body) +func (c *Client) GetDatabaseEngine(ctx context.Context, namespace string, name string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewGetDatabaseEngineRequest(c.Server, namespace, name) if err != nil { return nil, err } @@ -1960,8 +1960,8 @@ func (c *Client) UpdateMonitoringInstanceWithBody(ctx context.Context, name stri return c.Client.Do(req) } -func (c *Client) UpdateMonitoringInstance(ctx context.Context, name string, body UpdateMonitoringInstanceJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewUpdateMonitoringInstanceRequest(c.Server, name, body) +func (c *Client) UpdateDatabaseEngineWithBody(ctx context.Context, namespace string, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewUpdateDatabaseEngineRequestWithBody(c.Server, namespace, name, contentType, body) if err != nil { return nil, err } @@ -1972,8 +1972,8 @@ func (c *Client) UpdateMonitoringInstance(ctx context.Context, name string, body return c.Client.Do(req) } -func (c *Client) ListNamespaces(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewListNamespacesRequest(c.Server) +func (c *Client) UpdateDatabaseEngine(ctx context.Context, namespace string, name string, body UpdateDatabaseEngineJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewUpdateDatabaseEngineRequest(c.Server, namespace, name, body) if err != nil { return nil, err } @@ -2838,8 +2838,8 @@ func NewListDatabaseClusterRestoresRequest(server string, name string) (*http.Re return req, nil } -// NewListDatabaseEnginesRequest generates requests for ListDatabaseEngines -func NewListDatabaseEnginesRequest(server string) (*http.Request, error) { +// NewListMonitoringInstancesRequest generates requests for ListMonitoringInstances +func NewListMonitoringInstancesRequest(server string) (*http.Request, error) { var err error serverURL, err := url.Parse(server) @@ -2847,7 +2847,7 @@ func NewListDatabaseEnginesRequest(server string) (*http.Request, error) { return nil, err } - operationPath := fmt.Sprintf("/database-engines") + operationPath := fmt.Sprintf("/monitoring-instances") if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -2865,23 +2865,27 @@ func NewListDatabaseEnginesRequest(server string) (*http.Request, error) { return req, nil } -// NewGetDatabaseEngineRequest generates requests for GetDatabaseEngine -func NewGetDatabaseEngineRequest(server string, name string) (*http.Request, error) { - var err error - - var pathParam0 string - - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) +// NewCreateMonitoringInstanceRequest calls the generic CreateMonitoringInstance builder with application/json body +func NewCreateMonitoringInstanceRequest(server string, body CreateMonitoringInstanceJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) if err != nil { return nil, err } + bodyReader = bytes.NewReader(buf) + return NewCreateMonitoringInstanceRequestWithBody(server, "application/json", bodyReader) +} + +// NewCreateMonitoringInstanceRequestWithBody generates requests for CreateMonitoringInstance with any type of body +func NewCreateMonitoringInstanceRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { + var err error serverURL, err := url.Parse(server) if err != nil { return nil, err } - operationPath := fmt.Sprintf("/database-engines/%s", pathParam0) + operationPath := fmt.Sprintf("/monitoring-instances") if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -2891,27 +2895,18 @@ func NewGetDatabaseEngineRequest(server string, name string) (*http.Request, err return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest("POST", queryURL.String(), body) if err != nil { return nil, err } - return req, nil -} + req.Header.Add("Content-Type", contentType) -// NewUpdateDatabaseEngineRequest calls the generic UpdateDatabaseEngine builder with application/json body -func NewUpdateDatabaseEngineRequest(server string, name string, body UpdateDatabaseEngineJSONRequestBody) (*http.Request, error) { - var bodyReader io.Reader - buf, err := json.Marshal(body) - if err != nil { - return nil, err - } - bodyReader = bytes.NewReader(buf) - return NewUpdateDatabaseEngineRequestWithBody(server, name, "application/json", bodyReader) + return req, nil } -// NewUpdateDatabaseEngineRequestWithBody generates requests for UpdateDatabaseEngine with any type of body -func NewUpdateDatabaseEngineRequestWithBody(server string, name string, contentType string, body io.Reader) (*http.Request, error) { +// NewDeleteMonitoringInstanceRequest generates requests for DeleteMonitoringInstance +func NewDeleteMonitoringInstanceRequest(server string, name string) (*http.Request, error) { var err error var pathParam0 string @@ -2926,7 +2921,7 @@ func NewUpdateDatabaseEngineRequestWithBody(server string, name string, contentT return nil, err } - operationPath := fmt.Sprintf("/database-engines/%s", pathParam0) + operationPath := fmt.Sprintf("/monitoring-instances/%s", pathParam0) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -2936,26 +2931,31 @@ func NewUpdateDatabaseEngineRequestWithBody(server string, name string, contentT return nil, err } - req, err := http.NewRequest("PUT", queryURL.String(), body) + req, err := http.NewRequest("DELETE", queryURL.String(), nil) if err != nil { return nil, err } - req.Header.Add("Content-Type", contentType) - return req, nil } -// NewListMonitoringInstancesRequest generates requests for ListMonitoringInstances -func NewListMonitoringInstancesRequest(server string) (*http.Request, error) { +// NewGetMonitoringInstanceRequest generates requests for GetMonitoringInstance +func NewGetMonitoringInstanceRequest(server string, name string) (*http.Request, error) { var err error + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + if err != nil { + return nil, err + } + serverURL, err := url.Parse(server) if err != nil { return nil, err } - operationPath := fmt.Sprintf("/monitoring-instances") + operationPath := fmt.Sprintf("/monitoring-instances/%s", pathParam0) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -2973,27 +2973,34 @@ func NewListMonitoringInstancesRequest(server string) (*http.Request, error) { return req, nil } -// NewCreateMonitoringInstanceRequest calls the generic CreateMonitoringInstance builder with application/json body -func NewCreateMonitoringInstanceRequest(server string, body CreateMonitoringInstanceJSONRequestBody) (*http.Request, error) { +// NewUpdateMonitoringInstanceRequest calls the generic UpdateMonitoringInstance builder with application/json body +func NewUpdateMonitoringInstanceRequest(server string, name string, body UpdateMonitoringInstanceJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader buf, err := json.Marshal(body) if err != nil { return nil, err } bodyReader = bytes.NewReader(buf) - return NewCreateMonitoringInstanceRequestWithBody(server, "application/json", bodyReader) + return NewUpdateMonitoringInstanceRequestWithBody(server, name, "application/json", bodyReader) } -// NewCreateMonitoringInstanceRequestWithBody generates requests for CreateMonitoringInstance with any type of body -func NewCreateMonitoringInstanceRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { +// NewUpdateMonitoringInstanceRequestWithBody generates requests for UpdateMonitoringInstance with any type of body +func NewUpdateMonitoringInstanceRequestWithBody(server string, name string, contentType string, body io.Reader) (*http.Request, error) { var err error + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + if err != nil { + return nil, err + } + serverURL, err := url.Parse(server) if err != nil { return nil, err } - operationPath := fmt.Sprintf("/monitoring-instances") + operationPath := fmt.Sprintf("/monitoring-instances/%s", pathParam0) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -3003,7 +3010,7 @@ func NewCreateMonitoringInstanceRequestWithBody(server string, contentType strin return nil, err } - req, err := http.NewRequest("POST", queryURL.String(), body) + req, err := http.NewRequest("PATCH", queryURL.String(), body) if err != nil { return nil, err } @@ -3013,23 +3020,16 @@ func NewCreateMonitoringInstanceRequestWithBody(server string, contentType strin return req, nil } -// NewDeleteMonitoringInstanceRequest generates requests for DeleteMonitoringInstance -func NewDeleteMonitoringInstanceRequest(server string, name string) (*http.Request, error) { +// NewListNamespacesRequest generates requests for ListNamespaces +func NewListNamespacesRequest(server string) (*http.Request, error) { var err error - var pathParam0 string - - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) - if err != nil { - return nil, err - } - serverURL, err := url.Parse(server) if err != nil { return nil, err } - operationPath := fmt.Sprintf("/monitoring-instances/%s", pathParam0) + operationPath := fmt.Sprintf("/namespaces") if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -3039,7 +3039,7 @@ func NewDeleteMonitoringInstanceRequest(server string, name string) (*http.Reque return nil, err } - req, err := http.NewRequest("DELETE", queryURL.String(), nil) + req, err := http.NewRequest("GET", queryURL.String(), nil) if err != nil { return nil, err } @@ -3047,13 +3047,13 @@ func NewDeleteMonitoringInstanceRequest(server string, name string) (*http.Reque return req, nil } -// NewGetMonitoringInstanceRequest generates requests for GetMonitoringInstance -func NewGetMonitoringInstanceRequest(server string, name string) (*http.Request, error) { +// NewListDatabaseEnginesRequest generates requests for ListDatabaseEngines +func NewListDatabaseEnginesRequest(server string, namespace string) (*http.Request, error) { var err error var pathParam0 string - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "namespace", runtime.ParamLocationPath, namespace) if err != nil { return nil, err } @@ -3063,7 +3063,7 @@ func NewGetMonitoringInstanceRequest(server string, name string) (*http.Request, return nil, err } - operationPath := fmt.Sprintf("/monitoring-instances/%s", pathParam0) + operationPath := fmt.Sprintf("/namespaces/%s/database-engines", pathParam0) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -3081,24 +3081,20 @@ func NewGetMonitoringInstanceRequest(server string, name string) (*http.Request, return req, nil } -// NewUpdateMonitoringInstanceRequest calls the generic UpdateMonitoringInstance builder with application/json body -func NewUpdateMonitoringInstanceRequest(server string, name string, body UpdateMonitoringInstanceJSONRequestBody) (*http.Request, error) { - var bodyReader io.Reader - buf, err := json.Marshal(body) +// NewGetDatabaseEngineRequest generates requests for GetDatabaseEngine +func NewGetDatabaseEngineRequest(server string, namespace string, name string) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "namespace", runtime.ParamLocationPath, namespace) if err != nil { return nil, err } - bodyReader = bytes.NewReader(buf) - return NewUpdateMonitoringInstanceRequestWithBody(server, name, "application/json", bodyReader) -} -// NewUpdateMonitoringInstanceRequestWithBody generates requests for UpdateMonitoringInstance with any type of body -func NewUpdateMonitoringInstanceRequestWithBody(server string, name string, contentType string, body io.Reader) (*http.Request, error) { - var err error + var pathParam1 string - var pathParam0 string - - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + pathParam1, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) if err != nil { return nil, err } @@ -3108,7 +3104,7 @@ func NewUpdateMonitoringInstanceRequestWithBody(server string, name string, cont return nil, err } - operationPath := fmt.Sprintf("/monitoring-instances/%s", pathParam0) + operationPath := fmt.Sprintf("/namespaces/%s/database-engines/%s", pathParam0, pathParam1) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -3118,26 +3114,49 @@ func NewUpdateMonitoringInstanceRequestWithBody(server string, name string, cont return nil, err } - req, err := http.NewRequest("PATCH", queryURL.String(), body) + req, err := http.NewRequest("GET", queryURL.String(), nil) if err != nil { return nil, err } - req.Header.Add("Content-Type", contentType) - return req, nil } -// NewListNamespacesRequest generates requests for ListNamespaces -func NewListNamespacesRequest(server string) (*http.Request, error) { +// NewUpdateDatabaseEngineRequest calls the generic UpdateDatabaseEngine builder with application/json body +func NewUpdateDatabaseEngineRequest(server string, namespace string, name string, body UpdateDatabaseEngineJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewUpdateDatabaseEngineRequestWithBody(server, namespace, name, "application/json", bodyReader) +} + +// NewUpdateDatabaseEngineRequestWithBody generates requests for UpdateDatabaseEngine with any type of body +func NewUpdateDatabaseEngineRequestWithBody(server string, namespace string, name string, contentType string, body io.Reader) (*http.Request, error) { var err error + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "namespace", runtime.ParamLocationPath, namespace) + if err != nil { + return nil, err + } + + var pathParam1 string + + pathParam1, err = runtime.StyleParamWithLocation("simple", false, "name", runtime.ParamLocationPath, name) + if err != nil { + return nil, err + } + serverURL, err := url.Parse(server) if err != nil { return nil, err } - operationPath := fmt.Sprintf("/namespaces") + operationPath := fmt.Sprintf("/namespaces/%s/database-engines/%s", pathParam0, pathParam1) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -3147,11 +3166,13 @@ func NewListNamespacesRequest(server string) (*http.Request, error) { return nil, err } - req, err := http.NewRequest("GET", queryURL.String(), nil) + req, err := http.NewRequest("PUT", queryURL.String(), body) if err != nil { return nil, err } + req.Header.Add("Content-Type", contentType) + return req, nil } @@ -3337,17 +3358,6 @@ type ClientWithResponsesInterface interface { // ListDatabaseClusterRestoresWithResponse request ListDatabaseClusterRestoresWithResponse(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*ListDatabaseClusterRestoresResponse, error) - // ListDatabaseEnginesWithResponse request - ListDatabaseEnginesWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*ListDatabaseEnginesResponse, error) - - // GetDatabaseEngineWithResponse request - GetDatabaseEngineWithResponse(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*GetDatabaseEngineResponse, error) - - // UpdateDatabaseEngineWithBodyWithResponse request with any body - UpdateDatabaseEngineWithBodyWithResponse(ctx context.Context, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateDatabaseEngineResponse, error) - - UpdateDatabaseEngineWithResponse(ctx context.Context, name string, body UpdateDatabaseEngineJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateDatabaseEngineResponse, error) - // ListMonitoringInstancesWithResponse request ListMonitoringInstancesWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*ListMonitoringInstancesResponse, error) @@ -3370,6 +3380,17 @@ type ClientWithResponsesInterface interface { // ListNamespacesWithResponse request ListNamespacesWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*ListNamespacesResponse, error) + // ListDatabaseEnginesWithResponse request + ListDatabaseEnginesWithResponse(ctx context.Context, namespace string, reqEditors ...RequestEditorFn) (*ListDatabaseEnginesResponse, error) + + // GetDatabaseEngineWithResponse request + GetDatabaseEngineWithResponse(ctx context.Context, namespace string, name string, reqEditors ...RequestEditorFn) (*GetDatabaseEngineResponse, error) + + // UpdateDatabaseEngineWithBodyWithResponse request with any body + UpdateDatabaseEngineWithBodyWithResponse(ctx context.Context, namespace string, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateDatabaseEngineResponse, error) + + UpdateDatabaseEngineWithResponse(ctx context.Context, namespace string, name string, body UpdateDatabaseEngineJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateDatabaseEngineResponse, error) + // GetKubernetesClusterResourcesWithResponse request GetKubernetesClusterResourcesWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetKubernetesClusterResourcesResponse, error) @@ -3934,16 +3955,16 @@ func (r ListDatabaseClusterRestoresResponse) StatusCode() int { return 0 } -type ListDatabaseEnginesResponse struct { +type ListMonitoringInstancesResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *DatabaseEngineList + JSON200 *MonitoringInstancesList JSON400 *Error JSON500 *Error } // Status returns HTTPResponse.Status -func (r ListDatabaseEnginesResponse) Status() string { +func (r ListMonitoringInstancesResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -3951,23 +3972,23 @@ func (r ListDatabaseEnginesResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r ListDatabaseEnginesResponse) StatusCode() int { +func (r ListMonitoringInstancesResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type GetDatabaseEngineResponse struct { +type CreateMonitoringInstanceResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *DatabaseEngine + JSON200 *MonitoringInstance JSON400 *Error JSON500 *Error } // Status returns HTTPResponse.Status -func (r GetDatabaseEngineResponse) Status() string { +func (r CreateMonitoringInstanceResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -3975,23 +3996,23 @@ func (r GetDatabaseEngineResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r GetDatabaseEngineResponse) StatusCode() int { +func (r CreateMonitoringInstanceResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type UpdateDatabaseEngineResponse struct { +type DeleteMonitoringInstanceResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *DatabaseEngine JSON400 *Error + JSON404 *Error JSON500 *Error } // Status returns HTTPResponse.Status -func (r UpdateDatabaseEngineResponse) Status() string { +func (r DeleteMonitoringInstanceResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -3999,23 +4020,24 @@ func (r UpdateDatabaseEngineResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r UpdateDatabaseEngineResponse) StatusCode() int { +func (r DeleteMonitoringInstanceResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type ListMonitoringInstancesResponse struct { +type GetMonitoringInstanceResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *MonitoringInstancesList + JSON200 *MonitoringInstance JSON400 *Error + JSON404 *Error JSON500 *Error } // Status returns HTTPResponse.Status -func (r ListMonitoringInstancesResponse) Status() string { +func (r GetMonitoringInstanceResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -4023,23 +4045,24 @@ func (r ListMonitoringInstancesResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r ListMonitoringInstancesResponse) StatusCode() int { +func (r GetMonitoringInstanceResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type CreateMonitoringInstanceResponse struct { +type UpdateMonitoringInstanceResponse struct { Body []byte HTTPResponse *http.Response JSON200 *MonitoringInstance JSON400 *Error + JSON404 *Error JSON500 *Error } // Status returns HTTPResponse.Status -func (r CreateMonitoringInstanceResponse) Status() string { +func (r UpdateMonitoringInstanceResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -4047,23 +4070,21 @@ func (r CreateMonitoringInstanceResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r CreateMonitoringInstanceResponse) StatusCode() int { +func (r UpdateMonitoringInstanceResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type DeleteMonitoringInstanceResponse struct { +type ListNamespacesResponse struct { Body []byte HTTPResponse *http.Response - JSON400 *Error - JSON404 *Error - JSON500 *Error + JSON200 *NamespaceList } // Status returns HTTPResponse.Status -func (r DeleteMonitoringInstanceResponse) Status() string { +func (r ListNamespacesResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -4071,24 +4092,23 @@ func (r DeleteMonitoringInstanceResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r DeleteMonitoringInstanceResponse) StatusCode() int { +func (r ListNamespacesResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type GetMonitoringInstanceResponse struct { +type ListDatabaseEnginesResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *MonitoringInstance + JSON200 *DatabaseEngineList JSON400 *Error - JSON404 *Error JSON500 *Error } // Status returns HTTPResponse.Status -func (r GetMonitoringInstanceResponse) Status() string { +func (r ListDatabaseEnginesResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -4096,24 +4116,23 @@ func (r GetMonitoringInstanceResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r GetMonitoringInstanceResponse) StatusCode() int { +func (r ListDatabaseEnginesResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type UpdateMonitoringInstanceResponse struct { +type GetDatabaseEngineResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *MonitoringInstance + JSON200 *DatabaseEngine JSON400 *Error - JSON404 *Error JSON500 *Error } // Status returns HTTPResponse.Status -func (r UpdateMonitoringInstanceResponse) Status() string { +func (r GetDatabaseEngineResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -4121,21 +4140,23 @@ func (r UpdateMonitoringInstanceResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r UpdateMonitoringInstanceResponse) StatusCode() int { +func (r GetDatabaseEngineResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type ListNamespacesResponse struct { +type UpdateDatabaseEngineResponse struct { Body []byte HTTPResponse *http.Response - JSON200 *NamespaceList + JSON200 *DatabaseEngine + JSON400 *Error + JSON500 *Error } // Status returns HTTPResponse.Status -func (r ListNamespacesResponse) Status() string { +func (r UpdateDatabaseEngineResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -4143,7 +4164,7 @@ func (r ListNamespacesResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r ListNamespacesResponse) StatusCode() int { +func (r UpdateDatabaseEngineResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } @@ -4467,41 +4488,6 @@ func (c *ClientWithResponses) ListDatabaseClusterRestoresWithResponse(ctx contex return ParseListDatabaseClusterRestoresResponse(rsp) } -// ListDatabaseEnginesWithResponse request returning *ListDatabaseEnginesResponse -func (c *ClientWithResponses) ListDatabaseEnginesWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*ListDatabaseEnginesResponse, error) { - rsp, err := c.ListDatabaseEngines(ctx, reqEditors...) - if err != nil { - return nil, err - } - return ParseListDatabaseEnginesResponse(rsp) -} - -// GetDatabaseEngineWithResponse request returning *GetDatabaseEngineResponse -func (c *ClientWithResponses) GetDatabaseEngineWithResponse(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*GetDatabaseEngineResponse, error) { - rsp, err := c.GetDatabaseEngine(ctx, name, reqEditors...) - if err != nil { - return nil, err - } - return ParseGetDatabaseEngineResponse(rsp) -} - -// UpdateDatabaseEngineWithBodyWithResponse request with arbitrary body returning *UpdateDatabaseEngineResponse -func (c *ClientWithResponses) UpdateDatabaseEngineWithBodyWithResponse(ctx context.Context, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateDatabaseEngineResponse, error) { - rsp, err := c.UpdateDatabaseEngineWithBody(ctx, name, contentType, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseUpdateDatabaseEngineResponse(rsp) -} - -func (c *ClientWithResponses) UpdateDatabaseEngineWithResponse(ctx context.Context, name string, body UpdateDatabaseEngineJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateDatabaseEngineResponse, error) { - rsp, err := c.UpdateDatabaseEngine(ctx, name, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseUpdateDatabaseEngineResponse(rsp) -} - // ListMonitoringInstancesWithResponse request returning *ListMonitoringInstancesResponse func (c *ClientWithResponses) ListMonitoringInstancesWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*ListMonitoringInstancesResponse, error) { rsp, err := c.ListMonitoringInstances(ctx, reqEditors...) @@ -4572,6 +4558,41 @@ func (c *ClientWithResponses) ListNamespacesWithResponse(ctx context.Context, re return ParseListNamespacesResponse(rsp) } +// ListDatabaseEnginesWithResponse request returning *ListDatabaseEnginesResponse +func (c *ClientWithResponses) ListDatabaseEnginesWithResponse(ctx context.Context, namespace string, reqEditors ...RequestEditorFn) (*ListDatabaseEnginesResponse, error) { + rsp, err := c.ListDatabaseEngines(ctx, namespace, reqEditors...) + if err != nil { + return nil, err + } + return ParseListDatabaseEnginesResponse(rsp) +} + +// GetDatabaseEngineWithResponse request returning *GetDatabaseEngineResponse +func (c *ClientWithResponses) GetDatabaseEngineWithResponse(ctx context.Context, namespace string, name string, reqEditors ...RequestEditorFn) (*GetDatabaseEngineResponse, error) { + rsp, err := c.GetDatabaseEngine(ctx, namespace, name, reqEditors...) + if err != nil { + return nil, err + } + return ParseGetDatabaseEngineResponse(rsp) +} + +// UpdateDatabaseEngineWithBodyWithResponse request with arbitrary body returning *UpdateDatabaseEngineResponse +func (c *ClientWithResponses) UpdateDatabaseEngineWithBodyWithResponse(ctx context.Context, namespace string, name string, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*UpdateDatabaseEngineResponse, error) { + rsp, err := c.UpdateDatabaseEngineWithBody(ctx, namespace, name, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseUpdateDatabaseEngineResponse(rsp) +} + +func (c *ClientWithResponses) UpdateDatabaseEngineWithResponse(ctx context.Context, namespace string, name string, body UpdateDatabaseEngineJSONRequestBody, reqEditors ...RequestEditorFn) (*UpdateDatabaseEngineResponse, error) { + rsp, err := c.UpdateDatabaseEngine(ctx, namespace, name, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseUpdateDatabaseEngineResponse(rsp) +} + // GetKubernetesClusterResourcesWithResponse request returning *GetKubernetesClusterResourcesResponse func (c *ClientWithResponses) GetKubernetesClusterResourcesWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetKubernetesClusterResourcesResponse, error) { rsp, err := c.GetKubernetesClusterResources(ctx, reqEditors...) @@ -5545,22 +5566,22 @@ func ParseListDatabaseClusterRestoresResponse(rsp *http.Response) (*ListDatabase return response, nil } -// ParseListDatabaseEnginesResponse parses an HTTP response from a ListDatabaseEnginesWithResponse call -func ParseListDatabaseEnginesResponse(rsp *http.Response) (*ListDatabaseEnginesResponse, error) { +// ParseListMonitoringInstancesResponse parses an HTTP response from a ListMonitoringInstancesWithResponse call +func ParseListMonitoringInstancesResponse(rsp *http.Response) (*ListMonitoringInstancesResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &ListDatabaseEnginesResponse{ + response := &ListMonitoringInstancesResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest DatabaseEngineList + var dest MonitoringInstancesList if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -5585,22 +5606,22 @@ func ParseListDatabaseEnginesResponse(rsp *http.Response) (*ListDatabaseEnginesR return response, nil } -// ParseGetDatabaseEngineResponse parses an HTTP response from a GetDatabaseEngineWithResponse call -func ParseGetDatabaseEngineResponse(rsp *http.Response) (*GetDatabaseEngineResponse, error) { +// ParseCreateMonitoringInstanceResponse parses an HTTP response from a CreateMonitoringInstanceWithResponse call +func ParseCreateMonitoringInstanceResponse(rsp *http.Response) (*CreateMonitoringInstanceResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &GetDatabaseEngineResponse{ + response := &CreateMonitoringInstanceResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest DatabaseEngine + var dest MonitoringInstance if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -5625,33 +5646,33 @@ func ParseGetDatabaseEngineResponse(rsp *http.Response) (*GetDatabaseEngineRespo return response, nil } -// ParseUpdateDatabaseEngineResponse parses an HTTP response from a UpdateDatabaseEngineWithResponse call -func ParseUpdateDatabaseEngineResponse(rsp *http.Response) (*UpdateDatabaseEngineResponse, error) { +// ParseDeleteMonitoringInstanceResponse parses an HTTP response from a DeleteMonitoringInstanceWithResponse call +func ParseDeleteMonitoringInstanceResponse(rsp *http.Response) (*DeleteMonitoringInstanceResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &UpdateDatabaseEngineResponse{ + response := &DeleteMonitoringInstanceResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest DatabaseEngine + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 400: + var dest Error if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } - response.JSON200 = &dest + response.JSON400 = &dest - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 400: + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 404: var dest Error if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } - response.JSON400 = &dest + response.JSON404 = &dest case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 500: var dest Error @@ -5665,22 +5686,22 @@ func ParseUpdateDatabaseEngineResponse(rsp *http.Response) (*UpdateDatabaseEngin return response, nil } -// ParseListMonitoringInstancesResponse parses an HTTP response from a ListMonitoringInstancesWithResponse call -func ParseListMonitoringInstancesResponse(rsp *http.Response) (*ListMonitoringInstancesResponse, error) { +// ParseGetMonitoringInstanceResponse parses an HTTP response from a GetMonitoringInstanceWithResponse call +func ParseGetMonitoringInstanceResponse(rsp *http.Response) (*GetMonitoringInstanceResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &ListMonitoringInstancesResponse{ + response := &GetMonitoringInstanceResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest MonitoringInstancesList + var dest MonitoringInstance if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -5693,6 +5714,13 @@ func ParseListMonitoringInstancesResponse(rsp *http.Response) (*ListMonitoringIn } response.JSON400 = &dest + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 404: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON404 = &dest + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 500: var dest Error if err := json.Unmarshal(bodyBytes, &dest); err != nil { @@ -5705,15 +5733,15 @@ func ParseListMonitoringInstancesResponse(rsp *http.Response) (*ListMonitoringIn return response, nil } -// ParseCreateMonitoringInstanceResponse parses an HTTP response from a CreateMonitoringInstanceWithResponse call -func ParseCreateMonitoringInstanceResponse(rsp *http.Response) (*CreateMonitoringInstanceResponse, error) { +// ParseUpdateMonitoringInstanceResponse parses an HTTP response from a UpdateMonitoringInstanceWithResponse call +func ParseUpdateMonitoringInstanceResponse(rsp *http.Response) (*UpdateMonitoringInstanceResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &CreateMonitoringInstanceResponse{ + response := &UpdateMonitoringInstanceResponse{ Body: bodyBytes, HTTPResponse: rsp, } @@ -5733,6 +5761,13 @@ func ParseCreateMonitoringInstanceResponse(rsp *http.Response) (*CreateMonitorin } response.JSON400 = &dest + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 404: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON404 = &dest + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 500: var dest Error if err := json.Unmarshal(bodyBytes, &dest); err != nil { @@ -5745,62 +5780,47 @@ func ParseCreateMonitoringInstanceResponse(rsp *http.Response) (*CreateMonitorin return response, nil } -// ParseDeleteMonitoringInstanceResponse parses an HTTP response from a DeleteMonitoringInstanceWithResponse call -func ParseDeleteMonitoringInstanceResponse(rsp *http.Response) (*DeleteMonitoringInstanceResponse, error) { +// ParseListNamespacesResponse parses an HTTP response from a ListNamespacesWithResponse call +func ParseListNamespacesResponse(rsp *http.Response) (*ListNamespacesResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &DeleteMonitoringInstanceResponse{ + response := &ListNamespacesResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 400: - var dest Error - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSON400 = &dest - - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 404: - var dest Error - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSON404 = &dest - - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 500: - var dest Error + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest NamespaceList if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } - response.JSON500 = &dest - + response.JSON200 = &dest } return response, nil } -// ParseGetMonitoringInstanceResponse parses an HTTP response from a GetMonitoringInstanceWithResponse call -func ParseGetMonitoringInstanceResponse(rsp *http.Response) (*GetMonitoringInstanceResponse, error) { +// ParseListDatabaseEnginesResponse parses an HTTP response from a ListDatabaseEnginesWithResponse call +func ParseListDatabaseEnginesResponse(rsp *http.Response) (*ListDatabaseEnginesResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &GetMonitoringInstanceResponse{ + response := &ListDatabaseEnginesResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest MonitoringInstance + var dest DatabaseEngineList if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -5813,13 +5833,6 @@ func ParseGetMonitoringInstanceResponse(rsp *http.Response) (*GetMonitoringInsta } response.JSON400 = &dest - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 404: - var dest Error - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSON404 = &dest - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 500: var dest Error if err := json.Unmarshal(bodyBytes, &dest); err != nil { @@ -5832,22 +5845,22 @@ func ParseGetMonitoringInstanceResponse(rsp *http.Response) (*GetMonitoringInsta return response, nil } -// ParseUpdateMonitoringInstanceResponse parses an HTTP response from a UpdateMonitoringInstanceWithResponse call -func ParseUpdateMonitoringInstanceResponse(rsp *http.Response) (*UpdateMonitoringInstanceResponse, error) { +// ParseGetDatabaseEngineResponse parses an HTTP response from a GetDatabaseEngineWithResponse call +func ParseGetDatabaseEngineResponse(rsp *http.Response) (*GetDatabaseEngineResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &UpdateMonitoringInstanceResponse{ + response := &GetDatabaseEngineResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest MonitoringInstance + var dest DatabaseEngine if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } @@ -5860,13 +5873,6 @@ func ParseUpdateMonitoringInstanceResponse(rsp *http.Response) (*UpdateMonitorin } response.JSON400 = &dest - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 404: - var dest Error - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSON404 = &dest - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 500: var dest Error if err := json.Unmarshal(bodyBytes, &dest); err != nil { @@ -5879,26 +5885,41 @@ func ParseUpdateMonitoringInstanceResponse(rsp *http.Response) (*UpdateMonitorin return response, nil } -// ParseListNamespacesResponse parses an HTTP response from a ListNamespacesWithResponse call -func ParseListNamespacesResponse(rsp *http.Response) (*ListNamespacesResponse, error) { +// ParseUpdateDatabaseEngineResponse parses an HTTP response from a UpdateDatabaseEngineWithResponse call +func ParseUpdateDatabaseEngineResponse(rsp *http.Response) (*UpdateDatabaseEngineResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &ListNamespacesResponse{ + response := &UpdateDatabaseEngineResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest NamespaceList + var dest DatabaseEngine if err := json.Unmarshal(bodyBytes, &dest); err != nil { return nil, err } response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 400: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON400 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 500: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON500 = &dest + } return response, nil @@ -6092,18 +6113,18 @@ var swaggerSpec = []string{ "LB/Z3zI4WnZ0tKykcK/42NajspYbeF0qu+i1u+mzg/NkoJ/VzpONaKl3Hv5aOmn7TAYieVw5OlBBV1b/", "hiSwgTNkLRl4vSH/XZTwTLXgZ+DoGKj3obwKD6YQ7lVSTrd2LyDXSQ8vw3HRdBB+W2W8DK6Tx3OdVBB5", "m+yXgqgiQaAgF07k2oMz3USNqt2s1ydPaq0H6tqQusrtG6jrMZTMBjZvKa4yqsRakrrglKkxZeNrmhIk", - "SFIQe3mR/C6W24WexEBiG5MY7NtAXFsT1654vSXNVXM6t9cRi156KImXZduByLaL3w5q4iOqiRVc3iya", - "a6/7XktJ5TU9zZvCV5LPadHm0bGtckn6gGU7YdlKWDfRy95H7kerSpBnU5PD9LBK9zl1LTbnyEXnfxZW", - "6m59HxD7Ae2AAgs6cbrD1Wx8xhtibt3R/KyQ9/EcxN14+7z9wwO9bUtvPWljpRgpaxaM3VWtm+n6nrv2", - "/XqK56rXx9RVum6WHfDsQdTiDrA7XEs9wO7OPzvydVeWZQeOJNEHzVA/lNfVhTfsGEsSu/uU3HtzDUNG", - "IkUXBN2SpangXL+rkhESy1pfV3k0R1iOEJ2arg5RlqYf7A2CH/Tf0Fn1S3sPTOxqRNfGCDuroHpuLX4c", - "2bDmKvIOWXHeDYzPl1Tnu+l5IOWdKqN2E91aSu4SHdummnlQriPbzEs7vTW71DvOl1449Vsz18cd3sdV", - "GFfGRff8U8f8GLpO3vU0xdMe6P89Ubvh/vkT4v7A9wfC6uMgSLeiqo5ys157qI9kMR8+a8nyFLqh2YbV", - "umG6Tjf8LLVjBybx38MkNqDi9TqqJjaZ4VVODc2UcJKgsilKocQjXN1j79TxejR+Ljt/RNwuRtnMfdFi", - "vOvXCDtW3ie3tuovznBE1RJqvJaBjKKDnar+XlautXu60r/lqINtuX393+3xol0mdVHeB9mJjO7eq2Mc", - "3RIWuzsh4RqzFrLZSyQfu6q0u8dye3pduSro1sDCKCa5SILDYG9xEGh9we5jc7N0l0s111zUJZDYa8Uq", - "1WwrJ4KtxqKh8WnUvzPn2fd01cw+2arbMtLd6NWFEnaYK6qkn/jnXJyR32WUMhPaP4grcLfBGMfN8u62", - "53p190/vP/1vAAAA//+KCpT/AvQAAA==", + "SFIQe3mR/C6W24WexEBiG5MY7NtAXFsT1654vSXNVXM6t9cRi156KImXZduByLaL3w5q4iOqiRVc7hXN", + "LU8Fjt1laJtRk+c2Wz8heS5Te8ywbtfdbQPiPQjidYDd4VzqAXZ3hPfIeydyUfgUWJlEHzTr+lBeCBPe", + "sGMsSexuLHDvTaHjjESKLgi6JUtTI7F+GxQjJJa1vq7yaI6wHCE6NV0doixNP9g7ej7ov6Gz6pe20nrs", + "qjDWxgg764x57gV8HPfcmss+O7x1593A+Hxha99digMp71R7rJvo1lJyl+jYNpjrQbmOeK6XdnqrYql3", + "nC+9NNm3Zq6PO7yPqzCujBL8/IOzfgxdJ+96+tfSHuj/PVG74f75E+L+wPcHwurjiku3oqqOgm4mgruF", + "ZDEfPmvJ8hS6Ye227g7dMF2nG36W6mwDk/jvYRIbUPF6HZW5u9VXR7twkqCyKUqhiBIUx7dV670ejZ/L", + "zh8Rt+vXw/dG6xbjXb/Gxo4ZXR7+/lS6YAmbUdbDR1Re51z4qNynq9ysp0Wb3py3mGU3v3Wvn5db1Kx1", + "8Ert7pVaiWxNP6jZ9haDWInuFbt205C56WFV7O7Utfi8KD/qFcMolvNnCT7Y3R0o7CEj5wUWdBJXR3Km", + "V7qvo5V6auYXTi6Pl8TZTSnPO4dzoPAH1bU3IHItQcsr/tYWYsYZjqhaQtndUmQXHexUiPmyctPg01Vj", + "LkcdsG/7kszb40W7cu2ivKKzExndVWTHOLolLHbXdMLNci1ks/d6Pnahb3e16PYG3spVQbcGFkZa5iIJ", + "DoO9xUGgxYrdx+Zm6S6Xaq7NbpfTY296qxQYrhzStoJNQ6MtH7s7c4zc01UzIWirbkujstGrkxw7zBVV", + "MoL8cy7KFuwySpmc7h/E1RzcYIzjZsV923O94P6n95/+NwAA//8tOd+llfUAAA==", } // GetSwagger returns the content of the embedded swagger specification file From 56377673148d62dac688fc0123a03cf1c96e5a2b Mon Sep 17 00:00:00 2001 From: Diogo Recharte Date: Tue, 16 Jan 2024 16:26:01 +0000 Subject: [PATCH 6/8] EVEREST-757 Get namespaces from deployment instead of configmap Since this information forceably exists in the deployment spec, there's no need to introduce an extra resource for this. --- api/namespace.go | 2 +- deploy/quickstart-k8s.yaml | 4 ++-- pkg/kubernetes/client/client.go | 9 +++++++ pkg/kubernetes/kubernetes.go | 42 +++++++++++++++++++++++---------- 4 files changed, 42 insertions(+), 15 deletions(-) diff --git a/api/namespace.go b/api/namespace.go index 191f0894..330b2a25 100644 --- a/api/namespace.go +++ b/api/namespace.go @@ -9,7 +9,7 @@ import ( // ListNamespaces returns the current version information. func (e *EverestServer) ListNamespaces(ctx echo.Context) error { - namespaces, err := e.kubeClient.GetPersistedNamespaces(ctx.Request().Context(), e.kubeClient.Namespace()) + namespaces, err := e.kubeClient.GetWatchedNamespaces(ctx.Request().Context(), e.kubeClient.Namespace()) if err != nil { e.l.Error(err) return ctx.JSON(http.StatusInternalServerError, Error{ diff --git a/deploy/quickstart-k8s.yaml b/deploy/quickstart-k8s.yaml index 767f9f5d..762e5fb6 100644 --- a/deploy/quickstart-k8s.yaml +++ b/deploy/quickstart-k8s.yaml @@ -17,8 +17,8 @@ rules: - apiGroups: [""] resources: ["namespaces", "secrets"] verbs: ["*"] - - apiGroups: [""] - resources: ["configmaps"] + - apiGroups: ["apps"] + resources: ["deployments"] verbs: ["get"] --- apiVersion: rbac.authorization.k8s.io/v1 diff --git a/pkg/kubernetes/client/client.go b/pkg/kubernetes/client/client.go index 756c9bfa..30e248f5 100644 --- a/pkg/kubernetes/client/client.go +++ b/pkg/kubernetes/client/client.go @@ -22,6 +22,7 @@ import ( "os" "time" + appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -276,3 +277,11 @@ func (c *Client) helperForGVK(gvk schema.GroupVersionKind) (*resource.Helper, er func (c *Client) GetConfigMap(ctx context.Context, namespace, name string) (*corev1.ConfigMap, error) { return c.clientset.CoreV1().ConfigMaps(namespace).Get(ctx, name, metav1.GetOptions{}) } + +// GetDeployment returns deployment by name. +func (c *Client) GetDeployment(ctx context.Context, name string, namespace string) (*appsv1.Deployment, error) { + if namespace == "" { + namespace = c.namespace + } + return c.clientset.AppsV1().Deployments(namespace).Get(ctx, name, metav1.GetOptions{}) +} diff --git a/pkg/kubernetes/kubernetes.go b/pkg/kubernetes/kubernetes.go index 42faaaa4..49204f11 100644 --- a/pkg/kubernetes/kubernetes.go +++ b/pkg/kubernetes/kubernetes.go @@ -22,6 +22,7 @@ import ( "strings" "go.uber.org/zap" + appsv1 "k8s.io/api/apps/v1" "k8s.io/client-go/rest" "github.com/percona/percona-everest-backend/pkg/kubernetes/client" @@ -42,7 +43,13 @@ const ( // ClusterTypeGeneric is a generic type. ClusterTypeGeneric ClusterType = "generic" - configMapName = "everest-configuration" + // EverestOperatorDeploymentName is the name of the deployment for everest operator. + EverestOperatorDeploymentName = "everest-operator-controller-manager" + + // EverestWatchNamespacesEnvVar is the name of the environment variable. + EverestWatchNamespacesEnvVar = "WATCH_NAMESPACES" + + everestOperatorContainerName = "manager" ) // Kubernetes is a client for Kubernetes. @@ -108,18 +115,29 @@ func (k *Kubernetes) GetClusterType(ctx context.Context) (ClusterType, error) { return ClusterTypeGeneric, nil } -// GetPersistedNamespaces returns list of persisted namespaces. -func (k *Kubernetes) GetPersistedNamespaces(ctx context.Context, namespace string) ([]string, error) { - var namespaces []string - cMap, err := k.client.GetConfigMap(ctx, namespace, configMapName) +// GetWatchedNamespaces returns list of watched namespaces. +func (k *Kubernetes) GetWatchedNamespaces(ctx context.Context, namespace string) ([]string, error) { + deployment, err := k.GetDeployment(ctx, EverestOperatorDeploymentName, namespace) if err != nil { - return namespaces, err + return nil, err } - // FIXME: If we decide to separate the installation and the namespaces this key can be empty/nonexistent - v, ok := cMap.Data["namespaces"] - if !ok { - return namespaces, errors.New("`namespaces` key does not exist in the configmap") + + for _, container := range deployment.Spec.Template.Spec.Containers { + if container.Name != "manager" { + continue + } + for _, envVar := range container.Env { + if envVar.Name != EverestWatchNamespacesEnvVar { + continue + } + return strings.Split(envVar.Value, ","), nil + } } - namespaces = strings.Split(v, ",") - return namespaces, nil + + return nil, errors.New("failed to get watched namespaces") +} + +// GetDeployment returns k8s deployment by provided name and namespace. +func (k *Kubernetes) GetDeployment(ctx context.Context, name, namespace string) (*appsv1.Deployment, error) { + return k.client.GetDeployment(ctx, name, namespace) } From 8829d14dc737c9e19827f8061afd903b3bf54d7e Mon Sep 17 00:00:00 2001 From: Diogo Recharte Date: Tue, 16 Jan 2024 16:27:23 +0000 Subject: [PATCH 7/8] EVEREST-757 autogen --- pkg/kubernetes/client/kubeclient_interface.go | 3 ++ .../client/mock_kube_client_connector.go | 31 +++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/pkg/kubernetes/client/kubeclient_interface.go b/pkg/kubernetes/client/kubeclient_interface.go index e7b2e6bd..5b1047a2 100644 --- a/pkg/kubernetes/client/kubeclient_interface.go +++ b/pkg/kubernetes/client/kubeclient_interface.go @@ -6,6 +6,7 @@ import ( "context" everestv1alpha1 "github.com/percona/everest-operator/api/v1alpha1" + appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" storagev1 "k8s.io/api/storage/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -46,6 +47,8 @@ type KubeClientConnector interface { GetObject(gvk schema.GroupVersionKind, name string, into runtime.Object) error // GetConfigMap fetches the config map in the provided namespace. GetConfigMap(ctx context.Context, namespace, name string) (*corev1.ConfigMap, error) + // GetDeployment returns deployment by name. + GetDeployment(ctx context.Context, name string, namespace string) (*appsv1.Deployment, error) // ListDatabaseClusters returns list of managed database clusters. ListDatabaseClusters(ctx context.Context, options metav1.ListOptions) (*everestv1alpha1.DatabaseClusterList, error) // GetDatabaseCluster returns database clusters by provided name. diff --git a/pkg/kubernetes/client/mock_kube_client_connector.go b/pkg/kubernetes/client/mock_kube_client_connector.go index 66473fac..86d9163d 100644 --- a/pkg/kubernetes/client/mock_kube_client_connector.go +++ b/pkg/kubernetes/client/mock_kube_client_connector.go @@ -7,6 +7,7 @@ import ( v1alpha1 "github.com/percona/everest-operator/api/v1alpha1" mock "github.com/stretchr/testify/mock" + appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" storagev1 "k8s.io/api/storage/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -395,6 +396,36 @@ func (_m *MockKubeClientConnector) GetDatabaseEngine(ctx context.Context, name s return r0, r1 } +// GetDeployment provides a mock function with given fields: ctx, name, namespace +func (_m *MockKubeClientConnector) GetDeployment(ctx context.Context, name string, namespace string) (*appsv1.Deployment, error) { + ret := _m.Called(ctx, name, namespace) + + if len(ret) == 0 { + panic("no return value specified for GetDeployment") + } + + var r0 *appsv1.Deployment + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string) (*appsv1.Deployment, error)); ok { + return rf(ctx, name, namespace) + } + if rf, ok := ret.Get(0).(func(context.Context, string, string) *appsv1.Deployment); ok { + r0 = rf(ctx, name, namespace) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*appsv1.Deployment) + } + } + + if rf, ok := ret.Get(1).(func(context.Context, string, string) error); ok { + r1 = rf(ctx, name, namespace) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // GetMonitoringConfig provides a mock function with given fields: ctx, name func (_m *MockKubeClientConnector) GetMonitoringConfig(ctx context.Context, name string) (*v1alpha1.MonitoringConfig, error) { ret := _m.Called(ctx, name) From 454d7ec5be292e9081f5c9a23c727b0a69b356a0 Mon Sep 17 00:00:00 2001 From: Diogo Recharte Date: Sun, 28 Jan 2024 14:32:31 +0000 Subject: [PATCH 8/8] EVEREST-757 update everest-operator go mod --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index c4396a80..66710231 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( github.com/labstack/echo/v4 v4.11.3 github.com/oapi-codegen/echo-middleware v1.0.1 github.com/oapi-codegen/runtime v1.1.0 - github.com/percona/everest-operator v0.6.0-dev1.0.20240125150540-298621412982 + github.com/percona/everest-operator v0.6.0-dev1.0.20240125162053-e43000fbf0b8 github.com/stretchr/testify v1.8.4 go.uber.org/zap v1.26.0 golang.org/x/crypto v0.17.0 diff --git a/go.sum b/go.sum index 787cab16..51780c77 100644 --- a/go.sum +++ b/go.sum @@ -422,8 +422,8 @@ github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8P github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= -github.com/percona/everest-operator v0.6.0-dev1.0.20240125150540-298621412982 h1:rb3XM3Ce544WoX1Z41E7R0sL4KFEuidn0fYRhHen6Lg= -github.com/percona/everest-operator v0.6.0-dev1.0.20240125150540-298621412982/go.mod h1:o84NcJlAImYMpKK9+PIjS4V8SSREt1uZOqNhHt5qXMg= +github.com/percona/everest-operator v0.6.0-dev1.0.20240125162053-e43000fbf0b8 h1:nXu+L8fCl+vb9i24zqBCA5AjOMeeEGBn6M/KqWlmrCM= +github.com/percona/everest-operator v0.6.0-dev1.0.20240125162053-e43000fbf0b8/go.mod h1:o84NcJlAImYMpKK9+PIjS4V8SSREt1uZOqNhHt5qXMg= github.com/percona/percona-backup-mongodb v1.8.1-0.20230920143330-3b1c2e263901 h1:BDgsZRCjEuxl2/z4yWBqB0s8d20shuIDks7/RVdZiLs= github.com/percona/percona-backup-mongodb v1.8.1-0.20230920143330-3b1c2e263901/go.mod h1:fZRCMpUqkWlLVdRKqqaj001LoVP2eo6F0ZhoMPeXDng= github.com/percona/percona-postgresql-operator v0.0.0-20231220140959-ad5eef722609 h1:+UOK4gcHrRgqjo4smgfwT7/0apF6PhAJdQIdAV4ub/M=