@rancher/shell 0.3.0 → 0.3.1

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 (322) hide show
  1. package/assets/styles/global/_button.scss +5 -1
  2. package/assets/styles/global/_columns.scss +4 -0
  3. package/assets/styles/global/_layout.scss +1 -2
  4. package/assets/styles/global/_select.scss +1 -4
  5. package/assets/styles/themes/_dark.scss +4 -4
  6. package/assets/styles/themes/_light.scss +4 -3
  7. package/assets/styles/themes/_suse.scss +1 -1
  8. package/assets/styles/vendor/vue-select.scss +4 -3
  9. package/assets/translations/en-us.yaml +669 -73
  10. package/assets/translations/zh-hans.yaml +547 -165
  11. package/chart/monitoring/steps/uninstall-v1.vue +2 -2
  12. package/cloud-credential/azure.vue +23 -0
  13. package/cloud-credential/harvester.vue +25 -62
  14. package/cloud-credential/pnap.vue +80 -0
  15. package/components/.DS_Store +0 -0
  16. package/components/AdvancedSection.vue +9 -2
  17. package/components/Alert.vue +2 -2
  18. package/components/ButtonDropdown.vue +0 -2
  19. package/components/ButtonGroup.vue +1 -0
  20. package/components/CollapsibleCard.vue +0 -1
  21. package/components/CruResource.vue +41 -4
  22. package/components/DetailTop.vue +58 -3
  23. package/components/DisableAuthProviderModal.vue +106 -0
  24. package/{rancher-components/components/Utils/DraggableZone → components}/DraggableZone.vue +0 -0
  25. package/components/ExplorerMembers.vue +253 -30
  26. package/components/ExplorerProjectsNamespaces.vue +77 -33
  27. package/components/GrowlManager.vue +3 -3
  28. package/components/IconOrSvg.vue +149 -0
  29. package/components/LogItem.vue +69 -0
  30. package/components/PodSecurityAdmission.vue +302 -0
  31. package/components/PromptModal.vue +1 -0
  32. package/components/ResourceDetail/Masthead.vue +54 -2
  33. package/components/ResourceDetail/index.vue +12 -5
  34. package/components/ResourceList/Masthead.vue +11 -1
  35. package/components/ResourceList/ResourceLoadingIndicator.vue +12 -2
  36. package/components/ResourceList/index.vue +53 -12
  37. package/components/ResourceList/resource-list.config.js +7 -0
  38. package/components/ResourceTable.vue +31 -6
  39. package/components/SimpleBox.vue +1 -1
  40. package/components/SortableTable/THead.vue +15 -5
  41. package/components/SortableTable/index.vue +21 -10
  42. package/components/Tabbed/index.vue +20 -15
  43. package/components/__tests__/.DS_Store +0 -0
  44. package/components/__tests__/AsyncButton.test.ts +140 -0
  45. package/components/__tests__/BackLink.test.ts +33 -0
  46. package/components/__tests__/ButtonGroup.test.ts +124 -0
  47. package/components/__tests__/ClusterBadge.test.ts +32 -0
  48. package/components/__tests__/CollapsibleCard.test.ts +64 -0
  49. package/components/__tests__/ConsumptionGauge.test.ts +88 -0
  50. package/components/__tests__/CruResource.test.ts +3 -2
  51. package/components/__tests__/FixedBanner.test.ts +129 -0
  52. package/components/__tests__/GrowlManager.test.ts +147 -0
  53. package/components/__tests__/NamespaceFilter.test.ts +33 -25
  54. package/components/__tests__/PercentageBar.test.ts +32 -0
  55. package/components/__tests__/PodSecurityAdmission.test.ts +398 -0
  56. package/components/auth/AuthBanner.vue +20 -10
  57. package/components/auth/RoleDetailEdit.vue +26 -17
  58. package/components/auth/SelectPrincipal.vue +36 -5
  59. package/components/form/ArrayList.vue +3 -35
  60. package/components/form/ArrayListGrouped.vue +13 -4
  61. package/components/form/ArrayListSelect.vue +5 -5
  62. package/components/form/Error.vue +8 -0
  63. package/components/form/KeyValue.vue +39 -7
  64. package/components/form/LabeledSelect.vue +5 -2
  65. package/components/form/Labels.vue +46 -16
  66. package/components/form/Members/ClusterPermissionsEditor.vue +17 -17
  67. package/components/form/Members/MembershipEditor.vue +12 -12
  68. package/components/form/NameNsDescription.vue +1 -1
  69. package/components/form/NodeScheduling.vue +1 -1
  70. package/components/form/Probe.vue +3 -3
  71. package/components/form/ResourceQuota/Project.vue +6 -6
  72. package/components/form/ResourceTabs/index.vue +1 -6
  73. package/components/form/Security.vue +7 -6
  74. package/components/form/Select.vue +3 -2
  75. package/components/form/SelectOrCreateAuthSecret.vue +22 -29
  76. package/components/form/ServicePorts.vue +8 -0
  77. package/components/form/WorkloadPorts.vue +7 -1
  78. package/components/form/__tests__/ArrayList.test.ts +74 -0
  79. package/components/form/__tests__/ArrayListGrouped.test.ts +6 -4
  80. package/components/formatter/Checked.vue +1 -1
  81. package/components/formatter/ClusterLink.vue +5 -0
  82. package/components/formatter/IconIsDefault.vue +2 -2
  83. package/components/formatter/InternalExternalIP.vue +11 -8
  84. package/components/formatter/LiveDuration.vue +78 -0
  85. package/components/formatter/WorkloadHealthScale.vue +5 -3
  86. package/components/nav/Header.vue +6 -3
  87. package/components/nav/NamespaceFilter.vue +146 -63
  88. package/components/nav/TopLevelMenu.vue +22 -19
  89. package/components/nav/WindowManager/ContainerLogs.vue +83 -126
  90. package/components/nav/WindowManager/ContainerShell.vue +9 -7
  91. package/components/nav/WindowManager/Window.vue +2 -0
  92. package/components/nav/WindowManager/index.vue +10 -0
  93. package/config/elemental-types.js +9 -0
  94. package/config/features.js +2 -0
  95. package/config/home-links.js +4 -1
  96. package/config/pod-security-admission.ts +82 -0
  97. package/config/product/apps.js +1 -1
  98. package/config/product/auth.js +6 -5
  99. package/config/product/explorer.js +6 -6
  100. package/config/product/fleet.js +1 -1
  101. package/config/product/manager.js +6 -2
  102. package/config/secret.js +0 -1
  103. package/config/settings.ts +26 -9
  104. package/config/table-headers.js +22 -11
  105. package/config/types.js +4 -1
  106. package/content/docs/zh-hans/getting-started.md +113 -137
  107. package/content/docs/zh-hans/whats-new.md +8 -46
  108. package/creators/pkg/package-lock.json +37 -0
  109. package/creators/pkg/package.json +1 -1
  110. package/detail/catalog.cattle.io.app.vue +1 -1
  111. package/detail/pod.vue +1 -1
  112. package/detail/provisioning.cattle.io.cluster.vue +35 -9
  113. package/detail/service.vue +2 -9
  114. package/detail/workload/index.vue +0 -1
  115. package/dialog/AddClusterMemberDialog.vue +22 -28
  116. package/dialog/AddProjectMemberDialog.vue +53 -9
  117. package/dialog/DiagnosticTimingsDialog.vue +8 -7
  118. package/dialog/DrainNode.vue +44 -48
  119. package/dialog/ForceMachineRemoveDialog.vue +5 -7
  120. package/dialog/GenericPrompt.vue +15 -20
  121. package/dialog/RollbackWorkloadDialog.vue +15 -46
  122. package/dialog/RotateCertificatesDialog.vue +5 -7
  123. package/dialog/RotateEncryptionKeyDialog.vue +5 -9
  124. package/dialog/SaveAsRKETemplateDialog.vue +5 -13
  125. package/dialog/ScaleMachineDownDialog.vue +1 -1
  126. package/dialog/ScalePoolDownDialog.vue +121 -0
  127. package/edit/__tests__/management.cattle.io.setting.test.ts +3 -3
  128. package/edit/auth/azuread.vue +16 -16
  129. package/edit/auth/github.vue +8 -0
  130. package/edit/auth/googleoauth.vue +10 -1
  131. package/edit/auth/ldap/index.vue +10 -0
  132. package/edit/auth/oidc.vue +10 -0
  133. package/edit/auth/saml.vue +10 -0
  134. package/edit/autoscaling.horizontalpodautoscaler/index.vue +1 -1
  135. package/edit/cloudcredential.vue +3 -7
  136. package/edit/logging-flow/Match.vue +39 -8
  137. package/edit/logging-flow/index.vue +27 -4
  138. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +107 -0
  139. package/edit/management.cattle.io.project.vue +8 -1
  140. package/edit/management.cattle.io.setting.vue +5 -2
  141. package/edit/management.cattle.io.user.vue +7 -1
  142. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +23 -7
  143. package/edit/monitoring.coreos.com.alertmanagerconfig/types/email.vue +2 -2
  144. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +14 -6
  145. package/edit/namespace.vue +18 -4
  146. package/edit/networking.k8s.io.ingress/Certificate.vue +1 -0
  147. package/edit/networking.k8s.io.ingress/IngressClass.vue +8 -6
  148. package/edit/networking.k8s.io.ingress/RulePath.vue +12 -6
  149. package/edit/networking.k8s.io.ingress/index.vue +8 -6
  150. package/edit/persistentvolume/index.vue +30 -27
  151. package/edit/persistentvolume/plugins/cephfs.vue +29 -29
  152. package/edit/persistentvolume/plugins/csi.vue +102 -62
  153. package/edit/persistentvolume/plugins/fc.vue +19 -19
  154. package/edit/persistentvolume/plugins/iscsi.vue +45 -45
  155. package/edit/persistentvolume/plugins/rbd.vue +39 -39
  156. package/edit/persistentvolumeclaim.vue +78 -75
  157. package/edit/provisioning.cattle.io.cluster/MachinePool.vue +11 -7
  158. package/edit/provisioning.cattle.io.cluster/RegistryConfigs.vue +10 -1
  159. package/edit/provisioning.cattle.io.cluster/RegistryMirrors.vue +87 -27
  160. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +3 -6
  161. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +93 -0
  162. package/edit/provisioning.cattle.io.cluster/import.vue +1 -1
  163. package/edit/provisioning.cattle.io.cluster/index.vue +29 -6
  164. package/edit/provisioning.cattle.io.cluster/rke2.vue +440 -152
  165. package/edit/secret/index.vue +3 -7
  166. package/edit/service.vue +3 -1
  167. package/edit/storage.k8s.io.storageclass/index.vue +100 -16
  168. package/edit/storage.k8s.io.storageclass/provisioners/driver.harvesterhci.io.vue +114 -0
  169. package/edit/workload/__tests__/index.test.ts +98 -0
  170. package/edit/workload/index.vue +58 -8
  171. package/edit/workload/mixins/workload.js +107 -70
  172. package/edit/workload/storage/ContainerMountPaths.vue +0 -10
  173. package/edit/workload/storage/emptyDir.vue +88 -0
  174. package/edit/workload/storage/ephemeralVolume/index.vue +1 -1
  175. package/edit/workload/storage/index.vue +8 -0
  176. package/edit/workload/storage/persistentVolumeClaim/index.vue +1 -1
  177. package/layouts/default.vue +57 -44
  178. package/list/__tests__/workload.test.ts +5 -2
  179. package/list/catalog.cattle.io.app.vue +1 -0
  180. package/list/cis.cattle.io.clusterscan.vue +1 -0
  181. package/list/fleet.cattle.io.bundle.vue +5 -6
  182. package/list/fleet.cattle.io.cluster.vue +6 -3
  183. package/list/fleet.cattle.io.clusterregistrationtoken.vue +5 -6
  184. package/list/fleet.cattle.io.gitrepo.vue +4 -9
  185. package/list/helm.cattle.io.projecthelmchart.vue +1 -5
  186. package/list/logging.banzaicloud.io.clusterflow.vue +4 -1
  187. package/list/logging.banzaicloud.io.flow.vue +6 -5
  188. package/list/management.cattle.io.cluster.vue +1 -0
  189. package/list/management.cattle.io.feature.vue +3 -4
  190. package/list/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +47 -0
  191. package/list/management.cattle.io.setting.vue +2 -2
  192. package/list/management.cattle.io.user.vue +4 -10
  193. package/list/monitoring.coreos.com.alertmanagerconfig.vue +2 -7
  194. package/list/node.vue +8 -5
  195. package/list/persistentvolume.vue +3 -3
  196. package/list/persistentvolumeclaim.vue +3 -4
  197. package/list/provisioning.cattle.io.cluster.vue +18 -19
  198. package/list/service.vue +6 -14
  199. package/list/workload.vue +43 -38
  200. package/machine-config/azure.vue +429 -60
  201. package/machine-config/pnap.vue +288 -0
  202. package/mixins/auth-config.js +1 -3
  203. package/mixins/browser-tab-visibility.js +8 -14
  204. package/mixins/chart.js +1 -1
  205. package/mixins/create-edit-view/impl.js +4 -0
  206. package/mixins/create-edit-view/index.js +4 -2
  207. package/mixins/resource-fetch-namespaced.js +98 -0
  208. package/mixins/resource-fetch.js +79 -45
  209. package/mixins/resource-manager.js +1 -23
  210. package/models/apps.controllerrevision.js +7 -0
  211. package/models/apps.daemonset.js +18 -0
  212. package/models/apps.deployment.js +44 -0
  213. package/models/apps.replicaset.js +7 -0
  214. package/models/apps.statefulset.js +18 -0
  215. package/models/batch.job.js +7 -14
  216. package/models/cluster/node.js +10 -2
  217. package/models/cluster.x-k8s.io.machine.js +26 -4
  218. package/models/cluster.x-k8s.io.machinedeployment.js +12 -2
  219. package/models/event.js +7 -0
  220. package/models/logging.banzaicloud.io.flow.js +4 -0
  221. package/models/management.cattle.io.cluster.js +1 -1
  222. package/models/management.cattle.io.clusterroletemplatebinding.js +1 -1
  223. package/models/management.cattle.io.globalrole.js +2 -2
  224. package/models/management.cattle.io.node.js +37 -2
  225. package/models/management.cattle.io.podsecurityadmissionconfigurationtemplate.ts +4 -0
  226. package/models/management.cattle.io.project.js +30 -11
  227. package/models/management.cattle.io.setting.js +1 -1
  228. package/models/management.cattle.io.user.js +37 -1
  229. package/models/namespace.js +42 -5
  230. package/models/persistentvolume.js +14 -2
  231. package/models/pod.js +15 -0
  232. package/models/projectroletemplatebinding.js +7 -0
  233. package/models/provisioning.cattle.io.cluster.js +61 -10
  234. package/models/rke-machine.cattle.io.pnapmachinetemplate.js +15 -0
  235. package/models/service.js +14 -13
  236. package/models/storage.k8s.io.storageclass.js +33 -18
  237. package/models/workload.js +38 -7
  238. package/nuxt.config.js +27 -17
  239. package/package.json +7 -7
  240. package/pages/about.vue +14 -2
  241. package/pages/c/_cluster/apps/charts/index.vue +4 -3
  242. package/pages/c/_cluster/apps/charts/install.vue +59 -22
  243. package/pages/c/_cluster/auth/config/_id.vue +6 -0
  244. package/pages/c/_cluster/auth/config/index.vue +8 -6
  245. package/pages/c/_cluster/auth/group.principal/assign-edit.vue +1 -1
  246. package/pages/c/_cluster/auth/roles/index.vue +1 -1
  247. package/pages/c/_cluster/explorer/index.vue +12 -6
  248. package/pages/c/_cluster/longhorn/index.vue +1 -1
  249. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +15 -4
  250. package/pages/c/_cluster/monitoring/index.vue +1 -1
  251. package/pages/c/_cluster/neuvector/index.vue +1 -1
  252. package/pages/c/_cluster/settings/performance.vue +48 -2
  253. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +34 -1
  254. package/pages/c/_cluster/uiplugins/index.vue +28 -2
  255. package/pages/diagnostic.vue +5 -4
  256. package/pages/home.vue +105 -30
  257. package/pages/prefs.vue +23 -12
  258. package/pages/rio/mesh.vue +1 -1
  259. package/pkg/dynamic-importer.lib.js +8 -0
  260. package/pkg/vue.config.js +4 -0
  261. package/plugins/dashboard-store/__tests__/mutations.spec.js +406 -0
  262. package/plugins/dashboard-store/actions.js +32 -25
  263. package/plugins/dashboard-store/getters.js +50 -33
  264. package/plugins/dashboard-store/mutations.js +134 -28
  265. package/plugins/dashboard-store/resource-class.js +21 -41
  266. package/plugins/steve/actions.js +30 -0
  267. package/plugins/steve/caches/resourceCache.js +60 -0
  268. package/plugins/steve/getters.js +44 -1
  269. package/plugins/steve/mutations.js +97 -36
  270. package/plugins/steve/resourceWatcher.js +277 -0
  271. package/plugins/steve/schema.utils.js +25 -0
  272. package/plugins/steve/subscribe.js +288 -115
  273. package/plugins/steve/worker/index.js +17 -0
  274. package/plugins/steve/worker/web-worker.advanced.js +302 -0
  275. package/plugins/steve/{web-worker.steve-sub-worker.js → worker/web-worker.basic.js} +3 -44
  276. package/rancher-components/Card/Card.vue +3 -3
  277. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +1 -0
  278. package/rancher-components/StringList/StringList.test.ts +45 -420
  279. package/rancher-components/StringList/StringList.vue +1 -10
  280. package/rancher-components/components/Banner/Banner.test.ts +44 -0
  281. package/rancher-components/components/Banner/Banner.vue +129 -61
  282. package/rancher-components/components/Form/Checkbox/Checkbox.test.ts +13 -22
  283. package/rancher-components/components/Form/Checkbox/Checkbox.vue +8 -6
  284. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.test.ts +9 -9
  285. package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +0 -1
  286. package/rancher-components/components/StringList/StringList.test.ts +7 -7
  287. package/rancher-components/components/StringList/StringList.vue +21 -15
  288. package/scripts/test-plugins-build.sh +8 -0
  289. package/static/loading-indicator.html +1 -1
  290. package/store/index.js +54 -3
  291. package/store/plugins.js +0 -17
  292. package/store/pnap.js +128 -0
  293. package/store/prefs.js +4 -2
  294. package/store/type-map.js +55 -13
  295. package/types/pod-security-admission.ts +36 -0
  296. package/types/shell/index.d.ts +496 -396
  297. package/utils/__tests__/object.test.ts +17 -1
  298. package/utils/__tests__/pod-security-admission.test.ts +61 -0
  299. package/utils/async.ts +36 -0
  300. package/utils/color.js +45 -0
  301. package/utils/crypto/browserHashUtils.js +18 -0
  302. package/utils/dynamic-importer.js +8 -0
  303. package/utils/install-redirect.js +1 -1
  304. package/utils/object.js +24 -0
  305. package/utils/pod-security-admission.ts +39 -0
  306. package/utils/socket.js +61 -24
  307. package/utils/string.js +2 -0
  308. package/utils/svg-filter.js +301 -0
  309. package/utils/time.js +49 -0
  310. package/utils/validators/cidr.js +4 -0
  311. package/utils/validators/formRules/__tests__/index.test.ts +23 -3
  312. package/utils/validators/formRules/index.ts +14 -0
  313. package/config/product/harvester-manager.js +0 -162
  314. package/edit/harvesterhci.io.management.cluster.vue +0 -153
  315. package/list/harvesterhci.io.management.cluster.vue +0 -241
  316. package/machine-config/harvester.vue +0 -693
  317. package/models/harvesterhci.io.management.cluster.js +0 -228
  318. package/pages/c/_cluster/harvesterManager/index.vue +0 -24
  319. package/rancher-components/Card/Card.test.ts +0 -39
  320. package/rancher-components/Utils/DraggableZone/DraggableZone.vue +0 -181
  321. package/rancher-components/Utils/DraggableZone/index.ts +0 -1
  322. package/rancher-components/components/Utils/DraggableZone/index.ts +0 -1
package/store/index.js CHANGED
@@ -81,7 +81,13 @@ const getActiveNamespaces = (state, getters) => {
81
81
  return out;
82
82
  }
83
83
 
84
- const namespaces = getters[`${ inStore }/all`](NAMESPACE);
84
+ let namespaces = [];
85
+
86
+ if (Array.isArray(state.allNamespaces) && state.allNamespaces.length > 0) {
87
+ namespaces = state.allNamespaces;
88
+ } else {
89
+ namespaces = getters[`${ inStore }/all`](NAMESPACE);
90
+ }
85
91
 
86
92
  const filters = state.namespaceFilters.filter(x => !!x && !`${ x }`.startsWith(NAMESPACED_PREFIX));
87
93
  const includeAll = getters.isAllNamespaces;
@@ -169,6 +175,7 @@ export const state = () => {
169
175
  serverVersion: null,
170
176
  systemNamespaces: [],
171
177
  isSingleProduct: undefined,
178
+ namespaceFilterMode: null,
172
179
  };
173
180
  };
174
181
 
@@ -205,6 +212,15 @@ export const getters = {
205
212
  return state.systemNamespaces;
206
213
  },
207
214
 
215
+ /**
216
+ * Namespace Filter Mode supplies a resource type to the NamespaceFilter.
217
+ *
218
+ * Only one of the resource type is allowed to be selected
219
+ */
220
+ namespaceFilterMode(state) {
221
+ return state.namespaceFilterMode;
222
+ },
223
+
208
224
  currentCluster(state, getters) {
209
225
  return getters['management/byId'](MANAGEMENT.CLUSTER, state.clusterId);
210
226
  },
@@ -284,6 +300,34 @@ export const getters = {
284
300
  return state.namespaceFilters.filter(x => !`${ x }`.startsWith(NAMESPACED_PREFIX)).length === 0;
285
301
  },
286
302
 
303
+ isSingleNamespace(state, getters) {
304
+ const product = getters['currentProduct'];
305
+
306
+ if ( !product ) {
307
+ return false;
308
+ }
309
+
310
+ if ( product.showWorkspaceSwitcher ) {
311
+ return false;
312
+ }
313
+
314
+ if ( getters.isAllNamespaces ) {
315
+ return false;
316
+ }
317
+
318
+ const filters = state.namespaceFilters;
319
+
320
+ if ( filters.length !== 1 ) {
321
+ return false;
322
+ }
323
+
324
+ if (filters[0].startsWith('ns://')) {
325
+ return filters[0];
326
+ }
327
+
328
+ return false;
329
+ },
330
+
287
331
  isMultipleNamespaces(state, getters) {
288
332
  const product = getters['currentProduct'];
289
333
 
@@ -485,6 +529,10 @@ export const mutations = {
485
529
  getActiveNamespaces(state, getters);
486
530
  },
487
531
 
532
+ setNamespaceFilterMode(state, mode) {
533
+ state.namespaceFilterMode = mode;
534
+ },
535
+
488
536
  pageActions(state, pageActions) {
489
537
  state.pageActions = pageActions;
490
538
  },
@@ -808,7 +856,6 @@ export const actions = {
808
856
  commit('updateNamespaces', {
809
857
  filters: filters || [ALL_USER],
810
858
  all: res.namespaces,
811
- ...getters
812
859
  });
813
860
 
814
861
  commit('clusterReady', true);
@@ -826,7 +873,11 @@ export const actions = {
826
873
  [key]: ids
827
874
  }
828
875
  });
829
- commit('updateNamespaces', { filters: ids, ...getters });
876
+ commit('updateNamespaces', { filters: ids });
877
+ },
878
+
879
+ setNamespaceFilterMode({ commit }, mode) {
880
+ commit('setNamespaceFilterMode', mode);
830
881
  },
831
882
 
832
883
  async cleanNamespaces({ getters, dispatch }) {
package/store/plugins.js CHANGED
@@ -125,14 +125,6 @@ export const state = function() {
125
125
  };
126
126
 
127
127
  export const getters = {
128
- credentialDrivers() {
129
- const ctx = require.context('@shell/cloud-credential', true, /.*/);
130
-
131
- const drivers = ctx.keys().filter(path => !path.match(/\.(vue|js)$/)).map(path => path.substr(2));
132
-
133
- return drivers;
134
- },
135
-
136
128
  credentialOptions() {
137
129
  return (name) => {
138
130
  name = (name || '').toLowerCase();
@@ -157,15 +149,6 @@ export const getters = {
157
149
  };
158
150
  },
159
151
 
160
- machineDrivers() {
161
- // The subset of drivers supported by Vue components
162
- const ctx = require.context('@shell/machine-config', true, /.*/);
163
-
164
- const drivers = ctx.keys().filter(path => !path.match(/\.(vue|js)$/)).map(path => path.substr(2));
165
-
166
- return drivers;
167
- },
168
-
169
152
  clusterDrivers() {
170
153
  // The subset of drivers supported by Vue components
171
154
  return [];
package/store/pnap.js ADDED
@@ -0,0 +1,128 @@
1
+ import { base64Encode } from '@shell/utils/crypto';
2
+ import { addParam, addParams } from '@shell/utils/url';
3
+
4
+ const ENDPOINT = 'api.phoenixnap.com';
5
+
6
+ export const state = () => {
7
+ return { cache: {} };
8
+ };
9
+
10
+ export const mutations = {
11
+ setCache(state, { credentialId, key, value }) {
12
+ let cache = state.cache[credentialId];
13
+
14
+ if ( !cache ) {
15
+ cache = {};
16
+ state.cache[credentialId] = cache;
17
+ }
18
+
19
+ cache[key] = value;
20
+ },
21
+ };
22
+
23
+ export const getters = {
24
+ fromCache: state => ({ credentialId, key }) => {
25
+ return state.cache[credentialId]?.[key];
26
+ },
27
+ };
28
+
29
+ export const actions = {
30
+ async osChoices({ dispatch }, { credentialId }) {
31
+ const osList = await dispatch('cachedCommand', { credentialId, command: 'rancher-node-driver/options' });
32
+
33
+ const oses = osList.operatingSystems;
34
+ const result = [];
35
+
36
+ if (Array.isArray(oses)) {
37
+ const map = new Map();
38
+
39
+ for (const os of oses) {
40
+ if (!map.has(os)) {
41
+ map.set(os, true);
42
+ result.push({ value: os, label: os });
43
+ }
44
+ }
45
+ } else {
46
+ result.push({ value: osList.message });
47
+ }
48
+
49
+ return result;
50
+ },
51
+
52
+ async allProducts({ dispatch }, { credentialId }) {
53
+ const out = await dispatch('cachedCommand', { credentialId, command: 'billing/v1/products?productCategory=SERVER' });
54
+
55
+ return out;
56
+ },
57
+
58
+ async cachedCommand({ getters, commit, dispatch }, { credentialId, command }) {
59
+ let out = getters['fromCache']({ credentialId, key: command });
60
+
61
+ if ( !out ) {
62
+ out = await dispatch('request', { credentialId, command });
63
+ commit('setCache', {
64
+ credentialId, key: command, value: out
65
+ });
66
+ }
67
+
68
+ return out;
69
+ },
70
+
71
+ async request({ dispatch }, {
72
+ clientId, clientSecret, credentialId, command, opt, out
73
+ }) {
74
+ opt = opt || {};
75
+
76
+ let url = '/meta/proxy/';
77
+ const body = null;
78
+ let method = 'GET';
79
+
80
+ if ( opt.url ) {
81
+ url += opt.url.replace(/^https?:\/\//, '');
82
+ } else {
83
+ url += `${ ENDPOINT }/${ command }`;
84
+ url = addParam(url, 'per_page', opt.per_page || 1000);
85
+ url = addParams(url, opt.params || {});
86
+ }
87
+
88
+ const headers = { Accept: 'application/json' };
89
+
90
+ if ( credentialId ) {
91
+ headers['X-API-CattleAuth-Header'] = `Bearer credID=${ credentialId } passwordField=token`;
92
+ } else if ( clientId ) {
93
+ const credentials = `${ clientId }:${ clientSecret }`;
94
+ const encoded = base64Encode(credentials);
95
+
96
+ headers['Content-Type'] = 'application/json';
97
+ headers['X-API-Auth-Header'] = `Basic ${ encoded }`;
98
+ url = '/meta/proxy/auth.phoenixnap.com/auth/realms/BMC/protocol/openid-connect/token/';
99
+ // body = `grant_type:client_credentials`;
100
+ method = 'POST';
101
+ }
102
+
103
+ const res = await dispatch('management/request', {
104
+ url,
105
+ method,
106
+ headers,
107
+ data: body,
108
+ redirectUnauthorized: false,
109
+ }, { root: true });
110
+
111
+ if ( out ) {
112
+ out[command] = out[command].concat(res[command]);
113
+ } else {
114
+ out = res;
115
+ }
116
+
117
+ // De-pagination
118
+ if ( res?.links?.pages?.next ) {
119
+ opt.url = res.links.pages.next;
120
+
121
+ return dispatch('request', {
122
+ clientId, clientSecret, credentialId, command, opt, out
123
+ });
124
+ }
125
+
126
+ return out;
127
+ }
128
+ };
package/store/prefs.js CHANGED
@@ -74,7 +74,7 @@ export const HIDE_REPOS = create('hide-repos', [], { parseJSON });
74
74
  export const HIDE_DESC = create('hide-desc', [], { parseJSON });
75
75
  export const HIDE_SENSITIVE = create('hide-sensitive', true, { options: [true, false], parseJSON });
76
76
  export const SHOW_PRE_RELEASE = create('show-pre-release', false, { options: [false, true], parseJSON });
77
- export const SHOW_CHART_MODE = create('chartMode', 'featured', { parseJSON });
77
+ export const SHOW_CHART_MODE = create('chart-mode', 'featured', { parseJSON });
78
78
 
79
79
  export const DATE_FORMAT = create('date-format', 'ddd, MMM D YYYY', {
80
80
  options: [
@@ -109,7 +109,7 @@ export const PLUGIN_DEVELOPER = create('plugin-developer', false, { parseJSON, i
109
109
 
110
110
  export const _RKE1 = 'rke1';
111
111
  export const _RKE2 = 'rke2';
112
- export const PROVISIONER = create('provisioner', _RKE1, { options: [_RKE1, _RKE2] });
112
+ export const PROVISIONER = create('provisioner', _RKE2, { options: [_RKE1, _RKE2] });
113
113
 
114
114
  // Promo for Cluster Tools feature on Cluster Dashboard page
115
115
  export const CLUSTER_TOOLS_TIP = create('hide-cluster-tools-tip', false, { parseJSON });
@@ -120,6 +120,8 @@ export const PSP_DEPRECATION_BANNER = create('hide-psp-deprecation-banner', fals
120
120
  // Maximum number of clusters to show in the slide-in menu
121
121
  export const MENU_MAX_CLUSTERS = create('menu-max-clusters', 4, { options: [2, 3, 4, 5, 6, 7, 8, 9, 10], parseJSON });
122
122
 
123
+ // Prompt for confirm when scaling down node pool in GUI and save the pref
124
+ export const SCALE_POOL_PROMPT = create('scale-pool-prompt', null, { parseJSON });
123
125
  // --------------------
124
126
 
125
127
  const cookiePrefix = 'R_';
package/store/type-map.js CHANGED
@@ -42,6 +42,7 @@
42
42
  // category, -- Group to show the product in for the nav hamburger menu
43
43
  // typeStoreMap, -- An object mapping types to the store that should be used to retrieve information about the type
44
44
  // hideSystemResources -- Hide resources in namespaces where namespace.isSystem === true, or a namespace managed by fleet (per its annotation) and hide those namespaces from ns/project list and nsfilter (default false)
45
+ // hideNamespaceLocation -- Hide the namespace link in the ResourceDetail masthead of namespaced resources and hide the ExplorerProjectsNamespaces namespace link (default false)
45
46
  // })
46
47
  //
47
48
  // externalLink(stringOrFn) The product has an external page (function gets context object
@@ -137,7 +138,7 @@ import {
137
138
  ensureRegex, escapeHtml, escapeRegex, ucFirst, pluralize
138
139
  } from '@shell/utils/string';
139
140
  import {
140
- importChart, importList, importDetail, importEdit, listProducts, loadProduct, importCustomPromptRemove, resolveList, resolveEdit, resolveWindowComponent, importWindowComponent, resolveChart, resolveDetail, importDialog
141
+ importChart, importList, importDetail, importEdit, listProducts, loadProduct, importCustomPromptRemove, resolveList, resolveEdit, resolveWindowComponent, importWindowComponent, resolveChart, resolveDetail, importDialog, importMachineConfig, resolveMachineConfigComponent, resolveCloudCredentialComponent, importCloudCredential
141
142
  } from '@shell/utils/dynamic-importer';
142
143
 
143
144
  import { NAME as EXPLORER } from '@shell/config/product/explorer';
@@ -365,16 +366,19 @@ export const state = function() {
365
366
  hideBulkActions: {},
366
367
  schemaGeneration: 1,
367
368
  cache: {
368
- typeMove: {},
369
- groupLabel: {},
370
- ignore: {},
371
- list: {},
372
- chart: {},
373
- detail: {},
374
- edit: {},
375
- componentFor: {},
376
- promptRemove: {},
377
- windowComponents: {},
369
+ typeMove: {},
370
+ groupLabel: {},
371
+ ignore: {},
372
+ list: {},
373
+ chart: {},
374
+ detail: {},
375
+ edit: {},
376
+ componentFor: {},
377
+ promptRemove: {},
378
+ windowComponents: {},
379
+ 'machine-config': {},
380
+ 'cloud-credential': {}
381
+
378
382
  },
379
383
  };
380
384
  };
@@ -914,7 +918,15 @@ export const getters = {
914
918
 
915
919
  item.mode = mode;
916
920
  item.weight = weight;
917
- item.label = item.label || item.name;
921
+
922
+ // Ensure labelKey is taken into account... with a mock count
923
+ // This is harmless if the translation doesn't require count
924
+ if (item.labelKey && rootGetters['i18n/exists'](item.labelKey)) {
925
+ item.label = rootGetters['i18n/t'](item.labelKey, { count: 2 }).trim();
926
+ delete item.labelKey; // Label should really take precedence over labelKey, but it doesn't, so remove it
927
+ } else {
928
+ item.label = item.label || item.name;
929
+ }
918
930
 
919
931
  out[id] = item;
920
932
  }
@@ -1010,9 +1022,11 @@ export const getters = {
1010
1022
  formatter = 'Number';
1011
1023
  }
1012
1024
 
1025
+ const colName = col.name.includes(' ') ? col.name.split(' ').map(word => word.charAt(0).toUpperCase() + word.substring(1) ).join('') : col.name;
1026
+
1013
1027
  const exists = rootGetters['i18n/exists'];
1014
1028
  const t = rootGetters['i18n/t'];
1015
- const labelKey = `tableHeaders.${ col.name }`;
1029
+ const labelKey = `tableHeaders.${ colName.charAt(0).toLowerCase() + colName.slice(1) }`;
1016
1030
  const description = col.description || '';
1017
1031
  const tooltip = description && description[description.length - 1] === '.' ? description.slice(0, -1) : description;
1018
1032
 
@@ -1104,6 +1118,22 @@ export const getters = {
1104
1118
  };
1105
1119
  },
1106
1120
 
1121
+ hasCustomMachineConfigComponent(state, getters, rootState) {
1122
+ return (rawType, subType) => {
1123
+ const key = getters.componentFor(rawType, subType);
1124
+
1125
+ return hasCustom(state, rootState, 'machine-config', key, key => resolveMachineConfigComponent(key));
1126
+ };
1127
+ },
1128
+
1129
+ hasCustomCloudCredentialComponent(state, getters, rootState) {
1130
+ return (rawType, subType) => {
1131
+ const key = getters.componentFor(rawType, subType);
1132
+
1133
+ return hasCustom(state, rootState, 'machine-config', key, key => resolveCloudCredentialComponent(key));
1134
+ };
1135
+ },
1136
+
1107
1137
  importComponent(state, getters) {
1108
1138
  return (path) => {
1109
1139
  return importEdit(path);
@@ -1152,6 +1182,18 @@ export const getters = {
1152
1182
  };
1153
1183
  },
1154
1184
 
1185
+ importMachineConfig(state, getters, rootState) {
1186
+ return (rawType, subType) => {
1187
+ return loadExtension(rootState, 'machine-config', getters.componentFor(rawType, subType), importMachineConfig);
1188
+ };
1189
+ },
1190
+
1191
+ importCloudCredential(state, getters, rootState) {
1192
+ return (rawType, subType) => {
1193
+ return loadExtension(rootState, 'cloud-credential', getters.componentFor(rawType, subType), importCloudCredential);
1194
+ };
1195
+ },
1196
+
1155
1197
  componentFor(state, getters) {
1156
1198
  return (type, subType) => {
1157
1199
  let key = type;
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Mode Description
3
+ * - 'enforce': Policy violations will cause the pod to be rejected.
4
+ * - 'audit': Policy violations will trigger the addition of an audit annotation to the event recorded in the audit log, but are otherwise allowed.
5
+ * - 'warn': Policy violations will trigger a user-facing warning, but are otherwise allowed.
6
+ */
7
+ export type PSAMode = 'enforce' | 'audit' | 'warn';
8
+
9
+ /**
10
+ * Pod Security admission places requirements on a Pod's Security Context and other related fields according to the three levels defined by the Pod Security Standards:
11
+ * privileged, baseline, and restricted.
12
+ * Refer to the Pod Security Standards page for an in-depth look at those requirements.
13
+ */
14
+ export type PSALevel = 'privileged' | 'baseline' | 'restricted';
15
+
16
+ /**
17
+ * Usernames: requests from users with an exempt authenticated (or impersonated) username are ignored.
18
+ * RuntimeClassNames: pods and workload resources specifying an exempt runtime class name are ignored.
19
+ * Namespaces: pods and workload resources in an exempt namespace are ignored.
20
+ */
21
+ export type PSADimension = 'usernames' | 'runtimeClasses' | 'namespaces'
22
+
23
+ export type PSADefaults = Record<PSAMode, PSALevel>
24
+ export type PSAExemptions = Record<PSADimension, string[]>
25
+
26
+ export interface PSAConfig {
27
+ defaults: PSADefaults,
28
+ exemptions: PSAExemptions
29
+ }
30
+
31
+ export interface PSA {
32
+ configuration: PSAConfig,
33
+ metadata: {
34
+ labels: Record<string, string>
35
+ }
36
+ }