@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
@@ -57,8 +57,11 @@ export default {
57
57
  // We map the setting rulesets to use values to define validation from factory
58
58
  return this.setting?.ruleSet ? mapValues(
59
59
  keyBy(this.setting.ruleSet, 'name'),
60
- ({ key, name, arg }) => {
61
- return formRulesGenerator(t, key ? { key } : {})[name](arg);
60
+ // The validation is curried and may require the factory argument for the ValidatorFactory
61
+ ({ key, name, factoryArg }) => {
62
+ const rule = formRulesGenerator(t, key ? { key } : {})[name];
63
+
64
+ return factoryArg ? rule(factoryArg) : rule;
62
65
  }) : {};
63
66
  }
64
67
  },
@@ -167,7 +167,13 @@ export default {
167
167
  normanUser._name = this.form.displayName;
168
168
  normanUser.mustChangePassword = this.form.password.userChangeOnLogin;
169
169
 
170
- return normanUser.save();
170
+ await normanUser.save();
171
+
172
+ return await this.$store.dispatch('management/find', {
173
+ type: MANAGEMENT.USER,
174
+ id: this.value.id,
175
+ opt: { force: true }
176
+ });
171
177
  },
172
178
 
173
179
  async updateRoles(userId) {
@@ -12,6 +12,7 @@ import CreateEditView from '@shell/mixins/create-edit-view';
12
12
  import jsyaml from 'js-yaml';
13
13
  import ButtonDropdown from '@shell/components/ButtonDropdown';
14
14
  import { _CREATE, _VIEW } from '@shell/config/query-params';
15
+ import FormValidation from '@shell/mixins/form-validation';
15
16
 
16
17
  export const RECEIVERS_TYPES = [
17
18
  {
@@ -100,7 +101,7 @@ export default {
100
101
  },
101
102
  },
102
103
 
103
- mixins: [CreateEditView],
104
+ mixins: [CreateEditView, FormValidation],
104
105
 
105
106
  data(props) {
106
107
  const currentReceiver = {};
@@ -144,14 +145,18 @@ export default {
144
145
  }
145
146
 
146
147
  return {
147
- create: _CREATE,
148
+ create: _CREATE,
148
149
  EDITOR_MODES,
149
150
  expectedFields,
150
- fileFound: false,
151
- receiverTypes: RECEIVERS_TYPES,
151
+ fileFound: false,
152
+ receiverTypes: RECEIVERS_TYPES,
152
153
  suffixYaml,
153
- view: _VIEW,
154
- yamlError: '',
154
+ view: _VIEW,
155
+ yamlError: '',
156
+ fvFormRuleSets: [
157
+ { path: 'name', rules: ['required', 'duplicateName'] }
158
+ ],
159
+ fvReportedValidationPaths: ['value']
155
160
  };
156
161
  },
157
162
 
@@ -178,7 +183,19 @@ export default {
178
183
  receiverNameDisabled() {
179
184
  return this.$route.query.mode === _VIEW;
180
185
  },
181
-
186
+ fvExtraRules() {
187
+ return {
188
+ duplicateName: () => {
189
+ const receiversArray = this.alertmanagerConfigResource.spec.receivers;
190
+ const receiverNamesArray = receiversArray.map(R => R.name);
191
+ const receiversSet = new Set(receiverNamesArray);
192
+
193
+ if (receiversArray.length !== receiversSet.size) {
194
+ return this.$store.getters['i18n/t']('monitoring.alerting.validation.duplicatedReceiverName', { name: this.value.name });
195
+ }
196
+ }
197
+ };
198
+ }
182
199
  },
183
200
 
184
201
  watch: {
@@ -235,6 +252,14 @@ export default {
235
252
  createAddOptions(receiverType) {
236
253
  return receiverType.addOptions.map();
237
254
  },
255
+
256
+ setError(err) {
257
+ if (!err) {
258
+ this.errors = [];
259
+ } else {
260
+ this.errors = [err];
261
+ }
262
+ }
238
263
  }
239
264
  };
240
265
  </script>
@@ -249,8 +274,9 @@ export default {
249
274
  :can-yaml="true"
250
275
  :errors="errors"
251
276
  :cancel-event="true"
277
+ :validation-passed="fvFormIsValid"
252
278
  @error="e=>errors = e"
253
- @finish="saveOverride()"
279
+ @finish="saveOverride"
254
280
  @cancel="redirectAfterCancel"
255
281
  >
256
282
  <div class="row mb-10">
@@ -259,7 +285,9 @@ export default {
259
285
  v-model="value.name"
260
286
  :is-disabled="receiverNameDisabled"
261
287
  :label="t('generic.name')"
288
+ :required="true"
262
289
  :mode="mode"
290
+ :rules="fvGetAndReportPathRules('name')"
263
291
  />
264
292
  </div>
265
293
  </div>
@@ -25,7 +25,7 @@ export default {
25
25
  },
26
26
  data() {
27
27
  this.$set(this.value, 'sendResolved', this.value.sendResolved || false);
28
- this.$set(this.value, 'requireTls', this.value.requireTls || false);
28
+ this.$set(this.value, 'requireTLS', this.value.requireTLS || false);
29
29
 
30
30
  return {
31
31
  view: _VIEW,
@@ -123,7 +123,7 @@ export default {
123
123
  </div>
124
124
  <div class="col span-6">
125
125
  <Checkbox
126
- v-model="value.requireTls"
126
+ v-model="value.requireTLS"
127
127
  :mode="mode"
128
128
  class="mt-20"
129
129
  label="Use TLS"
@@ -1,6 +1,5 @@
1
1
  <script>
2
2
  import has from 'lodash/has';
3
-
4
3
  import { Banner } from '@components/Banner';
5
4
  import { removeAt } from '@shell/utils/array';
6
5
  import { _VIEW } from '@shell/config/query-params';
@@ -34,8 +33,9 @@ export default {
34
33
  expr: '',
35
34
  for: '0s',
36
35
  labels: {
37
- severity: 'none',
38
- namespace: 'default'
36
+ severity: 'none',
37
+ namespace: 'default',
38
+ cluster_id: this.$store.getters['clusterId']
39
39
  },
40
40
  };
41
41
 
@@ -91,7 +91,15 @@ export default {
91
91
 
92
92
  switch (ruleType) {
93
93
  case 'record':
94
- value.push({ record: '', expr: '' });
94
+ value.push({
95
+ record: '',
96
+ expr: '',
97
+ labels: {
98
+ severity: 'none',
99
+ namespace: 'default',
100
+ cluster_id: this.$store.getters['clusterId']
101
+ },
102
+ });
95
103
  break;
96
104
  case 'alert':
97
105
  value.push(this.defaultAlert);
@@ -145,7 +153,7 @@ export default {
145
153
  class="btn role-link close btn-sm"
146
154
  @click="removeRule(props.i)"
147
155
  >
148
- <i class="icon icon-2x icon-x" />
156
+ <i class="icon icon-x" />
149
157
  </button>
150
158
  <span v-else />
151
159
  </template>
@@ -194,7 +202,7 @@ export default {
194
202
  class="btn role-link close btn-sm"
195
203
  @click="removeRule(props.i)"
196
204
  >
197
- <i class="icon icon-2x icon-x" />
205
+ <i class="icon icon-x" />
198
206
  </button>
199
207
  <span v-else />
200
208
  </template>
@@ -6,16 +6,17 @@ import LabeledSelect from '@shell/components/form/LabeledSelect';
6
6
  import { MANAGEMENT } from '@shell/config/types';
7
7
  import { CONTAINER_DEFAULT_RESOURCE_LIMIT, PROJECT } from '@shell/config/labels-annotations';
8
8
  import ContainerResourceLimit from '@shell/components/ContainerResourceLimit';
9
+ import PodSecurityAdmission from '@shell/components/PodSecurityAdmission';
9
10
  import Tabbed from '@shell/components/Tabbed';
10
11
  import Tab from '@shell/components/Tabbed/Tab';
11
12
  import CruResource from '@shell/components/CruResource';
12
- import Labels from '@shell/components/form/Labels';
13
13
  import { PROJECT_ID, _VIEW } from '@shell/config/query-params';
14
14
  import MoveModal from '@shell/components/MoveModal';
15
15
  import ResourceQuota from '@shell/components/form/ResourceQuota/Namespace';
16
16
  import Loading from '@shell/components/Loading';
17
17
  import { HARVESTER_TYPES, RANCHER_TYPES } from '@shell/components/form/ResourceQuota/shared';
18
- import { HARVESTER_NAME as HARVESTER } from '@shell/config/product/harvester-manager';
18
+ import { HARVESTER_NAME as HARVESTER } from '@shell/config/features';
19
+ import Labels from '@shell/components/form/Labels';
19
20
 
20
21
  export default {
21
22
  components: {
@@ -25,6 +26,7 @@ export default {
25
26
  Labels,
26
27
  Loading,
27
28
  NameNsDescription,
29
+ PodSecurityAdmission,
28
30
  ResourceQuota,
29
31
  Tab,
30
32
  Tabbed,
@@ -101,7 +103,8 @@ export default {
101
103
 
102
104
  showContainerResourceLimit() {
103
105
  return !this.isSingleHarvester;
104
- }
106
+ },
107
+
105
108
  },
106
109
 
107
110
  watch: {
@@ -222,7 +225,6 @@ export default {
222
225
  />
223
226
  </Tab>
224
227
  <Tab
225
- v-if="!isView"
226
228
  name="labels-and-annotations"
227
229
  label-key="generic.labelsAndAnnotations"
228
230
  :weight="-1"
@@ -234,6 +236,18 @@ export default {
234
236
  :display-side-by-side="false"
235
237
  />
236
238
  </Tab>
239
+ <Tab
240
+ name="pod-security-admission"
241
+ label-key="podSecurityAdmission.name"
242
+ :label="t('podSecurityAdmission.name')"
243
+ >
244
+ <PodSecurityAdmission
245
+ :labels="value.labels"
246
+ :mode="mode"
247
+ labels-prefix="pod-security.kubernetes.io/"
248
+ @updateLabels="value.setLabels($event)"
249
+ />
250
+ </Tab>
237
251
  </Tabbed>
238
252
  <MoveModal v-if="projects" />
239
253
  </CruResource>
@@ -102,6 +102,7 @@ export default {
102
102
  :value="hosts"
103
103
  :add-label="t('ingress.certificates.addHost')"
104
104
  :rules="rules.host"
105
+ :initial-empty-row="true"
105
106
  @input="onHostsInput"
106
107
  />
107
108
  </div>
@@ -37,12 +37,13 @@ export default {
37
37
  },
38
38
  methods: {
39
39
  update(e) {
40
- this.ingressClassName = e && typeof e === 'object' ? e.value : e;
41
-
42
- if (this.ingressClassName) {
43
- set(this.value, 'spec.ingressClassName', this.ingressClassName);
44
- } else {
40
+ if (!e || e.label === this.t('generic.none')) {
45
41
  remove(this.value, 'spec.ingressClassName');
42
+ this.ingressClassName = '';
43
+ } else {
44
+ // when a user manually types an ingress class name, the event emitted has a 'label' but no 'value'
45
+ this.ingressClassName = e.value ? e.value : e.label;
46
+ set(this.value, 'spec.ingressClassName', this.ingressClassName);
46
47
  }
47
48
  }
48
49
  }
@@ -53,11 +54,12 @@ export default {
53
54
  <LabeledSelect
54
55
  v-model="ingressClassName"
55
56
  :taggable="true"
57
+ :searchable="true"
56
58
  :mode="mode"
57
59
  :label="t('ingress.ingressClass.label')"
58
60
  :options="ingressClassOptions"
59
61
  option-label="label"
60
- @input="update"
62
+ @selecting="update"
61
63
  />
62
64
  </div>
63
65
  </template>
@@ -66,7 +66,11 @@ export default {
66
66
  return isValueAnOption ? null : 'warning';
67
67
  },
68
68
  serviceTargetTooltip() {
69
- return this.serviceTargetStatus === 'warning' ? this.t('ingress.rules.target.doesntExist') : null;
69
+ if (this.serviceTargetStatus === 'warning' ) {
70
+ return this.t('ingress.rules.target.doesntExist');
71
+ }
72
+
73
+ return this.t('ingress.rules.target.tooltip');
70
74
  },
71
75
  },
72
76
  created() {
@@ -178,17 +182,19 @@ export default {
178
182
  </div>
179
183
  </template>
180
184
  <style lang="scss" scoped>
185
+ $row-height: 40px;
186
+
181
187
  .labeled-input ::v-deep, ::v-deep .labeled-input {
182
188
  padding: 0 !important;
183
189
  height: 100%;
184
190
  input.no-label {
185
- height: calc($input-height - 2px);
191
+ height: calc($row-height - 2px);
186
192
  padding: 10px;
187
193
  }
188
194
  }
189
195
  .rule-path ::v-deep {
190
- .col {
191
- height: $input-height;
196
+ .col, INPUT {
197
+ height: $row-height;
192
198
  }
193
199
 
194
200
  .unlabeled-select {
@@ -202,7 +208,7 @@ export default {
202
208
  }
203
209
 
204
210
  &, .input-container {
205
- height: $input-height;
211
+ height: $row-height;
206
212
  }
207
213
 
208
214
  .input-container .in-input.unlabeled-select {
@@ -210,7 +216,7 @@ export default {
210
216
  }
211
217
 
212
218
  button {
213
- line-height: 40px;
219
+ line-height: $row-height;
214
220
  }
215
221
 
216
222
  .v-select INPUT {
@@ -44,11 +44,11 @@ export default {
44
44
  }
45
45
  },
46
46
  async fetch() {
47
- const ingressClassSchema = this.$store.getters[`cluster/schemaFor`](INGRESS_CLASS);
47
+ this.ingressClassSchema = this.$store.getters[`cluster/schemaFor`](INGRESS_CLASS);
48
48
  const hash = await allHash({
49
49
  secrets: this.$store.dispatch('cluster/findAll', { type: SECRET }),
50
50
  services: this.$store.dispatch('cluster/findAll', { type: SERVICE }),
51
- ingressClasses: ingressClassSchema ? this.$store.dispatch('cluster/findAll', { type: INGRESS_CLASS }) : Promise.resolve([]),
51
+ ingressClasses: this.ingressClassSchema ? this.$store.dispatch('cluster/findAll', { type: INGRESS_CLASS }) : Promise.resolve([]),
52
52
  });
53
53
 
54
54
  this.allServices = hash.services;
@@ -57,10 +57,11 @@ export default {
57
57
  },
58
58
  data() {
59
59
  return {
60
- allSecrets: [],
61
- allServices: [],
62
- allIngressClasses: [],
63
- fvFormRuleSets: [
60
+ ingressClassSchema: null,
61
+ allSecrets: [],
62
+ allServices: [],
63
+ allIngressClasses: [],
64
+ fvFormRuleSets: [
64
65
  {
65
66
  path: 'metadata.name', rules: ['required', 'hostname'], translationKey: 'nameNsDescription.name.label'
66
67
  },
@@ -197,6 +198,7 @@ export default {
197
198
  :subtypes="[]"
198
199
  :validation-passed="fvFormIsValid"
199
200
  :errors="fvUnreportedValidationErrors"
201
+ :description="t('ingress.description')"
200
202
  @error="e=>errors = e"
201
203
  @finish="save"
202
204
  @cancel="done"
@@ -16,7 +16,7 @@ import UnitInput from '@shell/components/form/UnitInput';
16
16
  import { NODE, PVC, STORAGE_CLASS } from '@shell/config/types';
17
17
  import Loading from '@shell/components/Loading';
18
18
  import { LONGHORN_PLUGIN, VOLUME_PLUGINS } from '@shell/models/persistentvolume';
19
- import { _CREATE, _VIEW, _EDIT } from '@shell/config/query-params';
19
+ import { _CREATE, _VIEW } from '@shell/config/query-params';
20
20
  import { clone } from '@shell/utils/object';
21
21
  import InfoBox from '@shell/components/InfoBox';
22
22
  import { mapFeature, UNSUPPORTED_STORAGE_DRIVERS } from '@shell/store/features';
@@ -44,7 +44,7 @@ export default {
44
44
  mixins: [CreateEditView, ResourceManager],
45
45
 
46
46
  fetch() {
47
- if (this.mode === _EDIT) {
47
+ if (this.mode !== _CREATE) {
48
48
  this.secondaryResourceData.namespace = this.value?.spec?.claimRef?.namespace || null;
49
49
 
50
50
  this.secondaryResourceData.data[PVC] = {
@@ -80,34 +80,13 @@ export default {
80
80
  const plugin = (foundPlugin || VOLUME_PLUGINS[0]).value;
81
81
 
82
82
  return {
83
- secondaryResourceData: {
84
- namespace: null,
85
- data: {
86
- [STORAGE_CLASS]: {
87
- applyTo: [
88
- {
89
- var: 'storageClassOptions',
90
- parsingFunc: (data) => {
91
- const storageClassOptions = data.map(s => ({
92
- label: s.metadata.name,
93
- value: s.metadata.name
94
- }));
95
-
96
- storageClassOptions.unshift(this.NONE_OPTION);
97
-
98
- return storageClassOptions;
99
- }
100
- }
101
- ]
102
- },
103
- }
104
- },
105
- storageClassOptions: [],
106
- currentClaim: null,
83
+ secondaryResourceData: this.secondaryResourceDataConfig(),
84
+ storageClassOptions: [],
85
+ currentClaim: null,
107
86
  plugin,
108
87
  NONE_OPTION,
109
88
  NODE,
110
- initialNodeAffinity: clone(this.value.spec.nodeAffinity),
89
+ initialNodeAffinity: clone(this.value.spec.nodeAffinity),
111
90
  };
112
91
  },
113
92
 
@@ -175,6 +154,30 @@ export default {
175
154
  },
176
155
 
177
156
  methods: {
157
+ secondaryResourceDataConfig() {
158
+ return {
159
+ namespace: null,
160
+ data: {
161
+ [STORAGE_CLASS]: {
162
+ applyTo: [
163
+ {
164
+ var: 'storageClassOptions',
165
+ parsingFunc: (data) => {
166
+ const storageClassOptions = data.map(s => ({
167
+ label: s.metadata.name,
168
+ value: s.metadata.name
169
+ }));
170
+
171
+ storageClassOptions.unshift(this.NONE_OPTION);
172
+
173
+ return storageClassOptions;
174
+ }
175
+ }
176
+ ]
177
+ },
178
+ }
179
+ };
180
+ },
178
181
  checkboxSetter(key, value) {
179
182
  if (value) {
180
183
  this.value.spec.accessModes.push(key);
@@ -42,47 +42,47 @@ export default {
42
42
  <div>
43
43
  <div class="row mb-20">
44
44
  <div class="col span-6">
45
- <LabeledInput
46
- v-model="value.spec.cephfs.path"
47
- :mode="mode"
48
- :label="t('persistentVolume.cephfs.path.label')"
49
- :placeholder="t('persistentVolume.cephfs.path.placeholder')"
45
+ <LabeledInput
46
+ v-model="value.spec.cephfs.path"
47
+ :mode="mode"
48
+ :label="t('persistentVolume.cephfs.path.label')"
49
+ :placeholder="t('persistentVolume.cephfs.path.placeholder')"
50
50
  />
51
51
  </div>
52
52
  <div class="col span-6">
53
- <LabeledInput
54
- v-model="value.spec.cephfs.user"
55
- :mode="mode"
56
- :label="t('persistentVolume.cephfs.user.label')"
57
- :placeholder="t('persistentVolume.cephfs.user.placeholder')"
53
+ <LabeledInput
54
+ v-model="value.spec.cephfs.user"
55
+ :mode="mode"
56
+ :label="t('persistentVolume.cephfs.user.label')"
57
+ :placeholder="t('persistentVolume.cephfs.user.placeholder')"
58
58
  />
59
59
  </div>
60
60
  </div>
61
61
  <div class="row mb-20">
62
62
  <div class="col span-6">
63
- <LabeledInput
64
- v-model="value.spec.cephfs.secretFile"
65
- :mode="mode"
66
- :label="t('persistentVolume.cephfs.secretFile.label')"
67
- :placeholder="t('persistentVolume.cephfs.secretFile.placeholder')"
63
+ <LabeledInput
64
+ v-model="value.spec.cephfs.secretFile"
65
+ :mode="mode"
66
+ :label="t('persistentVolume.cephfs.secretFile.label')"
67
+ :placeholder="t('persistentVolume.cephfs.secretFile.placeholder')"
68
68
  />
69
69
  </div>
70
70
  <div class="col span-6">
71
- <LabeledInput
72
- v-model="value.spec.cephfs.secretRef.name"
73
- :mode="mode"
74
- :label="t('persistentVolume.shared.secretName.label')"
75
- :placeholder="t('persistentVolume.shared.secretName.placeholder')"
71
+ <LabeledInput
72
+ v-model="value.spec.cephfs.secretRef.name"
73
+ :mode="mode"
74
+ :label="t('persistentVolume.shared.secretName.label')"
75
+ :placeholder="t('persistentVolume.shared.secretName.placeholder')"
76
76
  />
77
77
  </div>
78
78
  </div>
79
79
  <div class="row mb-20">
80
80
  <div class="col span-6">
81
- <LabeledInput
82
- v-model="value.spec.cephfs.secretRef.namespace"
83
- :mode="mode"
84
- :label="t('persistentVolume.shared.secretNamespace.label')"
85
- :placeholder="t('persistentVolume.shared.secretNamespace.placeholder')"
81
+ <LabeledInput
82
+ v-model="value.spec.cephfs.secretRef.namespace"
83
+ :mode="mode"
84
+ :label="t('persistentVolume.shared.secretNamespace.label')"
85
+ :placeholder="t('persistentVolume.shared.secretNamespace.placeholder')"
86
86
  />
87
87
  </div>
88
88
  </div>
@@ -98,10 +98,10 @@ export default {
98
98
  />
99
99
  </div>
100
100
  <div class="col span-6">
101
- <ArrayList
102
- v-model="value.spec.cephfs.monitors"
103
- :add-label="t('persistentVolume.shared.monitors.add')"
104
- :mode="mode"
101
+ <ArrayList
102
+ v-model="value.spec.cephfs.monitors"
103
+ :add-label="t('persistentVolume.shared.monitors.add')"
104
+ :mode="mode"
105
105
  />
106
106
  </div>
107
107
  </div>