diff --git a/app/kubernetes/components/kubernetes-sidebar/kubernetes-sidebar.html b/app/kubernetes/components/kubernetes-sidebar/kubernetes-sidebar.html index e706d8069..86fcfec57 100644 --- a/app/kubernetes/components/kubernetes-sidebar/kubernetes-sidebar.html +++ b/app/kubernetes/components/kubernetes-sidebar/kubernetes-sidebar.html @@ -28,7 +28,13 @@ Namespaces - + Helm @@ -62,12 +68,12 @@ path="kubernetes.cluster" path-params="{ endpointId: $ctrl.endpointId }" is-sidebar-open="$ctrl.isSidebarOpen" - children-paths="['kubernetes.cluster', 'portainer.endpoints.endpoint.kubernetesConfig', 'kubernetes.registries', 'kubernetes.registries.access']" + children-paths="['kubernetes.cluster', 'portainer.k8sendpoint.kubernetesConfig', 'kubernetes.registries', 'kubernetes.registries.access']" >

Server metrics features must be enabled in the - environment configuration view. + environment configuration view.

diff --git a/app/kubernetes/views/configure/configure.html b/app/kubernetes/views/configure/configure.html index 0eb4c342c..e1cf3124a 100644 --- a/app/kubernetes/views/configure/configure.html +++ b/app/kubernetes/views/configure/configure.html @@ -1,4 +1,4 @@ - + Environment > {{ ctrl.endpoint.Name }} > Kubernetes configuration diff --git a/app/kubernetes/views/resource-pools/create/createResourcePool.html b/app/kubernetes/views/resource-pools/create/createResourcePool.html index 4ab2b8c84..4ef095823 100644 --- a/app/kubernetes/views/resource-pools/create/createResourcePool.html +++ b/app/kubernetes/views/resource-pools/create/createResourcePool.html @@ -210,8 +210,8 @@
The ingress feature must be enabled in the - environment configuration view to be able to register ingresses inside - this namespace. + environment configuration view to be able to register ingresses inside this + namespace.
diff --git a/app/kubernetes/views/resource-pools/edit/resourcePool.html b/app/kubernetes/views/resource-pools/edit/resourcePool.html index 45963b455..efbf08b61 100644 --- a/app/kubernetes/views/resource-pools/edit/resourcePool.html +++ b/app/kubernetes/views/resource-pools/edit/resourcePool.html @@ -164,8 +164,8 @@
The ingress feature must be enabled in the - environment configuration view to be able to register ingresses inside - this namespace. + environment configuration view to be able to register ingresses inside this + namespace.
diff --git a/app/portainer/__module.js b/app/portainer/__module.js index 7124cf7b0..4b9d6b258 100644 --- a/app/portainer/__module.js +++ b/app/portainer/__module.js @@ -21,436 +21,444 @@ async function initAuthentication(authManager, Authentication, $rootScope, $stat return await Authentication.init(); } -angular.module('portainer.app', ['portainer.oauth', 'portainer.rbac', componentsModule, settingsModule, featureFlagModule, userActivityModule, 'portainer.shared.datatable']).config([ - '$stateRegistryProvider', - function ($stateRegistryProvider) { - 'use strict'; +angular + .module('portainer.app', ['portainer.oauth', 'portainer.rbac', componentsModule, settingsModule, featureFlagModule, userActivityModule, 'portainer.shared.datatable']) + .config([ + '$stateRegistryProvider', + function ($stateRegistryProvider) { + 'use strict'; - var root = { - name: 'root', - abstract: true, - onEnter: /* @ngInject */ function onEnter($async, StateManager, Authentication, Notifications, authManager, $rootScope, $state) { - return $async(async () => { - const appState = StateManager.getState(); - if (!appState.loading) { - return; - } - try { - const loggedIn = await initAuthentication(authManager, Authentication, $rootScope, $state); - await StateManager.initialize(); - if (!loggedIn && isTransitionRequiresAuthentication($state.transition)) { - $state.go('portainer.logout'); - return Promise.reject('Unauthenticated'); - } - } catch (err) { - Notifications.error('Failure', err, 'Unable to retrieve application settings'); - throw err; - } - }); - }, - views: { - 'sidebar@': { - templateUrl: './views/sidebar/sidebar.html', - controller: 'SidebarController', - }, - }, - resolve: { - featuresServiceInitialized: /* @ngInject */ function featuresServiceInitialized($async, featureService, Notifications) { + var root = { + name: 'root', + abstract: true, + onEnter: /* @ngInject */ function onEnter($async, StateManager, Authentication, Notifications, authManager, $rootScope, $state) { return $async(async () => { - try { - await featureService.init(); - } catch (e) { - Notifications.error('Failed initializing features service', e); - throw e; - } - }); - }, - }, - }; - - var endpointRoot = { - name: 'endpoint', - url: '/:endpointId', - parent: 'root', - abstract: true, - resolve: { - endpoint: /* @ngInject */ function endpoint($async, $state, $transition$, EndpointService, Notifications) { - return $async(async () => { - try { - const endpointId = +$transition$.params().endpointId; - - const endpoint = await EndpointService.endpoint(endpointId); - if ((endpoint.Type === 4 || endpoint.Type === 7) && !endpoint.EdgeID) { - $state.go('portainer.endpoints.endpoint', { id: endpoint.Id }); - return; - } - - return endpoint; - } catch (e) { - Notifications.error('Failed loading environment', e); - $state.go('portainer.home', {}, { reload: true }); + const appState = StateManager.getState(); + if (!appState.loading) { return; } + try { + const loggedIn = await initAuthentication(authManager, Authentication, $rootScope, $state); + await StateManager.initialize(); + if (!loggedIn && isTransitionRequiresAuthentication($state.transition)) { + $state.go('portainer.logout'); + return Promise.reject('Unauthenticated'); + } + } catch (err) { + Notifications.error('Failure', err, 'Unable to retrieve application settings'); + throw err; + } }); }, - }, - }; - - var portainer = { - name: 'portainer', - parent: 'root', - abstract: true, - }; - - var account = { - name: 'portainer.account', - url: '/account', - views: { - 'content@': { - templateUrl: './views/account/account.html', - controller: 'AccountController', + views: { + 'sidebar@': { + templateUrl: './views/sidebar/sidebar.html', + controller: 'SidebarController', + }, }, - }, - }; - - var authentication = { - name: 'portainer.auth', - url: '/auth', - params: { - reload: false, - }, - views: { - 'content@': { - templateUrl: './views/auth/auth.html', - controller: 'AuthenticationController', - controllerAs: 'ctrl', + resolve: { + featuresServiceInitialized: /* @ngInject */ function featuresServiceInitialized($async, featureService, Notifications) { + return $async(async () => { + try { + await featureService.init(); + } catch (e) { + Notifications.error('Failed initializing features service', e); + throw e; + } + }); + }, }, - 'sidebar@': {}, - }, - }; - const logout = { - name: 'portainer.logout', - url: '/logout', - params: { - error: '', - performApiLogout: false, - }, - views: { - 'content@': { - templateUrl: './views/logout/logout.html', - controller: 'LogoutController', - controllerAs: 'ctrl', + }; + + var endpointRoot = { + name: 'endpoint', + url: '/:endpointId', + parent: 'root', + abstract: true, + resolve: { + endpoint: /* @ngInject */ function endpoint($async, $state, $transition$, EndpointService, Notifications) { + return $async(async () => { + try { + const endpointId = +$transition$.params().endpointId; + + const endpoint = await EndpointService.endpoint(endpointId); + if ((endpoint.Type === 4 || endpoint.Type === 7) && !endpoint.EdgeID) { + $state.go('portainer.endpoints.endpoint', { id: endpoint.Id }); + return; + } + + return endpoint; + } catch (e) { + Notifications.error('Failed loading environment', e); + $state.go('portainer.home', {}, { reload: true }); + return; + } + }); + }, }, - 'sidebar@': {}, - }, - }; + }; - var endpoints = { - name: 'portainer.endpoints', - url: '/endpoints', - views: { - 'content@': { - templateUrl: './views/endpoints/endpoints.html', - controller: 'EndpointsController', + var portainer = { + name: 'portainer', + parent: 'root', + abstract: true, + }; + + var account = { + name: 'portainer.account', + url: '/account', + views: { + 'content@': { + templateUrl: './views/account/account.html', + controller: 'AccountController', + }, }, - }, - }; + }; - var endpoint = { - name: 'portainer.endpoints.endpoint', - url: '/:id', - views: { - 'content@': { - templateUrl: './views/endpoints/edit/endpoint.html', - controller: 'EndpointController', + var authentication = { + name: 'portainer.auth', + url: '/auth', + params: { + reload: false, }, - }, - }; - - const endpointKubernetesConfiguration = { - name: 'portainer.endpoints.endpoint.kubernetesConfig', - url: '/configure', - views: { - 'content@': { - templateUrl: '../kubernetes/views/configure/configure.html', - controller: 'KubernetesConfigureController', - controllerAs: 'ctrl', + views: { + 'content@': { + templateUrl: './views/auth/auth.html', + controller: 'AuthenticationController', + controllerAs: 'ctrl', + }, + 'sidebar@': {}, }, - }, - }; - - var endpointCreation = { - name: 'portainer.endpoints.new', - url: '/new', - views: { - 'content@': { - templateUrl: './views/endpoints/create/createendpoint.html', - controller: 'CreateEndpointController', + }; + const logout = { + name: 'portainer.logout', + url: '/logout', + params: { + error: '', + performApiLogout: false, }, - }, - }; - - var endpointAccess = { - name: 'portainer.endpoints.endpoint.access', - url: '/access', - views: { - 'content@': { - templateUrl: './views/endpoints/access/endpointAccess.html', - controller: 'EndpointAccessController', - controllerAs: 'ctrl', + views: { + 'content@': { + templateUrl: './views/logout/logout.html', + controller: 'LogoutController', + controllerAs: 'ctrl', + }, + 'sidebar@': {}, }, - }, - }; + }; - var groups = { - name: 'portainer.groups', - url: '/groups', - views: { - 'content@': { - templateUrl: './views/groups/groups.html', - controller: 'GroupsController', + var endpoints = { + name: 'portainer.endpoints', + url: '/endpoints', + views: { + 'content@': { + templateUrl: './views/endpoints/endpoints.html', + controller: 'EndpointsController', + }, }, - }, - }; + }; - var group = { - name: 'portainer.groups.group', - url: '/:id', - views: { - 'content@': { - templateUrl: './views/groups/edit/group.html', - controller: 'GroupController', + var endpoint = { + name: 'portainer.endpoints.endpoint', + url: '/:id', + views: { + 'content@': { + templateUrl: './views/endpoints/edit/endpoint.html', + controller: 'EndpointController', + }, }, - }, - }; + }; - var groupCreation = { - name: 'portainer.groups.new', - url: '/new', - views: { - 'content@': { - templateUrl: './views/groups/create/creategroup.html', - controller: 'CreateGroupController', + var k8sendpoint = { + name: 'portainer.k8sendpoint', + url: '/:id', + }; + + const endpointKubernetesConfiguration = { + name: 'portainer.k8sendpoint.kubernetesConfig', + url: '/configure', + views: { + 'content@': { + templateUrl: '../kubernetes/views/configure/configure.html', + controller: 'KubernetesConfigureController', + controllerAs: 'ctrl', + }, }, - }, - }; + }; - var groupAccess = { - name: 'portainer.groups.group.access', - url: '/access', - views: { - 'content@': { - templateUrl: './views/groups/access/groupAccess.html', - controller: 'GroupAccessController', + var endpointCreation = { + name: 'portainer.endpoints.new', + url: '/new', + views: { + 'content@': { + templateUrl: './views/endpoints/create/createendpoint.html', + controller: 'CreateEndpointController', + }, }, - }, - }; + }; - var home = { - name: 'portainer.home', - url: '/home', - views: { - 'content@': { - templateUrl: './views/home/home.html', - controller: 'HomeController', + var endpointAccess = { + name: 'portainer.endpoints.endpoint.access', + url: '/access', + views: { + 'content@': { + templateUrl: './views/endpoints/access/endpointAccess.html', + controller: 'EndpointAccessController', + controllerAs: 'ctrl', + }, }, - }, - }; + }; - var init = { - name: 'portainer.init', - abstract: true, - url: '/init', - views: { - 'sidebar@': {}, - }, - }; - - const wizard = { - name: 'portainer.wizard', - url: '/wizard', - views: { - 'content@': { - component: 'wizardView', + var groups = { + name: 'portainer.groups', + url: '/groups', + views: { + 'content@': { + templateUrl: './views/groups/groups.html', + controller: 'GroupsController', + }, }, - }, - }; + }; - const wizardEndpoints = { - name: 'portainer.wizard.endpoints', - url: '/endpoints', - views: { - 'content@': { - component: 'wizardEndpoints', + var group = { + name: 'portainer.groups.group', + url: '/:id', + views: { + 'content@': { + templateUrl: './views/groups/edit/group.html', + controller: 'GroupController', + }, }, - }, - }; + }; - var initEndpoint = { - name: 'portainer.init.endpoint', - url: '/endpoint', - views: { - 'content@': { - templateUrl: './views/init/endpoint/initEndpoint.html', - controller: 'InitEndpointController', - controllerAs: 'ctrl', + var groupCreation = { + name: 'portainer.groups.new', + url: '/new', + views: { + 'content@': { + templateUrl: './views/groups/create/creategroup.html', + controller: 'CreateGroupController', + }, }, - }, - }; + }; - var initAdmin = { - name: 'portainer.init.admin', - url: '/admin', - views: { - 'content@': { - templateUrl: './views/init/admin/initAdmin.html', - controller: 'InitAdminController', + var groupAccess = { + name: 'portainer.groups.group.access', + url: '/access', + views: { + 'content@': { + templateUrl: './views/groups/access/groupAccess.html', + controller: 'GroupAccessController', + }, }, - }, - }; + }; - var registries = { - name: 'portainer.registries', - url: '/registries', - views: { - 'content@': { - templateUrl: './views/registries/registries.html', - controller: 'RegistriesController', + var home = { + name: 'portainer.home', + url: '/home', + views: { + 'content@': { + templateUrl: './views/home/home.html', + controller: 'HomeController', + }, }, - }, - }; + }; - var registry = { - name: 'portainer.registries.registry', - url: '/:id', - views: { - 'content@': { - templateUrl: './views/registries/edit/registry.html', - controller: 'RegistryController', + var init = { + name: 'portainer.init', + abstract: true, + url: '/init', + views: { + 'sidebar@': {}, }, - }, - }; + }; - const registryCreation = { - name: 'portainer.registries.new', - url: '/new', - views: { - 'content@': { - component: 'createRegistry', + const wizard = { + name: 'portainer.wizard', + url: '/wizard', + views: { + 'content@': { + component: 'wizardView', + }, }, - }, - }; + }; - var settings = { - name: 'portainer.settings', - url: '/settings', - views: { - 'content@': { - templateUrl: './views/settings/settings.html', - controller: 'SettingsController', + const wizardEndpoints = { + name: 'portainer.wizard.endpoints', + url: '/endpoints', + views: { + 'content@': { + component: 'wizardEndpoints', + }, }, - }, - }; + }; - var settingsAuthentication = { - name: 'portainer.settings.authentication', - url: '/auth', - views: { - 'content@': { - templateUrl: './views/settings/authentication/settingsAuthentication.html', - controller: 'SettingsAuthenticationController', + var initEndpoint = { + name: 'portainer.init.endpoint', + url: '/endpoint', + views: { + 'content@': { + templateUrl: './views/init/endpoint/initEndpoint.html', + controller: 'InitEndpointController', + controllerAs: 'ctrl', + }, }, - }, - }; + }; - var tags = { - name: 'portainer.tags', - url: '/tags', - views: { - 'content@': { - templateUrl: './views/tags/tags.html', - controller: 'TagsController', + var initAdmin = { + name: 'portainer.init.admin', + url: '/admin', + views: { + 'content@': { + templateUrl: './views/init/admin/initAdmin.html', + controller: 'InitAdminController', + }, }, - }, - }; + }; - var users = { - name: 'portainer.users', - url: '/users', - views: { - 'content@': { - templateUrl: './views/users/users.html', - controller: 'UsersController', + var registries = { + name: 'portainer.registries', + url: '/registries', + views: { + 'content@': { + templateUrl: './views/registries/registries.html', + controller: 'RegistriesController', + }, }, - }, - }; + }; - var user = { - name: 'portainer.users.user', - url: '/:id', - views: { - 'content@': { - templateUrl: './views/users/edit/user.html', - controller: 'UserController', + var registry = { + name: 'portainer.registries.registry', + url: '/:id', + views: { + 'content@': { + templateUrl: './views/registries/edit/registry.html', + controller: 'RegistryController', + }, }, - }, - }; + }; - var teams = { - name: 'portainer.teams', - url: '/teams', - views: { - 'content@': { - templateUrl: './views/teams/teams.html', - controller: 'TeamsController', + const registryCreation = { + name: 'portainer.registries.new', + url: '/new', + views: { + 'content@': { + component: 'createRegistry', + }, }, - }, - }; + }; - var team = { - name: 'portainer.teams.team', - url: '/:id', - views: { - 'content@': { - templateUrl: './views/teams/edit/team.html', - controller: 'TeamController', + var settings = { + name: 'portainer.settings', + url: '/settings', + views: { + 'content@': { + templateUrl: './views/settings/settings.html', + controller: 'SettingsController', + }, }, - }, - }; + }; - $stateRegistryProvider.register(root); - $stateRegistryProvider.register(endpointRoot); - $stateRegistryProvider.register(portainer); - $stateRegistryProvider.register(account); - $stateRegistryProvider.register(authentication); - $stateRegistryProvider.register(logout); - $stateRegistryProvider.register(endpoints); - $stateRegistryProvider.register(endpoint); - $stateRegistryProvider.register(endpointAccess); - $stateRegistryProvider.register(endpointCreation); - $stateRegistryProvider.register(endpointKubernetesConfiguration); - $stateRegistryProvider.register(groups); - $stateRegistryProvider.register(group); - $stateRegistryProvider.register(groupAccess); - $stateRegistryProvider.register(groupCreation); - $stateRegistryProvider.register(home); - $stateRegistryProvider.register(init); - $stateRegistryProvider.register(wizard); - $stateRegistryProvider.register(wizardEndpoints); - $stateRegistryProvider.register(initEndpoint); - $stateRegistryProvider.register(initAdmin); - $stateRegistryProvider.register(registries); - $stateRegistryProvider.register(registry); - $stateRegistryProvider.register(registryCreation); - $stateRegistryProvider.register(settings); - $stateRegistryProvider.register(settingsAuthentication); - $stateRegistryProvider.register(tags); - $stateRegistryProvider.register(users); - $stateRegistryProvider.register(user); - $stateRegistryProvider.register(teams); - $stateRegistryProvider.register(team); - }, -]); + var settingsAuthentication = { + name: 'portainer.settings.authentication', + url: '/auth', + views: { + 'content@': { + templateUrl: './views/settings/authentication/settingsAuthentication.html', + controller: 'SettingsAuthenticationController', + }, + }, + }; + + var tags = { + name: 'portainer.tags', + url: '/tags', + views: { + 'content@': { + templateUrl: './views/tags/tags.html', + controller: 'TagsController', + }, + }, + }; + + var users = { + name: 'portainer.users', + url: '/users', + views: { + 'content@': { + templateUrl: './views/users/users.html', + controller: 'UsersController', + }, + }, + }; + + var user = { + name: 'portainer.users.user', + url: '/:id', + views: { + 'content@': { + templateUrl: './views/users/edit/user.html', + controller: 'UserController', + }, + }, + }; + + var teams = { + name: 'portainer.teams', + url: '/teams', + views: { + 'content@': { + templateUrl: './views/teams/teams.html', + controller: 'TeamsController', + }, + }, + }; + + var team = { + name: 'portainer.teams.team', + url: '/:id', + views: { + 'content@': { + templateUrl: './views/teams/edit/team.html', + controller: 'TeamController', + }, + }, + }; + + $stateRegistryProvider.register(root); + $stateRegistryProvider.register(endpointRoot); + $stateRegistryProvider.register(portainer); + $stateRegistryProvider.register(account); + $stateRegistryProvider.register(authentication); + $stateRegistryProvider.register(logout); + $stateRegistryProvider.register(endpoints); + $stateRegistryProvider.register(endpoint); + $stateRegistryProvider.register(k8sendpoint); + $stateRegistryProvider.register(endpointAccess); + $stateRegistryProvider.register(endpointCreation); + $stateRegistryProvider.register(endpointKubernetesConfiguration); + $stateRegistryProvider.register(groups); + $stateRegistryProvider.register(group); + $stateRegistryProvider.register(groupAccess); + $stateRegistryProvider.register(groupCreation); + $stateRegistryProvider.register(home); + $stateRegistryProvider.register(init); + $stateRegistryProvider.register(wizard); + $stateRegistryProvider.register(wizardEndpoints); + $stateRegistryProvider.register(initEndpoint); + $stateRegistryProvider.register(initAdmin); + $stateRegistryProvider.register(registries); + $stateRegistryProvider.register(registry); + $stateRegistryProvider.register(registryCreation); + $stateRegistryProvider.register(settings); + $stateRegistryProvider.register(settingsAuthentication); + $stateRegistryProvider.register(tags); + $stateRegistryProvider.register(users); + $stateRegistryProvider.register(user); + $stateRegistryProvider.register(teams); + $stateRegistryProvider.register(team); + }, + ]); function isTransitionRequiresAuthentication(transition) { const UNAUTHENTICATED_ROUTES = ['portainer.logout', 'portainer.auth']; diff --git a/app/portainer/views/endpoints/create/createEndpointController.js b/app/portainer/views/endpoints/create/createEndpointController.js index 69720fee1..4422437fd 100644 --- a/app/portainer/views/endpoints/create/createEndpointController.js +++ b/app/portainer/views/endpoints/create/createEndpointController.js @@ -164,7 +164,7 @@ angular EndpointService.createLocalKubernetesEndpoint(name, tagIds) .then(function success(result) { Notifications.success('Environment created', name); - $state.go('portainer.endpoints.endpoint.kubernetesConfig', { id: result.Id }); + $state.go('portainer.k8sendpoint.kubernetesConfig', { id: result.Id }); }) .catch(function error(err) { Notifications.error('Failure', err, 'Unable to create environment'); @@ -263,7 +263,7 @@ angular $state.go('portainer.endpoints.endpoint', { id: endpoint.Id }); break; case PortainerEndpointTypes.AgentOnKubernetesEnvironment: - $state.go('portainer.endpoints.endpoint.kubernetesConfig', { id: endpoint.Id }); + $state.go('portainer.k8sendpoint.kubernetesConfig', { id: endpoint.Id }); break; default: $state.go('portainer.endpoints', {}, { reload: true }); diff --git a/app/portainer/views/endpoints/edit/endpoint.html b/app/portainer/views/endpoints/edit/endpoint.html index c76c1ef83..74ba468b6 100644 --- a/app/portainer/views/endpoints/edit/endpoint.html +++ b/app/portainer/views/endpoints/edit/endpoint.html @@ -104,7 +104,7 @@ You should configure the features available in this Kubernetes environment in the - Kubernetes configuration view. + Kubernetes configuration view. diff --git a/app/portainer/views/init/endpoint/initEndpointController.js b/app/portainer/views/init/endpoint/initEndpointController.js index b1615a091..2fbd4ec27 100644 --- a/app/portainer/views/init/endpoint/initEndpointController.js +++ b/app/portainer/views/init/endpoint/initEndpointController.js @@ -95,7 +95,7 @@ class InitEndpointController { try { this.state.actionInProgress = true; const endpoint = await this.EndpointService.createLocalKubernetesEndpoint(); - this.$state.go('portainer.endpoints.endpoint.kubernetesConfig', { id: endpoint.Id }); + this.$state.go('portainer.k8sendpoint.kubernetesConfig', { id: endpoint.Id }); } catch (err) { this.Notifications.error('Failure', err, 'Unable to connect to the Kubernetes environment'); } finally { @@ -131,7 +131,7 @@ class InitEndpointController { null, null ); - const routeName = endpoint.Type === PortainerEndpointTypes.AgentOnKubernetesEnvironment ? 'portainer.endpoints.endpoint.kubernetesConfig' : 'portainer.home'; + const routeName = endpoint.Type === PortainerEndpointTypes.AgentOnKubernetesEnvironment ? 'portainer.k8sendpoint.kubernetesConfig' : 'portainer.home'; this.$state.go(routeName, { id: endpoint.Id }); } catch (err) { this.Notifications.error('Failure', err, 'Unable to connect to the Docker environment');