From 8bb5129be039c3e606fb1dcc5b31e5f5022b5a7e Mon Sep 17 00:00:00 2001 From: matias-portainer <104775949+matias-portainer@users.noreply.github.com> Date: Tue, 31 Oct 2023 15:27:20 -0300 Subject: [PATCH] feat(nomad): remove nomad from UI EE-6060 (#10509) --- app/assets/css/index.js | 1 - app/assets/fonts/nomad-icon.css | 35 ----- app/assets/fonts/nomad-icon/nomad-icon.eot | Bin 1260 -> 0 bytes app/assets/fonts/nomad-icon/nomad-icon.svg | 11 -- app/assets/fonts/nomad-icon/nomad-icon.ttf | Bin 1096 -> 0 bytes app/assets/fonts/nomad-icon/nomad-icon.woff | Bin 1172 -> 0 bytes app/assets/ico/vendor/nomad-icon.svg | 6 - app/docker/helpers/logHelper/formatLogs.ts | 1 - app/edge/react/components/index.ts | 2 - .../create-edge-stack-view.html | 1 - app/index.js | 3 - app/nomad/index.ts | 127 ------------------ app/nomad/logs/index.ts | 9 -- app/nomad/logs/logs.html | 3 - app/nomad/logs/logs.ts | 6 - app/nomad/logs/logsController.js | 85 ------------ app/nomad/logs/nomad-log-viewer/index.ts | 1 - .../logs/nomad-log-viewer/nomad-log-viewer.js | 12 -- .../logs/nomad-log-viewer/nomadLogViewer.html | 103 -------------- .../nomadLogViewerController.js | 64 --------- app/nomad/react/components/index.ts | 6 - app/nomad/react/index.ts | 9 -- app/nomad/react/views/index.ts | 6 - app/portainer/filters/filters.js | 3 - .../views/endpoints/edit/endpoint.html | 7 +- .../endpoints/edit/endpointController.js | 5 +- app/react-tools/test-mocks.ts | 1 - app/react/common/stacks/types.ts | 4 - app/react/components/Svg.tsx | 4 - .../EdgeScriptForm/EdgeScriptForm.tsx | 8 +- .../EdgeScriptForm.validation.tsx | 16 +-- .../EdgeScriptSettingsFieldset.tsx | 20 --- .../EdgeScriptForm/NomadTokenField.tsx | 53 -------- .../edge/components/EdgeScriptForm/scripts.ts | 37 ----- .../edge/components/EdgeScriptForm/types.ts | 3 +- .../EditEdgeStackForm/EditEdgeStackForm.tsx | 8 +- .../EditEdgeStackForm/GitForm/GitForm.tsx | 5 +- .../ItemView/EditEdgeStackForm/NomadForm.tsx | 38 ------ .../EdgeStackDeploymentTypeSelector.tsx | 31 +---- app/react/edge/edge-stacks/types.ts | 3 - .../nomad/DashboardView/DashboardView.tsx | 83 ------------ .../nomad/DashboardView/RunningStatus.tsx | 31 ----- app/react/nomad/DashboardView/index.ts | 1 - app/react/nomad/DashboardView/useDashboard.ts | 41 ------ .../EventsDatatable/EventsDatatable.tsx | 35 ----- .../EventsDatatable/columns/date.tsx | 12 -- .../EventsDatatable/columns/helper.ts | 5 - .../EventsDatatable/columns/index.tsx | 5 - .../EventsDatatable/columns/message.tsx | 6 - .../EventsDatatable/columns/type.tsx | 6 - .../jobs/EventsView/EventsDatatable/index.ts | 1 - .../nomad/jobs/EventsView/EventsView.tsx | 41 ------ app/react/nomad/jobs/EventsView/index.ts | 1 - app/react/nomad/jobs/EventsView/useEvents.ts | 75 ----------- .../JobsView/JobsDatatable/JobsDatatable.tsx | 57 -------- .../JobsDatatable/JobsDatatableSettings.tsx | 20 --- .../TasksDatatable/TasksDatatable.tsx | 19 --- .../TasksDatatable/columns/actions.tsx | 46 ------- .../TasksDatatable/columns/allocationID.tsx | 10 -- .../TasksDatatable/columns/helper.ts | 5 - .../TasksDatatable/columns/index.tsx | 15 --- .../TasksDatatable/columns/started.tsx | 17 --- .../TasksDatatable/columns/taskGroup.tsx | 10 -- .../TasksDatatable/columns/taskName.tsx | 6 - .../TasksDatatable/columns/taskStatus.tsx | 38 ------ .../JobsDatatable/TasksDatatable/index.ts | 1 - .../JobsDatatable/actions/JobActions.tsx | 50 ------- .../JobsView/JobsDatatable/actions/delete.tsx | 21 --- .../JobsDatatable/columns/actions.tsx | 22 --- .../JobsDatatable/columns/created.tsx | 12 -- .../JobsView/JobsDatatable/columns/helper.ts | 5 - .../JobsView/JobsDatatable/columns/index.tsx | 13 -- .../JobsView/JobsDatatable/columns/name.tsx | 6 - .../JobsDatatable/columns/namespace.tsx | 10 -- .../JobsView/JobsDatatable/columns/status.tsx | 10 -- .../JobsView/JobsDatatable/datatable-store.ts | 9 -- .../jobs/JobsView/JobsDatatable/index.ts | 1 - .../jobs/JobsView/JobsDatatable/types.ts | 13 -- app/react/nomad/jobs/JobsView/JobsView.tsx | 33 ----- app/react/nomad/jobs/JobsView/index.ts | 1 - app/react/nomad/jobs/JobsView/useJobs.ts | 34 ----- app/react/nomad/jobs/LogsView/.keep | 0 app/react/nomad/jobs/jobs.service.ts | 16 --- app/react/nomad/nomad.service.ts | 20 --- app/react/nomad/types.ts | 25 ---- .../EnvironmentItem/EnvironmentStats.tsx | 5 - .../EnvironmentItem/EnvironmentStatsNomad.tsx | 44 ------ .../EnvironmentList/EnvironmentList.tsx | 1 - .../EnvironmentListFilters.tsx | 14 -- .../AutomaticEdgeEnvCreation.tsx | 2 - .../queries/useEnvironmentList.ts | 20 ++- app/react/portainer/environments/types.ts | 20 --- .../CreateView/CreateView.tsx | 2 +- .../update-schedules/ItemView/ItemView.tsx | 2 +- .../update-schedules/ListView/ListView.tsx | 2 +- .../environments/utils/get-platform-icon.ts | 2 - .../portainer/environments/utils/index.ts | 8 -- .../environment-types.ts | 13 -- .../EnvironmentsCreationView.tsx | 1 - .../shared/EdgeAgentTab/EdgeAgentTab.tsx | 9 +- .../wizard/EnvironmentsCreationView/types.ts | 1 - app/react/portainer/feature-flags/enums.ts | 1 - .../feature-flags/feature-flags.service.ts | 1 - .../portainer/gitops/GitForm.stories.tsx | 2 +- app/react/portainer/gitops/GitForm.tsx | 2 +- app/react/portainer/system/useSystemInfo.ts | 3 +- app/react/sidebar/EnvironmentSidebar.tsx | 3 - .../NomadSidebar/NomadSidebar.test.tsx | 38 ------ .../sidebar/NomadSidebar/NomadSidebar.tsx | 30 ----- app/react/sidebar/NomadSidebar/index.ts | 1 - 110 files changed, 39 insertions(+), 1813 deletions(-) delete mode 100644 app/assets/fonts/nomad-icon.css delete mode 100644 app/assets/fonts/nomad-icon/nomad-icon.eot delete mode 100644 app/assets/fonts/nomad-icon/nomad-icon.svg delete mode 100644 app/assets/fonts/nomad-icon/nomad-icon.ttf delete mode 100644 app/assets/fonts/nomad-icon/nomad-icon.woff delete mode 100644 app/assets/ico/vendor/nomad-icon.svg delete mode 100644 app/nomad/index.ts delete mode 100644 app/nomad/logs/index.ts delete mode 100644 app/nomad/logs/logs.html delete mode 100644 app/nomad/logs/logs.ts delete mode 100644 app/nomad/logs/logsController.js delete mode 100644 app/nomad/logs/nomad-log-viewer/index.ts delete mode 100644 app/nomad/logs/nomad-log-viewer/nomad-log-viewer.js delete mode 100644 app/nomad/logs/nomad-log-viewer/nomadLogViewer.html delete mode 100644 app/nomad/logs/nomad-log-viewer/nomadLogViewerController.js delete mode 100644 app/nomad/react/components/index.ts delete mode 100644 app/nomad/react/index.ts delete mode 100644 app/nomad/react/views/index.ts delete mode 100644 app/react/edge/components/EdgeScriptForm/NomadTokenField.tsx delete mode 100644 app/react/edge/edge-stacks/ItemView/EditEdgeStackForm/NomadForm.tsx delete mode 100644 app/react/nomad/DashboardView/DashboardView.tsx delete mode 100644 app/react/nomad/DashboardView/RunningStatus.tsx delete mode 100644 app/react/nomad/DashboardView/index.ts delete mode 100644 app/react/nomad/DashboardView/useDashboard.ts delete mode 100644 app/react/nomad/jobs/EventsView/EventsDatatable/EventsDatatable.tsx delete mode 100644 app/react/nomad/jobs/EventsView/EventsDatatable/columns/date.tsx delete mode 100644 app/react/nomad/jobs/EventsView/EventsDatatable/columns/helper.ts delete mode 100644 app/react/nomad/jobs/EventsView/EventsDatatable/columns/index.tsx delete mode 100644 app/react/nomad/jobs/EventsView/EventsDatatable/columns/message.tsx delete mode 100644 app/react/nomad/jobs/EventsView/EventsDatatable/columns/type.tsx delete mode 100644 app/react/nomad/jobs/EventsView/EventsDatatable/index.ts delete mode 100644 app/react/nomad/jobs/EventsView/EventsView.tsx delete mode 100644 app/react/nomad/jobs/EventsView/index.ts delete mode 100644 app/react/nomad/jobs/EventsView/useEvents.ts delete mode 100644 app/react/nomad/jobs/JobsView/JobsDatatable/JobsDatatable.tsx delete mode 100644 app/react/nomad/jobs/JobsView/JobsDatatable/JobsDatatableSettings.tsx delete mode 100644 app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/TasksDatatable.tsx delete mode 100644 app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/columns/actions.tsx delete mode 100644 app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/columns/allocationID.tsx delete mode 100644 app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/columns/helper.ts delete mode 100644 app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/columns/index.tsx delete mode 100644 app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/columns/started.tsx delete mode 100644 app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/columns/taskGroup.tsx delete mode 100644 app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/columns/taskName.tsx delete mode 100644 app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/columns/taskStatus.tsx delete mode 100644 app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/index.ts delete mode 100644 app/react/nomad/jobs/JobsView/JobsDatatable/actions/JobActions.tsx delete mode 100644 app/react/nomad/jobs/JobsView/JobsDatatable/actions/delete.tsx delete mode 100644 app/react/nomad/jobs/JobsView/JobsDatatable/columns/actions.tsx delete mode 100644 app/react/nomad/jobs/JobsView/JobsDatatable/columns/created.tsx delete mode 100644 app/react/nomad/jobs/JobsView/JobsDatatable/columns/helper.ts delete mode 100644 app/react/nomad/jobs/JobsView/JobsDatatable/columns/index.tsx delete mode 100644 app/react/nomad/jobs/JobsView/JobsDatatable/columns/name.tsx delete mode 100644 app/react/nomad/jobs/JobsView/JobsDatatable/columns/namespace.tsx delete mode 100644 app/react/nomad/jobs/JobsView/JobsDatatable/columns/status.tsx delete mode 100644 app/react/nomad/jobs/JobsView/JobsDatatable/datatable-store.ts delete mode 100644 app/react/nomad/jobs/JobsView/JobsDatatable/index.ts delete mode 100644 app/react/nomad/jobs/JobsView/JobsDatatable/types.ts delete mode 100644 app/react/nomad/jobs/JobsView/JobsView.tsx delete mode 100644 app/react/nomad/jobs/JobsView/index.ts delete mode 100644 app/react/nomad/jobs/JobsView/useJobs.ts delete mode 100644 app/react/nomad/jobs/LogsView/.keep delete mode 100644 app/react/nomad/jobs/jobs.service.ts delete mode 100644 app/react/nomad/nomad.service.ts delete mode 100644 app/react/nomad/types.ts delete mode 100644 app/react/portainer/HomeView/EnvironmentList/EnvironmentItem/EnvironmentStatsNomad.tsx delete mode 100644 app/react/sidebar/NomadSidebar/NomadSidebar.test.tsx delete mode 100644 app/react/sidebar/NomadSidebar/NomadSidebar.tsx delete mode 100644 app/react/sidebar/NomadSidebar/index.ts diff --git a/app/assets/css/index.js b/app/assets/css/index.js index 97ce0a638..953c01586 100644 --- a/app/assets/css/index.js +++ b/app/assets/css/index.js @@ -15,7 +15,6 @@ import './app.css'; import './theme.css'; import './vendor-override.css'; -import '../fonts/nomad-icon.css'; import './bootstrap-override.css'; import './icon.css'; import './button.css'; diff --git a/app/assets/fonts/nomad-icon.css b/app/assets/fonts/nomad-icon.css deleted file mode 100644 index 93e2534c0..000000000 --- a/app/assets/fonts/nomad-icon.css +++ /dev/null @@ -1,35 +0,0 @@ -/* created using https://icomoon.io/app */ -/* https://stackoverflow.com/a/35092005/681629 */ -/* for additional icons, we should create a new set that includes the existing icons */ - -@font-face { - font-family: 'nomad-icon'; - src: url('nomad-icon/nomad-icon.eot?6tre2n'); - src: - url('nomad-icon/nomad-icon.eot?6tre2n#iefix') format('embedded-opentype'), - url('nomad-icon/nomad-icon.ttf?6tre2n') format('truetype'), - url('nomad-icon/nomad-icon.woff?6tre2n') format('woff'), - url('nomad-icon/nomad-icon.svg?6tre2n#nomad-icon') format('svg'); - font-weight: normal; - font-style: normal; - font-display: block; -} - -.nomad-icon { - /* use !important to prevent issues with browser extensions that change fonts */ - font-family: 'nomad-icon' !important; - speak: never; - font-style: normal; - font-weight: normal; - font-variant: normal; - text-transform: none; - line-height: 1; - - /* Better Font Rendering =========== */ - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -.nomad-icon:before { - content: '\e900'; -} diff --git a/app/assets/fonts/nomad-icon/nomad-icon.eot b/app/assets/fonts/nomad-icon/nomad-icon.eot deleted file mode 100644 index 81eb68d0eb3d84af2708277989169e4ef4ab8dfd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1260 zcmaJ>O-~b16g_V~C@rQ~1W63hi7}D5sNe@+f(cE8h=>}5F5K9mj02>dY1(3F;(`?> zh6oA9gq?{dZj4(NxL_kI-S`9CxFWiBrF1xNW`LG7-1f~o=iGbW_j`Xd;4X`Rf_f8J z6H>YVs9u+`fvpatc8>diIOdRri#&@9hXHX+z=Dkh>SFg3U=~t+HVaa6kW}!3v<0XT-$R};HRA7CYT-MEYuJUY5zqm-w zf|XgzoVoCJejQLaYxK=hh*VV0Lm4E$G@CCk#()%ghP*xJW=(YC33-|PRNh=Hpc(Dt zOXP-Q=B9qxwfK$eA}Zr*OmNusHU#WK z-S)OIq_WT{*W$noAIRQh>7p;F*`?1l46u%Iyb6B;#xA@)&!dJzEWBTx8uMz~6%dSS zt3R2#-y2(*DApt~1f`4%)a=9at=#rYzcy+U8RzZXwcmg8R$WuOxai7m)#Lv*t7PfiNa*z;ws>hI4o&_eG0RiPIBch1d?UN_;!S8u5z|>%3q*d46sa^@$M2 za04IavTojWo%&mvwu+@W*D-pNJ&mts!>oqlgk>+}%wqkWZx}h^I%UJQ9II%Str=sw vVvJ_pagHs?HJ8sqnX|C@P&oc$VUk;zp*D>QzoY&$Gaf!ONv^s){U_KyrT?-M diff --git a/app/assets/fonts/nomad-icon/nomad-icon.svg b/app/assets/fonts/nomad-icon/nomad-icon.svg deleted file mode 100644 index f3b017d53..000000000 --- a/app/assets/fonts/nomad-icon/nomad-icon.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - -Generated by IcoMoon - - - - - - - \ No newline at end of file diff --git a/app/assets/fonts/nomad-icon/nomad-icon.ttf b/app/assets/fonts/nomad-icon/nomad-icon.ttf deleted file mode 100644 index c88998ea646f3152124cb82b2d44fd461a5d5a32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1096 zcmaJ=&r1|h9RIxe;ks*RYnl*JLj*~OZS99^VBkUuCKi}_@Y0UE)9lL5%(6eig$|w! zLNYJ{Z$Uwq=<2}^Uh-6z{(vr>q;scor_anAbqne3zImU|=lk=$Hv<8n3#(9(zW?Cr zwVq!63YCwXxx8am1{S_P1;ilvoNd-BTu+k+Yo}dqKAP4qu8?zLy=a+*3$K)bvX?h8ghlc?`6xH7tEWvsotZcD zVm^EC-CXPa(Z2VxqZNeB3VMivpg#xuDH2ItgH!veNz#ipS(0(ib;6HQPp-2D# diff --git a/app/assets/fonts/nomad-icon/nomad-icon.woff b/app/assets/fonts/nomad-icon/nomad-icon.woff deleted file mode 100644 index ffc04f12a0199a4af9b6cfb46e77d42d7b53926f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1172 zcmaJ=O;1xn6g~4kC@lskf+U9Mi!sr-sNe_1L=&0_5eZ@tSh$f#dA5-DJ<<=QiEA{5 zhzZ1mwI*(iTNb$JLRsm?AK=Cn(XA_`&olD|C9!eZGjr~lJNMrCcn>E>MI$}KK9b94;F?vCU{Z?e*(@P!u>F$hCf_{UwbXR zLQSv}5cKL$Q6kL%(pOaKzxn^K8OVfnbDLGSAPK}pl7DeDcBUtmO!r<+C&jPEh}aQ3 zjgb!zo~;9+f6EA1POy<_>=?1Sz=iSW=t>5do`U7p2s_e_$hI(Dm zs58p9!Rl1wI(2?L4B5=>gGkDhogK|Ywp>O#qpSqq#R)|3*hZI*c@Q~T5cTbNtK$m9 zC`Hv8y^rjf$t2Y`Y{U+C6wvF3C0;f3jIx2H5I44 zT(#hqnABsTRTSW&)YNk{@GDNv^SzQ=@fMum;VMX3#XX? diff --git a/app/assets/ico/vendor/nomad-icon.svg b/app/assets/ico/vendor/nomad-icon.svg deleted file mode 100644 index 0cd04fea3..000000000 --- a/app/assets/ico/vendor/nomad-icon.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - diff --git a/app/docker/helpers/logHelper/formatLogs.ts b/app/docker/helpers/logHelper/formatLogs.ts index 3b1c4dc4f..f60e61040 100644 --- a/app/docker/helpers/logHelper/formatLogs.ts +++ b/app/docker/helpers/logHelper/formatLogs.ts @@ -34,7 +34,6 @@ export function formatLogs( logs = stripHeadersFunc(logs); } // if JSON logs come serialized 2 times, parse them once to unwrap them - // for example when retrieving Edge Agent logs on Nomad if (logs.startsWith('"')) { try { logs = JSON.parse(logs); diff --git a/app/edge/react/components/index.ts b/app/edge/react/components/index.ts index 608fe3a0b..4f8564d2e 100644 --- a/app/edge/react/components/index.ts +++ b/app/edge/react/components/index.ts @@ -35,7 +35,6 @@ export const componentsModule = angular r2a(withReactQuery(EdgeScriptForm), [ 'edgeInfo', 'commands', - 'isNomadTokenVisible', 'asyncMode', 'showMetaFields', ]) @@ -69,7 +68,6 @@ export const componentsModule = angular 'onChange', 'hasDockerEndpoint', 'hasKubeEndpoint', - 'hasNomadEndpoint', 'allowKubeToSelectCompose', ]) ) diff --git a/app/edge/views/edge-stacks/createEdgeStackView/create-edge-stack-view.html b/app/edge/views/edge-stacks/createEdgeStackView/create-edge-stack-view.html index 234057816..c4990c9da 100644 --- a/app/edge/views/edge-stacks/createEdgeStackView/create-edge-stack-view.html +++ b/app/edge/views/edge-stacks/createEdgeStackView/create-edge-stack-view.html @@ -50,7 +50,6 @@ value="$ctrl.formValues.DeploymentType" has-docker-endpoint="$ctrl.hasType($ctrl.EnvironmentType.EdgeAgentOnDocker)" has-kube-endpoint="$ctrl.hasType($ctrl.EnvironmentType.EdgeAgentOnKubernetes)" - has-nomad-endpoint="$ctrl.hasType($ctrl.EnvironmentType.EdgeAgentOnNomad)" on-change="($ctrl.onChangeDeploymentType)" > diff --git a/app/index.js b/app/index.js index 659e0086c..e44ed80e8 100644 --- a/app/index.js +++ b/app/index.js @@ -21,8 +21,6 @@ import { onStartupAngular } from './app'; import { configApp } from './config'; import { constantsModule } from './ng-constants'; -import { nomadModule } from './nomad'; - initFeatureService(Edition[process.env.PORTAINER_EDITION]); angular @@ -47,7 +45,6 @@ angular azureModule, 'portainer.docker', 'portainer.kubernetes', - nomadModule, 'portainer.edge', 'rzModule', 'moment-picker', diff --git a/app/nomad/index.ts b/app/nomad/index.ts deleted file mode 100644 index 27aec4246..000000000 --- a/app/nomad/index.ts +++ /dev/null @@ -1,127 +0,0 @@ -import angular from 'angular'; -import { StateRegistry, StateService } from '@uirouter/angularjs'; - -import { isNomadEnvironment } from '@/react/portainer/environments/utils'; -import { DashboardView } from '@/react/nomad/DashboardView'; -import { r2a } from '@/react-tools/react2angular'; -import { EventsView } from '@/react/nomad/jobs/EventsView'; -import { withUIRouter } from '@/react-tools/withUIRouter'; -import { withReactQuery } from '@/react-tools/withReactQuery'; -import { withCurrentUser } from '@/react-tools/withCurrentUser'; -import { JobsView } from '@/react/nomad/jobs/JobsView'; -import { getLeader } from '@/react/nomad/nomad.service'; -import { Environment } from '@/react/portainer/environments/types'; -import { StateManager } from '@/portainer/services/types'; -import { notifyError } from '@/portainer/services/notifications'; -import { isBE } from '@/react/portainer/feature-flags/feature-flags.service'; - -import { reactModule } from './react'; -import { logsModule } from './logs'; - -export const nomadModule = angular - .module('portainer.nomad', [reactModule, logsModule]) - .config(config) - - .component( - 'nomadDashboardView', - r2a(withUIRouter(withReactQuery(withCurrentUser(DashboardView))), []) - ) - .component( - 'nomadEventsView', - r2a(withUIRouter(withReactQuery(withCurrentUser(EventsView))), []) - ) - .component( - 'nomadJobsView', - r2a(withUIRouter(withReactQuery(withCurrentUser(JobsView))), []) - ).name; - -/* @ngInject */ -function config($stateRegistryProvider: StateRegistry) { - // limits module to BE only - if (!isBE) { - return; - } - - const nomad = { - name: 'nomad', - url: '/nomad', - parent: 'endpoint', - abstract: true, - - onEnter: /* @ngInject */ function onEnter( - $async: (fn: () => Promise) => Promise, - $state: StateService, - endpoint: Environment, - StateManager: StateManager - ) { - return $async(async () => { - if (!isNomadEnvironment(endpoint.Type)) { - $state.go('portainer.home'); - return; - } - - try { - await getLeader(endpoint.Id); - await StateManager.updateEndpointState(endpoint); - } catch (e) { - notifyError( - 'Unable to contact Edge agent, please ensure that the agent is properly running on the remote environment.' - ); - $state.go('portainer.home', {}, { reload: true }); - } - }); - }, - }; - - const dashboard = { - name: 'nomad.dashboard', - url: '/dashboard', - views: { - 'content@': { - component: 'nomadDashboardView', - }, - }, - data: { - docs: '/user/nomad/dashboard', - }, - }; - - const jobs = { - name: 'nomad.jobs', - url: '/jobs', - views: { - 'content@': { - component: 'nomadJobsView', - }, - }, - data: { - docs: '/user/nomad/jobs', - }, - }; - - const events = { - name: 'nomad.events', - url: '/jobs/:jobID/tasks/:taskName/allocations/:allocationID/events?namespace', - views: { - 'content@': { - component: 'nomadEventsView', - }, - }, - }; - - const logs = { - name: 'nomad.logs', - url: '/jobs/:jobID/tasks/:taskName/allocations/:allocationID/logs?namespace', - views: { - 'content@': { - component: 'nomadLogsView', - }, - }, - }; - - $stateRegistryProvider.register(nomad); - $stateRegistryProvider.register(dashboard); - $stateRegistryProvider.register(jobs); - $stateRegistryProvider.register(events); - $stateRegistryProvider.register(logs); -} diff --git a/app/nomad/logs/index.ts b/app/nomad/logs/index.ts deleted file mode 100644 index 9dc9afd95..000000000 --- a/app/nomad/logs/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -import angular from 'angular'; - -import { logsView } from './logs'; -import { nomadLogViewer } from './nomad-log-viewer'; - -export const logsModule = angular - .module('portainer.app.nomad.logs', []) - .component('nomadLogViewer', nomadLogViewer) - .component('nomadLogsView', logsView).name; diff --git a/app/nomad/logs/logs.html b/app/nomad/logs/logs.html deleted file mode 100644 index a33545891..000000000 --- a/app/nomad/logs/logs.html +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/app/nomad/logs/logs.ts b/app/nomad/logs/logs.ts deleted file mode 100644 index 4824024aa..000000000 --- a/app/nomad/logs/logs.ts +++ /dev/null @@ -1,6 +0,0 @@ -import controller from './logsController'; - -export const logsView = { - templateUrl: './logs.html', - controller, -}; diff --git a/app/nomad/logs/logsController.js b/app/nomad/logs/logsController.js deleted file mode 100644 index 4975843be..000000000 --- a/app/nomad/logs/logsController.js +++ /dev/null @@ -1,85 +0,0 @@ -import axios from '@/portainer/services/axios'; - -/* @ngInject */ -export default function LogsController($scope, $async, $state, Notifications) { - let controller = new AbortController(); - - $scope.stderrLog = []; - $scope.stdoutLog = []; - - $scope.changeLogCollection = function (logCollectionStatus) { - if (!logCollectionStatus) { - controller.abort(); - controller = new AbortController(); - } else { - loadLogs('stderr', $scope.jobID, $scope.taskName, $scope.namespace, $scope.endpointId, controller); - loadLogs('stdout', $scope.jobID, $scope.taskName, $scope.namespace, $scope.endpointId, controller); - } - }; - - function stripEscapeCodes(logs) { - return logs.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, ''); - } - - function formatLogs(logs, splitter = '\\n') { - if (!logs) { - return []; - } - - const formattedLogs = []; - const logInLines = logs.trim().split(splitter); - - for (const logInLine of logInLines) { - const line = stripEscapeCodes(logInLine).replace('\n', '').replace(/[""]+/g, ''); - formattedLogs.push({ line, spans: [{ foregroundColor: null, backgroundColor: null, text: line }] }); - } - - return formattedLogs; - } - async function loadLogs(logType, jobID, taskName, namespace, endpointId, controller, refresh = true, offset = 50000) { - axios - .get(`/nomad/endpoints/${endpointId}/allocation/${$scope.allocationID}/logs`, { - params: { - jobID, - taskName, - namespace, - refresh, - logType, - offset, - }, - signal: controller.signal, - onDownloadProgress: (progressEvent) => { - $scope[`${logType}Log`] = formatLogs(progressEvent.currentTarget.response); - $scope.$apply(); - }, - }) - .then((response) => { - $scope[`${logType}Log`] = formatLogs(response.data, '\n'); - $scope.$apply(); - }) - .catch((err) => { - if (err.message !== 'canceled') Notifications.error('Failure', err, 'Unable to retrieve task logs'); - }); - } - - async function initView() { - return $async(async () => { - $scope.jobID = $state.params.jobID; - $scope.taskName = $state.params.taskName; - $scope.allocationID = $state.params.allocationID; - $scope.namespace = $state.params.namespace; - $scope.endpointId = $state.params.endpointId; - - loadLogs('stderr', $scope.jobID, $scope.taskName, $scope.namespace, $scope.endpointId, controller); - loadLogs('stdout', $scope.jobID, $scope.taskName, $scope.namespace, $scope.endpointId, controller); - }); - } - - $scope.$on('$destroy', function () { - if (controller) { - controller.abort(); - } - }); - - initView(); -} diff --git a/app/nomad/logs/nomad-log-viewer/index.ts b/app/nomad/logs/nomad-log-viewer/index.ts deleted file mode 100644 index df2a5ab97..000000000 --- a/app/nomad/logs/nomad-log-viewer/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { nomadLogViewer } from './nomad-log-viewer'; diff --git a/app/nomad/logs/nomad-log-viewer/nomad-log-viewer.js b/app/nomad/logs/nomad-log-viewer/nomad-log-viewer.js deleted file mode 100644 index df4621b0e..000000000 --- a/app/nomad/logs/nomad-log-viewer/nomad-log-viewer.js +++ /dev/null @@ -1,12 +0,0 @@ -import controller from './nomadLogViewerController'; - -export const nomadLogViewer = { - templateUrl: './nomadLogViewer.html', - controller, - bindings: { - stderrLog: '<', - stdoutLog: '<', - resourceName: '<', - logCollectionChange: '<', - }, -}; diff --git a/app/nomad/logs/nomad-log-viewer/nomadLogViewer.html b/app/nomad/logs/nomad-log-viewer/nomadLogViewer.html deleted file mode 100644 index c00be85d5..000000000 --- a/app/nomad/logs/nomad-log-viewer/nomadLogViewer.html +++ /dev/null @@ -1,103 +0,0 @@ -
-
- - - -
-
- -
-
-
- - -
-
-
-
-
-
- -
-
- -
-
-
- -
- -
-
-
-
- -
-
- -
-
-
- -
- - - - - - - -
-
-
-
-
-
-
- -
-
-
-      

No logs available

-

{{ span.text }}

-

No log line matching the '{{ $ctrl.state.search }}' filter

-
-
- -
-
-      

No logs available

-

{{ span.text }}

-

No log line matching the '{{ $ctrl.state.search }}' filter

-
-
-
diff --git a/app/nomad/logs/nomad-log-viewer/nomadLogViewerController.js b/app/nomad/logs/nomad-log-viewer/nomadLogViewerController.js deleted file mode 100644 index 4191a13bf..000000000 --- a/app/nomad/logs/nomad-log-viewer/nomadLogViewerController.js +++ /dev/null @@ -1,64 +0,0 @@ -import { concatLogsToString, NEW_LINE_BREAKER } from '@/docker/helpers/logHelper'; - -/* @ngInject */ -export default function NomadLogViewerController(clipboard, Blob, FileSaver) { - this.NomadLogType = Object.freeze({ - STDERR: 'stderr', - STDOUT: 'stdout', - }); - - this.state = { - copySupported: clipboard.supported, - logCollection: true, - autoScroll: true, - wrapLines: true, - search: '', - stderr: { - filteredLogs: [], - selectedLines: [], - }, - stdout: { - filteredLogs: [], - selectedLines: [], - }, - }; - - this.model = { - logType: this.NomadLogType.STDERR, - }; - - this.onChangeLogType = function (logType) { - this.model.logType = this.NomadLogType[logType.toUpperCase()]; - }; - - this.copy = function () { - clipboard.copyText(this.state[this.model.logType].filteredLogs.map((log) => log.line).join(NEW_LINE_BREAKER)); - $('#refreshRateChange').show(); - $('#refreshRateChange').fadeOut(2000); - }; - - this.copySelection = function () { - clipboard.copyText(this.state[this.model.logType].selectedLines.join(NEW_LINE_BREAKER)); - $('#refreshRateChange').show(); - $('#refreshRateChange').fadeOut(2000); - }; - - this.clearSelection = function () { - this.state[this.model.logType].selectedLines = []; - }; - - this.selectLine = function (line) { - var idx = this.state[this.model.logType].selectedLines.indexOf(line); - if (idx === -1) { - this.state[this.model.logType].selectedLines.push(line); - } else { - this.state[this.model.logType].selectedLines.splice(idx, 1); - } - }; - - this.downloadLogs = function () { - const logsAsString = concatLogsToString(this.state[this.model.logType].filteredLogs); - const data = new Blob([logsAsString]); - FileSaver.saveAs(data, this.resourceName + '_logs.txt'); - }; -} diff --git a/app/nomad/react/components/index.ts b/app/nomad/react/components/index.ts deleted file mode 100644 index a3b3ed75f..000000000 --- a/app/nomad/react/components/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import angular from 'angular'; - -export const componentsModule = angular.module( - 'portainer.nomad.react.components', - [] -).name; diff --git a/app/nomad/react/index.ts b/app/nomad/react/index.ts deleted file mode 100644 index 493d08f0b..000000000 --- a/app/nomad/react/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -import angular from 'angular'; - -import { componentsModule } from './components'; -import { viewsModule } from './views'; - -export const reactModule = angular.module('portainer.nomad.react', [ - viewsModule, - componentsModule, -]).name; diff --git a/app/nomad/react/views/index.ts b/app/nomad/react/views/index.ts deleted file mode 100644 index 84c5e5be3..000000000 --- a/app/nomad/react/views/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import angular from 'angular'; - -export const viewsModule = angular.module( - 'portainer.nomad.react.views', - [] -).name; diff --git a/app/portainer/filters/filters.js b/app/portainer/filters/filters.js index 1ea28326c..c6af4a9e7 100644 --- a/app/portainer/filters/filters.js +++ b/app/portainer/filters/filters.js @@ -6,7 +6,6 @@ import { Cloud } from 'lucide-react'; import Kube from '@/assets/ico/kube.svg?c'; import DockerIcon from '@/assets/ico/vendor/docker-icon.svg?c'; import MicrosoftIcon from '@/assets/ico/vendor/microsoft-icon.svg?c'; -import NomadIcon from '@/assets/ico/vendor/nomad-icon.svg?c'; import { EnvironmentType } from '@/react/portainer/environments/types'; export function truncateLeftRight(text, max, left, right) { @@ -119,8 +118,6 @@ export function environmentTypeIcon(type) { case EnvironmentType.AgentOnDocker: case EnvironmentType.Docker: return DockerIcon; - case EnvironmentType.EdgeAgentOnNomad: - return NomadIcon; default: throw new Error(`type ${type}-${EnvironmentType[type]} is not supported`); } diff --git a/app/portainer/views/endpoints/edit/endpoint.html b/app/portainer/views/endpoints/edit/endpoint.html index 044e9acfb..7b3ecbcc6 100644 --- a/app/portainer/views/endpoints/edit/endpoint.html +++ b/app/portainer/views/endpoints/edit/endpoint.html @@ -46,12 +46,7 @@
Edge agent deployment script
- + diff --git a/app/portainer/views/endpoints/edit/endpointController.js b/app/portainer/views/endpoints/edit/endpointController.js index 048cfb015..4b8d3d585 100644 --- a/app/portainer/views/endpoints/edit/endpointController.js +++ b/app/portainer/views/endpoints/edit/endpointController.js @@ -34,8 +34,6 @@ function EndpointController( $scope.onChangeTags = onChangeTags; $scope.onChangeTLSConfigFormValues = onChangeTLSConfigFormValues; - const isBE = process.env.PORTAINER_EDITION === 'BE'; - $scope.state = { selectAll: false, // displayTextFilter: false, @@ -53,10 +51,9 @@ function EndpointController( allowCreate: Authentication.isAdmin(), allowSelfSignedCerts: true, showAMTInfo: false, - showNomad: isBE, showTLSConfig: false, edgeScriptCommands: { - linux: _.compact([commandsTabs.k8sLinux, commandsTabs.swarmLinux, commandsTabs.standaloneLinux, isBE && commandsTabs.nomadLinux]), + linux: _.compact([commandsTabs.k8sLinux, commandsTabs.swarmLinux, commandsTabs.standaloneLinux]), win: [commandsTabs.swarmWindows, commandsTabs.standaloneWindow], }, }; diff --git a/app/react-tools/test-mocks.ts b/app/react-tools/test-mocks.ts index c957d7a34..895f84e28 100644 --- a/app/react-tools/test-mocks.ts +++ b/app/react-tools/test-mocks.ts @@ -80,7 +80,6 @@ export function createMockEnvironment(): Environment { AllowNoneIngressClass: false, }, }, - Nomad: { Snapshots: [] }, EdgeKey: '', EnableGPUManagement: false, Id: 3, diff --git a/app/react/common/stacks/types.ts b/app/react/common/stacks/types.ts index b2d79bdd4..86051939f 100644 --- a/app/react/common/stacks/types.ts +++ b/app/react/common/stacks/types.ts @@ -19,10 +19,6 @@ export enum StackType { * Represents a stack managed via kubectl */ Kubernetes, - /** - * Represents a stack managed via Nomad - */ - Nomad, } export enum StackStatus { diff --git a/app/react/components/Svg.tsx b/app/react/components/Svg.tsx index 6447679ad..398d89308 100644 --- a/app/react/components/Svg.tsx +++ b/app/react/components/Svg.tsx @@ -30,8 +30,6 @@ import helm from '@/assets/ico/vendor/helm.svg?c'; import linode from '@/assets/ico/vendor/linode.svg?c'; import microsoft from '@/assets/ico/vendor/microsoft.svg?c'; import microsofticon from '@/assets/ico/vendor/microsoft-icon.svg?c'; -import nomad from '@/assets/ico/vendor/nomad.svg?c'; -import nomadicon from '@/assets/ico/vendor/nomad-icon.svg?c'; import openldap from '@/assets/ico/vendor/openldap.svg?c'; import proget from '@/assets/ico/vendor/proget.svg?c'; import quay from '@/assets/ico/vendor/quay.svg?c'; @@ -67,8 +65,6 @@ export const SvgIcons = { linode, microsoft, microsofticon, - nomad, - nomadicon, openldap, proget, quay, diff --git a/app/react/edge/components/EdgeScriptForm/EdgeScriptForm.tsx b/app/react/edge/components/EdgeScriptForm/EdgeScriptForm.tsx index 411acb5c2..69ab23e2e 100644 --- a/app/react/edge/components/EdgeScriptForm/EdgeScriptForm.tsx +++ b/app/react/edge/components/EdgeScriptForm/EdgeScriptForm.tsx @@ -13,7 +13,6 @@ const edgePropertiesFormInitialValues: ScriptFormValues = { envVars: '', os: 'linux' as OS, platform: 'k8s' as Platform, - nomadToken: '', authEnabled: true, tlsEnabled: false, edgeGroupsIds: [], @@ -25,7 +24,6 @@ const edgePropertiesFormInitialValues: ScriptFormValues = { interface Props { edgeInfo: EdgeInfo; commands: CommandTab[] | Partial>; - isNomadTokenVisible?: boolean; asyncMode?: boolean; showMetaFields?: boolean; } @@ -33,7 +31,6 @@ interface Props { export function EdgeScriptForm({ edgeInfo, commands, - isNomadTokenVisible, asyncMode, showMetaFields, children, @@ -44,7 +41,7 @@ export function EdgeScriptForm({
validationSchema(isNomadTokenVisible)} + validationSchema={() => validationSchema()} onSubmit={() => {}} validateOnMount > @@ -53,9 +50,6 @@ export function EdgeScriptForm({ {children} diff --git a/app/react/edge/components/EdgeScriptForm/EdgeScriptForm.validation.tsx b/app/react/edge/components/EdgeScriptForm/EdgeScriptForm.validation.tsx index 0811485f3..a0f788724 100644 --- a/app/react/edge/components/EdgeScriptForm/EdgeScriptForm.validation.tsx +++ b/app/react/edge/components/EdgeScriptForm/EdgeScriptForm.validation.tsx @@ -1,8 +1,6 @@ import { object, boolean, string } from 'yup'; -import { validation as nomadTokenValidation } from './NomadTokenField'; - -export function validationSchema(isNomadTokenVisible?: boolean) { +export function validationSchema() { return object().shape({ allowSelfSignedCertificates: boolean(), envVars: string(), @@ -13,17 +11,5 @@ export function validationSchema(isNomadTokenVisible?: boolean) { 'edge id generator cannot be empty', (value) => !!(value && value.length) ), - ...nomadValidation(isNomadTokenVisible), }); } - -function nomadValidation(isNomadTokenVisible?: boolean) { - if (!isNomadTokenVisible) { - return {}; - } - - return { - tlsEnabled: boolean().default(false), - ...nomadTokenValidation(), - }; -} diff --git a/app/react/edge/components/EdgeScriptForm/EdgeScriptSettingsFieldset.tsx b/app/react/edge/components/EdgeScriptForm/EdgeScriptSettingsFieldset.tsx index eb62dbb72..0f0c87ead 100644 --- a/app/react/edge/components/EdgeScriptForm/EdgeScriptSettingsFieldset.tsx +++ b/app/react/edge/components/EdgeScriptForm/EdgeScriptSettingsFieldset.tsx @@ -10,17 +10,14 @@ import { TagSelector } from '@@/TagSelector'; import { EdgeGroupsSelector } from '../../edge-stacks/components/EdgeGroupsSelector'; -import { NomadTokenField } from './NomadTokenField'; import { ScriptFormValues } from './types'; interface Props { - isNomadTokenVisible?: boolean; hideIdGetter?: boolean; showMetaFields?: boolean; } export function EdgeScriptSettingsFieldset({ - isNomadTokenVisible, hideIdGetter, showMetaFields, }: Props) { @@ -75,23 +72,6 @@ export function EdgeScriptSettingsFieldset({ )} - {isNomadTokenVisible && ( - <> - - -
-
- setFieldValue('tlsEnabled', checked)} - /> -
-
- - )} - (); - - return ( - <> -
-
- { - if (!value) { - setFieldValue('nomadToken', ''); - } - setFieldValue('authEnabled', value); - }} - label="Nomad Authentication Enabled" - tooltip="Nomad authentication is only required if you have ACL enabled" - /> -
-
- - {values.authEnabled && ( - - - - )} - - ); -} - -export function validation() { - return { - nomadToken: string().when('authEnabled', { - is: true, - then: string().required('Token is required'), - }), - authEnabled: boolean(), - }; -} diff --git a/app/react/edge/components/EdgeScriptForm/scripts.ts b/app/react/edge/components/EdgeScriptForm/scripts.ts index 29ad9a954..1f547502f 100644 --- a/app/react/edge/components/EdgeScriptForm/scripts.ts +++ b/app/react/edge/components/EdgeScriptForm/scripts.ts @@ -35,11 +35,6 @@ export const commandsTabs: Record = { label: 'Docker Standalone', command: buildLinuxStandaloneCommand, }, - nomadLinux: { - id: 'nomad', - label: 'Nomad', - command: buildLinuxNomadCommand, - }, swarmWindows: { id: 'swarm', label: 'Docker Swarm', @@ -237,38 +232,6 @@ export function buildLinuxKubernetesCommand( return `${idEnvVar}curl https://downloads.portainer.io/ee${agentShortVersion}/portainer-edge-agent-setup.sh | bash -s -- "${edgeIdVar}" "${edgeKey}" "${selfSigned}" "${agentSecret}" "${allEnvVars}"`; } -export function buildLinuxNomadCommand( - agentVersion: string, - edgeKey: string, - properties: ScriptFormValues, - useAsyncMode: boolean, - edgeId?: string, - agentSecret?: string -) { - const { - allowSelfSignedCertificates, - edgeIdGenerator, - envVars, - nomadToken = '', - tlsEnabled, - } = properties; - - const agentShortVersion = getAgentShortVersion(agentVersion); - - const allEnvVars = buildEnvVars( - envVars, - _.compact([useAsyncMode && 'EDGE_ASYNC=1', ...metaEnvVars(properties)]) - ); - - const selfSigned = allowSelfSignedCertificates ? '1' : '0'; - const idEnvVar = edgeIdGenerator - ? `PORTAINER_EDGE_ID=$(${edgeIdGenerator}) \n\n` - : ''; - const edgeIdVar = !edgeIdGenerator && edgeId ? edgeId : '$PORTAINER_EDGE_ID'; - - return `${idEnvVar}curl https://downloads.portainer.io/ee${agentShortVersion}/portainer-edge-agent-nomad-setup.sh | bash -s -- "${nomadToken}" "${edgeIdVar}" "${edgeKey}" "${selfSigned}" "${allEnvVars}" "${agentSecret}" "${tlsEnabled}"`; -} - function buildDockerEnvVars(envVars: string, moreVars: string[]) { const vars = moreVars.concat(envVars.split(',').filter((s) => s.length > 0)); diff --git a/app/react/edge/components/EdgeScriptForm/types.ts b/app/react/edge/components/EdgeScriptForm/types.ts index 6d3581475..0e702655c 100644 --- a/app/react/edge/components/EdgeScriptForm/types.ts +++ b/app/react/edge/components/EdgeScriptForm/types.ts @@ -3,11 +3,10 @@ import { EnvironmentGroupId } from '@/react/portainer/environments/environment-g import { EdgeGroup } from '../../edge-groups/types'; -export type Platform = 'standalone' | 'swarm' | 'k8s' | 'nomad'; +export type Platform = 'standalone' | 'swarm' | 'k8s'; export type OS = 'win' | 'linux'; export interface ScriptFormValues { - nomadToken: string; authEnabled: boolean; tlsEnabled: boolean; diff --git a/app/react/edge/edge-stacks/ItemView/EditEdgeStackForm/EditEdgeStackForm.tsx b/app/react/edge/edge-stacks/ItemView/EditEdgeStackForm/EditEdgeStackForm.tsx index 00545b097..0d8e80227 100644 --- a/app/react/edge/edge-stacks/ItemView/EditEdgeStackForm/EditEdgeStackForm.tsx +++ b/app/react/edge/edge-stacks/ItemView/EditEdgeStackForm/EditEdgeStackForm.tsx @@ -24,10 +24,8 @@ import { PrivateRegistryFieldsetWrapper } from './PrivateRegistryFieldsetWrapper import { FormValues } from './types'; import { ComposeForm } from './ComposeForm'; import { KubernetesForm } from './KubernetesForm'; -import { NomadForm } from './NomadForm'; import { GitForm } from './GitForm'; import { useValidateEnvironmentTypes } from './useEdgeGroupHasType'; -import { atLeastTwo } from './atLeastTwo'; interface Props { edgeStack: EdgeStack; @@ -41,7 +39,6 @@ interface Props { const forms = { [DeploymentType.Compose]: ComposeForm, [DeploymentType.Kubernetes]: KubernetesForm, - [DeploymentType.Nomad]: NomadForm, }; export function EditEdgeStackForm({ @@ -108,7 +105,6 @@ function InnerForm({ const hasKubeEndpoint = hasType(EnvironmentType.EdgeAgentOnKubernetes); const hasDockerEndpoint = hasType(EnvironmentType.EdgeAgentOnDocker); - const hasNomadEndpoint = hasType(EnvironmentType.EdgeAgentOnNomad); const DeploymentForm = forms[values.deploymentType]; @@ -120,7 +116,7 @@ function InnerForm({ error={errors.edgeGroups} /> - {atLeastTwo(hasKubeEndpoint, hasDockerEndpoint, hasNomadEndpoint) && ( + {hasKubeEndpoint && hasDockerEndpoint && ( There are no available deployment types when there is more than one type of environment in your edge group selection (e.g. Kubernetes and @@ -142,7 +138,6 @@ function InnerForm({ value={values.deploymentType} hasDockerEndpoint={hasType(EnvironmentType.EdgeAgentOnDocker)} hasKubeEndpoint={hasType(EnvironmentType.EdgeAgentOnKubernetes)} - hasNomadEndpoint={hasType(EnvironmentType.EdgeAgentOnNomad)} onChange={(value) => { setFieldValue('content', getCachedContent(value)); setFieldValue('deploymentType', value); @@ -255,7 +250,6 @@ function useCachedContent() { const [cachedContent, setCachedContent] = useState({ [DeploymentType.Compose]: '', [DeploymentType.Kubernetes]: '', - [DeploymentType.Nomad]: '', }); function handleChangeContent(type: DeploymentType, content: string) { diff --git a/app/react/edge/edge-stacks/ItemView/EditEdgeStackForm/GitForm/GitForm.tsx b/app/react/edge/edge-stacks/ItemView/EditEdgeStackForm/GitForm/GitForm.tsx index 1a4566a12..06217cc34 100644 --- a/app/react/edge/edge-stacks/ItemView/EditEdgeStackForm/GitForm/GitForm.tsx +++ b/app/react/edge/edge-stacks/ItemView/EditEdgeStackForm/GitForm/GitForm.tsx @@ -44,7 +44,6 @@ import { EnvironmentVariablesPanel } from '@@/form-components/EnvironmentVariabl import { EnvVar } from '@@/form-components/EnvironmentVariablesFieldset/types'; import { useValidateEnvironmentTypes } from '../useEdgeGroupHasType'; -import { atLeastTwo } from '../atLeastTwo'; import { PrivateRegistryFieldset } from '../../../components/PrivateRegistryFieldset'; import { @@ -201,7 +200,6 @@ function InnerForm({ const hasKubeEndpoint = hasType(EnvironmentType.EdgeAgentOnKubernetes); const hasDockerEndpoint = hasType(EnvironmentType.EdgeAgentOnDocker); - const hasNomadEndpoint = hasType(EnvironmentType.EdgeAgentOnNomad); return (
@@ -211,7 +209,7 @@ function InnerForm({ error={errors.groupIds} /> - {atLeastTwo(hasKubeEndpoint, hasDockerEndpoint, hasNomadEndpoint) && ( + {hasKubeEndpoint && hasDockerEndpoint && ( There are no available deployment types when there is more than one type of environment in your edge group selection (e.g. Kubernetes and @@ -231,7 +229,6 @@ function InnerForm({ value={values.deploymentType} hasDockerEndpoint={hasType(EnvironmentType.EdgeAgentOnDocker)} hasKubeEndpoint={hasType(EnvironmentType.EdgeAgentOnKubernetes)} - hasNomadEndpoint={hasType(EnvironmentType.EdgeAgentOnNomad)} onChange={(value) => { setFieldValue('deploymentType', value); }} diff --git a/app/react/edge/edge-stacks/ItemView/EditEdgeStackForm/NomadForm.tsx b/app/react/edge/edge-stacks/ItemView/EditEdgeStackForm/NomadForm.tsx deleted file mode 100644 index 9a526e159..000000000 --- a/app/react/edge/edge-stacks/ItemView/EditEdgeStackForm/NomadForm.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import { useFormikContext } from 'formik'; - -import { WebEditorForm } from '@@/WebEditorForm'; - -import { DeploymentType } from '../../types'; - -import { FormValues } from './types'; - -export function NomadForm({ - handleContentChange, -}: { - handleContentChange: (type: DeploymentType, content: string) => void; -}) { - const { errors, values } = useFormikContext(); - - return ( - handleContentChange(DeploymentType.Nomad, value)} - error={errors.content} - > -

- You can get more information about Nomad file format in the{' '} - - official documentation - - . -

-
- ); -} diff --git a/app/react/edge/edge-stacks/components/EdgeStackDeploymentTypeSelector.tsx b/app/react/edge/edge-stacks/components/EdgeStackDeploymentTypeSelector.tsx index c2376c3dc..58d21796c 100644 --- a/app/react/edge/edge-stacks/components/EdgeStackDeploymentTypeSelector.tsx +++ b/app/react/edge/edge-stacks/components/EdgeStackDeploymentTypeSelector.tsx @@ -1,8 +1,6 @@ import _ from 'lodash'; import { EditorType } from '@/react/edge/edge-stacks/types'; -import NomadIcon from '@/assets/ico/vendor/nomad.svg?c'; -import { isBE } from '@/react/portainer/feature-flags/feature-flags.service'; import { BoxSelector } from '@@/BoxSelector'; import { BoxSelectorOption } from '@@/BoxSelector/types'; @@ -16,7 +14,6 @@ interface Props { onChange(value: number): void; hasDockerEndpoint: boolean; hasKubeEndpoint: boolean; - hasNomadEndpoint: boolean; allowKubeToSelectCompose?: boolean; } @@ -25,44 +22,28 @@ export function EdgeStackDeploymentTypeSelector({ onChange, hasDockerEndpoint, hasKubeEndpoint, - hasNomadEndpoint, allowKubeToSelectCompose, }: Props) { const deploymentOptions: BoxSelectorOption[] = _.compact([ { ...compose, value: EditorType.Compose, - disabled: () => - allowKubeToSelectCompose - ? hasNomadEndpoint - : hasNomadEndpoint || hasKubeEndpoint, + disabled: () => !allowKubeToSelectCompose && hasKubeEndpoint, tooltip: () => - hasNomadEndpoint || hasKubeEndpoint - ? 'Cannot use this option with Edge Kubernetes or Edge Nomad environments' + hasKubeEndpoint + ? 'Cannot use this option with Edge Kubernetes environments' : '', }, { ...kubernetes, value: EditorType.Kubernetes, - disabled: () => hasDockerEndpoint || hasNomadEndpoint, + disabled: () => hasDockerEndpoint, tooltip: () => - hasDockerEndpoint || hasNomadEndpoint - ? 'Cannot use this option with Edge Docker or Edge Nomad environments' + hasDockerEndpoint + ? 'Cannot use this option with Edge Docker environments' : '', iconType: 'logo', }, - isBE && { - id: 'deployment_nomad', - icon: NomadIcon, - label: 'Nomad', - description: 'Nomad HCL format', - value: EditorType.Nomad, - disabled: () => hasDockerEndpoint || hasKubeEndpoint, - tooltip: () => - hasDockerEndpoint || hasKubeEndpoint - ? 'Cannot use this option with Edge Docker or Edge Kubernetes environments' - : '', - }, ]); return ( diff --git a/app/react/edge/edge-stacks/types.ts b/app/react/edge/edge-stacks/types.ts index ccb5a3fe8..351942471 100644 --- a/app/react/edge/edge-stacks/types.ts +++ b/app/react/edge/edge-stacks/types.ts @@ -60,8 +60,6 @@ export enum DeploymentType { Compose, /** represent an edge stack deployed using a kubernetes manifest file */ Kubernetes, - /** represent an edge stack deployed using a nomad hcl job file */ - Nomad, } export type EdgeStack = { @@ -100,5 +98,4 @@ export type EdgeStack = { export enum EditorType { Compose, Kubernetes, - Nomad, } diff --git a/app/react/nomad/DashboardView/DashboardView.tsx b/app/react/nomad/DashboardView/DashboardView.tsx deleted file mode 100644 index 8a992fc61..000000000 --- a/app/react/nomad/DashboardView/DashboardView.tsx +++ /dev/null @@ -1,83 +0,0 @@ -import { List, Settings, Boxes, Gauge } from 'lucide-react'; - -import { useEnvironmentId } from '@/react/hooks/useEnvironmentId'; - -import { DashboardItem } from '@@/DashboardItem'; -import { Widget, WidgetTitle, WidgetBody } from '@@/Widget'; -import { PageHeader } from '@@/PageHeader'; -import { DashboardGrid } from '@@/DashboardItem/DashboardGrid'; -import { Icon } from '@@/Icon'; - -import { useDashboard } from './useDashboard'; -import { RunningStatus } from './RunningStatus'; - -export function DashboardView() { - const environmentId = useEnvironmentId(); - const dashboardQuery = useDashboard(environmentId); - - const running = dashboardQuery.data?.RunningTaskCount || 0; - const stopped = (dashboardQuery.data?.TaskCount || 0) - running; - - return ( - <> - - - {dashboardQuery.isLoading ? ( -
- Connecting to the Edge environment... - -
- ) : ( - <> -
-
- {/* cluster info */} - - - - - - - - - - -
Nodes in the cluster{dashboardQuery.data?.NodeCount ?? '-'}
-
-
-
-
- -
- - {/* jobs */} - - {/* groups */} - - {/* tasks */} - - {/* running status of tasks */} - - - -
- - )} - - ); -} diff --git a/app/react/nomad/DashboardView/RunningStatus.tsx b/app/react/nomad/DashboardView/RunningStatus.tsx deleted file mode 100644 index d86a8d1d1..000000000 --- a/app/react/nomad/DashboardView/RunningStatus.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { Power } from 'lucide-react'; - -import { StatsItem } from '@@/StatsItem'; - -interface Props { - running: number; - stopped: number; -} - -export function RunningStatus({ running, stopped }: Props) { - return ( -
-
- - {`${running || '-'} running`} -
-
- - {`${stopped || '-'} stopped`} -
-
- ); -} diff --git a/app/react/nomad/DashboardView/index.ts b/app/react/nomad/DashboardView/index.ts deleted file mode 100644 index ea829dbf3..000000000 --- a/app/react/nomad/DashboardView/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { DashboardView } from './DashboardView'; diff --git a/app/react/nomad/DashboardView/useDashboard.ts b/app/react/nomad/DashboardView/useDashboard.ts deleted file mode 100644 index d491b63c6..000000000 --- a/app/react/nomad/DashboardView/useDashboard.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { useQuery } from 'react-query'; - -import { EnvironmentId } from '@/react/portainer/environments/types'; -import axios, { parseAxiosError } from '@/portainer/services/axios'; - -export type DashboardResponse = { - JobCount: number; - GroupCount: number; - TaskCount: number; - RunningTaskCount: number; - NodeCount: number; -}; - -export function useDashboard(environmentId: EnvironmentId) { - return useQuery( - ['environments', environmentId, 'nomad', 'dashboard'], - () => getDashboard(environmentId), - { - meta: { - error: { - title: 'Failure', - message: 'Unable to get dashboard information', - }, - }, - } - ); -} - -export async function getDashboard(environmentId: EnvironmentId) { - try { - const { data: dashboard } = await axios.get( - `/nomad/endpoints/${environmentId}/dashboard`, - { - params: {}, - } - ); - return dashboard; - } catch (e) { - throw parseAxiosError(e as Error); - } -} diff --git a/app/react/nomad/jobs/EventsView/EventsDatatable/EventsDatatable.tsx b/app/react/nomad/jobs/EventsView/EventsDatatable/EventsDatatable.tsx deleted file mode 100644 index bd9f62342..000000000 --- a/app/react/nomad/jobs/EventsView/EventsDatatable/EventsDatatable.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { History } from 'lucide-react'; - -import { NomadEvent } from '@/react/nomad/types'; - -import { Datatable } from '@@/datatables'; -import { createPersistedStore } from '@@/datatables/types'; -import { useTableState } from '@@/datatables/useTableState'; - -import { columns } from './columns'; - -export interface EventsDatatableProps { - data: NomadEvent[]; - isLoading: boolean; -} - -const storageKey = 'nomad_events'; - -const settingsStore = createPersistedStore(storageKey, 'date'); - -export function EventsDatatable({ data, isLoading }: EventsDatatableProps) { - const tableState = useTableState(settingsStore, storageKey); - - return ( - `${row.Date}-${row.Message}-${row.Type}`} - disableSelect - /> - ); -} diff --git a/app/react/nomad/jobs/EventsView/EventsDatatable/columns/date.tsx b/app/react/nomad/jobs/EventsView/EventsDatatable/columns/date.tsx deleted file mode 100644 index 440c8b6d5..000000000 --- a/app/react/nomad/jobs/EventsView/EventsDatatable/columns/date.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { isoDate } from '@/portainer/filters/filters'; - -import { columnHelper } from './helper'; - -export const date = columnHelper.accessor('Date', { - header: 'Date', - id: 'date', - cell: ({ getValue }) => { - const date = getValue(); - return date ? isoDate(date) : '-'; - }, -}); diff --git a/app/react/nomad/jobs/EventsView/EventsDatatable/columns/helper.ts b/app/react/nomad/jobs/EventsView/EventsDatatable/columns/helper.ts deleted file mode 100644 index 239da69fe..000000000 --- a/app/react/nomad/jobs/EventsView/EventsDatatable/columns/helper.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { createColumnHelper } from '@tanstack/react-table'; - -import { NomadEvent } from '@/react/nomad/types'; - -export const columnHelper = createColumnHelper(); diff --git a/app/react/nomad/jobs/EventsView/EventsDatatable/columns/index.tsx b/app/react/nomad/jobs/EventsView/EventsDatatable/columns/index.tsx deleted file mode 100644 index 001e6dfaa..000000000 --- a/app/react/nomad/jobs/EventsView/EventsDatatable/columns/index.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { date } from './date'; -import { type } from './type'; -import { message } from './message'; - -export const columns = [date, type, message]; diff --git a/app/react/nomad/jobs/EventsView/EventsDatatable/columns/message.tsx b/app/react/nomad/jobs/EventsView/EventsDatatable/columns/message.tsx deleted file mode 100644 index 686856a93..000000000 --- a/app/react/nomad/jobs/EventsView/EventsDatatable/columns/message.tsx +++ /dev/null @@ -1,6 +0,0 @@ -import { columnHelper } from './helper'; - -export const message = columnHelper.accessor('Message', { - header: 'Message', - id: 'message', -}); diff --git a/app/react/nomad/jobs/EventsView/EventsDatatable/columns/type.tsx b/app/react/nomad/jobs/EventsView/EventsDatatable/columns/type.tsx deleted file mode 100644 index 1a165071b..000000000 --- a/app/react/nomad/jobs/EventsView/EventsDatatable/columns/type.tsx +++ /dev/null @@ -1,6 +0,0 @@ -import { columnHelper } from './helper'; - -export const type = columnHelper.accessor('Type', { - header: 'Type', - id: 'type', -}); diff --git a/app/react/nomad/jobs/EventsView/EventsDatatable/index.ts b/app/react/nomad/jobs/EventsView/EventsDatatable/index.ts deleted file mode 100644 index 79b6c371a..000000000 --- a/app/react/nomad/jobs/EventsView/EventsDatatable/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { EventsDatatable } from './EventsDatatable'; diff --git a/app/react/nomad/jobs/EventsView/EventsView.tsx b/app/react/nomad/jobs/EventsView/EventsView.tsx deleted file mode 100644 index 3f33e1e82..000000000 --- a/app/react/nomad/jobs/EventsView/EventsView.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { useCurrentStateAndParams } from '@uirouter/react'; - -import { useEnvironmentId } from '@/react/hooks/useEnvironmentId'; - -import { PageHeader } from '@@/PageHeader'; - -import { EventsDatatable } from './EventsDatatable'; -import { useEvents } from './useEvents'; - -export function EventsView() { - const environmentId = useEnvironmentId(); - const { query, invalidateQuery } = useEvents(); - const { - params: { jobID, taskName }, - } = useCurrentStateAndParams(); - - const breadcrumbs = [ - { - label: 'Nomad Jobs', - link: 'nomad.jobs', - linkParams: { id: environmentId }, - }, - { label: jobID }, - { label: taskName }, - { label: 'Events' }, - ]; - - return ( - <> - - - - - ); -} diff --git a/app/react/nomad/jobs/EventsView/index.ts b/app/react/nomad/jobs/EventsView/index.ts deleted file mode 100644 index 89943afeb..000000000 --- a/app/react/nomad/jobs/EventsView/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { EventsView } from './EventsView'; diff --git a/app/react/nomad/jobs/EventsView/useEvents.ts b/app/react/nomad/jobs/EventsView/useEvents.ts deleted file mode 100644 index 1d1cec667..000000000 --- a/app/react/nomad/jobs/EventsView/useEvents.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { useQuery, useQueryClient } from 'react-query'; -import { useCurrentStateAndParams } from '@uirouter/react'; - -import * as notifications from '@/portainer/services/notifications'; -import { EnvironmentId } from '@/react/portainer/environments/types'; -import axios, { parseAxiosError } from '@/portainer/services/axios'; - -import { NomadEventsList } from '../../types'; - -export function useEvents() { - const queryClient = useQueryClient(); - - const { - params: { - endpointId: environmentID, - allocationID, - jobID, - taskName, - namespace, - }, - } = useCurrentStateAndParams(); - - if (!environmentID) { - throw new Error('endpointId url param is required'); - } - - const key = [ - 'environments', - environmentID, - 'nomad', - 'events', - allocationID, - jobID, - taskName, - namespace, - ]; - - function invalidateQuery() { - return queryClient.invalidateQueries(key); - } - - const query = useQuery( - key, - () => - getTaskEvents(environmentID, allocationID, jobID, taskName, namespace), - { - refetchOnWindowFocus: false, - onError: (err) => { - notifications.error('Failed loading events', err as Error, ''); - }, - } - ); - - return { query, invalidateQuery }; -} - -export async function getTaskEvents( - environmentId: EnvironmentId, - allocationId: string, - jobId: string, - taskName: string, - namespace: string -) { - try { - const ret = await axios.get( - `/nomad/endpoints/${environmentId}/allocation/${allocationId}/events`, - { - params: { jobId, taskName, namespace }, - } - ); - return ret.data; - } catch (e) { - throw parseAxiosError(e as Error); - } -} diff --git a/app/react/nomad/jobs/JobsView/JobsDatatable/JobsDatatable.tsx b/app/react/nomad/jobs/JobsView/JobsDatatable/JobsDatatable.tsx deleted file mode 100644 index 35bb17c50..000000000 --- a/app/react/nomad/jobs/JobsView/JobsDatatable/JobsDatatable.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { Clock } from 'lucide-react'; - -import { Job } from '@/react/nomad/types'; - -import { useRepeater } from '@@/datatables/useRepeater'; -import { ExpandableDatatable } from '@@/datatables/ExpandableDatatable'; -import { TableSettingsMenu } from '@@/datatables/TableSettingsMenu'; -import { useTableState } from '@@/datatables/useTableState'; - -import { TasksDatatable } from './TasksDatatable'; -import { columns } from './columns'; -import { createStore } from './datatable-store'; -import { JobsDatatableSettings } from './JobsDatatableSettings'; - -export interface JobsDatatableProps { - jobs: Job[]; - refreshData: () => Promise; - isLoading?: boolean; -} - -const storageKey = 'nomad_jobs'; -const settingsStore = createStore(storageKey); - -export function JobsDatatable({ - jobs, - refreshData, - isLoading, -}: JobsDatatableProps) { - const tableState = useTableState(settingsStore, storageKey); - useRepeater(tableState.autoRefreshRate, refreshData); - - return ( - ( - - - - - - )} - isLoading={isLoading} - renderTableSettings={() => ( - - - - )} - expandOnRowClick - /> - ); -} diff --git a/app/react/nomad/jobs/JobsView/JobsDatatable/JobsDatatableSettings.tsx b/app/react/nomad/jobs/JobsView/JobsDatatable/JobsDatatableSettings.tsx deleted file mode 100644 index 14e6d2924..000000000 --- a/app/react/nomad/jobs/JobsView/JobsDatatable/JobsDatatableSettings.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { TableSettingsMenuAutoRefresh } from '@@/datatables/TableSettingsMenuAutoRefresh'; - -import { TableSettings } from './types'; - -interface Props { - settings: TableSettings; -} - -export function JobsDatatableSettings({ settings }: Props) { - return ( - - ); - - function handleRefreshRateChange(autoRefreshRate: number) { - settings.setAutoRefreshRate(autoRefreshRate); - } -} diff --git a/app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/TasksDatatable.tsx b/app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/TasksDatatable.tsx deleted file mode 100644 index da1f1210d..000000000 --- a/app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/TasksDatatable.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { Task } from '@/react/nomad/types'; - -import { NestedDatatable } from '@@/datatables/NestedDatatable'; - -import { columns } from './columns'; - -export interface Props { - data: Task[]; -} - -export function TasksDatatable({ data }: Props) { - return ( - - ); -} diff --git a/app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/columns/actions.tsx b/app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/columns/actions.tsx deleted file mode 100644 index 3ee8f96c5..000000000 --- a/app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/columns/actions.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import { Clock, FileText } from 'lucide-react'; -import { CellContext } from '@tanstack/react-table'; - -import { Task } from '@/react/nomad/types'; - -import { Link } from '@@/Link'; -import { Icon } from '@@/Icon'; - -import { columnHelper } from './helper'; - -export const actions = columnHelper.display({ - header: 'Task Actions', - id: 'actions', - meta: { - width: '5px', - }, - cell: ActionsCell, -}); - -export function ActionsCell({ row }: CellContext) { - const params = { - allocationID: row.original.AllocationID, - taskName: row.original.TaskName, - namespace: row.original.Namespace, - jobID: row.original.JobID, - }; - - return ( -
- {/* events */} - - - - - {/* logs */} - - - -
- ); -} diff --git a/app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/columns/allocationID.tsx b/app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/columns/allocationID.tsx deleted file mode 100644 index 8267c58c1..000000000 --- a/app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/columns/allocationID.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { columnHelper } from './helper'; - -export const allocationID = columnHelper.accessor('AllocationID', { - header: 'Allocation ID', - id: 'allocationID', - cell: ({ getValue }) => { - const value = getValue(); - return value || '-'; - }, -}); diff --git a/app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/columns/helper.ts b/app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/columns/helper.ts deleted file mode 100644 index 9280074fd..000000000 --- a/app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/columns/helper.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { createColumnHelper } from '@tanstack/react-table'; - -import { Task } from '@/react/nomad/types'; - -export const columnHelper = createColumnHelper(); diff --git a/app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/columns/index.tsx b/app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/columns/index.tsx deleted file mode 100644 index 94b7852b1..000000000 --- a/app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/columns/index.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { taskStatus } from './taskStatus'; -import { taskName } from './taskName'; -import { taskGroup } from './taskGroup'; -import { allocationID } from './allocationID'; -import { started } from './started'; -import { actions } from './actions'; - -export const columns = [ - taskStatus, - taskName, - taskGroup, - allocationID, - actions, - started, -]; diff --git a/app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/columns/started.tsx b/app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/columns/started.tsx deleted file mode 100644 index d5e06c4f7..000000000 --- a/app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/columns/started.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import moment from 'moment'; - -import { Task } from '@/react/nomad/types'; -import { isoDate } from '@/portainer/filters/filters'; - -import { columnHelper } from './helper'; - -function accessor(row: Task) { - const momentDate = moment(row.StartedAt); - const isValid = momentDate.unix() > 0; - return isValid ? isoDate(momentDate) : '-'; -} - -export const started = columnHelper.accessor(accessor, { - header: 'Started', - id: 'startedName', -}); diff --git a/app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/columns/taskGroup.tsx b/app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/columns/taskGroup.tsx deleted file mode 100644 index 875cd24b9..000000000 --- a/app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/columns/taskGroup.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { columnHelper } from './helper'; - -export const taskGroup = columnHelper.accessor('TaskGroup', { - header: 'Task Group', - id: 'taskGroup', - cell: ({ getValue }) => { - const value = getValue(); - return value || '-'; - }, -}); diff --git a/app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/columns/taskName.tsx b/app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/columns/taskName.tsx deleted file mode 100644 index c3a324150..000000000 --- a/app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/columns/taskName.tsx +++ /dev/null @@ -1,6 +0,0 @@ -import { columnHelper } from './helper'; - -export const taskName = columnHelper.accessor('TaskName', { - header: 'Task Name', - id: 'taskName', -}); diff --git a/app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/columns/taskStatus.tsx b/app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/columns/taskStatus.tsx deleted file mode 100644 index cc322820a..000000000 --- a/app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/columns/taskStatus.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import _ from 'lodash'; -import clsx from 'clsx'; -import { CellContext } from '@tanstack/react-table'; - -import { Task } from '@/react/nomad/types'; - -import { filterHOC } from '@@/datatables/Filter'; - -import { columnHelper } from './helper'; - -export const taskStatus = columnHelper.accessor('State', { - header: 'Task Status', - id: 'status', - meta: { - filter: filterHOC('Filter by state'), - }, - cell: StateCell, - enableColumnFilter: true, -}); - -function StateCell({ getValue }: CellContext) { - const state = getValue(); - const className = getClassName(); - - return {state}; - - function getClassName() { - if (['dead'].includes(_.toLower(state))) { - return 'label-danger'; - } - - if (['pending'].includes(_.toLower(state))) { - return 'label-warning'; - } - - return 'label-success'; - } -} diff --git a/app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/index.ts b/app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/index.ts deleted file mode 100644 index f95acf3ac..000000000 --- a/app/react/nomad/jobs/JobsView/JobsDatatable/TasksDatatable/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { TasksDatatable } from './TasksDatatable'; diff --git a/app/react/nomad/jobs/JobsView/JobsDatatable/actions/JobActions.tsx b/app/react/nomad/jobs/JobsView/JobsDatatable/actions/JobActions.tsx deleted file mode 100644 index 33ffb264a..000000000 --- a/app/react/nomad/jobs/JobsView/JobsDatatable/actions/JobActions.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import { useMutation } from 'react-query'; -import { Trash2 } from 'lucide-react'; - -import { useEnvironmentId } from '@/react/hooks/useEnvironmentId'; -import { Job } from '@/react/nomad/types'; - -import { confirmDelete } from '@@/modals/confirm'; -import { LoadingButton } from '@@/buttons/LoadingButton'; - -import { deleteJobs } from './delete'; - -interface Props { - selectedItems: Job[]; - refreshData: () => Promise | void; -} - -export function JobActions({ selectedItems, refreshData }: Props) { - const environmentId = useEnvironmentId(); - - const mutation = useMutation(() => deleteJobs(environmentId, selectedItems)); - - return ( - - Remove - - ); - - async function handleDeleteClicked() { - const confirmed = await confirmDelete( - 'Are you sure to delete all selected jobs?' - ); - - if (!confirmed) { - return; - } - - mutation.mutate(undefined, { - onSuccess() { - return refreshData(); - }, - }); - } -} diff --git a/app/react/nomad/jobs/JobsView/JobsDatatable/actions/delete.tsx b/app/react/nomad/jobs/JobsView/JobsDatatable/actions/delete.tsx deleted file mode 100644 index a19e67737..000000000 --- a/app/react/nomad/jobs/JobsView/JobsDatatable/actions/delete.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import * as notifications from '@/portainer/services/notifications'; -import { EnvironmentId } from '@/react/portainer/environments/types'; -import { Job } from '@/react/nomad/types'; -import { deleteJob } from '@/react/nomad/jobs/jobs.service'; - -export async function deleteJobs(environmentID: EnvironmentId, jobs: Job[]) { - return Promise.all( - jobs.map(async (job) => { - try { - await deleteJob(environmentID, job.ID, job.Namespace); - notifications.success('Job successfully removed', job.ID); - } catch (err) { - notifications.error( - 'Failure', - err as Error, - `Failed to delete job ${job.ID}` - ); - } - }) - ); -} diff --git a/app/react/nomad/jobs/JobsView/JobsDatatable/columns/actions.tsx b/app/react/nomad/jobs/JobsView/JobsDatatable/columns/actions.tsx deleted file mode 100644 index 7ac0a63fb..000000000 --- a/app/react/nomad/jobs/JobsView/JobsDatatable/columns/actions.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { Clock } from 'lucide-react'; - -import { Icon } from '@@/Icon'; - -import { columnHelper } from './helper'; - -export const actions = columnHelper.display({ - header: 'Job Actions', - id: 'actions', - meta: { - width: '110px', - }, - cell: ActionsCell, -}); - -export function ActionsCell() { - return ( -
- -
- ); -} diff --git a/app/react/nomad/jobs/JobsView/JobsDatatable/columns/created.tsx b/app/react/nomad/jobs/JobsView/JobsDatatable/columns/created.tsx deleted file mode 100644 index 710760c86..000000000 --- a/app/react/nomad/jobs/JobsView/JobsDatatable/columns/created.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { isoDate } from '@/portainer/filters/filters'; - -import { columnHelper } from './helper'; - -export const created = columnHelper.accessor('SubmitTime', { - header: 'Created', - id: 'created', - cell: ({ getValue }) => { - const date = getValue(); - return date ? isoDate(parseInt(date, 10)) : '-'; - }, -}); diff --git a/app/react/nomad/jobs/JobsView/JobsDatatable/columns/helper.ts b/app/react/nomad/jobs/JobsView/JobsDatatable/columns/helper.ts deleted file mode 100644 index 7baae53d7..000000000 --- a/app/react/nomad/jobs/JobsView/JobsDatatable/columns/helper.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { createColumnHelper } from '@tanstack/react-table'; - -import { Job } from '@/react/nomad/types'; - -export const columnHelper = createColumnHelper(); diff --git a/app/react/nomad/jobs/JobsView/JobsDatatable/columns/index.tsx b/app/react/nomad/jobs/JobsView/JobsDatatable/columns/index.tsx deleted file mode 100644 index c3fdaa0ee..000000000 --- a/app/react/nomad/jobs/JobsView/JobsDatatable/columns/index.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { Job } from '@/react/nomad/types'; - -import { buildExpandColumn } from '@@/datatables/expand-column'; - -import { name } from './name'; -import { status } from './status'; -import { created } from './created'; -import { actions } from './actions'; -import { namespace } from './namespace'; - -const expand = buildExpandColumn(); - -export const columns = [expand, name, status, namespace, actions, created]; diff --git a/app/react/nomad/jobs/JobsView/JobsDatatable/columns/name.tsx b/app/react/nomad/jobs/JobsView/JobsDatatable/columns/name.tsx deleted file mode 100644 index a25c77197..000000000 --- a/app/react/nomad/jobs/JobsView/JobsDatatable/columns/name.tsx +++ /dev/null @@ -1,6 +0,0 @@ -import { columnHelper } from './helper'; - -export const name = columnHelper.accessor('ID', { - header: 'Name', - id: 'name', -}); diff --git a/app/react/nomad/jobs/JobsView/JobsDatatable/columns/namespace.tsx b/app/react/nomad/jobs/JobsView/JobsDatatable/columns/namespace.tsx deleted file mode 100644 index 1e832413b..000000000 --- a/app/react/nomad/jobs/JobsView/JobsDatatable/columns/namespace.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { columnHelper } from './helper'; - -export const namespace = columnHelper.accessor('Namespace', { - header: 'Namespace', - id: 'namespace', - cell: ({ getValue }) => { - const value = getValue(); - return value || '-'; - }, -}); diff --git a/app/react/nomad/jobs/JobsView/JobsDatatable/columns/status.tsx b/app/react/nomad/jobs/JobsView/JobsDatatable/columns/status.tsx deleted file mode 100644 index 64c80e206..000000000 --- a/app/react/nomad/jobs/JobsView/JobsDatatable/columns/status.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { columnHelper } from './helper'; - -export const status = columnHelper.accessor('Status', { - header: 'Job Status', - id: 'status', - cell: ({ getValue }) => { - const value = getValue(); - return value || '-'; - }, -}); diff --git a/app/react/nomad/jobs/JobsView/JobsDatatable/datatable-store.ts b/app/react/nomad/jobs/JobsView/JobsDatatable/datatable-store.ts deleted file mode 100644 index 94fe39a8a..000000000 --- a/app/react/nomad/jobs/JobsView/JobsDatatable/datatable-store.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { refreshableSettings, createPersistedStore } from '@@/datatables/types'; - -import { TableSettings } from './types'; - -export function createStore(storageKey: string) { - return createPersistedStore(storageKey, 'created', (set) => ({ - ...refreshableSettings(set), - })); -} diff --git a/app/react/nomad/jobs/JobsView/JobsDatatable/index.ts b/app/react/nomad/jobs/JobsView/JobsDatatable/index.ts deleted file mode 100644 index fde9e775b..000000000 --- a/app/react/nomad/jobs/JobsView/JobsDatatable/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { JobsDatatable } from './JobsDatatable'; diff --git a/app/react/nomad/jobs/JobsView/JobsDatatable/types.ts b/app/react/nomad/jobs/JobsView/JobsDatatable/types.ts deleted file mode 100644 index c9b659ff7..000000000 --- a/app/react/nomad/jobs/JobsView/JobsDatatable/types.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { - BasicTableSettings, - RefreshableTableSettings, -} from '@@/datatables/types'; - -export interface TableSettings - extends BasicTableSettings, - RefreshableTableSettings {} - -export enum DeployType { - FDO = 'FDO', - MANUAL = 'MANUAL', -} diff --git a/app/react/nomad/jobs/JobsView/JobsView.tsx b/app/react/nomad/jobs/JobsView/JobsView.tsx deleted file mode 100644 index cdf7be3ce..000000000 --- a/app/react/nomad/jobs/JobsView/JobsView.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { useEnvironmentId } from '@/react/hooks/useEnvironmentId'; - -import { PageHeader } from '@@/PageHeader'; - -import { useJobs } from './useJobs'; -import { JobsDatatable } from './JobsDatatable'; - -export function JobsView() { - const environmentId = useEnvironmentId(); - const jobsQuery = useJobs(environmentId); - - async function reloadData() { - await jobsQuery.refetch(); - } - - return ( - <> - - - - - ); -} diff --git a/app/react/nomad/jobs/JobsView/index.ts b/app/react/nomad/jobs/JobsView/index.ts deleted file mode 100644 index 29a6fb69e..000000000 --- a/app/react/nomad/jobs/JobsView/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { JobsView } from './JobsView'; diff --git a/app/react/nomad/jobs/JobsView/useJobs.ts b/app/react/nomad/jobs/JobsView/useJobs.ts deleted file mode 100644 index 5a8618516..000000000 --- a/app/react/nomad/jobs/JobsView/useJobs.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { useQuery } from 'react-query'; - -import { EnvironmentId } from '@/react/portainer/environments/types'; -import { Job } from '@/react/nomad/types'; -import axios, { parseAxiosError } from '@/portainer/services/axios'; - -export function useJobs(environmentId: EnvironmentId) { - return useQuery( - ['environments', environmentId, 'nomad', 'jobs'], - () => listJobs(environmentId), - { - meta: { - error: { - title: 'Failure', - message: 'Unable to list jobs', - }, - }, - } - ); -} - -export async function listJobs(environmentId: EnvironmentId) { - try { - const { data: jobs } = await axios.get( - `/nomad/endpoints/${environmentId}/jobs`, - { - params: {}, - } - ); - return jobs; - } catch (e) { - throw parseAxiosError(e as Error); - } -} diff --git a/app/react/nomad/jobs/LogsView/.keep b/app/react/nomad/jobs/LogsView/.keep deleted file mode 100644 index e69de29bb..000000000 diff --git a/app/react/nomad/jobs/jobs.service.ts b/app/react/nomad/jobs/jobs.service.ts deleted file mode 100644 index 8e0977d59..000000000 --- a/app/react/nomad/jobs/jobs.service.ts +++ /dev/null @@ -1,16 +0,0 @@ -import axios, { parseAxiosError } from '@/portainer/services/axios'; -import { EnvironmentId } from '@/react/portainer/environments/types'; - -export async function deleteJob( - environmentId: EnvironmentId, - jobId: string, - namespace: string -) { - try { - await axios.delete(`/nomad/endpoints/${environmentId}/jobs/${jobId}`, { - params: { namespace }, - }); - } catch (e) { - throw parseAxiosError(e as Error); - } -} diff --git a/app/react/nomad/nomad.service.ts b/app/react/nomad/nomad.service.ts deleted file mode 100644 index 4ce318940..000000000 --- a/app/react/nomad/nomad.service.ts +++ /dev/null @@ -1,20 +0,0 @@ -import axios, { parseAxiosError } from '@/portainer/services/axios'; -import { EnvironmentId } from '@/react/portainer/environments/types'; - -interface LeaderResponse { - Leader: string; -} - -export async function getLeader(environmentId: EnvironmentId) { - try { - const { data } = await axios.get( - `/nomad/endpoints/${environmentId}/leader`, - { - params: {}, - } - ); - return data; - } catch (e) { - throw parseAxiosError(e as Error); - } -} diff --git a/app/react/nomad/types.ts b/app/react/nomad/types.ts deleted file mode 100644 index dcf2d1d32..000000000 --- a/app/react/nomad/types.ts +++ /dev/null @@ -1,25 +0,0 @@ -export type NomadEvent = { - Type: string; - Message: string; - Date: number; -}; - -export type NomadEventsList = NomadEvent[]; - -export type Task = { - JobID: string; - Namespace: string; - TaskName: string; - State: string; - TaskGroup: string; - AllocationID: string; - StartedAt: string; -}; - -export type Job = { - ID: string; - Status: string; - Namespace: string; - SubmitTime: string; - Tasks: Task[]; -}; diff --git a/app/react/portainer/HomeView/EnvironmentList/EnvironmentItem/EnvironmentStats.tsx b/app/react/portainer/HomeView/EnvironmentList/EnvironmentItem/EnvironmentStats.tsx index 7d1c5f457..b3ad7f22d 100644 --- a/app/react/portainer/HomeView/EnvironmentList/EnvironmentItem/EnvironmentStats.tsx +++ b/app/react/portainer/HomeView/EnvironmentList/EnvironmentItem/EnvironmentStats.tsx @@ -6,7 +6,6 @@ import { getPlatformType } from '@/react/portainer/environments/utils'; import { EnvironmentStatsDocker } from './EnvironmentStatsDocker'; import { EnvironmentStatsKubernetes } from './EnvironmentStatsKubernetes'; -import { EnvironmentStatsNomad } from './EnvironmentStatsNomad'; interface Props { environment: Environment; @@ -34,10 +33,6 @@ function getComponent(platform: PlatformType, environment: Environment) { ); case PlatformType.Docker: return ; - case PlatformType.Nomad: - return ( - - ); default: return null; } diff --git a/app/react/portainer/HomeView/EnvironmentList/EnvironmentItem/EnvironmentStatsNomad.tsx b/app/react/portainer/HomeView/EnvironmentList/EnvironmentItem/EnvironmentStatsNomad.tsx deleted file mode 100644 index b6db46f67..000000000 --- a/app/react/portainer/HomeView/EnvironmentList/EnvironmentItem/EnvironmentStatsNomad.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import { Box, Dice4, HardDrive, List, Power } from 'lucide-react'; - -import { NomadSnapshot } from '@/react/portainer/environments/types'; -import { addPlural } from '@/portainer/helpers/strings'; - -import { StatsItem } from '@@/StatsItem'; - -interface Props { - snapshot?: NomadSnapshot; -} - -export function EnvironmentStatsNomad({ snapshot }: Props) { - if (!snapshot) { - return <>No snapshot available; - } - - return ( - <> - - - - {snapshot.TaskCount > 0 && ( - <> - - - - )} - - - - - ); -} diff --git a/app/react/portainer/HomeView/EnvironmentList/EnvironmentList.tsx b/app/react/portainer/HomeView/EnvironmentList/EnvironmentList.tsx index 58096e4da..ec471aef1 100644 --- a/app/react/portainer/HomeView/EnvironmentList/EnvironmentList.tsx +++ b/app/react/portainer/HomeView/EnvironmentList/EnvironmentList.tsx @@ -268,7 +268,6 @@ export function EnvironmentList({ onClickBrowse, onRefresh }: Props) { EnvironmentType.AgentOnKubernetes, EnvironmentType.EdgeAgentOnKubernetes, ], - [PlatformType.Nomad]: [EnvironmentType.EdgeAgentOnNomad], }; const typesByConnection = { diff --git a/app/react/portainer/HomeView/EnvironmentList/EnvironmentListFilters.tsx b/app/react/portainer/HomeView/EnvironmentList/EnvironmentListFilters.tsx index 01af915c8..40a3bcf53 100644 --- a/app/react/portainer/HomeView/EnvironmentList/EnvironmentListFilters.tsx +++ b/app/react/portainer/HomeView/EnvironmentList/EnvironmentListFilters.tsx @@ -4,7 +4,6 @@ import { useTags } from '@/portainer/tags/queries'; import { useAgentVersionsList } from '../../environments/queries/useAgentVersionsList'; import { EnvironmentStatus, PlatformType } from '../../environments/types'; -import { isBE } from '../../feature-flags/feature-flags.service'; import { useGroups } from '../../environments/environment-groups/queries'; import { SortOptions, @@ -188,10 +187,6 @@ function getConnectionTypeOptions(platformTypes: PlatformType[]) { ConnectionType.EdgeAgentStandard, ConnectionType.EdgeAgentAsync, ], - [PlatformType.Nomad]: [ - ConnectionType.EdgeAgentStandard, - ConnectionType.EdgeAgentAsync, - ], }; const connectionTypesDefaultOptions = [ @@ -219,13 +214,6 @@ function getPlatformTypeOptions(connectionTypes: ConnectionType[]) { { value: PlatformType.Kubernetes, label: 'Kubernetes' }, ]; - if (isBE) { - platformDefaultOptions.push({ - value: PlatformType.Nomad, - label: 'Nomad', - }); - } - if (connectionTypes.length === 0) { return platformDefaultOptions; } @@ -235,11 +223,9 @@ function getPlatformTypeOptions(connectionTypes: ConnectionType[]) { [ConnectionType.Agent]: [PlatformType.Docker, PlatformType.Kubernetes], [ConnectionType.EdgeAgentStandard]: [ PlatformType.Kubernetes, - PlatformType.Nomad, PlatformType.Docker, ], [ConnectionType.EdgeAgentAsync]: [ - PlatformType.Nomad, PlatformType.Docker, PlatformType.Kubernetes, ], diff --git a/app/react/portainer/environments/EdgeAutoCreateScriptView/AutomaticEdgeEnvCreation/AutomaticEdgeEnvCreation.tsx b/app/react/portainer/environments/EdgeAutoCreateScriptView/AutomaticEdgeEnvCreation/AutomaticEdgeEnvCreation.tsx index 8880986d5..dc9fa88f0 100644 --- a/app/react/portainer/environments/EdgeAutoCreateScriptView/AutomaticEdgeEnvCreation/AutomaticEdgeEnvCreation.tsx +++ b/app/react/portainer/environments/EdgeAutoCreateScriptView/AutomaticEdgeEnvCreation/AutomaticEdgeEnvCreation.tsx @@ -23,7 +23,6 @@ const commands = { commandsTabs.k8sLinux, commandsTabs.swarmLinux, commandsTabs.standaloneLinux, - commandsTabs.nomadLinux, ], win: [commandsTabs.swarmWindows, commandsTabs.standaloneWindow], }; @@ -156,7 +155,6 @@ function EdgeKeyInfo({ diff --git a/app/react/portainer/environments/queries/useEnvironmentList.ts b/app/react/portainer/environments/queries/useEnvironmentList.ts index 966dab122..978aba855 100644 --- a/app/react/portainer/environments/queries/useEnvironmentList.ts +++ b/app/react/portainer/environments/queries/useEnvironmentList.ts @@ -2,7 +2,7 @@ import { useQuery } from 'react-query'; import { withError } from '@/react-tools/react-query'; -import { EnvironmentStatus } from '../types'; +import { EnvironmentStatus, EnvironmentType } from '../types'; import { EnvironmentsQueryParams, getEnvironments, @@ -71,6 +71,24 @@ export function useEnvironmentList( ], async () => { const start = (page - 1) * pageLimit + 1; + + // Workaround for EE-6060: filter out Nomad results when no filter is applied. + // Remove when cleaning up API. + if (!query.types || query.types.length === 0) { + const environmentTypesArray: EnvironmentType[] = [ + EnvironmentType.Docker, + EnvironmentType.AgentOnDocker, + EnvironmentType.Azure, + EnvironmentType.EdgeAgentOnDocker, + EnvironmentType.KubernetesLocal, + EnvironmentType.AgentOnKubernetes, + EnvironmentType.EdgeAgentOnKubernetes, + ]; + + // eslint-disable-next-line no-param-reassign + query.types = environmentTypesArray; + } + return getEnvironments({ start, limit: pageLimit, diff --git a/app/react/portainer/environments/types.ts b/app/react/portainer/environments/types.ts index f35a077ee..5e6b5272f 100644 --- a/app/react/portainer/environments/types.ts +++ b/app/react/portainer/environments/types.ts @@ -1,6 +1,5 @@ import { TagId } from '@/portainer/tags/types'; import { EnvironmentGroupId } from '@/react/portainer/environments/environment-groups/types'; -import { Job } from '@/react/nomad/types'; import { DockerSnapshot } from '@/react/docker/snapshots/types'; export type EnvironmentId = number; @@ -20,14 +19,11 @@ export enum EnvironmentType { AgentOnKubernetes, // EdgeAgentOnKubernetes represents an environment(endpoint) connected to an Edge agent deployed on a Kubernetes environment(endpoint) EdgeAgentOnKubernetes, - // EdgeAgentOnNomad represents an environment(endpoint) connected to an Edge agent deployed on a Nomad environment(endpoint) - EdgeAgentOnNomad, } export const EdgeTypes = [ EnvironmentType.EdgeAgentOnDocker, EnvironmentType.EdgeAgentOnKubernetes, - EnvironmentType.EdgeAgentOnNomad, ] as const; export enum EnvironmentStatus { @@ -75,20 +71,6 @@ export interface KubernetesSettings { Configuration: KubernetesConfiguration; } -export interface NomadSnapshot { - JobCount: number; - GroupCount: number; - TaskCount: number; - RunningTaskCount: number; - NodeCount: number; - Time: number; - Jobs: Job[]; -} - -export interface NomadSettings { - Snapshots: NomadSnapshot[]; -} - export type EnvironmentEdge = { AsyncMode: boolean; PingInterval: number; @@ -156,7 +138,6 @@ export type Environment = { URL: string; Snapshots: DockerSnapshot[]; Kubernetes: KubernetesSettings; - Nomad: NomadSettings; PublicURL?: string; UserTrusted: boolean; AMTDeviceGUID?: string; @@ -190,5 +171,4 @@ export enum PlatformType { Docker, Kubernetes, Azure, - Nomad, } diff --git a/app/react/portainer/environments/update-schedules/CreateView/CreateView.tsx b/app/react/portainer/environments/update-schedules/CreateView/CreateView.tsx index 0f40cafdb..bd809e35a 100644 --- a/app/react/portainer/environments/update-schedules/CreateView/CreateView.tsx +++ b/app/react/portainer/environments/update-schedules/CreateView/CreateView.tsx @@ -58,7 +58,7 @@ function CreateView() {
diff --git a/app/react/portainer/environments/update-schedules/ItemView/ItemView.tsx b/app/react/portainer/environments/update-schedules/ItemView/ItemView.tsx index 983e560d1..1b3cc6d0c 100644 --- a/app/react/portainer/environments/update-schedules/ItemView/ItemView.tsx +++ b/app/react/portainer/environments/update-schedules/ItemView/ItemView.tsx @@ -82,7 +82,7 @@ function ItemView() {
diff --git a/app/react/portainer/environments/update-schedules/ListView/ListView.tsx b/app/react/portainer/environments/update-schedules/ListView/ListView.tsx index 01d429428..a39336dd0 100644 --- a/app/react/portainer/environments/update-schedules/ListView/ListView.tsx +++ b/app/react/portainer/environments/update-schedules/ListView/ListView.tsx @@ -62,7 +62,7 @@ export function ListView() { = { dockerSwarm: 'Connect to your Docker Swarm environment', kubernetes: 'Connect to your Kubernetes environment', aci: 'Connect to your ACI environment', - nomad: 'Connect to your Nomad environment', kaas: 'Provision a KaaS environment', k8sInstall: 'Create a Kubernetes cluster', }; diff --git a/app/react/portainer/environments/wizard/EnvironmentsCreationView/EnvironmentsCreationView.tsx b/app/react/portainer/environments/wizard/EnvironmentsCreationView/EnvironmentsCreationView.tsx index 4fae4f007..e0a2f37c8 100644 --- a/app/react/portainer/environments/wizard/EnvironmentsCreationView/EnvironmentsCreationView.tsx +++ b/app/react/portainer/environments/wizard/EnvironmentsCreationView/EnvironmentsCreationView.tsx @@ -210,7 +210,6 @@ function useAnalyticsState() { kaasAgent: 0, aciApi: 0, localEndpoint: 0, - nomadEdgeAgentStandard: 0, dockerEdgeAgentAsync: 0, dockerEdgeAgentStandard: 0, }); diff --git a/app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/EdgeAgentTab/EdgeAgentTab.tsx b/app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/EdgeAgentTab/EdgeAgentTab.tsx index ca9d0774e..1ce5fc102 100644 --- a/app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/EdgeAgentTab/EdgeAgentTab.tsx +++ b/app/react/portainer/environments/wizard/EnvironmentsCreationView/shared/EdgeAgentTab/EdgeAgentTab.tsx @@ -14,16 +14,10 @@ import { EdgeAgentForm } from './EdgeAgentForm'; interface Props { onCreate: (environment: Environment) => void; commands: CommandTab[] | Partial>; - isNomadTokenVisible?: boolean; asyncMode?: boolean; } -export function EdgeAgentTab({ - onCreate, - commands, - isNomadTokenVisible, - asyncMode = false, -}: Props) { +export function EdgeAgentTab({ onCreate, commands, asyncMode = false }: Props) { const [edgeInfo, setEdgeInfo] = useState(); const [formKey, clearForm] = useReducer((state) => state + 1, 0); @@ -49,7 +43,6 @@ export function EdgeAgentTab({ diff --git a/app/react/portainer/environments/wizard/EnvironmentsCreationView/types.ts b/app/react/portainer/environments/wizard/EnvironmentsCreationView/types.ts index 9fb76255e..13317d129 100644 --- a/app/react/portainer/environments/wizard/EnvironmentsCreationView/types.ts +++ b/app/react/portainer/environments/wizard/EnvironmentsCreationView/types.ts @@ -9,7 +9,6 @@ export interface AnalyticsState { kaasAgent: number; aciApi: number; localEndpoint: number; - nomadEdgeAgentStandard: number; } export type AnalyticsStateKey = keyof AnalyticsState; diff --git a/app/react/portainer/feature-flags/enums.ts b/app/react/portainer/feature-flags/enums.ts index 5b9615c29..e7f77f9f2 100644 --- a/app/react/portainer/feature-flags/enums.ts +++ b/app/react/portainer/feature-flags/enums.ts @@ -15,7 +15,6 @@ export enum FeatureId { K8S_CREATE_FROM_KUBECONFIG = 'k8s-create-from-kubeconfig', K8S_EDIT_YAML = 'k8s-edit-yaml', KAAS_PROVISIONING = 'kaas-provisioning', - NOMAD = 'nomad', RBAC_ROLES = 'rbac-roles', REGISTRY_MANAGEMENT = 'registry-management', K8S_SETUP_DEFAULT = 'k8s-setup-default', diff --git a/app/react/portainer/feature-flags/feature-flags.service.ts b/app/react/portainer/feature-flags/feature-flags.service.ts index 048db493a..6f69c42da 100644 --- a/app/react/portainer/feature-flags/feature-flags.service.ts +++ b/app/react/portainer/feature-flags/feature-flags.service.ts @@ -20,7 +20,6 @@ export async function init(edition: Edition) { [FeatureId.K8S_CREATE_FROM_KUBECONFIG]: Edition.BE, [FeatureId.KAAS_PROVISIONING]: Edition.BE, [FeatureId.K8SINSTALL]: Edition.BE, - [FeatureId.NOMAD]: Edition.BE, [FeatureId.ACTIVITY_AUDIT]: Edition.BE, [FeatureId.EXTERNAL_AUTH_LDAP]: Edition.BE, [FeatureId.HIDE_INTERNAL_AUTH]: Edition.BE, diff --git a/app/react/portainer/gitops/GitForm.stories.tsx b/app/react/portainer/gitops/GitForm.stories.tsx index dfb60768e..beae078fe 100644 --- a/app/react/portainer/gitops/GitForm.stories.tsx +++ b/app/react/portainer/gitops/GitForm.stories.tsx @@ -48,7 +48,7 @@ interface Args { isAdditionalFilesFieldVisible: boolean; isAuthExplanationVisible: boolean; isDockerStandalone: boolean; - deployMethod: 'compose' | 'nomad' | 'manifest'; + deployMethod: 'compose' | 'manifest'; isForcePullVisible: boolean; } diff --git a/app/react/portainer/gitops/GitForm.tsx b/app/react/portainer/gitops/GitForm.tsx index 19c947206..599989716 100644 --- a/app/react/portainer/gitops/GitForm.tsx +++ b/app/react/portainer/gitops/GitForm.tsx @@ -23,7 +23,7 @@ interface Props { value: GitFormModel; onChange: (value: Partial) => void; environmentType?: 'DOCKER' | 'KUBERNETES' | undefined; - deployMethod?: 'compose' | 'nomad' | 'manifest'; + deployMethod?: 'compose' | 'manifest'; isDockerStandalone?: boolean; isAdditionalFilesFieldVisible?: boolean; isForcePullVisible?: boolean; diff --git a/app/react/portainer/system/useSystemInfo.ts b/app/react/portainer/system/useSystemInfo.ts index cd7016170..769ed1143 100644 --- a/app/react/portainer/system/useSystemInfo.ts +++ b/app/react/portainer/system/useSystemInfo.ts @@ -12,8 +12,7 @@ export type ContainerPlatform = | 'Docker Standalone' | 'Docker Swarm' | 'Kubernetes' - | 'Podman' - | 'Nomad'; + | 'Podman'; export interface SystemInfoResponse { platform: ContainerPlatform; diff --git a/app/react/sidebar/EnvironmentSidebar.tsx b/app/react/sidebar/EnvironmentSidebar.tsx index c6586c6f7..b3159585b 100644 --- a/app/react/sidebar/EnvironmentSidebar.tsx +++ b/app/react/sidebar/EnvironmentSidebar.tsx @@ -11,7 +11,6 @@ import { } from '@/react/portainer/environments/types'; import { getPlatformType } from '@/react/portainer/environments/utils'; import { useEnvironment } from '@/react/portainer/environments/queries/useEnvironment'; -import { isBE } from '@/react/portainer/feature-flags/feature-flags.service'; import { environmentStore } from '@/react/hooks/current-environment-store'; import { Icon } from '@@/Icon'; @@ -24,7 +23,6 @@ import { DockerSidebar } from './DockerSidebar'; import { KubernetesSidebar } from './KubernetesSidebar'; import { SidebarSection, SidebarSectionTitle } from './SidebarSection'; import { useSidebarState } from './useSidebarState'; -import { NomadSidebar } from './NomadSidebar'; export function EnvironmentSidebar() { const { query: currentEnvironmentQuery, clearEnvironment } = @@ -87,7 +85,6 @@ function Content({ environment, onClear }: ContentProps) { [PlatformType.Azure]: AzureSidebar, [PlatformType.Docker]: DockerSidebar, [PlatformType.Kubernetes]: KubernetesSidebar, - [PlatformType.Nomad]: isBE ? NomadSidebar : null, }; return sidebar[platform]; diff --git a/app/react/sidebar/NomadSidebar/NomadSidebar.test.tsx b/app/react/sidebar/NomadSidebar/NomadSidebar.test.tsx deleted file mode 100644 index 8f71f77a4..000000000 --- a/app/react/sidebar/NomadSidebar/NomadSidebar.test.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import { UserContext } from '@/react/hooks/useUser'; -import { UserViewModel } from '@/portainer/models/user'; -import { render, within } from '@/react-tools/test-utils'; - -import { TestSidebarProvider } from '../useSidebarState'; - -import { NomadSidebar } from './NomadSidebar'; - -test('dashboard items should render correctly', () => { - const { getByLabelText } = renderComponent(); - const dashboardItem = getByLabelText(/Dashboard/i); - expect(dashboardItem).toBeVisible(); - expect(dashboardItem).toHaveTextContent('Dashboard'); - - const dashboardItemElements = within(dashboardItem); - expect( - dashboardItemElements.getByRole('img', { hidden: true }) - ).toBeVisible(); - - const jobsItem = getByLabelText('Nomad Jobs'); - expect(jobsItem).toBeVisible(); - expect(jobsItem).toHaveTextContent('Jobs'); - - const jobsItemElements = within(jobsItem); - expect(jobsItemElements.getByRole('img', { hidden: true })).toBeVisible(); -}); - -function renderComponent() { - const user = new UserViewModel({ Username: 'user' }); - - return render( - - - - - - ); -} diff --git a/app/react/sidebar/NomadSidebar/NomadSidebar.tsx b/app/react/sidebar/NomadSidebar/NomadSidebar.tsx deleted file mode 100644 index b451ffd5a..000000000 --- a/app/react/sidebar/NomadSidebar/NomadSidebar.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { Clock } from 'lucide-react'; - -import { EnvironmentId } from '@/react/portainer/environments/types'; - -import { DashboardLink } from '../items/DashboardLink'; -import { SidebarItem } from '../SidebarItem'; - -interface Props { - environmentId: EnvironmentId; -} - -export function NomadSidebar({ environmentId }: Props) { - return ( - <> - - - - - ); -} diff --git a/app/react/sidebar/NomadSidebar/index.ts b/app/react/sidebar/NomadSidebar/index.ts deleted file mode 100644 index 27ec2b481..000000000 --- a/app/react/sidebar/NomadSidebar/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { NomadSidebar } from './NomadSidebar';