@rancher/shell 0.3.4 → 0.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (289) hide show
  1. package/assets/images/providers/outscale.svg +19 -0
  2. package/assets/styles/app.scss +1 -1
  3. package/assets/styles/base/_basic.scss +18 -0
  4. package/assets/styles/base/_mixins.scss +0 -11
  5. package/assets/styles/base/_variables.scss +2 -4
  6. package/assets/styles/fonts/_fontstack.scss +11 -11
  7. package/assets/styles/global/_button.scss +12 -2
  8. package/assets/styles/vendor/vue-js-modal.scss +3 -3
  9. package/assets/translations/en-us.yaml +113 -22
  10. package/assets/translations/zh-hans.yaml +113 -24
  11. package/babel.config.js +13 -0
  12. package/chart/gatekeeper.vue +78 -0
  13. package/chart/istio.vue +135 -112
  14. package/chart/logging/index.vue +13 -4
  15. package/chart/monitoring/index.vue +15 -5
  16. package/chart/monitoring/steps/uninstall-v1.vue +2 -2
  17. package/chart/rancher-backup/index.vue +10 -3
  18. package/cloud-credential/aws.vue +1 -1
  19. package/cloud-credential/digitalocean.vue +1 -1
  20. package/cloud-credential/gcp.vue +1 -1
  21. package/cloud-credential/generic.vue +2 -2
  22. package/cloud-credential/linode.vue +1 -1
  23. package/cloud-credential/pnap.vue +1 -1
  24. package/components/ActionMenu.vue +3 -4
  25. package/components/AssignTo.vue +1 -1
  26. package/components/AsyncButton.vue +1 -1
  27. package/components/BannerGraphic.vue +1 -1
  28. package/components/BrandImage.vue +1 -4
  29. package/components/ButtonDropdown.vue +2 -3
  30. package/components/Carousel.vue +85 -37
  31. package/components/ChartPsp.vue +76 -0
  32. package/components/CruResource.vue +6 -2
  33. package/components/DashboardMetrics.vue +12 -10
  34. package/components/DetailText.vue +1 -1
  35. package/components/DisableAuthProviderModal.vue +1 -1
  36. package/components/EmberPage.vue +1 -1
  37. package/components/EtcdInfoBanner.vue +12 -7
  38. package/components/ExplorerMembers.vue +101 -6
  39. package/components/ExplorerProjectsNamespaces.vue +46 -3
  40. package/components/FileDiff.vue +6 -7
  41. package/components/GrafanaDashboard.vue +27 -23
  42. package/components/LazyImage.vue +10 -12
  43. package/components/LogItem.vue +1 -1
  44. package/components/Markdown.vue +1 -1
  45. package/components/PromptRemove.vue +2 -2
  46. package/components/PromptRestore.vue +1 -1
  47. package/components/ResourceDetail/Masthead.vue +16 -0
  48. package/components/ResourceDetail/index.vue +21 -4
  49. package/components/ResourceList/index.vue +1 -1
  50. package/components/ResourceTable.vue +4 -1
  51. package/components/SingleClusterInfo.vue +2 -2
  52. package/components/SortableTable/THead.vue +1 -1
  53. package/components/SortableTable/index.vue +28 -13
  54. package/components/SortableTable/selection.js +58 -50
  55. package/components/Wizard.vue +4 -2
  56. package/components/__tests__/AsyncButton.test.ts +3 -1
  57. package/components/__tests__/ChartPsp.test.ts +75 -0
  58. package/components/__tests__/CruResource.test.ts +3 -1
  59. package/components/auth/Principal.vue +1 -1
  60. package/components/auth/RoleDetailEdit.vue +2 -2
  61. package/components/fleet/FleetBundles.vue +3 -1
  62. package/components/fleet/FleetClusters.vue +1 -2
  63. package/components/fleet/FleetIntro.vue +9 -1
  64. package/components/fleet/FleetNoWorkspaces.vue +62 -0
  65. package/components/fleet/FleetSummary.vue +7 -1
  66. package/components/form/HookOption.vue +14 -10
  67. package/components/form/LabeledSelect.vue +14 -11
  68. package/components/form/Labels.vue +32 -27
  69. package/components/form/MatchExpressions.vue +19 -4
  70. package/components/form/Members/ClusterPermissionsEditor.vue +32 -7
  71. package/components/form/NameNsDescription.vue +32 -46
  72. package/components/form/ProjectMemberEditor.vue +46 -21
  73. package/components/form/ResourceSelector.vue +1 -1
  74. package/components/form/SecretSelector.vue +5 -1
  75. package/components/form/ServiceNameSelect.vue +1 -1
  76. package/components/form/SimpleSecretSelector.vue +9 -9
  77. package/components/form/Tolerations.vue +4 -1
  78. package/components/form/ValueFromResource.vue +14 -9
  79. package/components/form/WorkloadPorts.vue +2 -2
  80. package/components/form/__tests__/LabeledSelect.test.ts +138 -0
  81. package/components/form/__tests__/NameNsDescription.ts +59 -0
  82. package/components/formatter/InternalExternalIP.vue +6 -0
  83. package/components/formatter/InvolvedObjectLink.vue +54 -0
  84. package/components/formatter/Link.vue +20 -4
  85. package/components/formatter/LinkName.vue +6 -1
  86. package/components/formatter/ServiceTargets.vue +1 -1
  87. package/components/formatter/WorkloadHealthScale.vue +8 -2
  88. package/components/nav/Group.vue +2 -2
  89. package/components/nav/NamespaceFilter.vue +23 -11
  90. package/components/nav/TopLevelMenu.vue +2 -4
  91. package/components/nav/Type.vue +1 -1
  92. package/components/nav/WorkspaceSwitcher.vue +46 -5
  93. package/components/nuxt/nuxt-build-indicator.vue +143 -0
  94. package/components/nuxt/nuxt-child.js +122 -0
  95. package/components/nuxt/nuxt-error.vue +98 -0
  96. package/components/nuxt/nuxt-link.client.js +98 -0
  97. package/components/nuxt/nuxt-link.server.js +16 -0
  98. package/components/nuxt/nuxt-loading.vue +154 -0
  99. package/components/nuxt/nuxt.js +101 -0
  100. package/config/labels-annotations.js +17 -0
  101. package/config/middleware.js +12 -0
  102. package/config/product/auth.js +3 -2
  103. package/config/product/explorer.js +34 -6
  104. package/config/product/fleet.js +2 -0
  105. package/config/query-params.js +1 -0
  106. package/config/router.js +414 -0
  107. package/config/store.js +181 -0
  108. package/config/table-headers.js +54 -12
  109. package/config/types.js +18 -8
  110. package/config/uiplugins.js +30 -0
  111. package/content/docs/en-us/whats-new.md +10 -0
  112. package/content/docs/zh-hans/whats-new.md +11 -1
  113. package/core/plugin-routes.ts +23 -0
  114. package/core/plugin.ts +4 -2
  115. package/core/types.ts +258 -1
  116. package/creators/app/app.package.json +2 -1
  117. package/creators/app/files/.eslintrc.js +1 -1
  118. package/creators/app/files/babel.config.js +1 -18
  119. package/creators/app/files/tsconfig.json +0 -1
  120. package/creators/app/files/vue.config.js +6 -0
  121. package/creators/app/init +5 -5
  122. package/creators/pkg/files/.github/workflows/build-extension.yml +110 -0
  123. package/creators/pkg/files/tsconfig.json +0 -1
  124. package/creators/pkg/init +35 -4
  125. package/creators/pkg/pkg.package.json +3 -3
  126. package/creators/update/init +1 -1
  127. package/detail/constraints.gatekeeper.sh.constraint.vue +34 -17
  128. package/detail/fleet.cattle.io.clustergroup.vue +7 -1
  129. package/detail/fleet.cattle.io.gitrepo.vue +19 -11
  130. package/detail/harvesterhci.io.management.cluster.vue +3 -3
  131. package/detail/provisioning.cattle.io.cluster.vue +54 -12
  132. package/detail/workload/index.vue +3 -3
  133. package/dialog/AddClusterMemberDialog.vue +1 -1
  134. package/dialog/AddProjectMemberDialog.vue +2 -2
  135. package/dialog/AddonConfigConfirmationDialog.vue +27 -15
  136. package/dialog/DiagnosticTimingsDialog.vue +1 -1
  137. package/dialog/ForceMachineRemoveDialog.vue +1 -1
  138. package/dialog/GenericPrompt.vue +18 -6
  139. package/dialog/RotateEncryptionKeyDialog.vue +1 -1
  140. package/dialog/SaveAsRKETemplateDialog.vue +1 -1
  141. package/dialog/ScaleMachineDownDialog.vue +1 -1
  142. package/edit/auth/github.vue +8 -8
  143. package/edit/auth/googleoauth.vue +5 -5
  144. package/edit/auth/ldap/index.vue +1 -1
  145. package/edit/auth/oidc.vue +1 -1
  146. package/edit/auth/saml.vue +1 -1
  147. package/edit/cis.cattle.io.clusterscan.vue +1 -1
  148. package/edit/fleet.cattle.io.clustergroup.vue +6 -4
  149. package/edit/fleet.cattle.io.gitrepo.vue +32 -4
  150. package/edit/helm.cattle.io.projecthelmchart.vue +5 -1
  151. package/edit/logging.banzaicloud.io.output/index.vue +18 -5
  152. package/edit/logging.banzaicloud.io.output/providers/loki.vue +1 -0
  153. package/edit/management.cattle.io.fleetworkspace.vue +141 -6
  154. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +4 -1
  155. package/edit/management.cattle.io.setting.vue +1 -1
  156. package/edit/monitoring.coreos.com.alertmanagerconfig/types/webhook.vue +2 -2
  157. package/edit/monitoring.coreos.com.receiver/tls.vue +18 -18
  158. package/edit/monitoring.coreos.com.receiver/types/webhook.banner.vue +4 -4
  159. package/edit/monitoring.coreos.com.receiver/types/webhook.vue +1 -1
  160. package/edit/namespace.vue +14 -10
  161. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +126 -45
  162. package/edit/networking.k8s.io.networkpolicy/index.vue +1 -1
  163. package/edit/provisioning.cattle.io.cluster/MachinePool.vue +21 -4
  164. package/edit/provisioning.cattle.io.cluster/RegistryConfigs.vue +1 -0
  165. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +202 -2
  166. package/edit/provisioning.cattle.io.cluster/import.vue +23 -25
  167. package/edit/provisioning.cattle.io.cluster/rke2.vue +344 -102
  168. package/edit/resources.cattle.io.backup.vue +1 -1
  169. package/edit/service.vue +1 -1
  170. package/edit/storage.k8s.io.storageclass/provisioners/driver.harvesterhci.io.vue +2 -2
  171. package/edit/workload/__tests__/Job.test.ts +3 -1
  172. package/edit/workload/index.vue +8 -3
  173. package/edit/workload/mixins/workload.js +22 -7
  174. package/edit/workload/storage/Mount.vue +3 -3
  175. package/initialize/App.js +206 -0
  176. package/initialize/client.js +863 -0
  177. package/initialize/index.js +364 -0
  178. package/layouts/default.vue +7 -3
  179. package/layouts/standalone.vue +13 -0
  180. package/list/catalog.cattle.io.clusterrepo.vue +1 -0
  181. package/list/fleet.cattle.io.bundle.vue +6 -3
  182. package/list/fleet.cattle.io.clusterregistrationtoken.vue +3 -1
  183. package/list/fleet.cattle.io.gitrepo.vue +44 -5
  184. package/list/management.cattle.io.fleetworkspace.vue +45 -0
  185. package/list/node.vue +69 -16
  186. package/list/provisioning.cattle.io.cluster.vue +30 -1
  187. package/list/rbac.authorization.k8s.io.clusterrolebinding.vue +48 -0
  188. package/list/workload.vue +6 -4
  189. package/machine-config/azure.vue +97 -38
  190. package/middleware/authenticated.js +34 -0
  191. package/mixins/chart.js +101 -2
  192. package/mixins/fetch.client.js +95 -0
  193. package/mixins/fetch.server.js +73 -0
  194. package/mixins/labeled-form-element.ts +2 -2
  195. package/mixins/resource-fetch.js +2 -2
  196. package/models/apps.statefulset.js +28 -0
  197. package/models/cluster/node.js +23 -2
  198. package/models/cluster.x-k8s.io.machine.js +4 -2
  199. package/models/clusterroletemplatebinding.js +7 -0
  200. package/models/constraints.gatekeeper.sh.constraint.js +46 -0
  201. package/models/fleet.cattle.io.cluster.js +19 -10
  202. package/models/fleet.cattle.io.gitrepo.js +7 -2
  203. package/models/management.cattle.io.cluster.js +1 -1
  204. package/models/management.cattle.io.fleetworkspace.js +12 -0
  205. package/models/management.cattle.io.gitreporestriction.js +5 -0
  206. package/models/management.cattle.io.podsecurityadmissionconfigurationtemplate.js +3 -0
  207. package/models/pod.js +4 -0
  208. package/models/provisioning.cattle.io.cluster.js +7 -5
  209. package/models/rbac.authorization.k8s.io.clusterrolebinding.js +16 -0
  210. package/models/rbac.authorization.k8s.io.rolebinding.js +16 -0
  211. package/package.json +13 -21
  212. package/pages/auth/setup.vue +2 -2
  213. package/pages/c/_cluster/apps/charts/__tests__/install.helper.test.ts +33 -0
  214. package/pages/c/_cluster/apps/charts/chart.vue +4 -4
  215. package/pages/c/_cluster/apps/charts/install.helpers.js +26 -0
  216. package/pages/c/_cluster/apps/charts/install.vue +98 -102
  217. package/pages/c/_cluster/explorer/EventsTable.vue +5 -19
  218. package/pages/c/_cluster/explorer/index.vue +29 -25
  219. package/pages/c/_cluster/explorer/tools/index.vue +8 -8
  220. package/pages/c/_cluster/fleet/index.vue +95 -34
  221. package/pages/c/_cluster/gatekeeper/index.vue +1 -1
  222. package/pages/c/_cluster/istio/index.vue +5 -5
  223. package/pages/c/_cluster/manager/cloudCredential/index.vue +1 -1
  224. package/pages/c/_cluster/monitoring/index.vue +7 -0
  225. package/pages/c/_cluster/uiplugins/InstallDialog.vue +8 -8
  226. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +20 -7
  227. package/pages/c/_cluster/uiplugins/index.vue +49 -17
  228. package/pages/diagnostic.vue +32 -25
  229. package/pages/home.vue +9 -4
  230. package/pages/index.vue +10 -1
  231. package/pages/rio/mesh.vue +1 -2
  232. package/pkg/tsconfig.json +0 -1
  233. package/plugins/clean-html-directive.js +34 -0
  234. package/plugins/dashboard-store/actions.js +32 -9
  235. package/plugins/dashboard-store/index.js +1 -1
  236. package/plugins/dashboard-store/mutations.js +5 -2
  237. package/plugins/dashboard-store/resource-class.js +8 -1
  238. package/plugins/plugin.js +0 -14
  239. package/plugins/portal-vue.js +4 -0
  240. package/plugins/steve/mutations.js +3 -2
  241. package/plugins/steve/steve-description-class.js +5 -1
  242. package/plugins/steve/subscribe.js +63 -54
  243. package/plugins/steve-create-worker.js +14 -0
  244. package/promptRemove/management.cattle.io.globalrole.vue +2 -2
  245. package/promptRemove/management.cattle.io.project.vue +2 -2
  246. package/promptRemove/management.cattle.io.roletemplate.vue +2 -2
  247. package/promptRemove/pod.vue +1 -1
  248. package/public/index.html +65 -0
  249. package/rancher-components/components/Banner/Banner.test.ts +7 -1
  250. package/rancher-components/components/Banner/Banner.vue +2 -1
  251. package/rancher-components/components/Form/Checkbox/Checkbox.vue +2 -0
  252. package/rancher-components/components/Form/Radio/RadioButton.test.ts +31 -0
  253. package/rancher-components/components/Form/Radio/RadioButton.vue +14 -3
  254. package/scripts/build-pkg.sh +1 -0
  255. package/scripts/clean +6 -0
  256. package/scripts/extension/bundle +58 -0
  257. package/scripts/extension/helmpatch +89 -0
  258. package/scripts/extension/publish +333 -0
  259. package/scripts/serve-pkgs +6 -2
  260. package/scripts/test-plugins-build.sh +4 -0
  261. package/store/__tests__/index.test.ts +110 -0
  262. package/store/index.js +145 -58
  263. package/store/type-map.js +6 -2
  264. package/tsconfig.default.json +36 -0
  265. package/tsconfig.json +23 -0
  266. package/types/rancher/index.d.ts +2 -0
  267. package/types/shell/index.d.ts +466 -320
  268. package/utils/__tests__/grafana.test.ts +44 -0
  269. package/utils/__tests__/string.test.ts +12 -0
  270. package/utils/auth.js +65 -0
  271. package/utils/axios.js +190 -0
  272. package/utils/cookie-universal-nuxt.js +10 -0
  273. package/utils/dom.js +15 -0
  274. package/utils/grafana.js +35 -16
  275. package/utils/monitoring.js +2 -1
  276. package/utils/nuxt.js +659 -0
  277. package/utils/position.js +5 -8
  278. package/utils/router.scrollBehavior.js +80 -0
  279. package/utils/select.js +1 -3
  280. package/utils/socket.js +1 -0
  281. package/utils/string.js +13 -0
  282. package/utils/time.js +9 -0
  283. package/vue.config.js +690 -0
  284. package/chart/rancher-alerting-drivers.vue +0 -53
  285. package/chart/rancher-gatekeeper.vue +0 -37
  286. package/creators/app/files/nuxt.config.js +0 -6
  287. package/models/management.cattle.io.podsecurityadmissionconfigurationtemplate.ts +0 -4
  288. package/nuxt.config.js +0 -798
  289. package/plugins/dashboard-store/extensions.js +0 -22
@@ -103,7 +103,7 @@ export default class ProvCluster extends SteveModel {
103
103
  const clusterTemplatesSchema = this.$getters['schemaFor']('management.cattle.io.clustertemplate');
104
104
  let canUpdateClusterTemplate = false;
105
105
 
106
- if (clusterTemplatesSchema && (clusterTemplatesSchema.resourceMethods.includes('blocked-PUT') || clusterTemplatesSchema.resourceMethods.includes('PUT'))) {
106
+ if (clusterTemplatesSchema && (clusterTemplatesSchema.resourceMethods?.includes('blocked-PUT') || clusterTemplatesSchema.resourceMethods?.includes('PUT'))) {
107
107
  canUpdateClusterTemplate = true;
108
108
  }
109
109
 
@@ -272,7 +272,7 @@ export default class ProvCluster extends SteveModel {
272
272
  }
273
273
 
274
274
  get mgmtClusterId() {
275
- return this.mgmt?.id || this.id.replace(`${ this.metadata.namespace }/`, '');
275
+ return this.mgmt?.id || this.id?.replace(`${ this.metadata.namespace }/`, '');
276
276
  }
277
277
 
278
278
  get mgmt() {
@@ -291,8 +291,10 @@ export default class ProvCluster extends SteveModel {
291
291
  return !!this.mgmt?.isReady;
292
292
  }
293
293
 
294
+ // nodeGroups can be undefined for an EKS cluster that has just been created and has not
295
+ // had any node groups added to it
294
296
  get eksNodeGroups() {
295
- return this.mgmt?.spec?.eksConfig?.nodeGroups;
297
+ return this.mgmt?.spec?.eksConfig?.nodeGroups || [];
296
298
  }
297
299
 
298
300
  waitForProvisioner(timeout, interval) {
@@ -457,9 +459,9 @@ export default class ProvCluster extends SteveModel {
457
459
  return names.join('<br>');
458
460
  } else {
459
461
  const names = this.machines.filter((machine) => {
460
- return machine.status.conditions.find(c => c.error && c.type === 'NodeHealthy');
462
+ return machine.status?.conditions?.find(c => c.error && c.type === 'NodeHealthy');
461
463
  }).map((machine) => {
462
- if (machine.status.nodeRef?.name) {
464
+ if (machine.status?.nodeRef?.name) {
463
465
  return this.t('cluster.availabilityWarnings.node', { name: machine.status.nodeRef.name });
464
466
  }
465
467
 
@@ -0,0 +1,16 @@
1
+ import HybridModel from '@shell/plugins/steve/hybrid-class';
2
+ import { GROUP, SERVICE_ACCOUNT, USER } from '@shell/config/types';
3
+
4
+ export default class ClusterRoleBinding extends HybridModel {
5
+ get users() {
6
+ return this.subjects?.filter(({ kind }) => kind?.toLowerCase() === USER);
7
+ }
8
+
9
+ get serviceAccounts() {
10
+ return this.subjects?.filter(({ kind }) => kind?.toLowerCase() === SERVICE_ACCOUNT);
11
+ }
12
+
13
+ get groups() {
14
+ return this.subjects?.filter(({ kind }) => kind?.toLowerCase() === GROUP);
15
+ }
16
+ }
@@ -0,0 +1,16 @@
1
+ import HybridModel from '@shell/plugins/steve/hybrid-class';
2
+ import { GROUP, SERVICE_ACCOUNT, USER } from '@shell/config/types';
3
+
4
+ export default class RoleBinding extends HybridModel {
5
+ get users() {
6
+ return this.subjects.filter(({ kind }) => kind?.toLowerCase() === USER);
7
+ }
8
+
9
+ get serviceAccounts() {
10
+ return this.subjects.filter(({ kind }) => kind?.toLowerCase() === SERVICE_ACCOUNT);
11
+ }
12
+
13
+ get groups() {
14
+ return this.subjects.filter(({ kind }) => kind?.toLowerCase() === GROUP);
15
+ }
16
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rancher/shell",
3
- "version": "0.3.4",
3
+ "version": "0.3.6",
4
4
  "description": "Rancher Dashboard Shell",
5
5
  "repository": "https://github.com/rancherlabs/dashboard",
6
6
  "license": "Apache-2.0",
@@ -16,15 +16,11 @@
16
16
  "clean": "./scripts/clean",
17
17
  "lint": "./node_modules/.bin/eslint --max-warnings 0 --ext .ts,.js,.vue .",
18
18
  "test": "./node_modules/.bin/nyc ava --serial --verbose",
19
- "nuxt": "./node_modules/.bin/nuxt",
20
- "dev": "./node_modules/.bin/nuxt dev",
21
- "mem-dev": "node --max-old-space-size=8192 ./node_modules/.bin/nuxt dev",
19
+ "dev": "./node_modules/.bin/vue-cli-service dev",
22
20
  "docker-dev": "docker run --rm --name dashboard-dev -p 8005:8005 -e API=$API -v $(pwd):/src -v dashboard_node:/src/node_modules rancher/dashboard:dev",
23
- "build": "./node_modules/.bin/nuxt build --devtools",
24
- "analyze": "./node_modules/.bin/nuxt build --analyze",
25
- "start": "./node_modules/.bin/nuxt start",
26
- "generate": "./node_modules/.bin/nuxt generate",
27
- "dev-debug": "node --inspect ./node_modules/.bin/nuxt",
21
+ "build": "./node_modules/.bin/vue-cli-service build",
22
+ "analyze": "./node_modules/.bin/vue-cli-service build --report",
23
+ "start": "./node_modules/.bin/vue-cli-service start",
28
24
  "cy:run": "cypress run",
29
25
  "cy:open": "cypress open",
30
26
  "e2e:pre": "NODE_ENV=dev yarn build",
@@ -40,21 +36,17 @@
40
36
  "@babel/preset-typescript": "7.16.7",
41
37
  "@innologica/vue-dropdown-menu": "0.1.3",
42
38
  "@novnc/novnc": "1.2.0",
43
- "@nuxt/types": "2.14.6",
44
39
  "@nuxt/typescript-build": "2.1.0",
45
40
  "@nuxtjs/axios": "5.12.0",
46
41
  "@nuxtjs/eslint-config-typescript": "6.0.1",
47
- "@nuxtjs/eslint-module": "1.2.0",
48
- "@nuxtjs/proxy": "1.3.3",
49
- "@nuxtjs/style-resources": "1.2.1",
50
42
  "@nuxtjs/webpack-profile": "0.1.0",
51
43
  "@popperjs/core": "2.4.4",
52
44
  "@types/node": "16.4.3",
53
45
  "@typescript-eslint/eslint-plugin": "4.33.0",
54
46
  "@typescript-eslint/parser": "4.33.0",
55
- "@vue/cli-plugin-babel": "4.5.15",
56
- "@vue/cli-plugin-typescript": "4.5.15",
57
- "@vue/cli-service": "4.5.15",
47
+ "@vue/cli-plugin-babel": "4.5.18",
48
+ "@vue/cli-plugin-typescript": "4.5.18",
49
+ "@vue/cli-service": "4.5.18",
58
50
  "@vue/test-utils": "1.2.1",
59
51
  "@vue/vue2-jest": "27.0.0",
60
52
  "add": "2.0.6",
@@ -86,7 +78,7 @@
86
78
  "eslint-plugin-import": "2.23.4",
87
79
  "eslint-plugin-jest": "24.4.0",
88
80
  "eslint-plugin-n": "15.2.0",
89
- "eslint-plugin-vue": "7.14.0",
81
+ "eslint-plugin-vue": "9.10.0",
90
82
  "event-target-shim": "5.0.1",
91
83
  "express": "4.17.1",
92
84
  "file-saver": "2.0.2",
@@ -113,7 +105,7 @@
113
105
  "nyc": "15.1.0",
114
106
  "papaparse": "5.3.0",
115
107
  "portal-vue": "2.1.7",
116
- "rancher-icons": "rancher/icons#v2.0.13",
108
+ "rancher-icons": "rancher/icons#v2.0.14",
117
109
  "require-extension-hooks": "0.3.3",
118
110
  "require-extension-hooks-babel": "1.0.0",
119
111
  "require-extension-hooks-vue": "3.0.0",
@@ -129,15 +121,15 @@
129
121
  "typescript": "4.1.6",
130
122
  "url-parse": "1.5.10",
131
123
  "v-tooltip": "2.0.3",
132
- "vue": "2.6.14",
124
+ "vue": "2.7.14",
133
125
  "vue-clipboard2": "0.3.1",
134
126
  "vue-codemirror": "4.0.6",
135
127
  "vue-js-modal": "1.3.35",
136
128
  "vue-resize": "0.4.5",
137
129
  "vue-select": "3.18.3",
138
- "vue-server-renderer": "2.6.14",
130
+ "vue-server-renderer": "2.7.14",
139
131
  "vue-shortkey": "3.1.7",
140
- "vue-template-compiler": "2.6.14",
132
+ "vue-template-compiler": "2.7.14",
141
133
  "vue-virtual-scroll-list": "^2.3.4",
142
134
  "vue2-transitions": "0.3.0",
143
135
  "vuedraggable": "2.24.3",
@@ -281,8 +281,8 @@ export default {
281
281
 
282
282
  <template v-if="mustChangePassword">
283
283
  <p
284
+ v-clean-html="t(isFirstLogin ? 'setup.setPassword' : 'setup.newUserSetPassword', { username }, true)"
284
285
  class="text-center mb-20 mt-20 setup-title"
285
- v-html="t(isFirstLogin ? 'setup.setPassword' : 'setup.newUserSetPassword', { username }, true)"
286
286
  />
287
287
 
288
288
  <Password
@@ -495,7 +495,7 @@ export default {
495
495
  }
496
496
 
497
497
  .landscape {
498
- background-image: url('~shell/assets/images/pl/login-landscape.svg');
498
+ background-image: url('~@shell/assets/images/pl/login-landscape.svg');
499
499
  background-repeat: no-repeat;
500
500
  background-size: cover;
501
501
  background-position: center center;
@@ -0,0 +1,33 @@
1
+ import { ignoreVariables } from '@shell/pages/c/_cluster/apps/charts/install.helpers';
2
+
3
+ describe('fX: ignoreVariables', () => {
4
+ describe.each([['epinio', 'global.rbac.pspEnabled']])('given chart %p with path %p', (name, path) => {
5
+ it.each([
6
+ ['v1.24.11+rke2r1'],
7
+ ])('should not return variable path list if cluster has k8s version %p', (version) => {
8
+ const cluster = { kubernetesVersion: version };
9
+ const data = {
10
+ chart: { name },
11
+ values: { global: { rbac: { pspEnabled: undefined } } }
12
+ };
13
+
14
+ const paths = ignoreVariables(cluster, data);
15
+
16
+ expect(paths).toStrictEqual([]);
17
+ });
18
+
19
+ it.each([
20
+ ['v1.25.11+rke2r1'],
21
+ ])('should return questions if cluster has k8s version %p', (version) => {
22
+ const cluster = { kubernetesVersion: version };
23
+ const data = {
24
+ chart: { name },
25
+ values: { global: { rbac: { pspEnabled: undefined } } }
26
+ };
27
+
28
+ const paths = ignoreVariables(cluster, data);
29
+
30
+ expect(paths).toStrictEqual([path]);
31
+ });
32
+ });
33
+ });
@@ -159,14 +159,14 @@ export default {
159
159
  v-if="osWarning"
160
160
  color="error"
161
161
  >
162
- <span v-html="osWarning" />
162
+ <span v-clean-html="osWarning" />
163
163
  </Banner>
164
164
  <Banner
165
165
  v-for="msg in requires"
166
166
  :key="msg"
167
167
  color="error"
168
168
  >
169
- <span v-html="msg" />
169
+ <span v-clean-html="msg" />
170
170
  </Banner>
171
171
 
172
172
  <Banner
@@ -174,14 +174,14 @@ export default {
174
174
  :key="msg"
175
175
  color="warning"
176
176
  >
177
- <span v-html="msg" />
177
+ <span v-clean-html="msg" />
178
178
  </Banner>
179
179
 
180
180
  <Banner
181
181
  v-if="targetedAppWarning"
182
182
  color="warning"
183
183
  >
184
- <span v-html="targetedAppWarning" />
184
+ <span v-clean-html="targetedAppWarning" />
185
185
  </Banner>
186
186
  </div>
187
187
  <div
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Return list of variables to filter chart questions
3
+ */
4
+ export const ignoreVariables = (cluster, data) => {
5
+ const pspChartMap = {
6
+ epinio: 'global.rbac.pspEnabled',
7
+ longhorn: 'enablePSP',
8
+ 'rancher-alerting-drivers': 'global.cattle.psp.enabled',
9
+ neuvector: 'global.cattle.psp.enabled',
10
+ 'prometheus-federator': 'global.rbac.pspEnabled',
11
+ };
12
+ const path = pspChartMap[data.chart.name];
13
+
14
+ if (path) {
15
+ const clusterVersion = cluster?.kubernetesVersion || '';
16
+ const version = clusterVersion.match(/\d+/g);
17
+ const isRequiredVersion = version?.length ? +version[0] === 1 && +version[1] < 25 : false;
18
+
19
+ // Provide path as question variable to be ignored
20
+ if (!isRequiredVersion) {
21
+ return [path];
22
+ }
23
+ }
24
+
25
+ return [];
26
+ };
@@ -32,6 +32,7 @@ import { CATALOG as CATALOG_ANNOTATIONS, PROJECT } from '@shell/config/labels-an
32
32
 
33
33
  import { exceptionToErrorsArray } from '@shell/utils/error';
34
34
  import { clone, diff, get, set } from '@shell/utils/object';
35
+ import { ignoreVariables } from './install.helpers';
35
36
  import { findBy, insertAt } from '@shell/utils/array';
36
37
  import Vue from 'vue';
37
38
  import { saferDump } from '@shell/utils/create-yaml';
@@ -92,6 +93,7 @@ export default {
92
93
  */
93
94
  await this.fetchChart();
94
95
 
96
+ await this.fetchAutoInstallInfo();
95
97
  this.errors = [];
96
98
 
97
99
  // If the chart doesn't contain system `systemDefaultRegistry` properties there's no point applying them
@@ -360,6 +362,7 @@ export default {
360
362
  migratedApp: false,
361
363
  defaultCmdOpts,
362
364
  customCmdOpts: { ...defaultCmdOpts },
365
+ autoInstallInfo: [],
363
366
 
364
367
  nameDisabled: false,
365
368
 
@@ -425,6 +428,13 @@ export default {
425
428
  ...mapGetters({ inStore: 'catalog/inStore', features: 'features/get' }),
426
429
  mcm: mapFeature(MULTI_CLUSTER),
427
430
 
431
+ /**
432
+ * Return list of variables to filter chart questions
433
+ */
434
+ ignoreVariables() {
435
+ return ignoreVariables(this.currentCluster, this.versionInfo);
436
+ },
437
+
428
438
  namespaceIsNew() {
429
439
  const all = this.$store.getters['cluster/all'](NAMESPACE);
430
440
  const want = this.value?.metadata?.namespace;
@@ -799,7 +809,7 @@ export default {
799
809
  }) : {};
800
810
 
801
811
  if (provCluster.isRke2) { // isRke2 returns true for both RKE2 and K3s clusters.
802
- const agentConfig = provCluster.spec.rkeConfig.machineSelectorConfig.find(x => !x.machineLabelSelector).config;
812
+ const agentConfig = provCluster.spec?.rkeConfig?.machineSelectorConfig?.find(x => !x.machineLabelSelector).config;
803
813
 
804
814
  // If a cluster scoped registry exists,
805
815
  // it should be used by default.
@@ -812,7 +822,7 @@ export default {
812
822
  if (provCluster.isRke1) {
813
823
  // For RKE1 clusters, the cluster scoped private registry is on the management
814
824
  // cluster, not the provisioning cluster.
815
- const rke1Registries = mgmCluster.spec.rancherKubernetesEngineConfig.privateRegistries;
825
+ const rke1Registries = mgmCluster.spec?.rancherKubernetesEngineConfig?.privateRegistries;
816
826
 
817
827
  if (rke1Registries?.length > 0) {
818
828
  const defaultRegistry = rke1Registries.find((registry) => {
@@ -844,10 +854,8 @@ export default {
844
854
  },
845
855
 
846
856
  async loadValuesComponent() {
847
- // TODO: Remove RELEASE_NAME. This is only in until the component annotation is added to the OPA Gatekeeper chart.
848
-
849
857
  // The const component is a string, for example, 'monitoring'.
850
- const component = this.version?.annotations?.[CATALOG_ANNOTATIONS.COMPONENT] || this.version?.annotations?.[CATALOG_ANNOTATIONS.RELEASE_NAME];
858
+ const component = this.version?.annotations?.[CATALOG_ANNOTATIONS.COMPONENT];
851
859
 
852
860
  // Load a values component for the UI if it is named in the Helm chart.
853
861
  if ( component ) {
@@ -872,7 +880,7 @@ export default {
872
880
  },
873
881
 
874
882
  async loadChartSteps() {
875
- const component = this.version?.annotations?.[CATALOG_ANNOTATIONS.COMPONENT] || this.version?.annotations?.[CATALOG_ANNOTATIONS.RELEASE_NAME];
883
+ const component = this.version?.annotations?.[CATALOG_ANNOTATIONS.COMPONENT];
876
884
 
877
885
  if ( component ) {
878
886
  const steps = await this.$store.getters['catalog/chartSteps'](component);
@@ -1167,56 +1175,7 @@ export default {
1167
1175
 
1168
1176
  const more = [];
1169
1177
 
1170
- /*
1171
- An example value for auto is ["rancher-monitoring-crd=match"].
1172
- It is an array of chart names that lets Rancher know of other
1173
- charts that should be auto-installed at the same time.
1174
- */
1175
- let auto = (this.version?.annotations?.[CATALOG_ANNOTATIONS.AUTO_INSTALL] || '').split(/\s*,\s*/).filter(x => !!x).reverse();
1176
-
1177
- for ( const constraint of auto ) {
1178
- const provider = this.$store.getters['catalog/versionSatisfying']({
1179
- constraint,
1180
- repoName: this.chart.repoName,
1181
- repoType: this.chart.repoType,
1182
- chartVersion: this.version.version,
1183
- });
1184
-
1185
- /*
1186
- An example return value for "provider":
1187
- [
1188
- {
1189
- "name": "rancher-monitoring-crd",
1190
- "version": "100.1.3+up19.0.3",
1191
- "description": "Installs the CRDs for rancher-monitoring.",
1192
- "apiVersion": "v1",
1193
- "annotations": {
1194
- "catalog.cattle.io/certified": "rancher",
1195
- "catalog.cattle.io/hidden": "true",
1196
- "catalog.cattle.io/namespace": "cattle-monitoring-system",
1197
- "catalog.cattle.io/release-name": "rancher-monitoring-crd"
1198
- },
1199
- "type": "application",
1200
- "urls": [
1201
- "https://192.168.0.18:8005/k8s/clusters/c-m-hhpg69fv/v1/catalog.cattle.io.clusterrepos/rancher-charts?chartName=rancher-monitoring-crd&link=chart&version=100.1.3%2Bup19.0.3"
1202
- ],
1203
- "created": "2022-04-27T10:04:18.343124-07:00",
1204
- "digest": "ecf07ba23a9cdaa7ffbbb14345d94ea1240b7f3b8e0ce9be4640e3e585c484e2",
1205
- "key": "cluster/rancher-charts/rancher-monitoring-crd/100.1.3+up19.0.3",
1206
- "repoType": "cluster",
1207
- "repoName": "rancher-charts"
1208
- }
1209
- ]
1210
- */
1211
-
1212
- if ( provider ) {
1213
- more.push(provider);
1214
- } else {
1215
- errors.push(`This chart requires ${ constraint } but no matching chart was found`);
1216
- }
1217
- }
1218
-
1219
- auto = (this.version?.annotations?.[CATALOG_ANNOTATIONS.AUTO_INSTALL_GVK] || '').split(/\s*,\s*/).filter(x => !!x).reverse();
1178
+ const auto = (this.version?.annotations?.[CATALOG_ANNOTATIONS.AUTO_INSTALL_GVK] || '').split(/\s*,\s*/).filter(x => !!x).reverse();
1220
1179
 
1221
1180
  for ( const gvr of auto ) {
1222
1181
  const provider = this.$store.getters['catalog/versionProviding']({
@@ -1232,9 +1191,33 @@ export default {
1232
1191
  }
1233
1192
  }
1234
1193
 
1194
+ /* Chart custom UI components have the ability to edit CRD chart values eg gatekeeper-crd has values.enableRuntimeDefaultSeccompProfile
1195
+ like the main chart, only CRD values that differ from defaults should be sent on install/upgrade
1196
+ CRDs should be installed with the same global values as the main chart
1197
+ */
1198
+ for (const versionInfo of this.autoInstallInfo) {
1199
+ // allValues are the values potentially changed in the installation ui: any previously customized values + defaults
1200
+ // values are default values from the chart
1201
+ const { allValues, values: crdValues } = versionInfo;
1202
+
1203
+ // only save crd values that differ from the defaults defined in chart values.yaml
1204
+ const customizedCrdValues = diff(crdValues, allValues);
1205
+
1206
+ // CRD globals should be overwritten by main chart globals
1207
+ // we want to avoid including globals present on crd values and not main chart values
1208
+ // that covers the scenario where a global value was customized on a previous install (and so is present in crd global vals) and the user has reverted it to default on this update (no longer present in main chart global vals)
1209
+ const crdValuesToInstall = { ...customizedCrdValues, global: values.global };
1210
+
1211
+ out.charts.unshift({
1212
+ chartName: versionInfo.chart.name,
1213
+ version: versionInfo.chart.version,
1214
+ releaseName: versionInfo.chart.annotations[CATALOG_ANNOTATIONS.RELEASE_NAME] || chart.name,
1215
+ projectId: this.project,
1216
+ values: crdValuesToInstall
1217
+ });
1218
+ }
1235
1219
  /*
1236
- 'more' contains the values for the CRD chart, which needs the same
1237
- global and cattle values as the chart. It could also contain additional
1220
+ 'more' contains additional
1238
1221
  charts that may not be CRD charts but are also meant to be installed at
1239
1222
  the same time.
1240
1223
  */
@@ -1368,7 +1351,7 @@ export default {
1368
1351
  :key="msg"
1369
1352
  color="error"
1370
1353
  >
1371
- <span v-html="msg" />
1354
+ <span v-clean-html="msg" />
1372
1355
  </Banner>
1373
1356
 
1374
1357
  <Banner
@@ -1376,7 +1359,7 @@ export default {
1376
1359
  :key="msg"
1377
1360
  color="warning"
1378
1361
  >
1379
- <span v-html="msg" />
1362
+ <span v-clean-html="msg" />
1380
1363
  </Banner>
1381
1364
  </div>
1382
1365
  <div
@@ -1479,7 +1462,7 @@ export default {
1479
1462
  v-if="isNamespaceNew && value.metadata.namespace.length"
1480
1463
  color="info"
1481
1464
  >
1482
- <div v-html="t('catalog.install.steps.basics.createNamespace', {namespace: value.metadata.namespace}, true) " />
1465
+ <div v-clean-html="t('catalog.install.steps.basics.createNamespace', {namespace: value.metadata.namespace}, true) " />
1483
1466
  </Banner>
1484
1467
  </div>
1485
1468
  </template>
@@ -1517,47 +1500,49 @@ export default {
1517
1500
  </div>
1518
1501
  </template>
1519
1502
  <template #helmValues>
1520
- <Banner
1521
- v-if="step2Description"
1522
- color="info"
1523
- class="description"
1524
- >
1525
- {{ step2Description }}
1526
- </Banner>
1527
- <div class="step__values__controls">
1528
- <ButtonGroup
1529
- v-model="preFormYamlOption"
1530
- :options="formYamlOptions"
1531
- inactive-class="bg-disabled btn-sm"
1532
- active-class="bg-primary btn-sm"
1533
- :disabled="preFormYamlOption != formYamlOption"
1534
- />
1535
- <div class="step__values__controls--spacer">
1536
- &nbsp;
1537
- </div>
1538
- <ButtonGroup
1539
- v-if="showDiff"
1540
- v-model="diffMode"
1541
- :options="yamlDiffModeOptions"
1542
- inactive-class="bg-disabled btn-sm"
1543
- active-class="bg-primary btn-sm"
1544
- />
1545
- <div
1546
- v-if="hasReadme && !showingReadmeWindow"
1547
- class="btn-group"
1503
+ <div class="sticky-header">
1504
+ <Banner
1505
+ v-if="step2Description"
1506
+ color="info"
1507
+ class="description"
1548
1508
  >
1549
- <button
1550
- type="button"
1551
- class="btn bg-primary btn-sm"
1552
- @click="showSlideIn = !showSlideIn"
1509
+ {{ step2Description }}
1510
+ </Banner>
1511
+ <div class="step__values__controls">
1512
+ <ButtonGroup
1513
+ v-model="preFormYamlOption"
1514
+ :options="formYamlOptions"
1515
+ inactive-class="bg-disabled btn-sm"
1516
+ active-class="bg-primary btn-sm"
1517
+ :disabled="preFormYamlOption != formYamlOption"
1518
+ />
1519
+ <div class="step__values__controls--spacer">
1520
+ &nbsp;
1521
+ </div>
1522
+ <ButtonGroup
1523
+ v-if="showDiff"
1524
+ v-model="diffMode"
1525
+ :options="yamlDiffModeOptions"
1526
+ inactive-class="bg-disabled btn-sm"
1527
+ active-class="bg-primary btn-sm"
1528
+ />
1529
+ <div
1530
+ v-if="hasReadme && !showingReadmeWindow"
1531
+ class="btn-group"
1553
1532
  >
1554
- {{ t('catalog.install.steps.helmValues.chartInfo.button') }}
1555
- </button>
1533
+ <button
1534
+ type="button"
1535
+ class="btn bg-primary btn-sm"
1536
+ @click="showSlideIn = !showSlideIn"
1537
+ >
1538
+ {{ t('catalog.install.steps.helmValues.chartInfo.button') }}
1539
+ </button>
1540
+ </div>
1556
1541
  </div>
1557
1542
  </div>
1558
1543
  <div class="scroll__container">
1559
1544
  <div class="scroll__content">
1560
- <!-- Values (as Custom Component) -->
1545
+ <!-- Values (as Custom Component in ./shell/charts/) -->
1561
1546
  <template v-if="valuesComponent && showValuesComponent">
1562
1547
  <Tabbed
1563
1548
  v-if="componentHasTabs"
@@ -1576,6 +1561,7 @@ export default {
1576
1561
  :existing="existing"
1577
1562
  :version="version"
1578
1563
  :version-info="versionInfo"
1564
+ :auto-install-info="autoInstallInfo"
1579
1565
  @warn="e=>errors.push(e)"
1580
1566
  @register-before-hook="registerBeforeHook"
1581
1567
  @register-after-hook="registerAfterHook"
@@ -1592,13 +1578,15 @@ export default {
1592
1578
  :existing="existing"
1593
1579
  :version="version"
1594
1580
  :version-info="versionInfo"
1581
+ :auto-install-info="autoInstallInfo"
1595
1582
  @warn="e=>errors.push(e)"
1596
1583
  @register-before-hook="registerBeforeHook"
1597
1584
  @register-after-hook="registerAfterHook"
1598
1585
  />
1599
1586
  </template>
1600
1587
  </template>
1601
- <!-- Values (as Questions) -->
1588
+
1589
+ <!-- Values (as Questions, abstracted component based on question.yaml configuration from repositories) -->
1602
1590
  <Tabbed
1603
1591
  v-else-if="hasQuestions && showQuestions"
1604
1592
  ref="tabs"
@@ -1612,6 +1600,7 @@ export default {
1612
1600
  :in-store="inStore"
1613
1601
  :mode="mode"
1614
1602
  :source="versionInfo"
1603
+ :ignore-variables="ignoreVariables"
1615
1604
  tabbed="multiple"
1616
1605
  :target-namespace="targetNamespace"
1617
1606
  />
@@ -1802,17 +1791,17 @@ export default {
1802
1791
  {{ t('catalog.install.error.legacy.label', { legacyType: mcapp ? legacyDefs.mcm : legacyDefs.legacy }, true) }}
1803
1792
  </span>
1804
1793
  <template v-if="!legacyEnabled">
1805
- <span v-html="t('catalog.install.error.legacy.enableLegacy.prompt', true)" />
1794
+ <span v-clean-html="t('catalog.install.error.legacy.enableLegacy.prompt', true)" />
1806
1795
  <nuxt-link :to="legacyFeatureRoute">
1807
1796
  {{ t('catalog.install.error.legacy.enableLegacy.goto') }}
1808
1797
  </nuxt-link>
1809
1798
  </template>
1810
1799
  <template v-else-if="mcapp">
1811
- <span v-html="t('catalog.install.error.legacy.mcmNotSupported')" />
1800
+ <span v-clean-html="t('catalog.install.error.legacy.mcmNotSupported')" />
1812
1801
  </template>
1813
1802
  <template v-else>
1814
1803
  <nuxt-link :to="legacyAppRoute">
1815
- <span v-html="t('catalog.install.error.legacy.navigate')" />
1804
+ <span v-clean-html="t('catalog.install.error.legacy.navigate')" />
1816
1805
  </nuxt-link>
1817
1806
  </template>
1818
1807
  </Banner>
@@ -1971,8 +1960,6 @@ export default {
1971
1960
  .scroll {
1972
1961
  &__container {
1973
1962
  $yaml-height: 200px;
1974
- display: flex;
1975
- flex: 1;
1976
1963
  min-height: $yaml-height;
1977
1964
  height: 0;
1978
1965
  }
@@ -2071,4 +2058,13 @@ export default {
2071
2058
  margin-top: 5px;
2072
2059
  }
2073
2060
 
2061
+ .sticky-header {
2062
+ position: sticky;
2063
+ top: 0;
2064
+ z-index: 10;
2065
+ display: flex;
2066
+ flex-direction: column;
2067
+ background: var(--primary-text);
2068
+ }
2069
+
2074
2070
  </style>