@rancher/shell 0.3.0 → 0.3.2

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 (342) 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/_gauges.scss +1 -1
  4. package/assets/styles/global/_layout.scss +5 -2
  5. package/assets/styles/global/_select.scss +1 -4
  6. package/assets/styles/themes/_dark.scss +5 -4
  7. package/assets/styles/themes/_light.scss +4 -3
  8. package/assets/styles/themes/_suse.scss +1 -1
  9. package/assets/styles/vendor/vue-select.scss +4 -3
  10. package/assets/translations/en-us.yaml +673 -73
  11. package/assets/translations/zh-hans.yaml +720 -207
  12. package/chart/monitoring/steps/uninstall-v1.vue +2 -2
  13. package/cloud-credential/azure.vue +23 -0
  14. package/cloud-credential/harvester.vue +25 -62
  15. package/cloud-credential/pnap.vue +80 -0
  16. package/components/.DS_Store +0 -0
  17. package/components/ActionMenu.vue +28 -7
  18. package/components/AdvancedSection.vue +9 -2
  19. package/components/Alert.vue +2 -2
  20. package/components/ButtonDropdown.vue +0 -2
  21. package/components/ButtonGroup.vue +1 -0
  22. package/components/CollapsibleCard.vue +0 -1
  23. package/components/CruResource.vue +41 -4
  24. package/components/DetailTop.vue +72 -4
  25. package/components/DisableAuthProviderModal.vue +106 -0
  26. package/{rancher-components/components/Utils/DraggableZone → components}/DraggableZone.vue +0 -0
  27. package/components/ExplorerMembers.vue +253 -30
  28. package/components/ExplorerProjectsNamespaces.vue +77 -33
  29. package/components/ExtensionPanel.vue +42 -0
  30. package/components/GrowlManager.vue +3 -3
  31. package/components/IconOrSvg.vue +178 -0
  32. package/components/LogItem.vue +69 -0
  33. package/components/PodSecurityAdmission.vue +302 -0
  34. package/components/PromptModal.vue +1 -0
  35. package/components/ResourceDetail/Masthead.vue +69 -4
  36. package/components/ResourceDetail/index.vue +12 -5
  37. package/components/ResourceList/Masthead.vue +11 -1
  38. package/components/ResourceList/ResourceLoadingIndicator.vue +12 -2
  39. package/components/ResourceList/index.vue +66 -12
  40. package/components/ResourceList/resource-list.config.js +7 -0
  41. package/components/ResourceTable.vue +33 -6
  42. package/components/SimpleBox.vue +1 -1
  43. package/components/SortableTable/THead.vue +21 -14
  44. package/components/SortableTable/filtering.js +1 -1
  45. package/components/SortableTable/index.vue +21 -10
  46. package/components/SortableTable/selection.js +15 -3
  47. package/components/Tabbed/Tab.vue +1 -1
  48. package/components/Tabbed/index.vue +20 -15
  49. package/components/__tests__/.DS_Store +0 -0
  50. package/components/__tests__/AsyncButton.test.ts +140 -0
  51. package/components/__tests__/BackLink.test.ts +33 -0
  52. package/components/__tests__/ButtonGroup.test.ts +124 -0
  53. package/components/__tests__/ClusterBadge.test.ts +32 -0
  54. package/components/__tests__/CollapsibleCard.test.ts +64 -0
  55. package/components/__tests__/ConsumptionGauge.test.ts +88 -0
  56. package/components/__tests__/CruResource.test.ts +3 -2
  57. package/components/__tests__/FixedBanner.test.ts +129 -0
  58. package/components/__tests__/GrowlManager.test.ts +147 -0
  59. package/components/__tests__/NamespaceFilter.test.ts +33 -25
  60. package/components/__tests__/PercentageBar.test.ts +32 -0
  61. package/components/__tests__/PodSecurityAdmission.test.ts +398 -0
  62. package/components/auth/AuthBanner.vue +20 -10
  63. package/components/auth/RoleDetailEdit.vue +26 -17
  64. package/components/auth/SelectPrincipal.vue +36 -5
  65. package/components/form/ArrayList.vue +3 -35
  66. package/components/form/ArrayListGrouped.vue +13 -4
  67. package/components/form/ArrayListSelect.vue +5 -5
  68. package/components/form/Error.vue +8 -0
  69. package/components/form/KeyValue.vue +39 -7
  70. package/components/form/LabeledSelect.vue +5 -2
  71. package/components/form/Labels.vue +46 -16
  72. package/components/form/Members/ClusterPermissionsEditor.vue +17 -17
  73. package/components/form/Members/MembershipEditor.vue +12 -12
  74. package/components/form/NameNsDescription.vue +1 -1
  75. package/components/form/NodeScheduling.vue +1 -1
  76. package/components/form/Probe.vue +3 -3
  77. package/components/form/ResourceQuota/Project.vue +6 -6
  78. package/components/form/ResourceTabs/index.vue +24 -6
  79. package/components/form/Security.vue +7 -6
  80. package/components/form/Select.vue +3 -2
  81. package/components/form/SelectOrCreateAuthSecret.vue +22 -29
  82. package/components/form/ServicePorts.vue +8 -0
  83. package/components/form/WorkloadPorts.vue +7 -1
  84. package/components/form/__tests__/ArrayList.test.ts +74 -0
  85. package/components/form/__tests__/ArrayListGrouped.test.ts +6 -4
  86. package/components/formatter/Checked.vue +1 -1
  87. package/components/formatter/ClusterLink.vue +5 -0
  88. package/components/formatter/IconIsDefault.vue +2 -2
  89. package/components/formatter/InternalExternalIP.vue +11 -8
  90. package/components/formatter/LiveDuration.vue +78 -0
  91. package/components/formatter/WorkloadHealthScale.vue +5 -3
  92. package/components/nav/Header.vue +74 -7
  93. package/components/nav/NamespaceFilter.vue +146 -63
  94. package/components/nav/TopLevelMenu.vue +22 -19
  95. package/components/nav/WindowManager/ContainerLogs.vue +83 -126
  96. package/components/nav/WindowManager/ContainerShell.vue +9 -7
  97. package/components/nav/WindowManager/Window.vue +2 -0
  98. package/components/nav/WindowManager/index.vue +10 -0
  99. package/config/elemental-types.js +9 -0
  100. package/config/features.js +2 -0
  101. package/config/home-links.js +4 -1
  102. package/config/pod-security-admission.ts +82 -0
  103. package/config/product/apps.js +1 -1
  104. package/config/product/auth.js +6 -5
  105. package/config/product/backup.js +1 -1
  106. package/config/product/explorer.js +6 -6
  107. package/config/product/fleet.js +1 -1
  108. package/config/product/manager.js +6 -2
  109. package/config/query-params.js +1 -0
  110. package/config/secret.js +0 -1
  111. package/config/settings.ts +26 -9
  112. package/config/table-headers.js +22 -11
  113. package/config/types.js +4 -1
  114. package/config/uiplugins.js +3 -3
  115. package/content/docs/zh-hans/getting-started.md +113 -137
  116. package/content/docs/zh-hans/whats-new.md +8 -46
  117. package/core/plugin-helpers.js +171 -0
  118. package/core/plugin.ts +61 -1
  119. package/core/plugins.js +33 -0
  120. package/core/types.ts +128 -2
  121. package/creators/pkg/package-lock.json +37 -0
  122. package/creators/pkg/package.json +1 -1
  123. package/detail/catalog.cattle.io.app.vue +1 -1
  124. package/detail/pod.vue +1 -1
  125. package/detail/provisioning.cattle.io.cluster.vue +35 -9
  126. package/detail/service.vue +2 -9
  127. package/detail/workload/index.vue +0 -1
  128. package/dialog/AddClusterMemberDialog.vue +22 -28
  129. package/dialog/AddProjectMemberDialog.vue +53 -9
  130. package/dialog/DiagnosticTimingsDialog.vue +8 -7
  131. package/dialog/DrainNode.vue +44 -48
  132. package/dialog/ForceMachineRemoveDialog.vue +5 -7
  133. package/dialog/GenericPrompt.vue +15 -20
  134. package/dialog/RollbackWorkloadDialog.vue +15 -46
  135. package/dialog/RotateCertificatesDialog.vue +5 -7
  136. package/dialog/RotateEncryptionKeyDialog.vue +5 -9
  137. package/dialog/SaveAsRKETemplateDialog.vue +5 -13
  138. package/dialog/ScaleMachineDownDialog.vue +1 -1
  139. package/dialog/ScalePoolDownDialog.vue +121 -0
  140. package/edit/__tests__/management.cattle.io.setting.test.ts +3 -3
  141. package/edit/auth/azuread.vue +16 -16
  142. package/edit/auth/github.vue +8 -0
  143. package/edit/auth/googleoauth.vue +10 -1
  144. package/edit/auth/ldap/index.vue +10 -0
  145. package/edit/auth/oidc.vue +10 -0
  146. package/edit/auth/saml.vue +10 -0
  147. package/edit/autoscaling.horizontalpodautoscaler/index.vue +1 -1
  148. package/edit/catalog.cattle.io.clusterrepo.vue +3 -0
  149. package/edit/cloudcredential.vue +3 -7
  150. package/edit/logging-flow/Match.vue +39 -8
  151. package/edit/logging-flow/index.vue +27 -4
  152. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +107 -0
  153. package/edit/management.cattle.io.project.vue +8 -1
  154. package/edit/management.cattle.io.setting.vue +5 -2
  155. package/edit/management.cattle.io.user.vue +7 -1
  156. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +36 -8
  157. package/edit/monitoring.coreos.com.alertmanagerconfig/types/email.vue +2 -2
  158. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +14 -6
  159. package/edit/namespace.vue +18 -4
  160. package/edit/networking.k8s.io.ingress/Certificate.vue +1 -0
  161. package/edit/networking.k8s.io.ingress/IngressClass.vue +8 -6
  162. package/edit/networking.k8s.io.ingress/RulePath.vue +12 -6
  163. package/edit/networking.k8s.io.ingress/index.vue +8 -6
  164. package/edit/persistentvolume/index.vue +30 -27
  165. package/edit/persistentvolume/plugins/cephfs.vue +29 -29
  166. package/edit/persistentvolume/plugins/csi.vue +102 -62
  167. package/edit/persistentvolume/plugins/fc.vue +19 -19
  168. package/edit/persistentvolume/plugins/iscsi.vue +45 -45
  169. package/edit/persistentvolume/plugins/rbd.vue +39 -39
  170. package/edit/persistentvolumeclaim.vue +78 -75
  171. package/edit/provisioning.cattle.io.cluster/MachinePool.vue +11 -7
  172. package/edit/provisioning.cattle.io.cluster/RegistryConfigs.vue +10 -1
  173. package/edit/provisioning.cattle.io.cluster/RegistryMirrors.vue +87 -27
  174. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +3 -6
  175. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +96 -0
  176. package/edit/provisioning.cattle.io.cluster/import.vue +1 -1
  177. package/edit/provisioning.cattle.io.cluster/index.vue +29 -6
  178. package/edit/provisioning.cattle.io.cluster/rke2.vue +445 -154
  179. package/edit/secret/index.vue +3 -7
  180. package/edit/service.vue +3 -1
  181. package/edit/storage.k8s.io.storageclass/index.vue +100 -16
  182. package/edit/storage.k8s.io.storageclass/provisioners/driver.harvesterhci.io.vue +114 -0
  183. package/edit/workload/__tests__/index.test.ts +98 -0
  184. package/edit/workload/index.vue +58 -8
  185. package/edit/workload/mixins/workload.js +107 -70
  186. package/edit/workload/storage/ContainerMountPaths.vue +0 -10
  187. package/edit/workload/storage/emptyDir.vue +88 -0
  188. package/edit/workload/storage/ephemeralVolume/index.vue +1 -1
  189. package/edit/workload/storage/index.vue +8 -0
  190. package/edit/workload/storage/persistentVolumeClaim/index.vue +1 -1
  191. package/layouts/default.vue +57 -44
  192. package/list/__tests__/workload.test.ts +5 -2
  193. package/list/catalog.cattle.io.app.vue +1 -0
  194. package/list/cis.cattle.io.clusterscan.vue +1 -0
  195. package/list/fleet.cattle.io.bundle.vue +5 -6
  196. package/list/fleet.cattle.io.cluster.vue +6 -3
  197. package/list/fleet.cattle.io.clusterregistrationtoken.vue +5 -6
  198. package/list/fleet.cattle.io.gitrepo.vue +4 -9
  199. package/list/helm.cattle.io.projecthelmchart.vue +1 -5
  200. package/list/logging.banzaicloud.io.clusterflow.vue +4 -1
  201. package/list/logging.banzaicloud.io.flow.vue +6 -5
  202. package/list/management.cattle.io.cluster.vue +1 -0
  203. package/list/management.cattle.io.feature.vue +3 -4
  204. package/list/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +47 -0
  205. package/list/management.cattle.io.setting.vue +2 -2
  206. package/list/management.cattle.io.user.vue +4 -10
  207. package/list/monitoring.coreos.com.alertmanagerconfig.vue +2 -7
  208. package/list/node.vue +8 -5
  209. package/list/persistentvolume.vue +3 -3
  210. package/list/persistentvolumeclaim.vue +3 -4
  211. package/list/provisioning.cattle.io.cluster.vue +18 -19
  212. package/list/service.vue +6 -14
  213. package/list/workload.vue +43 -38
  214. package/machine-config/azure.vue +429 -60
  215. package/machine-config/pnap.vue +288 -0
  216. package/mixins/auth-config.js +1 -3
  217. package/mixins/browser-tab-visibility.js +8 -14
  218. package/mixins/chart.js +1 -1
  219. package/mixins/create-edit-view/impl.js +4 -0
  220. package/mixins/create-edit-view/index.js +4 -2
  221. package/mixins/resource-fetch-namespaced.js +98 -0
  222. package/mixins/resource-fetch.js +79 -45
  223. package/mixins/resource-manager.js +1 -23
  224. package/models/apps.controllerrevision.js +7 -0
  225. package/models/apps.daemonset.js +18 -0
  226. package/models/apps.deployment.js +44 -0
  227. package/models/apps.replicaset.js +7 -0
  228. package/models/apps.statefulset.js +18 -0
  229. package/models/batch.job.js +7 -14
  230. package/models/cluster/node.js +10 -2
  231. package/models/cluster.x-k8s.io.machine.js +26 -4
  232. package/models/cluster.x-k8s.io.machinedeployment.js +12 -2
  233. package/models/event.js +7 -0
  234. package/models/logging.banzaicloud.io.flow.js +4 -0
  235. package/models/management.cattle.io.cluster.js +1 -1
  236. package/models/management.cattle.io.clusterroletemplatebinding.js +1 -1
  237. package/models/management.cattle.io.globalrole.js +2 -2
  238. package/models/management.cattle.io.node.js +37 -2
  239. package/models/management.cattle.io.podsecurityadmissionconfigurationtemplate.ts +4 -0
  240. package/models/management.cattle.io.project.js +30 -11
  241. package/models/management.cattle.io.setting.js +1 -1
  242. package/models/management.cattle.io.user.js +37 -1
  243. package/models/namespace.js +42 -5
  244. package/models/persistentvolume.js +14 -2
  245. package/models/pod.js +15 -0
  246. package/models/projectroletemplatebinding.js +7 -0
  247. package/models/provisioning.cattle.io.cluster.js +61 -10
  248. package/models/rke-machine.cattle.io.pnapmachinetemplate.js +15 -0
  249. package/models/service.js +14 -13
  250. package/models/storage.k8s.io.storageclass.js +33 -18
  251. package/models/workload.js +38 -7
  252. package/nuxt.config.js +27 -17
  253. package/package.json +7 -7
  254. package/pages/about.vue +14 -2
  255. package/pages/c/_cluster/apps/charts/index.vue +21 -3
  256. package/pages/c/_cluster/apps/charts/install.vue +59 -22
  257. package/pages/c/_cluster/auth/config/_id.vue +6 -0
  258. package/pages/c/_cluster/auth/config/index.vue +8 -6
  259. package/pages/c/_cluster/auth/group.principal/assign-edit.vue +1 -1
  260. package/pages/c/_cluster/auth/roles/index.vue +1 -1
  261. package/pages/c/_cluster/explorer/index.vue +51 -6
  262. package/pages/c/_cluster/longhorn/index.vue +1 -1
  263. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +15 -4
  264. package/pages/c/_cluster/monitoring/index.vue +1 -1
  265. package/pages/c/_cluster/neuvector/index.vue +1 -1
  266. package/pages/c/_cluster/settings/performance.vue +48 -2
  267. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +2 -0
  268. package/pages/c/_cluster/uiplugins/InstallDialog.vue +3 -0
  269. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +42 -2
  270. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +2 -0
  271. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +1 -0
  272. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +2 -0
  273. package/pages/c/_cluster/uiplugins/index.vue +42 -3
  274. package/pages/diagnostic.vue +5 -4
  275. package/pages/home.vue +105 -30
  276. package/pages/prefs.vue +23 -12
  277. package/pages/rio/mesh.vue +1 -1
  278. package/pkg/dynamic-importer.lib.js +8 -0
  279. package/pkg/vue.config.js +4 -0
  280. package/plugins/dashboard-store/__tests__/mutations.spec.js +406 -0
  281. package/plugins/dashboard-store/actions.js +32 -25
  282. package/plugins/dashboard-store/getters.js +50 -33
  283. package/plugins/dashboard-store/mutations.js +134 -28
  284. package/plugins/dashboard-store/resource-class.js +37 -42
  285. package/plugins/steve/actions.js +30 -0
  286. package/plugins/steve/caches/resourceCache.js +60 -0
  287. package/plugins/steve/getters.js +44 -1
  288. package/plugins/steve/mutations.js +97 -36
  289. package/plugins/steve/resourceWatcher.js +277 -0
  290. package/plugins/steve/schema.utils.js +25 -0
  291. package/plugins/steve/subscribe.js +288 -115
  292. package/plugins/steve/worker/index.js +17 -0
  293. package/plugins/steve/worker/web-worker.advanced.js +302 -0
  294. package/plugins/steve/{web-worker.steve-sub-worker.js → worker/web-worker.basic.js} +3 -44
  295. package/rancher-components/Card/Card.vue +3 -3
  296. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +1 -0
  297. package/rancher-components/StringList/StringList.test.ts +45 -420
  298. package/rancher-components/StringList/StringList.vue +1 -10
  299. package/rancher-components/components/Banner/Banner.test.ts +44 -0
  300. package/rancher-components/components/Banner/Banner.vue +130 -61
  301. package/rancher-components/components/Form/Checkbox/Checkbox.test.ts +13 -22
  302. package/rancher-components/components/Form/Checkbox/Checkbox.vue +8 -6
  303. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.test.ts +9 -9
  304. package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +0 -1
  305. package/rancher-components/components/StringList/StringList.test.ts +7 -7
  306. package/rancher-components/components/StringList/StringList.vue +21 -15
  307. package/scripts/test-plugins-build.sh +8 -0
  308. package/static/loading-indicator.html +1 -1
  309. package/store/action-menu.js +4 -3
  310. package/store/index.js +54 -3
  311. package/store/plugins.js +0 -17
  312. package/store/pnap.js +128 -0
  313. package/store/prefs.js +4 -2
  314. package/store/type-map.js +81 -13
  315. package/types/pod-security-admission.ts +36 -0
  316. package/types/shell/index.d.ts +497 -396
  317. package/utils/__tests__/object.test.ts +17 -1
  318. package/utils/__tests__/pod-security-admission.test.ts +61 -0
  319. package/utils/async.ts +36 -0
  320. package/utils/color.js +45 -0
  321. package/utils/crypto/browserHashUtils.js +18 -0
  322. package/utils/dynamic-importer.js +8 -0
  323. package/utils/install-redirect.js +1 -1
  324. package/utils/object.js +24 -0
  325. package/utils/pod-security-admission.ts +39 -0
  326. package/utils/socket.js +61 -24
  327. package/utils/string.js +2 -0
  328. package/utils/svg-filter.js +301 -0
  329. package/utils/time.js +49 -0
  330. package/utils/validators/cidr.js +4 -0
  331. package/utils/validators/formRules/__tests__/index.test.ts +23 -3
  332. package/utils/validators/formRules/index.ts +14 -0
  333. package/config/product/harvester-manager.js +0 -162
  334. package/edit/harvesterhci.io.management.cluster.vue +0 -153
  335. package/list/harvesterhci.io.management.cluster.vue +0 -241
  336. package/machine-config/harvester.vue +0 -693
  337. package/models/harvesterhci.io.management.cluster.js +0 -228
  338. package/pages/c/_cluster/harvesterManager/index.vue +0 -24
  339. package/rancher-components/Card/Card.test.ts +0 -39
  340. package/rancher-components/Utils/DraggableZone/DraggableZone.vue +0 -181
  341. package/rancher-components/Utils/DraggableZone/index.ts +0 -1
  342. package/rancher-components/components/Utils/DraggableZone/index.ts +0 -1
@@ -0,0 +1,121 @@
1
+ <script>
2
+ import { Card } from '@components/Card';
3
+ import { alternateLabel } from '@shell/utils/platform';
4
+ import { Checkbox } from '@components/Form/Checkbox';
5
+ import { SCALE_POOL_PROMPT } from '@shell/store/prefs';
6
+
7
+ export default {
8
+ components: { Card, Checkbox },
9
+
10
+ props: {
11
+ resources: {
12
+ type: Array,
13
+ required: true
14
+ }
15
+ },
16
+
17
+ data() {
18
+ const allToDelete = Array.isArray(this.resources) ? this.resources : [this.resources];
19
+
20
+ return {
21
+ allToDelete,
22
+ type: this.$store.getters['type-map/labelFor'](allToDelete[0].schema, allToDelete.length),
23
+ promptConfirmation: true
24
+ };
25
+ },
26
+ computed: {
27
+ machinenName() {
28
+ const name = this.resources.length > 0 ? this.resources[0].id.split('/')[1] : '';
29
+
30
+ return name;
31
+ },
32
+ protip() {
33
+ return this.t('promptRemove.protip', { alternateLabel });
34
+ },
35
+ },
36
+ created() {
37
+ const showScalePoolPrompt = this.$store.getters['prefs/get'](SCALE_POOL_PROMPT);
38
+
39
+ // Check for showScalePoolPrompt pref
40
+ // If it is not set, set it to true and update promt checkbox
41
+ if ( showScalePoolPrompt === null ) {
42
+ this.promptConfirmation = true;
43
+ this.$store.dispatch('prefs/set', { key: SCALE_POOL_PROMPT, value: true });
44
+ } else {
45
+ this.promptConfirmation = showScalePoolPrompt;
46
+ }
47
+ },
48
+
49
+ methods: {
50
+ close() {
51
+ this.$emit('close');
52
+ },
53
+
54
+ update() {
55
+ this.$store.dispatch('prefs/set', { key: SCALE_POOL_PROMPT, value: !!this.promptConfirmation });
56
+ },
57
+
58
+ remove() {
59
+ // Delete pool
60
+ if (this.resources.length > 0 ) {
61
+ this.resources[0].scalePool(-1);
62
+ }
63
+ this.close();
64
+ }
65
+ }
66
+ };
67
+ </script>
68
+
69
+ <template>
70
+ <Card
71
+ class="prompt-remove"
72
+ :show-highlight-border="false"
73
+ >
74
+ <h4
75
+ slot="title"
76
+ class="text-default-text"
77
+ >
78
+ {{ t('promptForceRemove.modalTitle') }}
79
+ </h4>
80
+ <div
81
+ slot="body"
82
+ class="pl-10 pr-10"
83
+ >
84
+ <div>
85
+ {{ t('promptRemove.attemptingToRemove', { type }) }} <b>{{ machinenName }}</b>
86
+ </div>
87
+ <div>
88
+ <Checkbox
89
+ v-model="promptConfirmation"
90
+ :label="t('promptRemove.promptConfirmation')"
91
+ class="mt-10"
92
+ @input="update()"
93
+ />
94
+ </div>
95
+ <div class="text-info mt-20">
96
+ {{ protip }}
97
+ </div>
98
+ </div>
99
+ <template #actions>
100
+ <button
101
+ class="btn role-secondary mr-10"
102
+ @click="close"
103
+ >
104
+ {{ t('generic.cancel') }}
105
+ </button>
106
+ <div class="spacer" />
107
+ <button
108
+ class="btn bg-error ml-10 btn role-primary"
109
+ @click="remove"
110
+ >
111
+ {{ t('generic.confirm') }}
112
+ </button>
113
+ </template>
114
+ </Card>
115
+ </template>
116
+
117
+ <style lang='scss' scoped>
118
+ .actions {
119
+ text-align: right;
120
+ }
121
+ </style>
@@ -32,7 +32,7 @@ describe('management.cattle.io.setting should', () => {
32
32
  });
33
33
 
34
34
  describe('using predefined generic rule', () => {
35
- const id = SETTING.CATTLE_PASSWORD_MIN_LENGTH;
35
+ const id = SETTING.PASSWORD_MIN_LENGTH;
36
36
 
37
37
  describe('validate input with provided settings', () => {
38
38
  it('allowing to save if pass', () => {
@@ -65,7 +65,7 @@ describe('management.cattle.io.setting should', () => {
65
65
  });
66
66
  const expectation = [{
67
67
  path: 'value',
68
- rules: ['betweenValues']
68
+ rules: ['betweenValues', 'isInteger', 'isPositive', 'isOctal']
69
69
  }];
70
70
 
71
71
  expect(wrapper.vm.$data['fvFormRuleSets']).toStrictEqual(expectation);
@@ -76,7 +76,7 @@ describe('management.cattle.io.setting should', () => {
76
76
  propsData: { value: { id, value: '' } },
77
77
  ...requiredSetup()
78
78
  });
79
- const expectation = ['betweenValues'];
79
+ const expectation = ['betweenValues', 'isInteger', 'isPositive', 'isOctal'];
80
80
 
81
81
  // Avoid integration tests with mixin as it returns the whole function
82
82
  const rules = Object.keys((wrapper.vm as any)['fvExtraRules']);
@@ -219,8 +219,8 @@ export default {
219
219
 
220
220
  promptUpdate() {
221
221
  this.$store.dispatch('management/promptModal', {
222
- component: 'GenericPrompt',
223
- resources: [this.modalConfig]
222
+ component: 'GenericPrompt',
223
+ componentProps: this.modalConfig
224
224
  });
225
225
  },
226
226
 
@@ -267,10 +267,10 @@ export default {
267
267
  @cancel="cancel"
268
268
  >
269
269
  <template v-if="model.enabled && !isEnabling && !editConfig">
270
- <AuthBanner
271
- :t-args="tArgs"
272
- :disable="disable"
273
- :edit="goToEdit"
270
+ <AuthBanner
271
+ :t-args="tArgs"
272
+ :disable="disable"
273
+ :edit="goToEdit"
274
274
  >
275
275
  <template slot="rows">
276
276
  <tr>
@@ -298,9 +298,9 @@ export default {
298
298
  <td>{{ model.authEndpoint }}</td>
299
299
  </tr>
300
300
  </template>
301
- <template
302
- v-if="needsUpdate"
303
- slot="actions"
301
+ <template
302
+ v-if="needsUpdate"
303
+ slot="actions"
304
304
  >
305
305
  <button
306
306
  type="button"
@@ -328,17 +328,17 @@ export default {
328
328
  color="warning"
329
329
  />
330
330
 
331
- <InfoBox
332
- v-if="!model.enabled"
333
- id="reply-info"
334
- class="mt-20 mb-20 p-10"
331
+ <InfoBox
332
+ v-if="!model.enabled"
333
+ id="reply-info"
334
+ class="mt-20 mb-20 p-10"
335
335
  >
336
336
  {{ t('authConfig.azuread.reply.info') }}
337
337
  <br>
338
338
  <label class="reply-url">{{ t('authConfig.azuread.reply.label') }} </label>
339
- <CopyToClipboardText
340
- :plain="true"
341
- :text="replyUrl"
339
+ <CopyToClipboardText
340
+ :plain="true"
341
+ :text="replyUrl"
342
342
  />
343
343
  </InfoBox>
344
344
 
@@ -269,4 +269,12 @@ export default {
269
269
  .step-list li:not(:last-child) {
270
270
  margin-bottom: 8px;
271
271
  }
272
+ .banner {
273
+ display: block;
274
+
275
+ &::v-deep code {
276
+ padding: 0 3px;
277
+ margin: 0 3px;
278
+ }
279
+ }
272
280
  </style>
@@ -246,7 +246,7 @@ export default {
246
246
  v-if="!model.enabled"
247
247
  class="row"
248
248
  >
249
- <div class="col span-12">
249
+ <div class="col span-12 google">
250
250
  <Banner
251
251
  color="info"
252
252
  v-html="t('authConfig.associatedWarning', tArgs, true)"
@@ -261,4 +261,13 @@ export default {
261
261
  .step-list li:not(:last-child) {
262
262
  margin-bottom: 8px;
263
263
  }
264
+
265
+ .banner {
266
+ display: block;
267
+
268
+ &::v-deep code {
269
+ padding: 0 3px;
270
+ margin: 0 3px;
271
+ }
272
+ }
264
273
  </style>
@@ -156,3 +156,13 @@ export default {
156
156
  </CruResource>
157
157
  </div>
158
158
  </template>
159
+ <style lang="scss" scoped>
160
+ .banner {
161
+ display: block;
162
+
163
+ &::v-deep code {
164
+ padding: 0 3px;
165
+ margin: 0 3px;
166
+ }
167
+ }
168
+ </style>
@@ -285,3 +285,13 @@ export default {
285
285
  </CruResource>
286
286
  </div>
287
287
  </template>
288
+ <style lang="scss" scoped>
289
+ .banner {
290
+ display: block;
291
+
292
+ &::v-deep code {
293
+ padding: 0 3px;
294
+ margin: 0 3px;
295
+ }
296
+ }
297
+ </style>
@@ -265,3 +265,13 @@ export default {
265
265
  </CruResource>
266
266
  </div>
267
267
  </template>
268
+ <style lang="scss" scoped>
269
+ .banner {
270
+ display: block;
271
+
272
+ &::v-deep code {
273
+ padding: 0 3px;
274
+ margin: 0 3px;
275
+ }
276
+ }
277
+ </style>
@@ -228,7 +228,7 @@ export default {
228
228
  class="btn role-link close btn-sm"
229
229
  @click="removeProps.remove"
230
230
  >
231
- <i class="icon icon-2x icon-x" />
231
+ <i class="icon icon-x" />
232
232
  </button>
233
233
  <span v-else />
234
234
  </template>
@@ -59,6 +59,7 @@ export default {
59
59
  :options="[false, true]"
60
60
  :labels="[t('catalog.repo.target.http'), t('catalog.repo.target.git')]"
61
61
  :mode="mode"
62
+ data-testid="clusterrepo-radio-input"
62
63
  />
63
64
  </div>
64
65
  </div>
@@ -74,6 +75,7 @@ export default {
74
75
  :label="t('catalog.repo.gitRepo.label')"
75
76
  :placeholder="t('catalog.repo.gitRepo.placeholder', null, true)"
76
77
  :mode="mode"
78
+ data-testid="clusterrepo-git-repo-input"
77
79
  />
78
80
  </div>
79
81
  <div class="col span-6">
@@ -83,6 +85,7 @@ export default {
83
85
  :label="t('catalog.repo.gitBranch.label')"
84
86
  :placeholder="t('catalog.repo.gitBranch.placeholder', null, true)"
85
87
  :mode="mode"
88
+ data-testid="clusterrepo-git-branch-input"
86
89
  />
87
90
  </div>
88
91
  </div>
@@ -10,7 +10,6 @@ import Labels from '@shell/components/form/Labels';
10
10
  import { HIDE_SENSITIVE } from '@shell/store/prefs';
11
11
  import { CAPI } from '@shell/config/labels-annotations';
12
12
  import { clear, uniq } from '@shell/utils/array';
13
- import { importCloudCredential } from '@shell/utils/dynamic-importer';
14
13
  import SelectIconGrid from '@shell/components/SelectIconGrid';
15
14
  import { sortBy } from '@shell/utils/sort';
16
15
  import { ucFirst } from '@shell/utils/string';
@@ -95,14 +94,11 @@ export default {
95
94
  },
96
95
 
97
96
  cloudComponent() {
98
- const driver = this.driverName;
99
- const haveProviders = this.$store.getters['plugins/credentialDrivers'];
100
-
101
- if ( haveProviders.includes(driver) ) {
102
- return importCloudCredential(driver);
97
+ if (this.$store.getters['type-map/hasCustomCloudCredentialComponent'](this.driverName)) {
98
+ return this.$store.getters['type-map/importCloudCredential'](this.driverName);
103
99
  }
104
100
 
105
- return importCloudCredential('generic');
101
+ return this.$store.getters['type-map/importCloudCredential']('generic');
106
102
  },
107
103
 
108
104
  // array of id, label, description, initials for type selection step
@@ -27,6 +27,16 @@ export default {
27
27
  type: Array,
28
28
  default: () => [],
29
29
  },
30
+
31
+ namespaces: {
32
+ type: Array,
33
+ default: () => [],
34
+ },
35
+
36
+ isClusterFlow: {
37
+ type: Boolean,
38
+ default: false
39
+ }
30
40
  },
31
41
 
32
42
  methods: {
@@ -43,19 +53,19 @@ export default {
43
53
  <div>
44
54
  <KeyValue
45
55
  v-model="value.labels"
46
- :title="value.select ? 'Include Pods' : 'Exclude Pods'"
56
+ :title="value.select ? t('logging.flow.matches.pods.title.include') : t('logging.flow.matches.pods.title.exclude')"
47
57
  :mode="mode"
48
58
  :initial-empty-row="true"
49
59
  :read-allowed="false"
50
60
  :title-add="true"
51
61
  protip=""
52
- key-label="Pod Label Key"
53
- value-label="Pod Label Value"
54
- add-label="Add Pod"
62
+ :key-label="t('logging.flow.matches.pods.keyLabel')"
63
+ :value-label="t('logging.flow.matches.pods.valueLabel')"
64
+ :add-label="t('logging.flow.matches.pods.addLabel')"
55
65
  />
56
66
  <div class="spacer" />
57
67
  <h3>
58
- Limit to specific nodes
68
+ {{ value.select ? t('logging.flow.matches.nodes.title.include') : t('logging.flow.matches.nodes.title.exclude') }}
59
69
  </h3>
60
70
  <div class="row">
61
71
  <div class="col span-12">
@@ -63,7 +73,7 @@ export default {
63
73
  v-model="value.hosts"
64
74
  class="lg"
65
75
  :options="nodes"
66
- placeholder="Default: Any node"
76
+ :placeholder="t('logging.flow.matches.nodes.placeholder')"
67
77
  :multiple="true"
68
78
  :searchable="true"
69
79
  :taggable="true"
@@ -75,7 +85,7 @@ export default {
75
85
  </div>
76
86
  <div class="spacer" />
77
87
  <h3>
78
- Limit to specific container names
88
+ {{ value.select ? t('logging.flow.matches.containerNames.title.include') : t('logging.flow.matches.containerNames.title.exclude') }}
79
89
  </h3>
80
90
  <div class="row">
81
91
  <div class="col span-12">
@@ -83,7 +93,7 @@ export default {
83
93
  v-model="value.container_names"
84
94
  class="lg"
85
95
  :options="containers"
86
- placeholder="Default: Any container"
96
+ :placeholder="t('logging.flow.matches.containerNames.placeholder')"
87
97
  :multiple="true"
88
98
  :taggable="true"
89
99
  :clearable="true"
@@ -92,5 +102,26 @@ export default {
92
102
  />
93
103
  </div>
94
104
  </div>
105
+ <div v-if="isClusterFlow">
106
+ <div class="spacer" />
107
+ <h3>
108
+ {{ value.select ? t('logging.flow.matches.namespaces.title.include') : t('logging.flow.matches.namespaces.title.exclude') }}
109
+ </h3>
110
+ <div class="row">
111
+ <div class="col span-12">
112
+ <Select
113
+ v-model="value.namespaces"
114
+ class="lg"
115
+ :options="namespaces"
116
+ :placeholder="t('logging.flow.matches.namespaces.placeholder')"
117
+ :multiple="true"
118
+ :taggable="true"
119
+ :clearable="true"
120
+ :close-on-select="false"
121
+ placement="top"
122
+ />
123
+ </div>
124
+ </div>
125
+ </div>
95
126
  </div>
96
127
  </template>
@@ -6,7 +6,9 @@ import Loading from '@shell/components/Loading';
6
6
  import NameNsDescription from '@shell/components/form/NameNsDescription';
7
7
  import Tabbed from '@shell/components/Tabbed';
8
8
  import Tab from '@shell/components/Tabbed/Tab';
9
- import { LOGGING, NODE, POD, SCHEMA } from '@shell/config/types';
9
+ import {
10
+ LOGGING, NAMESPACE, NODE, POD, SCHEMA
11
+ } from '@shell/config/types';
10
12
  import jsyaml from 'js-yaml';
11
13
  import { createYaml } from '@shell/utils/create-yaml';
12
14
  import YamlEditor, { EDITOR_MODES } from '@shell/components/YamlEditor';
@@ -51,6 +53,7 @@ export default {
51
53
  async fetch() {
52
54
  const hasAccessToClusterOutputs = this.$store.getters[`cluster/schemaFor`](LOGGING.CLUSTER_OUTPUT);
53
55
  const hasAccessToOutputs = this.$store.getters[`cluster/schemaFor`](LOGGING.OUTPUT);
56
+ const hasAccessToNamespaces = this.$store.getters[`cluster/schemaFor`](NAMESPACE);
54
57
  const hasAccessToNodes = this.$store.getters[`cluster/schemaFor`](NODE);
55
58
  const hasAccessToPods = this.$store.getters[`cluster/schemaFor`](POD);
56
59
  const isFlow = this.value.type === LOGGING.FLOW;
@@ -62,6 +65,7 @@ export default {
62
65
  const hash = await allHash({
63
66
  allOutputs: getAllOrDefault(LOGGING.OUTPUT, isFlow && hasAccessToOutputs),
64
67
  allClusterOutputs: getAllOrDefault(LOGGING.CLUSTER_OUTPUT, hasAccessToClusterOutputs),
68
+ allNamespaces: getAllOrDefault(NAMESPACE, hasAccessToNamespaces),
65
69
  allNodes: getAllOrDefault(NODE, hasAccessToNodes),
66
70
  allPods: getAllOrDefault(POD, hasAccessToPods),
67
71
  });
@@ -113,6 +117,7 @@ export default {
113
117
  matches,
114
118
  allOutputs: null,
115
119
  allClusterOutputs: null,
120
+ allNamespaces: null,
116
121
  allNodes: null,
117
122
  allPods: null,
118
123
  filtersYaml,
@@ -166,6 +171,22 @@ export default {
166
171
  });
167
172
  },
168
173
 
174
+ namespaceChoices() {
175
+ if (!this.allNamespaces) {
176
+ // Handle the case where the user doesn't have permission
177
+ // to see namespaces
178
+ return [];
179
+ }
180
+ const out = this.allNamespaces.map((namespace) => {
181
+ return {
182
+ label: namespace.nameDisplay,
183
+ value: namespace.metadata.name
184
+ };
185
+ });
186
+
187
+ return out;
188
+ },
189
+
169
190
  nodeChoices() {
170
191
  if (!this.allNodes) {
171
192
  // Handle the case where the user doesn't have permission
@@ -349,7 +370,7 @@ export default {
349
370
  <Banner
350
371
  color="info"
351
372
  class="mt-0"
352
- label="Configure which container logs will be pulled from"
373
+ :label="t('logging.flow.matches.banner')"
353
374
  />
354
375
  <ArrayListGrouped
355
376
  v-model="matches"
@@ -362,8 +383,10 @@ export default {
362
383
  class="rule mb-20"
363
384
  :value="props.row.value"
364
385
  :mode="mode"
386
+ :namespaces="namespaceChoices"
365
387
  :nodes="nodeChoices"
366
388
  :containers="containerChoices"
389
+ :is-cluster-flow="value.type === LOGGING.CLUSTER_FLOW"
367
390
  @remove="e=>removeMatch(props.row.i)"
368
391
  @input="e=>updateMatch(e,props.row.i)"
369
392
  />
@@ -394,7 +417,7 @@ export default {
394
417
  >
395
418
  <Banner
396
419
  v-if="value.type !== LOGGING.CLUSTER_FLOW"
397
- label="Output must reside in same namespace as the flow."
420
+ :label="t('logging.flow.outputs.sameNamespaceError')"
398
421
  color="info"
399
422
  />
400
423
  <LabeledSelect
@@ -457,7 +480,7 @@ export default {
457
480
  </CruResource>
458
481
  <Banner
459
482
  v-else
460
- label="This resource contains a match configuration that the form editor does not support. Please use YAML edit."
483
+ :label="t('logging.flow.matches.unsupportedConfig')"
461
484
  color="error"
462
485
  />
463
486
  </template>
@@ -0,0 +1,107 @@
1
+ <script lang="ts">
2
+ import Vue, { PropType, VueConstructor } from 'vue';
3
+ import CreateEditView from '@shell/mixins/create-edit-view';
4
+ import CruResource from '@shell/components/CruResource.vue';
5
+ import PodSecurityAdmission from '@shell/components/PodSecurityAdmission.vue';
6
+ import Loading from '@shell/components/Loading.vue';
7
+ import NameNsDescription from '@shell/components/form/NameNsDescription.vue';
8
+ import { PSA, PSAConfig, PSADefaults, PSAExemptions } from '@shell/types/pod-security-admission';
9
+ import { PSADimensions } from '@shell/config/pod-security-admission';
10
+ import { MANAGEMENT } from '@shell/config/types';
11
+
12
+ export default (Vue as VueConstructor<Vue & InstanceType<typeof CreateEditView>>).extend({
13
+ mixins: [CreateEditView],
14
+ components: {
15
+ CruResource,
16
+ Loading,
17
+ NameNsDescription,
18
+ PodSecurityAdmission,
19
+ },
20
+
21
+ async fetch() {
22
+ await this.$store.dispatch('management/findAll', { type: MANAGEMENT.PSA });
23
+ },
24
+
25
+ props: {
26
+ value: {
27
+ type: Object as PropType<PSA>,
28
+ required: true,
29
+ default: () => ({}) as PSA
30
+ },
31
+
32
+ mode: {
33
+ type: String,
34
+ required: true,
35
+ }
36
+ },
37
+ computed: {
38
+ /**
39
+ * Get or initialize exemptions if none
40
+ */
41
+ exemptions(): PSAExemptions {
42
+ return this.value?.configuration?.exemptions || {};
43
+ },
44
+
45
+ /**
46
+ * Get or initialize defaults labels if none
47
+ */
48
+ defaults(): PSADefaults {
49
+ return this.value?.configuration?.defaults || {};
50
+ },
51
+ },
52
+
53
+ methods: {
54
+ /**
55
+ * Replace exemption with new values
56
+ */
57
+ setExemptions(exemptions: PSAExemptions) {
58
+ this.value.configuration.exemptions = exemptions;
59
+ },
60
+
61
+ /**
62
+ * Replace defaults with new values
63
+ */
64
+ setDefaults(labels: PSADefaults) {
65
+ this.value.configuration.defaults = labels;
66
+ },
67
+ },
68
+
69
+ created() {
70
+ // Initialize configuration if none, as default value resource case
71
+ if (!this.value.configuration) {
72
+ this.value.configuration = {
73
+ defaults: {},
74
+ exemptions: Object.assign({}, ...PSADimensions.map(dimension => ({ [dimension]: [] }))),
75
+ } as PSAConfig;
76
+ }
77
+ }
78
+ });
79
+ </script>
80
+
81
+ <template>
82
+ <Loading v-if="$fetchState.pending" />
83
+ <CruResource
84
+ v-else
85
+ :mode="mode"
86
+ :resource="value"
87
+ :errors="errors"
88
+ :cancel-event="true"
89
+ @error="setErrors"
90
+ @finish="save"
91
+ @cancel="done()"
92
+ >
93
+ <NameNsDescription
94
+ :value="value"
95
+ :namespaced="false"
96
+ :mode="mode"
97
+ />
98
+ <PodSecurityAdmission
99
+ :labels="defaults"
100
+ :labels-always-active="true"
101
+ :exemptions="exemptions"
102
+ :mode="mode"
103
+ @updateLabels="setDefaults($event)"
104
+ @updateExemptions="setExemptions($event)"
105
+ />
106
+ </CruResource>
107
+ </template>
@@ -16,7 +16,7 @@ import { NAME } from '@shell/config/product/explorer';
16
16
  import { PROJECT_ID, _VIEW, _CREATE, _EDIT } from '@shell/config/query-params';
17
17
  import ProjectMembershipEditor from '@shell/components/form/Members/ProjectMembershipEditor';
18
18
  import { canViewProjectMembershipEditor } from '@shell/components/form/Members/ProjectMembershipEditor.vue';
19
- import { HARVESTER_NAME as HARVESTER } from '@shell/config/product/harvester-manager';
19
+ import { HARVESTER_NAME as HARVESTER } from '@shell/config/features';
20
20
  import { Banner } from '@components/Banner';
21
21
 
22
22
  export default {
@@ -146,6 +146,13 @@ export default {
146
146
  } else if (this.mode === _EDIT) {
147
147
  if (this.canEditProject) {
148
148
  await this.value.save(true);
149
+
150
+ // We updated the Norman resource - re-fetch the Steve resource so we know it is definitely updated in the store
151
+ await this.$store.dispatch('management/find', {
152
+ type: MANAGEMENT.PROJECT,
153
+ id: this.value.id,
154
+ opt: { force: true }
155
+ });
149
156
  }
150
157
 
151
158
  // // we allow users with permissions for projectroletemplatebindings to be able to manage members on projects