diff --git a/api/database_cluster.go b/api/database_cluster.go index 5a5e1930..93840a28 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..44af1368 100644 --- a/api/database_engine.go +++ b/api/database_engine.go @@ -18,17 +18,21 @@ package api import "github.com/labstack/echo/v4" -// ListDatabaseEngines List of the available database engines on the specified kubernetes cluster. -func (e *EverestServer) ListDatabaseEngines(ctx echo.Context) error { - return e.proxyKubernetes(ctx, "") +const ( + databaseEngineKind = "databaseengines" +) + +// 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, 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, 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/api/everest-server.gen.go b/api/everest-server.gen.go index 1addc1e1..26522dd1 100644 --- a/api/everest-server.gen.go +++ b/api/everest-server.gen.go @@ -702,6 +702,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"` @@ -826,15 +829,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 +1343,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 @@ -1364,6 +1358,18 @@ 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 + // 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 @@ -1689,17 +1695,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 @@ -1710,12 +1725,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 @@ -1726,47 +1741,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 @@ -1776,13 +1806,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 @@ -1792,7 +1830,7 @@ func (w *ServerInterfaceWrapper) UpdateMonitoringInstance(ctx echo.Context) erro } // Invoke the callback with all the unmarshaled arguments - err = w.Handler.UpdateMonitoringInstance(ctx, name) + err = w.Handler.UpdateDatabaseEngine(ctx, namespace, name) return err } @@ -1864,152 +1902,155 @@ 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) } // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", + "//S/AQAA//+OeR6A7fUAAA==", } // GetSwagger returns the content of the embedded swagger specification file 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/namespace.go b/api/namespace.go new file mode 100644 index 00000000..330b2a25 --- /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.GetWatchedNamespaces(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/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 } diff --git a/client/everest-client.gen.go b/client/everest-client.gen.go index 431934a0..710c863d 100644 --- a/client/everest-client.gen.go +++ b/client/everest-client.gen.go @@ -703,6 +703,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"` @@ -827,15 +830,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 +1431,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) @@ -1458,6 +1450,20 @@ 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) + + // 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) @@ -1837,8 +1843,20 @@ 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 + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + 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) if err != nil { return nil, err } @@ -1849,8 +1867,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) CreateMonitoringInstance(ctx context.Context, body CreateMonitoringInstanceJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewCreateMonitoringInstanceRequest(c.Server, body) if err != nil { return nil, err } @@ -1861,8 +1879,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) DeleteMonitoringInstance(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewDeleteMonitoringInstanceRequest(c.Server, name) if err != nil { return nil, err } @@ -1873,8 +1891,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) GetMonitoringInstance(ctx context.Context, name string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewGetMonitoringInstanceRequest(c.Server, name) if err != nil { return nil, err } @@ -1885,8 +1903,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) 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 } @@ -1897,8 +1915,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) 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 } @@ -1909,8 +1927,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) ListNamespaces(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewListNamespacesRequest(c.Server) if err != nil { return nil, err } @@ -1921,8 +1939,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) ListDatabaseEngines(ctx context.Context, namespace string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewListDatabaseEnginesRequest(c.Server, namespace) if err != nil { return nil, err } @@ -1933,8 +1951,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) 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 } @@ -1945,8 +1963,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) 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 } @@ -1957,8 +1975,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) 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 } @@ -2823,8 +2841,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) @@ -2832,7 +2850,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 } @@ -2850,23 +2868,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 } @@ -2876,27 +2898,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 @@ -2911,7 +2924,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 } @@ -2921,26 +2934,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 } @@ -2958,27 +2976,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 } @@ -2988,7 +3013,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 } @@ -2998,13 +3023,40 @@ 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 + + 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 +} + +// 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 } @@ -3014,7 +3066,7 @@ func NewDeleteMonitoringInstanceRequest(server string, name string) (*http.Reque return nil, err } - operationPath := fmt.Sprintf("/monitoring-instances/%s", pathParam0) + operationPath := fmt.Sprintf("/namespaces/%s/database-engines", pathParam0) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -3024,7 +3076,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 } @@ -3032,13 +3084,20 @@ 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) { +// 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, "name", runtime.ParamLocationPath, name) + 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 } @@ -3048,7 +3107,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/%s", pathParam0, pathParam1) if operationPath[0] == '/' { operationPath = "." + operationPath } @@ -3066,24 +3125,31 @@ 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) { +// 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 NewUpdateMonitoringInstanceRequestWithBody(server, name, "application/json", bodyReader) + return NewUpdateDatabaseEngineRequestWithBody(server, namespace, 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) { +// 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, "name", runtime.ParamLocationPath, name) + 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 } @@ -3093,7 +3159,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 } @@ -3103,7 +3169,7 @@ func NewUpdateMonitoringInstanceRequestWithBody(server string, name string, cont return nil, err } - req, err := http.NewRequest("PATCH", queryURL.String(), body) + req, err := http.NewRequest("PUT", queryURL.String(), body) if err != nil { return nil, err } @@ -3295,17 +3361,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) @@ -3325,6 +3380,20 @@ 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) + + // 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) @@ -3889,16 +3958,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 } @@ -3906,23 +3975,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 } @@ -3930,23 +3999,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 } @@ -3954,23 +4023,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 } @@ -3978,23 +4048,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 } @@ -4002,23 +4073,45 @@ 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 + 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 ListDatabaseEnginesResponse struct { Body []byte HTTPResponse *http.Response + JSON200 *DatabaseEngineList JSON400 *Error - JSON404 *Error JSON500 *Error } // Status returns HTTPResponse.Status -func (r DeleteMonitoringInstanceResponse) Status() string { +func (r ListDatabaseEnginesResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -4026,24 +4119,23 @@ func (r DeleteMonitoringInstanceResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r DeleteMonitoringInstanceResponse) StatusCode() int { +func (r ListDatabaseEnginesResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type GetMonitoringInstanceResponse 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 GetMonitoringInstanceResponse) Status() string { +func (r GetDatabaseEngineResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -4051,24 +4143,23 @@ func (r GetMonitoringInstanceResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r GetMonitoringInstanceResponse) StatusCode() int { +func (r GetDatabaseEngineResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } return 0 } -type UpdateMonitoringInstanceResponse struct { +type UpdateDatabaseEngineResponse 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 UpdateDatabaseEngineResponse) Status() string { if r.HTTPResponse != nil { return r.HTTPResponse.Status } @@ -4076,7 +4167,7 @@ func (r UpdateMonitoringInstanceResponse) Status() string { } // StatusCode returns HTTPResponse.StatusCode -func (r UpdateMonitoringInstanceResponse) StatusCode() int { +func (r UpdateDatabaseEngineResponse) StatusCode() int { if r.HTTPResponse != nil { return r.HTTPResponse.StatusCode } @@ -4400,41 +4491,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...) @@ -4496,6 +4552,50 @@ 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) +} + +// 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...) @@ -5469,22 +5569,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 } @@ -5509,22 +5609,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 } @@ -5549,33 +5649,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 @@ -5589,22 +5689,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 } @@ -5617,6 +5717,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 { @@ -5629,15 +5736,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, } @@ -5657,6 +5764,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 { @@ -5669,33 +5783,58 @@ 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 + 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.JSON400 = &dest + response.JSON200 = &dest + } - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 404: + return response, nil +} + +// 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 := &ListDatabaseEnginesResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest DatabaseEngineList + 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.JSON404 = &dest + response.JSON400 = &dest case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 500: var dest Error @@ -5709,22 +5848,22 @@ func ParseDeleteMonitoringInstanceResponse(rsp *http.Response) (*DeleteMonitorin return response, nil } -// ParseGetMonitoringInstanceResponse parses an HTTP response from a GetMonitoringInstanceWithResponse call -func ParseGetMonitoringInstanceResponse(rsp *http.Response) (*GetMonitoringInstanceResponse, 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 := &GetMonitoringInstanceResponse{ + 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 } @@ -5737,13 +5876,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 { @@ -5756,22 +5888,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) { +// 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 := &UpdateMonitoringInstanceResponse{ + response := &UpdateDatabaseEngineResponse{ 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 } @@ -5784,13 +5916,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 { @@ -5870,138 +5995,140 @@ func ParseVersionInfoResponse(rsp *http.Response) (*VersionInfoResponse, error) // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", + "//S/AQAA//+OeR6A7fUAAA==", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/deploy/quickstart-k8s.yaml b/deploy/quickstart-k8s.yaml index e7c9ebb2..762e5fb6 100644 --- a/deploy/quickstart-k8s.yaml +++ b/deploy/quickstart-k8s.yaml @@ -17,6 +17,9 @@ rules: - apiGroups: [""] resources: ["namespaces", "secrets"] verbs: ["*"] + - apiGroups: ["apps"] + resources: ["deployments"] + verbs: ["get"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole diff --git a/docs/spec/openapi.yml b/docs/spec/openapi.yml index 509caa16..ef28f06a 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 @@ -423,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 @@ -449,7 +468,7 @@ paths: application/json: schema: $ref: '#/components/schemas/Error' - '/database-engines/{name}': + '/namespaces/{namespace}/database-engines/{name}': get: tags: - databaseEngine @@ -457,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 @@ -489,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 @@ -1155,6 +1186,10 @@ components: properties: message: type: string + NamespaceList: + type: array + items: + type: string CreateBackupStorageParams: type: object description: Backup storage parameters 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= diff --git a/pkg/kubernetes/client/client.go b/pkg/kubernetes/client/client.go index 1041525e..30e248f5 100644 --- a/pkg/kubernetes/client/client.go +++ b/pkg/kubernetes/client/client.go @@ -17,10 +17,13 @@ package client import ( + "context" "errors" "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" "k8s.io/apimachinery/pkg/runtime" @@ -269,3 +272,16 @@ 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{}) +} + +// 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/client/kubeclient_interface.go b/pkg/kubernetes/client/kubeclient_interface.go index 0fa4b29f..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" @@ -44,6 +45,10 @@ 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) + // 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 c040af08..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" @@ -245,6 +246,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) @@ -365,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) diff --git a/pkg/kubernetes/kubernetes.go b/pkg/kubernetes/kubernetes.go index 5872f277..49204f11 100644 --- a/pkg/kubernetes/kubernetes.go +++ b/pkg/kubernetes/kubernetes.go @@ -18,9 +18,11 @@ package kubernetes import ( "context" + "errors" "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" @@ -40,6 +42,14 @@ const ( ClusterTypeEKS ClusterType = "eks" // ClusterTypeGeneric is a generic type. ClusterTypeGeneric ClusterType = "generic" + + // 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. @@ -104,3 +114,30 @@ func (k *Kubernetes) GetClusterType(ctx context.Context) (ClusterType, error) { } return ClusterTypeGeneric, nil } + +// 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 nil, err + } + + 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 + } + } + + 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) +}