From d7fc2046d7af03e2e83c9ec57f87b5f7191cf3c4 Mon Sep 17 00:00:00 2001 From: Ali <83188384+testA113@users.noreply.github.com> Date: Mon, 12 Jun 2023 09:46:48 +1200 Subject: [PATCH] feat(config): separate configmaps and secrets [EE-5078] (#9029) --- .../kubernetes/configmaps_and_secrets.go | 15 - app/kubernetes/__module.js | 60 +++- .../configurationsDatatable.js | 13 - .../models/application/formValues.js | 6 +- app/kubernetes/react/views/index.ts | 12 +- .../create/createApplication.html | 174 +++++++++- .../create/createApplicationController.js | 102 ++++-- .../configmap/create/createConfigMap.html | 124 +++++++ .../configmap/create/createConfigMap.js | 5 + .../create/createConfigMapController.js | 170 ++++++++++ .../configmap/edit/configMap.html | 173 ++++++++++ .../edit/configMap.js} | 6 +- .../configmap/edit/configMapController.js | 304 ++++++++++++++++++ .../views/configurations/configurations.html | 17 - .../views/configurations/configurations.js | 5 - .../create/createConfiguration.html | 239 -------------- .../create/createConfiguration.js | 5 - .../secret/create/createSecret.html | 229 +++++++++++++ .../secret/create/createSecret.js | 5 + .../create/createSecretController.js} | 42 +-- .../edit/secret.html} | 18 +- .../configurations/secret/edit/secret.js | 8 + .../edit/secretController.js} | 71 ++-- .../views/deploy/deployController.js | 5 + app/portainer/helpers/promise-utils.ts | 6 + app/portainer/react/components/index.ts | 1 + app/portainer/services/axios.ts | 9 +- app/react/.keep | 0 app/react/components/Badge/Badge.tsx | 2 +- .../DashboardItem/DashboardItem.tsx | 8 +- app/react/components/Widget/WidgetTabs.tsx | 66 ++++ .../components/datatables/select-column.tsx | 2 + app/react/kubernetes/.keep | 0 .../ApplicationEnvVarsTable.tsx | 10 +- .../applications/application.queries.ts | 6 +- .../applications/application.service.ts | 13 +- app/react/kubernetes/axiosError.ts | 29 ++ .../ingressClass/ingressClass.service.ts | 10 +- app/react/kubernetes/configs/.keep | 0 app/react/kubernetes/configs/ListView/.keep | 0 .../ConfigMapsDatatable.tsx | 196 +++++++++++ .../ConfigMapsDatatable/columns/created.tsx | 18 ++ .../ConfigMapsDatatable/columns/helper.ts | 5 + .../ConfigMapsDatatable/columns/index.ts | 5 + .../ConfigMapsDatatable/columns/name.tsx | 80 +++++ .../ConfigMapsDatatable/columns/namespace.tsx | 43 +++ .../ListView/ConfigMapsDatatable/index.ts | 1 + .../ListView/ConfigMapsDatatable/types.ts | 5 + .../ListView/ConfigMapsDatatable/utils.ts | 29 ++ .../ListView/ConfigmapsAndSecretsView.tsx | 43 +++ .../SecretsDatatable/SecretsDatatable.tsx | 192 +++++++++++ .../SecretsDatatable/columns/created.tsx | 18 ++ .../SecretsDatatable/columns/helper.ts | 5 + .../SecretsDatatable/columns/index.ts | 5 + .../SecretsDatatable/columns/name.tsx | 83 +++++ .../SecretsDatatable/columns/namespace.tsx | 43 +++ .../ListView/SecretsDatatable/index.ts | 1 + .../ListView/SecretsDatatable/types.ts | 5 + .../ListView/SecretsDatatable/utils.ts | 26 ++ .../kubernetes/configs/ListView/index.ts | 1 + .../kubernetes/configs/configmap.service.ts | 163 ++++++++++ app/react/kubernetes/configs/queries.ts | 10 +- .../kubernetes/configs/secret.service.ts | 156 +++++++++ app/react/kubernetes/configs/types.ts | 5 +- .../DashboardView.tsx | 75 ++++- .../EnvironmentInfo.tsx | 0 .../{DashboardView => dashboard}/index.ts | 0 .../SystemResourceDescription.tsx} | 2 +- .../default-kube-datatable-store.ts | 13 + .../CreateIngressView/IngressForm.tsx | 12 +- .../IngressDatatable/IngressDatatable.tsx | 6 +- .../IngressDatatable/columns/ingressRules.tsx | 41 +-- .../ingresses/IngressDatatable/index.tsx | 2 +- app/react/kubernetes/ingresses/queries.ts | 7 +- app/react/kubernetes/namespaces/queries.ts | 11 +- .../ServicesDatatable/ServicesDatatable.tsx | 41 ++- .../columns/ExternalIPLink.tsx | 0 .../ServicesDatatable/columns/application.tsx | 2 +- .../ServicesDatatable/columns/clusterIP.tsx | 0 .../ServicesDatatable/columns/created.tsx | 0 .../ServicesDatatable/columns/externalIP.tsx | 2 +- .../ServicesDatatable/columns/helper.ts | 2 +- .../ServicesDatatable/columns/index.tsx | 0 .../ServicesDatatable/columns/name.tsx | 2 +- .../ServicesDatatable/columns/namespace.tsx | 2 +- .../ServicesDatatable/columns/ports.tsx | 0 .../ServicesDatatable/columns/targetPorts.tsx | 0 .../ServicesDatatable/columns/type.tsx | 2 +- .../ServicesDatatable/datatable-store.ts | 2 +- .../ServicesView/ServicesDatatable/index.tsx | 0 .../ServicesView/ServicesView.tsx | 2 +- .../{ => services}/ServicesView/index.ts | 0 app/react/kubernetes/services/readme.md | 5 - .../{ServicesView => services}/service.ts | 68 ++-- .../{ServicesView => services}/types.ts | 0 app/react/kubernetes/services/types/index.ts | 11 - .../services/types/v1IngressClass.ts | 48 --- .../kubernetes/services/types/v1ObjectMeta.ts | 33 -- app/react/kubernetes/volumes/queries.ts | 4 +- app/react/kubernetes/volumes/service.ts | 5 +- .../KubeconfigButton/KubeconfigPrompt.tsx | 2 +- .../KubeconfigButton}/kubeconfig.service.ts | 0 102 files changed, 2845 insertions(+), 665 deletions(-) delete mode 100644 app/kubernetes/components/datatables/configurations-datatable/configurationsDatatable.js create mode 100644 app/kubernetes/views/configurations/configmap/create/createConfigMap.html create mode 100644 app/kubernetes/views/configurations/configmap/create/createConfigMap.js create mode 100644 app/kubernetes/views/configurations/configmap/create/createConfigMapController.js create mode 100644 app/kubernetes/views/configurations/configmap/edit/configMap.html rename app/kubernetes/views/configurations/{edit/configuration.js => configmap/edit/configMap.js} (55%) create mode 100644 app/kubernetes/views/configurations/configmap/edit/configMapController.js delete mode 100644 app/kubernetes/views/configurations/configurations.html delete mode 100644 app/kubernetes/views/configurations/configurations.js delete mode 100644 app/kubernetes/views/configurations/create/createConfiguration.html delete mode 100644 app/kubernetes/views/configurations/create/createConfiguration.js create mode 100644 app/kubernetes/views/configurations/secret/create/createSecret.html create mode 100644 app/kubernetes/views/configurations/secret/create/createSecret.js rename app/kubernetes/views/configurations/{create/createConfigurationController.js => secret/create/createSecretController.js} (86%) rename app/kubernetes/views/configurations/{edit/configuration.html => secret/edit/secret.html} (93%) create mode 100644 app/kubernetes/views/configurations/secret/edit/secret.js rename app/kubernetes/views/configurations/{edit/configurationController.js => secret/edit/secretController.js} (81%) delete mode 100644 app/react/.keep create mode 100644 app/react/components/Widget/WidgetTabs.tsx delete mode 100644 app/react/kubernetes/.keep create mode 100644 app/react/kubernetes/axiosError.ts delete mode 100644 app/react/kubernetes/configs/.keep delete mode 100644 app/react/kubernetes/configs/ListView/.keep create mode 100644 app/react/kubernetes/configs/ListView/ConfigMapsDatatable/ConfigMapsDatatable.tsx create mode 100644 app/react/kubernetes/configs/ListView/ConfigMapsDatatable/columns/created.tsx create mode 100644 app/react/kubernetes/configs/ListView/ConfigMapsDatatable/columns/helper.ts create mode 100644 app/react/kubernetes/configs/ListView/ConfigMapsDatatable/columns/index.ts create mode 100644 app/react/kubernetes/configs/ListView/ConfigMapsDatatable/columns/name.tsx create mode 100644 app/react/kubernetes/configs/ListView/ConfigMapsDatatable/columns/namespace.tsx create mode 100644 app/react/kubernetes/configs/ListView/ConfigMapsDatatable/index.ts create mode 100644 app/react/kubernetes/configs/ListView/ConfigMapsDatatable/types.ts create mode 100644 app/react/kubernetes/configs/ListView/ConfigMapsDatatable/utils.ts create mode 100644 app/react/kubernetes/configs/ListView/ConfigmapsAndSecretsView.tsx create mode 100644 app/react/kubernetes/configs/ListView/SecretsDatatable/SecretsDatatable.tsx create mode 100644 app/react/kubernetes/configs/ListView/SecretsDatatable/columns/created.tsx create mode 100644 app/react/kubernetes/configs/ListView/SecretsDatatable/columns/helper.ts create mode 100644 app/react/kubernetes/configs/ListView/SecretsDatatable/columns/index.ts create mode 100644 app/react/kubernetes/configs/ListView/SecretsDatatable/columns/name.tsx create mode 100644 app/react/kubernetes/configs/ListView/SecretsDatatable/columns/namespace.tsx create mode 100644 app/react/kubernetes/configs/ListView/SecretsDatatable/index.ts create mode 100644 app/react/kubernetes/configs/ListView/SecretsDatatable/types.ts create mode 100644 app/react/kubernetes/configs/ListView/SecretsDatatable/utils.ts create mode 100644 app/react/kubernetes/configs/ListView/index.ts create mode 100644 app/react/kubernetes/configs/configmap.service.ts create mode 100644 app/react/kubernetes/configs/secret.service.ts rename app/react/kubernetes/{DashboardView => dashboard}/DashboardView.tsx (53%) rename app/react/kubernetes/{DashboardView => dashboard}/EnvironmentInfo.tsx (100%) rename app/react/kubernetes/{DashboardView => dashboard}/index.ts (100%) rename app/react/kubernetes/{ServicesView/ServicesDatatable/ServicesDatatableDescription.tsx => datatables/SystemResourceDescription.tsx} (81%) create mode 100644 app/react/kubernetes/datatables/default-kube-datatable-store.ts rename app/react/kubernetes/{ => services}/ServicesView/ServicesDatatable/ServicesDatatable.tsx (79%) rename app/react/kubernetes/{ => services}/ServicesView/ServicesDatatable/columns/ExternalIPLink.tsx (100%) rename app/react/kubernetes/{ => services}/ServicesView/ServicesDatatable/columns/application.tsx (95%) rename app/react/kubernetes/{ => services}/ServicesView/ServicesDatatable/columns/clusterIP.tsx (100%) rename app/react/kubernetes/{ => services}/ServicesView/ServicesDatatable/columns/created.tsx (100%) rename app/react/kubernetes/{ => services}/ServicesView/ServicesDatatable/columns/externalIP.tsx (98%) rename app/react/kubernetes/{ => services}/ServicesView/ServicesDatatable/columns/helper.ts (74%) rename app/react/kubernetes/{ => services}/ServicesView/ServicesDatatable/columns/index.tsx (100%) rename app/react/kubernetes/{ => services}/ServicesView/ServicesDatatable/columns/name.tsx (98%) rename app/react/kubernetes/{ => services}/ServicesView/ServicesDatatable/columns/namespace.tsx (95%) rename app/react/kubernetes/{ => services}/ServicesView/ServicesDatatable/columns/ports.tsx (100%) rename app/react/kubernetes/{ => services}/ServicesView/ServicesDatatable/columns/targetPorts.tsx (100%) rename app/react/kubernetes/{ => services}/ServicesView/ServicesDatatable/columns/type.tsx (91%) rename app/react/kubernetes/{ => services}/ServicesView/ServicesDatatable/datatable-store.ts (86%) rename app/react/kubernetes/{ => services}/ServicesView/ServicesDatatable/index.tsx (100%) rename app/react/kubernetes/{ => services}/ServicesView/ServicesView.tsx (76%) rename app/react/kubernetes/{ => services}/ServicesView/index.ts (100%) delete mode 100644 app/react/kubernetes/services/readme.md rename app/react/kubernetes/{ServicesView => services}/service.ts (85%) rename app/react/kubernetes/{ServicesView => services}/types.ts (100%) delete mode 100644 app/react/kubernetes/services/types/index.ts delete mode 100644 app/react/kubernetes/services/types/v1IngressClass.ts delete mode 100644 app/react/kubernetes/services/types/v1ObjectMeta.ts rename app/react/{kubernetes/services => portainer/HomeView/EnvironmentList/KubeconfigButton}/kubeconfig.service.ts (100%) diff --git a/api/http/handler/kubernetes/configmaps_and_secrets.go b/api/http/handler/kubernetes/configmaps_and_secrets.go index 11f9a5605..fc2580875 100644 --- a/api/http/handler/kubernetes/configmaps_and_secrets.go +++ b/api/http/handler/kubernetes/configmaps_and_secrets.go @@ -9,21 +9,6 @@ import ( "github.com/portainer/libhttp/response" ) -// @id getKubernetesConfigMapsAndSecrets -// @summary Get ConfigMaps and Secrets -// @description Get all ConfigMaps and Secrets for a given namespace -// @description **Access policy**: authenticated -// @tags kubernetes -// @security ApiKeyAuth -// @security jwt -// @accept json -// @produce json -// @param id path int true "Environment (Endpoint) identifier" -// @param namespace path string true "Namespace name" -// @success 200 {array} kubernetes.K8sConfigMapOrSecret "Success" -// @failure 400 "Invalid request" -// @failure 500 "Server error" -// @router /kubernetes/{id}/namespaces/{namespace}/configuration [get] func (handler *Handler) getKubernetesConfigMapsAndSecrets(w http.ResponseWriter, r *http.Request) *httperror.HandlerError { endpointID, err := request.RetrieveNumericRouteVariableValue(r, "id") if err != nil { diff --git a/app/kubernetes/__module.js b/app/kubernetes/__module.js index 9ccdbcc8a..86fc7dc8a 100644 --- a/app/kubernetes/__module.js +++ b/app/kubernetes/__module.js @@ -223,30 +223,64 @@ angular.module('portainer.kubernetes', ['portainer.app', registriesModule, custo const configurations = { name: 'kubernetes.configurations', - url: '/configurations', + url: '/configurations?tab', views: { 'content@': { - component: 'kubernetesConfigurationsView', + component: 'kubernetesConfigMapsAndSecretsView', }, }, + params: { + tab: null, + }, + }; + const configmaps = { + name: 'kubernetes.configmaps', + url: '/configmaps', + abstract: true, }; - const configurationCreation = { - name: 'kubernetes.configurations.new', + const configMapCreation = { + name: 'kubernetes.configmaps.new', url: '/new', views: { 'content@': { - component: 'kubernetesCreateConfigurationView', + component: 'kubernetesCreateConfigMapView', }, }, }; - const configuration = { - name: 'kubernetes.configurations.configuration', + const configMap = { + name: 'kubernetes.configmaps.configmap', url: '/:namespace/:name', views: { 'content@': { - component: 'kubernetesConfigurationView', + component: 'kubernetesConfigMapView', + }, + }, + }; + + const secrets = { + name: 'kubernetes.secrets', + url: '/secrets', + abstract: true, + }; + + const secretCreation = { + name: 'kubernetes.secrets.new', + url: '/new', + views: { + 'content@': { + component: 'kubernetesCreateSecretView', + }, + }, + }; + + const secret = { + name: 'kubernetes.secrets.secret', + url: '/:namespace/:name', + views: { + 'content@': { + component: 'kubernetesSecretView', }, }, }; @@ -293,7 +327,7 @@ angular.module('portainer.kubernetes', ['portainer.app', registriesModule, custo const deploy = { name: 'kubernetes.deploy', - url: '/deploy?templateId&referrer', + url: '/deploy?templateId&referrer&tab', views: { 'content@': { component: 'kubernetesDeployView', @@ -418,8 +452,12 @@ angular.module('portainer.kubernetes', ['portainer.app', registriesModule, custo $stateRegistryProvider.register(stack); $stateRegistryProvider.register(stackLogs); $stateRegistryProvider.register(configurations); - $stateRegistryProvider.register(configurationCreation); - $stateRegistryProvider.register(configuration); + $stateRegistryProvider.register(configmaps); + $stateRegistryProvider.register(configMapCreation); + $stateRegistryProvider.register(secrets); + $stateRegistryProvider.register(secretCreation); + $stateRegistryProvider.register(configMap); + $stateRegistryProvider.register(secret); $stateRegistryProvider.register(cluster); $stateRegistryProvider.register(dashboard); $stateRegistryProvider.register(deploy); diff --git a/app/kubernetes/components/datatables/configurations-datatable/configurationsDatatable.js b/app/kubernetes/components/datatables/configurations-datatable/configurationsDatatable.js deleted file mode 100644 index bf68244e0..000000000 --- a/app/kubernetes/components/datatables/configurations-datatable/configurationsDatatable.js +++ /dev/null @@ -1,13 +0,0 @@ -angular.module('portainer.kubernetes').component('kubernetesConfigurationsDatatable', { - templateUrl: './configurationsDatatable.html', - controller: 'KubernetesConfigurationsDatatableController', - bindings: { - titleText: '@', - titleIcon: '@', - dataset: '<', - tableKey: '@', - orderBy: '@', - refreshCallback: '<', - removeAction: '<', - }, -}); diff --git a/app/kubernetes/models/application/formValues.js b/app/kubernetes/models/application/formValues.js index 3b6a30bac..692bc84ef 100644 --- a/app/kubernetes/models/application/formValues.js +++ b/app/kubernetes/models/application/formValues.js @@ -1,5 +1,5 @@ import { PorImageRegistryModel } from '@/docker/models/porImageRegistry'; -import { KubernetesApplicationDataAccessPolicies, KubernetesApplicationDeploymentTypes, KubernetesApplicationPublishingTypes, KubernetesApplicationPlacementTypes } from './models'; +import { KubernetesApplicationDataAccessPolicies, KubernetesApplicationDeploymentTypes, KubernetesApplicationPlacementTypes } from './models'; /** * KubernetesApplicationFormValues Model @@ -22,8 +22,8 @@ export function KubernetesApplicationFormValues() { this.EnvironmentVariables = []; // KubernetesApplicationEnvironmentVariableFormValue lis; this.DataAccessPolicy = KubernetesApplicationDataAccessPolicies.ISOLATED; this.PersistedFolders = []; // KubernetesApplicationPersistedFolderFormValue lis; - this.Configurations = []; // KubernetesApplicationConfigurationFormValue lis; - this.PublishingType = KubernetesApplicationPublishingTypes.CLUSTER_IP; + this.ConfigMaps = []; + this.Secrets = []; this.PublishedPorts = []; // KubernetesApplicationPublishedPortFormValue lis; this.PlacementType = KubernetesApplicationPlacementTypes.PREFERRED; this.Placements = []; // KubernetesApplicationPlacementFormValue lis; diff --git a/app/kubernetes/react/views/index.ts b/app/kubernetes/react/views/index.ts index 59d9699ae..981d6ef3d 100644 --- a/app/kubernetes/react/views/index.ts +++ b/app/kubernetes/react/views/index.ts @@ -6,9 +6,10 @@ import { withReactQuery } from '@/react-tools/withReactQuery'; import { withUIRouter } from '@/react-tools/withUIRouter'; import { IngressesDatatableView } from '@/react/kubernetes/ingresses/IngressDatatable'; import { CreateIngressView } from '@/react/kubernetes/ingresses/CreateIngressView'; -import { DashboardView } from '@/react/kubernetes/DashboardView'; -import { ServicesView } from '@/react/kubernetes/ServicesView'; +import { DashboardView } from '@/react/kubernetes/dashboard/DashboardView'; +import { ServicesView } from '@/react/kubernetes/services/ServicesView'; import { ConsoleView } from '@/react/kubernetes/applications/ConsoleView'; +import { ConfigmapsAndSecretsView } from '@/react/kubernetes/configs/ListView/ConfigmapsAndSecretsView'; export const viewsModule = angular .module('portainer.kubernetes.react.views', []) @@ -27,6 +28,13 @@ export const viewsModule = angular 'kubernetesIngressesCreateView', r2a(withUIRouter(withReactQuery(withCurrentUser(CreateIngressView))), []) ) + .component( + 'kubernetesConfigMapsAndSecretsView', + r2a( + withUIRouter(withReactQuery(withCurrentUser(ConfigmapsAndSecretsView))), + [] + ) + ) .component( 'kubernetesDashboardView', r2a(withUIRouter(withReactQuery(withCurrentUser(DashboardView))), []) diff --git a/app/kubernetes/views/applications/create/createApplication.html b/app/kubernetes/views/applications/create/createApplication.html index cb77338f0..b643556be 100644 --- a/app/kubernetes/views/applications/create/createApplication.html +++ b/app/kubernetes/views/applications/create/createApplication.html @@ -349,28 +349,28 @@ - +
- +
-
+
- Portainer will automatically expose all the keys of a ConfigMap or Secret as environment variables. This behavior can be overridden to filesystem mounts for - each key via the override option. + Portainer will automatically expose all the keys of a ConfigMap as environment variables. This behavior can be overridden to filesystem mounts for each key + via the override option.
-
+
name @@ -380,7 +380,7 @@