@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
@@ -25,7 +25,7 @@ describe('component: NamespaceFilter', () => {
25
25
  options: () => [],
26
26
  value: () => [],
27
27
  },
28
- mocks: { $store: { getters: { 'i18n/t': () => text } } },
28
+ mocks: { $store: { getters: { 'i18n/t': () => text, namespaceFilterMode: () => undefined } } },
29
29
  directives: { shortkey: () => jest.fn() }
30
30
  });
31
31
  const element = wrapper.find(`[data-testid="namespaces-values-none"]`).element.textContent;
@@ -60,7 +60,8 @@ describe('component: NamespaceFilter', () => {
60
60
  options: () => [],
61
61
  value: () => [{ label: text }],
62
62
  },
63
- directives: { shortkey: () => jest.fn() }
63
+ directives: { shortkey: () => jest.fn() },
64
+ mocks: { $store: { getters: { 'i18n/t': () => text, namespaceFilterMode: () => undefined } } },
64
65
  });
65
66
 
66
67
  const element = wrapper.find(`[data-testid="namespaces-value-0"]`).element.textContent;
@@ -92,8 +93,9 @@ describe('component: NamespaceFilter', () => {
92
93
  mocks: {
93
94
  $store: {
94
95
  getters: {
95
- 'i18n/t': () => text,
96
- 'prefs/get': () => preferences
96
+ 'i18n/t': () => text,
97
+ 'prefs/get': () => preferences,
98
+ namespaceFilterMode: () => undefined,
97
99
  },
98
100
  }
99
101
  },
@@ -114,6 +116,7 @@ describe('component: NamespaceFilter', () => {
114
116
  options: () => [],
115
117
  value: () => [],
116
118
  },
119
+ mocks: { $store: { getters: { 'i18n/t': () => '', namespaceFilterMode: () => undefined } } },
117
120
  directives: { shortkey: () => jest.fn() }
118
121
  });
119
122
  const dropdown = wrapper.find(`[data-testid="namespaces-dropdown"]`);
@@ -132,7 +135,7 @@ describe('component: NamespaceFilter', () => {
132
135
  options: () => [],
133
136
  value: () => [],
134
137
  },
135
- mocks: { $store: { getters: { 'i18n/t': () => text } } },
138
+ mocks: { $store: { getters: { 'i18n/t': () => text, namespaceFilterMode: () => undefined } } },
136
139
  directives: { shortkey: () => jest.fn() }
137
140
  });
138
141
  const dropdown = wrapper.find(`[data-testid="namespaces-dropdown"]`);
@@ -147,18 +150,20 @@ describe('component: NamespaceFilter', () => {
147
150
  const text = 'my option';
148
151
  const wrapper = mount(NamespaceFilter, {
149
152
  computed: {
150
- filtered: () => [
151
- {
152
- kind: 'namespace',
153
- label: `default-${ text }`,
154
- },
155
- ],
156
153
  options: () => [],
157
154
  value: () => [],
158
155
  },
159
- mocks: { $store: { getters: { 'i18n/t': () => text } } },
156
+ mocks: { $store: { getters: { 'i18n/t': () => text, namespaceFilterMode: () => undefined } } },
160
157
  directives: { shortkey: () => jest.fn() }
161
158
  });
159
+
160
+ (wrapper.vm as any).cachedFiltered = [
161
+ {
162
+ kind: 'namespace',
163
+ label: `default-${ text }`,
164
+ },
165
+ ];
166
+
162
167
  const dropdown = wrapper.find(`[data-testid="namespaces-dropdown"]`);
163
168
 
164
169
  await dropdown.trigger('click');
@@ -180,28 +185,31 @@ describe('component: NamespaceFilter', () => {
180
185
  jest.spyOn(NamespaceFilter.computed.value, 'get').mockReturnValue([]);
181
186
  const wrapper = mount(NamespaceFilter, {
182
187
  computed: {
183
- filtered: () => [
184
- {
185
- label: text,
186
- key,
187
- elementId: text,
188
- id: text,
189
- kind: 'namespace',
190
- },
191
- ],
192
- options: () => [],
193
- currentProduct: () => undefined,
194
- key: () => key,
188
+ options: () => [],
189
+ currentProduct: () => undefined,
190
+ namespaceFilterMode: () => undefined,
191
+ key: () => key,
195
192
  },
196
193
  mocks: {
197
194
  $store: {
198
- getters: { 'i18n/t': () => text },
195
+ getters: { 'i18n/t': () => text, namespaceFilterMode: () => undefined },
199
196
  dispatch: action
200
197
  }
201
198
  },
202
199
  directives: { shortkey: () => jest.fn() }
203
200
  });
204
201
 
202
+ (wrapper.vm as any).cachedFiltered = [
203
+ {
204
+ label: text,
205
+ key,
206
+ elementId: text,
207
+ id: text,
208
+ kind: 'namespace',
209
+ enabled: true,
210
+ },
211
+ ];
212
+
205
213
  await wrapper.find(`[data-testid="namespaces-dropdown"]`).trigger('click');
206
214
  await wrapper.find(`[data-testid="namespaces-option-0"]`).trigger('click');
207
215
 
@@ -0,0 +1,32 @@
1
+ import { shallowMount } from '@vue/test-utils';
2
+ import PercentageBar, { PreferredDirection } from '@shell/components/PercentageBar.vue';
3
+ import Bar from '@shell/components/graph/Bar.vue';
4
+ import { ExtendedVue, Vue } from 'vue/types/vue';
5
+ import { DefaultProps } from 'vue/types/options';
6
+
7
+ const colorStops = {
8
+ 0: '--success', 30: '--warning', 70: '--error'
9
+ };
10
+
11
+ describe('component: PercentageBar', () => {
12
+ it('should render component with the correct data applied', () => {
13
+ const wrapper = shallowMount(PercentageBar as unknown as ExtendedVue<Vue, {}, {}, {}, DefaultProps>, {
14
+ propsData: {
15
+ value: 25,
16
+ preferredDirection: PreferredDirection.MORE,
17
+ showPercentage: true,
18
+ colorStops
19
+ }
20
+ });
21
+
22
+ const container = wrapper.find('.percentage-bar');
23
+ const barComponent = wrapper.findComponent(Bar);
24
+ const val = wrapper.find('.percentage-value');
25
+
26
+ expect(container.exists()).toBe(true);
27
+ expect(barComponent.exists()).toBe(true);
28
+ expect(val.exists()).toBe(true);
29
+ expect(val.text()).toBe('25%');
30
+ expect(wrapper.vm.primaryColor).toBe('--warning');
31
+ });
32
+ });
@@ -0,0 +1,398 @@
1
+ import { mount } from '@vue/test-utils';
2
+ import PodSecurityAdmission from '@shell/components/PodSecurityAdmission.vue';
3
+
4
+ describe('component: PodSecurityAdmission', () => {
5
+ it.each([
6
+ ['updateLabels', {
7
+ audit: 'privileged',
8
+ 'audit-version': 'latest',
9
+ enforce: 'privileged',
10
+ 'enforce-version': 'latest',
11
+ warn: 'privileged',
12
+ 'warn-version': 'latest',
13
+ }],
14
+ ['updateExemptions', {
15
+ namespaces: [], runtimeClasses: [], usernames: []
16
+ }]
17
+ ])('should emit %p and exemptions on creation if labels always active', (emission, value) => {
18
+ const wrapper = mount(PodSecurityAdmission, { propsData: { mode: 'create', labelsAlwaysActive: true } });
19
+
20
+ expect(wrapper.emitted(emission)![0][0]).toStrictEqual(value);
21
+ });
22
+
23
+ describe('handling labels', () => {
24
+ it.each([
25
+ ['true', 'active'],
26
+ ['', 'level'],
27
+ ['', 'version'],
28
+ ])('should display default value %p for input %p', (value, inputId) => {
29
+ const wrapper = mount(PodSecurityAdmission, { propsData: { mode: 'edit' } });
30
+
31
+ const input = wrapper.find(`[data-testid="pod-security-admission--psaControl-0-${ inputId }"]`).find('input').element as HTMLInputElement;
32
+
33
+ expect(input.value).toStrictEqual(value);
34
+ });
35
+
36
+ describe.each([
37
+ 'pod-security.kubernetes.io/',
38
+ ''
39
+ ])('given prefix %p', (prefix) => {
40
+ it('should map labels to the form control', () => {
41
+ const labels = {
42
+ [`${ prefix }enforce`]: 'baseline',
43
+ [`${ prefix }enforce-version`]: '123'
44
+ };
45
+ const psaControls = {
46
+ audit: {
47
+ active: false,
48
+ level: 'privileged',
49
+ version: ''
50
+ },
51
+ enforce: {
52
+ active: true,
53
+ level: 'baseline',
54
+ version: '123'
55
+ },
56
+ warn: {
57
+ active: false,
58
+ level: 'privileged',
59
+ version: ''
60
+ },
61
+ };
62
+
63
+ const wrapper = mount(PodSecurityAdmission, {
64
+ propsData: {
65
+ mode: 'edit',
66
+ labels,
67
+ labelsPrefix: prefix
68
+ }
69
+ });
70
+
71
+ expect(wrapper.vm.psaControls).toStrictEqual(psaControls);
72
+ });
73
+
74
+ it.each([
75
+ // ['true', 'active'],
76
+ // ['baseline', 'level'],
77
+ ['123', 'version'],
78
+ ])('should map labels to the form, with value %p for input %p', (value, inputId) => {
79
+ const labels = {
80
+ [`${ prefix }enforce`]: 'baseline',
81
+ [`${ prefix }enforce-version`]: '123'
82
+ };
83
+
84
+ const wrapper = mount(PodSecurityAdmission, {
85
+ propsData: {
86
+ mode: 'edit',
87
+ labels,
88
+ labelsPrefix: prefix
89
+ }
90
+ });
91
+
92
+ const input = wrapper.find(`[data-testid="pod-security-admission--psaControl-0-${ inputId }"]`).find('input').element as HTMLInputElement;
93
+
94
+ expect(input.value).toStrictEqual(value);
95
+ });
96
+
97
+ it.each([
98
+ // ['true', 'active'],
99
+ // ['privileged', 'level'],
100
+ ['', 'version'],
101
+ ])('should map labels to the form, using default values if none, with value %p for input %p', (value, inputId) => {
102
+ const labels = {
103
+ [`${ prefix }enforce`]: '',
104
+ [`${ prefix }enforce-version`]: ''
105
+ };
106
+
107
+ const wrapper = mount(PodSecurityAdmission, {
108
+ propsData: {
109
+ mode: 'edit',
110
+ labels,
111
+ labelsPrefix: prefix
112
+ }
113
+ });
114
+
115
+ const input = wrapper.find(`[data-testid="pod-security-admission--psaControl-0-${ inputId }"]`).find('input').element as HTMLInputElement;
116
+
117
+ expect(input.value).toStrictEqual(value);
118
+ });
119
+
120
+ describe('changing input values', () => {
121
+ it('should add labels if active', () => {
122
+ const version = '123';
123
+ const newLabels = {
124
+ [`${ prefix }enforce`]: 'privileged',
125
+ [`${ prefix }enforce-version`]: version
126
+ };
127
+ const wrapper = mount(PodSecurityAdmission, {
128
+ propsData: {
129
+ mode: 'edit',
130
+ labels: {},
131
+ labelsPrefix: prefix
132
+ },
133
+ // Unable to toggle the checkbox, so we enforce the data
134
+ data: () => ({
135
+ psaControls: {
136
+ enforce: {
137
+ active: true,
138
+ level: '',
139
+ version: ''
140
+ }
141
+ }
142
+ }),
143
+ });
144
+
145
+ // Unable to toggle the checkbox, so we use the input
146
+ wrapper.find(`[data-testid="pod-security-admission--psaControl-0-version"]`).find('input').setValue(version);
147
+
148
+ expect(wrapper.emitted('updateLabels')![0][0]).toStrictEqual(newLabels);
149
+ });
150
+
151
+ it('should remove other labels if not active', () => {
152
+ const labels = {
153
+ [`${ prefix }audit`]: 'privileged',
154
+ [`${ prefix }audit-version`]: 'latest'
155
+ };
156
+ const newLabels = {
157
+ [`${ prefix }enforce`]: 'privileged',
158
+ [`${ prefix }enforce-version`]: 'latest',
159
+ };
160
+ const wrapper = mount(PodSecurityAdmission, {
161
+ propsData: {
162
+ mode: 'edit',
163
+ labels,
164
+ labelsPrefix: prefix
165
+ },
166
+ // Unable to toggle the checkbox, so we enforce the data
167
+ data: () => ({
168
+ psaControls: {
169
+ enforce: {
170
+ active: true,
171
+ level: '',
172
+ version: ''
173
+ }
174
+ }
175
+ }),
176
+ });
177
+
178
+ // Unable to toggle the checkbox, so we enforce the data
179
+ wrapper.setData({
180
+ psaControls: {
181
+ audit: {
182
+ active: false,
183
+ level: '',
184
+ version: ''
185
+ }
186
+ }
187
+ });
188
+
189
+ // Unable to toggle the checkbox, so we use the input
190
+ wrapper.find(`[data-testid="pod-security-admission--psaControl-0-version"]`).find('input').setValue('');
191
+
192
+ expect(wrapper.emitted('updateLabels')![0][0]).toStrictEqual(newLabels);
193
+ });
194
+
195
+ it('should assign default version and level if missing', () => {
196
+ const wrapper = mount(PodSecurityAdmission, {
197
+ propsData: {
198
+ mode: 'edit',
199
+ labels: {},
200
+ labelsPrefix: prefix
201
+ },
202
+ // Unable to toggle the checkbox, so we enforce the data
203
+ data: () => ({
204
+ psaControls: {
205
+ enforce: {
206
+ active: true,
207
+ level: '',
208
+ version: ''
209
+ }
210
+ }
211
+ }),
212
+ });
213
+ const newLabels = {
214
+ [`${ prefix }enforce`]: 'privileged',
215
+ [`${ prefix }enforce-version`]: 'latest'
216
+ };
217
+
218
+ // Unable to toggle the checkbox, so we use the input
219
+ wrapper.find(`[data-testid="pod-security-admission--psaControl-0-version"]`).find('input').setValue('');
220
+
221
+ expect(wrapper.emitted('updateLabels')![0][0]).toStrictEqual(newLabels);
222
+ });
223
+ });
224
+ });
225
+
226
+ describe.each(['level', 'version'])('should keep always %p enabled', (inputId) => {
227
+ it('given labelsAlwaysActive true and no labels', () => {
228
+ const wrapper = mount(PodSecurityAdmission, {
229
+ propsData: {
230
+ mode: 'edit',
231
+ labelsAlwaysActive: true,
232
+ labels: {}
233
+ },
234
+ });
235
+
236
+ const input = wrapper.find(`[data-testid="pod-security-admission--psaControl-0-${ inputId }"]`).find('input').element as HTMLInputElement;
237
+
238
+ expect(input.disabled).toBe(false);
239
+ });
240
+
241
+ it('given existing values', () => {
242
+ const wrapper = mount(PodSecurityAdmission, {
243
+ propsData: {
244
+ mode: 'edit',
245
+ labels: {
246
+ [`enforce`]: 'baseline',
247
+ [`enforce-version`]: '123'
248
+ }
249
+ },
250
+ });
251
+
252
+ const input = wrapper.find(`[data-testid="pod-security-admission--psaControl-0-${ inputId }"]`).find('input').element as HTMLInputElement;
253
+
254
+ expect(input.disabled).toBe(false);
255
+ });
256
+ });
257
+
258
+ describe.each(['level', 'version'])('should keep always %p disabled', (inputId) => {
259
+ it('given labelsAlwaysActive false and no labels', () => {
260
+ const wrapper = mount(PodSecurityAdmission, {
261
+ propsData: {
262
+ mode: 'edit',
263
+ labelsAlwaysActive: false,
264
+ labels: {}
265
+ },
266
+ });
267
+
268
+ const input = wrapper.find(`[data-testid="pod-security-admission--psaControl-0-${ inputId }"]`).find('input').element as HTMLInputElement;
269
+
270
+ expect(input.disabled).toBe(true);
271
+ });
272
+
273
+ it('given disabled active status', () => {
274
+ const wrapper = mount(PodSecurityAdmission, {
275
+ propsData: { mode: 'edit' },
276
+ data: () => ({
277
+ psaControls: {
278
+ enforce: {
279
+ active: false,
280
+ level: '',
281
+ version: ''
282
+ }
283
+ }
284
+ }),
285
+ });
286
+
287
+ const input = wrapper.find(`[data-testid="pod-security-admission--psaControl-0-${ inputId }"]`).find('input').element as HTMLInputElement;
288
+
289
+ expect(input.disabled).toBe(true);
290
+ });
291
+
292
+ it('given view mode and provided labels', () => {
293
+ const wrapper = mount(PodSecurityAdmission, {
294
+ propsData: {
295
+ mode: 'view',
296
+ labels: {
297
+ [`enforce`]: 'baseline',
298
+ [`enforce-version`]: '123'
299
+ }
300
+ },
301
+ });
302
+
303
+ const input = wrapper.find(`[data-testid="pod-security-admission--psaControl-0-${ inputId }"]`).find('input').element as HTMLInputElement;
304
+
305
+ expect(input.disabled).toBe(true);
306
+ });
307
+ });
308
+
309
+ it.each([
310
+ [true, false],
311
+ ])('should display the checkbox %p', (value) => {
312
+ const wrapper = mount(PodSecurityAdmission, {
313
+ propsData: {
314
+ mode: 'edit',
315
+ labelsAlwaysActive: value
316
+ }
317
+ });
318
+
319
+ const input = wrapper.find(`[data-testid="pod-security-admission--psaControl-0-active"]`).element as HTMLInputElement;
320
+
321
+ expect(!input).toBe(value);
322
+ });
323
+ });
324
+
325
+ describe('handling exemptions', () => {
326
+ it.each([
327
+ [['namespace1', 'namespace2'], 'namespace1,namespace2'],
328
+ ])('should map %p to the form control as %p', (exemption, control) => {
329
+ const exemptions = { namespaces: exemption };
330
+ const result = {
331
+ namespaces: {
332
+ active: true,
333
+ value: control
334
+ },
335
+ runtimeClasses: {
336
+ active: false,
337
+ value: ''
338
+ },
339
+ usernames: {
340
+ active: false,
341
+ value: ''
342
+ },
343
+ };
344
+
345
+ const wrapper = mount(PodSecurityAdmission, {
346
+ propsData: {
347
+ mode: 'edit',
348
+ exemptions,
349
+ }
350
+ });
351
+
352
+ expect(wrapper.vm.psaExemptionsControls).toStrictEqual(result);
353
+ });
354
+
355
+ it.each([
356
+ // ['true', 'active'],
357
+ ['username', 'value'],
358
+ ])('should map to the form, with value %p for input %p', (value, inputId) => {
359
+ const exemptions = { usernames: [value] };
360
+ const wrapper = mount(PodSecurityAdmission, {
361
+ propsData: {
362
+ mode: 'edit',
363
+ exemptions
364
+ }
365
+ });
366
+
367
+ const input = wrapper.find(`[data-testid="pod-security-admission--psaExemptionsControl-0-${ inputId }"]`).find('input').element as HTMLInputElement;
368
+
369
+ expect(input.value).toStrictEqual(value);
370
+ });
371
+
372
+ describe('changing input values', () => {
373
+ it.each([
374
+ ['username1', ['username1']],
375
+ ['username1, username2', ['username1', 'username2']],
376
+ ['username1,username2', ['username1', 'username2']],
377
+ ])('should emit exemption input value %p as %p', (value, exemption) => {
378
+ const exemptions = {
379
+ usernames: exemption,
380
+ namespaces: [],
381
+ runtimeClasses: []
382
+ };
383
+ const wrapper = mount(PodSecurityAdmission, {
384
+ propsData: {
385
+ mode: 'edit',
386
+ exemptions
387
+ },
388
+ });
389
+ // Unable to toggle the checkbox, so we use the input
390
+ const input = wrapper.find(`[data-testid="pod-security-admission--psaExemptionsControl-0-value"]`).find('input');
391
+
392
+ input.setValue(value);
393
+
394
+ expect(wrapper.emitted('updateExemptions')![0][0]).toStrictEqual(exemptions);
395
+ });
396
+ });
397
+ });
398
+ });
@@ -1,12 +1,12 @@
1
1
 
2
2
  <script>
3
3
  import { Banner } from '@components/Banner';
4
- import AsyncButton from '@shell/components/AsyncButton';
4
+ import DisableAuthProviderModal from '@shell/components/DisableAuthProviderModal';
5
5
 
6
6
  export default {
7
7
  components: {
8
- AsyncButton,
9
- Banner
8
+ Banner,
9
+ DisableAuthProviderModal
10
10
  },
11
11
 
12
12
  props: {
@@ -32,6 +32,12 @@ export default {
32
32
  return Object.entries(this.table);
33
33
  }
34
34
  },
35
+
36
+ methods: {
37
+ showDisableModal() {
38
+ this.$refs.disableAuthProviderModal.show();
39
+ }
40
+ },
35
41
  };
36
42
  </script>
37
43
 
@@ -52,13 +58,13 @@ export default {
52
58
  >
53
59
  {{ t('action.edit') }}
54
60
  </button>
55
- <AsyncButton
56
- class="ml-10"
57
- mode="disable"
58
- size="sm"
59
- action-color="bg-error"
60
- @click="disable"
61
- />
61
+ <button
62
+ type="button"
63
+ class="ml-10 btn-sm role-primary bg-error"
64
+ @click="showDisableModal"
65
+ >
66
+ {{ t('generic.disable') }}
67
+ </button>
62
68
  </Banner>
63
69
 
64
70
  <table
@@ -67,6 +73,10 @@ export default {
67
73
  >
68
74
  <slot name="rows" />
69
75
  </table>
76
+ <DisableAuthProviderModal
77
+ ref="disableAuthProviderModal"
78
+ @disable="disable"
79
+ />
70
80
  </div>
71
81
  </template>
72
82