@rancher/shell 0.1.1 → 0.1.3

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 (294) hide show
  1. package/assets/translations/en-us.yaml +33 -769
  2. package/assets/translations/zh-hans.yaml +153 -781
  3. package/components/ActionMenu.vue +3 -3
  4. package/components/CodeMirror.vue +6 -8
  5. package/components/CommunityLinks.vue +1 -1
  6. package/components/ContainerResourceLimit.vue +14 -0
  7. package/components/ExplorerMembers.vue +123 -0
  8. package/components/ExplorerProjectsNamespaces.vue +405 -0
  9. package/components/GrafanaDashboard.vue +17 -2
  10. package/components/LocaleSelector.vue +81 -0
  11. package/components/PromptModal.vue +2 -3
  12. package/components/ResourceList/index.vue +1 -1
  13. package/components/ResourceTable.vue +3 -6
  14. package/components/SingleClusterInfo.vue +1 -1
  15. package/components/SortableTable/index.vue +23 -20
  16. package/components/SortableTable/selection.js +1 -0
  17. package/components/auth/AzureWarning.vue +5 -1
  18. package/components/auth/Principal.vue +1 -1
  19. package/components/auth/RoleDetailEdit.vue +32 -12
  20. package/components/fleet/FleetRepos.vue +0 -2
  21. package/components/form/NameNsDescription.vue +4 -6
  22. package/components/form/NodeScheduling.vue +1 -1
  23. package/components/form/ResourceTabs/index.vue +27 -18
  24. package/components/form/WorkloadPorts.vue +1 -1
  25. package/components/formatter/ClusterLink.vue +13 -0
  26. package/components/formatter/PodImages.vue +11 -1
  27. package/components/formatter/RKETemplateName.vue +37 -0
  28. package/components/formatter/WorkloadHealthScale.vue +1 -1
  29. package/components/nav/Header.vue +9 -9
  30. package/components/nav/NamespaceFilter.vue +7 -4
  31. package/components/nav/TopLevelMenu.vue +6 -43
  32. package/components/nav/WindowManager/ContainerLogs.vue +1 -1
  33. package/config/product/harvester-manager.js +64 -2
  34. package/config/product/manager.js +9 -0
  35. package/config/settings.js +17 -71
  36. package/config/table-headers.js +0 -1
  37. package/config/types.js +8 -26
  38. package/core/plugin-routes.ts +34 -22
  39. package/core/plugin.ts +15 -3
  40. package/core/plugins-loader.js +2 -0
  41. package/core/plugins.js +79 -36
  42. package/core/types.ts +7 -1
  43. package/creators/app/tsconfig.json +6 -1
  44. package/creators/pkg/init +3 -0
  45. package/creators/pkg/tsconfig.json +7 -2
  46. package/detail/provisioning.cattle.io.cluster.vue +23 -0
  47. package/detail/workload/index.vue +11 -5
  48. package/{components/dialog → dialog}/AddClusterMemberDialog.vue +0 -0
  49. package/{components/dialog → dialog}/AddCustomBadgeDialog.vue +0 -0
  50. package/{components/dialog → dialog}/AddProjectMemberDialog.vue +0 -0
  51. package/{components/dialog → dialog}/AddonConfigConfirmationDialog.vue +0 -0
  52. package/{components/dialog → dialog}/DrainNode.vue +0 -0
  53. package/{components/dialog → dialog}/ForceMachineRemoveDialog.vue +0 -0
  54. package/{components/dialog → dialog}/GenericPrompt.vue +0 -0
  55. package/{components/dialog → dialog}/RollbackWorkloadDialog.vue +0 -0
  56. package/{components/dialog → dialog}/RotateCertificatesDialog.vue +0 -0
  57. package/{components/dialog → dialog}/RotateEncryptionKeyDialog.vue +0 -0
  58. package/{components/dialog → dialog}/SaveAsRKETemplateDialog.vue +0 -0
  59. package/{components/dialog → dialog}/ScaleMachineDownDialog.vue +0 -0
  60. package/edit/auth/azuread.vue +20 -1
  61. package/edit/cloudcredential.vue +7 -1
  62. package/edit/management.cattle.io.project.vue +2 -2
  63. package/edit/namespace.vue +17 -10
  64. package/edit/networking.k8s.io.ingress/index.vue +2 -1
  65. package/edit/persistentvolumeclaim.vue +33 -2
  66. package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +1 -1
  67. package/edit/provisioning.cattle.io.cluster/MachinePool.vue +34 -6
  68. package/edit/provisioning.cattle.io.cluster/index.vue +1 -1
  69. package/edit/provisioning.cattle.io.cluster/rke2.vue +21 -6
  70. package/edit/service.vue +1 -1
  71. package/edit/workload/index.vue +363 -15
  72. package/edit/workload/mixins/workload.js +62 -7
  73. package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +1 -0
  74. package/layouts/default.vue +52 -27
  75. package/layouts/error.vue +5 -1
  76. package/layouts/home.vue +6 -2
  77. package/list/harvesterhci.io.management.cluster.vue +74 -33
  78. package/list/namespace.vue +3 -5
  79. package/list/provisioning.cattle.io.cluster.vue +6 -0
  80. package/machine-config/amazonec2.vue +2 -0
  81. package/machine-config/harvester.vue +96 -49
  82. package/middleware/authenticated.js +56 -52
  83. package/mixins/brand.js +3 -4
  84. package/mixins/create-edit-view/impl.js +0 -8
  85. package/mixins/form-validation.js +1 -1
  86. package/mixins/resource-fetch.js +3 -1
  87. package/models/chart.js +1 -1
  88. package/models/cluster/node.js +12 -1
  89. package/models/fleet.cattle.io.bundle.js +26 -19
  90. package/models/harvesterhci.io.management.cluster.js +194 -5
  91. package/models/management.cattle.io.cluster.js +1 -1
  92. package/models/management.cattle.io.clusterroletemplatebinding.js +9 -0
  93. package/models/management.cattle.io.globalrole.js +0 -19
  94. package/models/management.cattle.io.project.js +23 -2
  95. package/models/management.cattle.io.roletemplate.js +2 -21
  96. package/models/namespace.js +19 -3
  97. package/models/pod.js +19 -2
  98. package/models/provisioning.cattle.io.cluster.js +71 -0
  99. package/models/service.js +5 -1
  100. package/models/workload.js +4 -243
  101. package/models/workload.service.js +314 -0
  102. package/nuxt.config.js +14 -12
  103. package/package.json +3 -3
  104. package/pages/auth/login.vue +11 -2
  105. package/pages/auth/setup.vue +1 -1
  106. package/pages/c/_cluster/_product/members/index.vue +3 -93
  107. package/pages/c/_cluster/_product/projectsnamespaces.vue +6 -403
  108. package/pages/c/_cluster/apps/charts/install.vue +0 -6
  109. package/pages/c/_cluster/settings/performance.vue +19 -16
  110. package/pages/fail-whale.vue +1 -10
  111. package/pages/index.vue +18 -4
  112. package/pages/plugins.vue +2 -2
  113. package/pages/prefs.vue +8 -6
  114. package/pkg/auto-import.js +44 -7
  115. package/pkg/dynamic-plugin-loader.js +28 -0
  116. package/pkg/import.js +2 -2
  117. package/pkg/model-loader-require.lib.js +3 -0
  118. package/pkg/vue.config.js +9 -6
  119. package/plugins/console.js +10 -5
  120. package/plugins/dashboard-store/actions.js +8 -3
  121. package/plugins/dashboard-store/getters.js +7 -2
  122. package/plugins/dashboard-store/model-loader-require.js +12 -0
  123. package/plugins/dashboard-store/model-loader.js +4 -1
  124. package/plugins/dashboard-store/resource-class.js +10 -3
  125. package/plugins/steve/actions.js +1 -1
  126. package/plugins/steve/index.js +6 -4
  127. package/plugins/steve/steve-description-class.js +32 -0
  128. package/plugins/steve/subscribe.js +34 -23
  129. package/rancher-components/Banner/Banner.vue +2 -2
  130. package/rancher-components/Form/Checkbox/Checkbox.test.ts +77 -0
  131. package/rancher-components/Form/Checkbox/Checkbox.vue +12 -2
  132. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +0 -2
  133. package/rancher-components/Form/LabeledInput/LabeledInput.vue +2 -0
  134. package/rancher-components/Form/Radio/RadioButton.vue +14 -1
  135. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.test.ts +107 -0
  136. package/{components/form → rancher-components/Form/ToggleSwitch}/ToggleSwitch.vue +18 -8
  137. package/rancher-components/Form/ToggleSwitch/index.ts +1 -0
  138. package/rancher-components/Form/index.ts +1 -0
  139. package/scripts/build-pkg.sh +48 -2
  140. package/scripts/drone-build-pkg.sh +31 -0
  141. package/scripts/publish-shell.sh +10 -11
  142. package/scripts/serve-pkgs +17 -10
  143. package/scripts/test-plugins-build.sh +18 -1
  144. package/store/catalog.js +3 -1
  145. package/store/i18n.js +16 -11
  146. package/store/index.js +4 -181
  147. package/store/prefs.js +30 -2
  148. package/store/type-map.js +16 -29
  149. package/types/{index.d.ts → rancher/index.d.ts} +0 -0
  150. package/utils/cluster.js +1 -1
  151. package/utils/custom-validators.js +1 -12
  152. package/utils/dynamic-importer.js +1 -1
  153. package/utils/validators/setting.js +0 -35
  154. package/components/FilterLabel.vue +0 -254
  155. package/components/HarvesterUpgradeProgressBarList.vue +0 -109
  156. package/components/VMConsoleBar.vue +0 -87
  157. package/components/dialog/harvester/AddHotplugModal.vue +0 -159
  158. package/components/dialog/harvester/BackupModal.vue +0 -117
  159. package/components/dialog/harvester/CloneTemplate.vue +0 -125
  160. package/components/dialog/harvester/EjectCDROMDialog.vue +0 -157
  161. package/components/dialog/harvester/ExportImageDialog.vue +0 -152
  162. package/components/dialog/harvester/MaintenanceDialog.vue +0 -94
  163. package/components/dialog/harvester/MigrationDialog.vue +0 -154
  164. package/components/dialog/harvester/RestoreDialog.vue +0 -153
  165. package/components/dialog/harvester/SupportBundle.vue +0 -217
  166. package/components/dialog/harvester/UnplugVolume.vue +0 -108
  167. package/components/form/SerialConsole/index.vue +0 -267
  168. package/components/formatter/AttachVMWithName.vue +0 -46
  169. package/components/formatter/CloudInitType.vue +0 -27
  170. package/components/formatter/HarvesterBackupTargetValidation.vue +0 -43
  171. package/components/formatter/HarvesterCPUUsed.vue +0 -122
  172. package/components/formatter/HarvesterDiskState.vue +0 -66
  173. package/components/formatter/HarvesterHostName.vue +0 -66
  174. package/components/formatter/HarvesterIpAddress.vue +0 -90
  175. package/components/formatter/HarvesterMemoryUsed.vue +0 -140
  176. package/components/formatter/HarvesterMigrationState.vue +0 -85
  177. package/components/formatter/HarvesterNodeName.vue +0 -49
  178. package/components/formatter/HarvesterStorageUsed.vue +0 -194
  179. package/components/formatter/HarvesterVmState.vue +0 -123
  180. package/components/nav/HarvesterUpgrade.vue +0 -232
  181. package/components/novnc/NovncConsole.vue +0 -93
  182. package/components/novnc/NovncConsoleItem.vue +0 -89
  183. package/components/novnc/NovncConsoleWrapper.vue +0 -243
  184. package/config/harvester-map.js +0 -44
  185. package/config/harvester-table-headers.js +0 -27
  186. package/config/product/harvester.js +0 -305
  187. package/detail/harvesterhci.io.host/HarvesterHostBasic.vue +0 -364
  188. package/detail/harvesterhci.io.host/HarvesterHostDisk.vue +0 -200
  189. package/detail/harvesterhci.io.host/HarvesterHostNetwork.vue +0 -89
  190. package/detail/harvesterhci.io.host/VirtualMachineInstance.vue +0 -134
  191. package/detail/harvesterhci.io.host/index.vue +0 -243
  192. package/detail/harvesterhci.io.virtualmachinebackup/index.vue +0 -221
  193. package/detail/harvesterhci.io.virtualmachineimage.vue +0 -118
  194. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineBasics.vue +0 -279
  195. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineEvents.vue +0 -75
  196. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineKeypairs.vue +0 -114
  197. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineMigration.vue +0 -79
  198. package/detail/kubevirt.io.virtualmachine/index.vue +0 -213
  199. package/edit/harvesterhci.io.cloudtemplate.vue +0 -123
  200. package/edit/harvesterhci.io.host/HarvesterDisk.vue +0 -262
  201. package/edit/harvesterhci.io.host/index.vue +0 -533
  202. package/edit/harvesterhci.io.keypair.vue +0 -112
  203. package/edit/harvesterhci.io.managedchart/index.vue +0 -25
  204. package/edit/harvesterhci.io.managedchart/rancher-monitoring.vue +0 -172
  205. package/edit/harvesterhci.io.networkattachmentdefinition.vue +0 -210
  206. package/edit/harvesterhci.io.setting/additional-ca.vue +0 -36
  207. package/edit/harvesterhci.io.setting/backup-target.vue +0 -182
  208. package/edit/harvesterhci.io.setting/http-proxy.vue +0 -79
  209. package/edit/harvesterhci.io.setting/index.vue +0 -201
  210. package/edit/harvesterhci.io.setting/overcommit-config.vue +0 -94
  211. package/edit/harvesterhci.io.setting/ssl-certificates.vue +0 -117
  212. package/edit/harvesterhci.io.setting/ssl-parameters.vue +0 -161
  213. package/edit/harvesterhci.io.setting/support-bundle-image.vue +0 -134
  214. package/edit/harvesterhci.io.setting/support-bundle-namespaces.vue +0 -73
  215. package/edit/harvesterhci.io.setting/vip-pools.vue +0 -244
  216. package/edit/harvesterhci.io.setting/vm-force-reset-policy.vue +0 -81
  217. package/edit/harvesterhci.io.virtualmachinebackup.vue +0 -256
  218. package/edit/harvesterhci.io.virtualmachineimage.vue +0 -364
  219. package/edit/harvesterhci.io.virtualmachinetemplateversion.vue +0 -340
  220. package/edit/harvesterhci.io.volume.vue +0 -195
  221. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/AccessCredentialsUsers.vue +0 -190
  222. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/index.vue +0 -212
  223. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/type/basicAuth.vue +0 -94
  224. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/type/sshkey.vue +0 -85
  225. package/edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig/DataTemplate.vue +0 -153
  226. package/edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig/index.vue +0 -279
  227. package/edit/kubevirt.io.virtualmachine/VirtualMachineCpuMemory.vue +0 -113
  228. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/__tests__/HarvesterEditNetwork.test.ts +0 -41
  229. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/base.vue +0 -281
  230. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/index.vue +0 -142
  231. package/edit/kubevirt.io.virtualmachine/VirtualMachineReserved.vue +0 -54
  232. package/edit/kubevirt.io.virtualmachine/VirtualMachineSSHKey.vue +0 -256
  233. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/index.vue +0 -391
  234. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditContainer.test.ts +0 -40
  235. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditExisting.test.ts +0 -102
  236. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditVMImage.test.ts +0 -117
  237. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditVolume.test.ts +0 -74
  238. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/container.vue +0 -132
  239. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/existing.vue +0 -303
  240. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/vmImage.vue +0 -285
  241. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/volume.vue +0 -188
  242. package/edit/kubevirt.io.virtualmachine/index.vue +0 -642
  243. package/edit/network.harvesterhci.io.clusternetwork/index.vue +0 -19
  244. package/edit/network.harvesterhci.io.clusternetwork/vlan.vue +0 -134
  245. package/edit/workload/types/Deployment.vue +0 -377
  246. package/edit/workload/types/Generic.vue +0 -295
  247. package/list/harvesterhci.io.cloudtemplate.vue +0 -78
  248. package/list/harvesterhci.io.dashboard/HarvesterUpgrade.vue +0 -211
  249. package/list/harvesterhci.io.dashboard/UpgradeInfo.vue +0 -40
  250. package/list/harvesterhci.io.dashboard/index.vue +0 -752
  251. package/list/harvesterhci.io.host/index.vue +0 -186
  252. package/list/harvesterhci.io.networkattachmentdefinition.vue +0 -167
  253. package/list/harvesterhci.io.setting.vue +0 -241
  254. package/list/harvesterhci.io.virtualmachinebackup.vue +0 -172
  255. package/list/harvesterhci.io.virtualmachineimage.vue +0 -80
  256. package/list/harvesterhci.io.virtualmachinetemplateversion.vue +0 -173
  257. package/list/harvesterhci.io.volume.vue +0 -122
  258. package/list/kubevirt.io.virtualmachine.vue +0 -193
  259. package/mixins/harvester-vm/impl.js +0 -267
  260. package/mixins/harvester-vm/index.js +0 -1357
  261. package/models/harvester/configmap.js +0 -32
  262. package/models/harvester/harvesterhci.io.blockdevice.js +0 -55
  263. package/models/harvester/harvesterhci.io.keypair.js +0 -12
  264. package/models/harvester/harvesterhci.io.setting.js +0 -127
  265. package/models/harvester/harvesterhci.io.supportbundle.js +0 -35
  266. package/models/harvester/harvesterhci.io.upgrade.js +0 -226
  267. package/models/harvester/harvesterhci.io.virtualmachinebackup.js +0 -116
  268. package/models/harvester/harvesterhci.io.virtualmachineimage.js +0 -255
  269. package/models/harvester/harvesterhci.io.virtualmachinerestore.js +0 -43
  270. package/models/harvester/harvesterhci.io.virtualmachinetemplate.js +0 -69
  271. package/models/harvester/harvesterhci.io.virtualmachinetemplateversion.js +0 -227
  272. package/models/harvester/k8s.cni.cncf.io.networkattachmentdefinition.js +0 -32
  273. package/models/harvester/kubevirt.io.virtualmachine.js +0 -850
  274. package/models/harvester/kubevirt.io.virtualmachineinstance.js +0 -142
  275. package/models/harvester/management.cattle.io.managedchart.js +0 -191
  276. package/models/harvester/management.cattle.io.setting.js +0 -40
  277. package/models/harvester/network.harvesterhci.io.clusternetwork.js +0 -100
  278. package/models/harvester/network.harvesterhci.io.nodenetwork.js +0 -34
  279. package/models/harvester/node.js +0 -255
  280. package/models/harvester/persistentvolumeclaim.js +0 -166
  281. package/models/harvester/pod.js +0 -185
  282. package/pages/c/_cluster/harvester/airgapupgrade/index.vue +0 -309
  283. package/pages/c/_cluster/harvester/console/_uid/serial.vue +0 -51
  284. package/pages/c/_cluster/harvester/console/_uid/vnc.vue +0 -52
  285. package/pages/c/_cluster/harvester/index.vue +0 -24
  286. package/pages/c/_cluster/harvester/support/index.vue +0 -154
  287. package/pkg/model-loader.lib.js +0 -3
  288. package/plugins/lookup.js +0 -50
  289. package/promptRemove/kubevirt.io.virtualmachine.vue +0 -164
  290. package/store/harvester-common.js +0 -126
  291. package/utils/validators/vm-datavolumes.js +0 -38
  292. package/utils/validators/vm-image.js +0 -32
  293. package/utils/validators/vm.js +0 -221
  294. package/yarn-error.log +0 -196
@@ -15,7 +15,7 @@ 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 { NAME as HARVESTER } from '@shell/config/product/harvester';
18
+ import { HARVESTER_NAME as HARVESTER } from '@shell/config/product/harvester-manager';
19
19
 
20
20
  export default {
21
21
  components: {
@@ -34,9 +34,11 @@ export default {
34
34
  mixins: [CreateEditView],
35
35
 
36
36
  async fetch() {
37
- this.projects = await this.$store.dispatch('management/findAll', { type: MANAGEMENT.PROJECT });
37
+ if (this.$store.getters['management/schemaFor'](MANAGEMENT.PROJECT)) {
38
+ this.projects = await this.$store.dispatch('management/findAll', { type: MANAGEMENT.PROJECT });
38
39
 
39
- this.project = this.projects.find(p => p.id.includes(this.projectName));
40
+ this.project = this.projects.find(p => p.id.includes(this.projectName));
41
+ }
40
42
  },
41
43
 
42
44
  data() {
@@ -62,8 +64,9 @@ export default {
62
64
 
63
65
  computed: {
64
66
  ...mapGetters(['isSingleProduct']),
65
- isHarvester() {
66
- return this.$store.getters['currentProduct'].inStore === HARVESTER;
67
+
68
+ isSingleHarvester() {
69
+ return this.$store.getters['currentProduct'].inStore === HARVESTER && this.isSingleProduct;
67
70
  },
68
71
 
69
72
  projectOpts() {
@@ -93,7 +96,11 @@ export default {
93
96
  },
94
97
 
95
98
  showResourceQuota() {
96
- return Object.keys(this.project?.spec?.resourceQuota?.limit || {}).length > 0;
99
+ return !this.isSingleHarvester && Object.keys(this.project?.spec?.resourceQuota?.limit || {}).length > 0;
100
+ },
101
+
102
+ showContainerResourceLimit() {
103
+ return !this.isSingleHarvester;
97
104
  }
98
105
  },
99
106
 
@@ -160,13 +167,13 @@ export default {
160
167
  :namespaced="false"
161
168
  :mode="mode"
162
169
  >
163
- <template v-if="!isSingleProduct" #project-col>
170
+ <template v-if="project" #project-col>
164
171
  <LabeledSelect v-model="projectName" :label="t('namespace.project.label')" :options="projectOpts" />
165
172
  </template>
166
173
  </NameNsDescription>
167
174
 
168
175
  <Tabbed :side-tabs="true">
169
- <Tab v-if="!isSingleProduct && showResourceQuota" :weight="1" name="container-resource-quotas" :label="t('namespace.resourceQuotas')">
176
+ <Tab v-if="showResourceQuota" :weight="1" name="container-resource-quotas" :label="t('namespace.resourceQuotas')">
170
177
  <div class="row">
171
178
  <div class="col span-12">
172
179
  <p class="helper-text mb-10">
@@ -177,7 +184,7 @@ export default {
177
184
  </div>
178
185
  <ResourceQuota v-model="value" :mode="mode" :project="project" :types="isHarvester ? HARVESTER_TYPES : RANCHER_TYPES" />
179
186
  </Tab>
180
- <Tab v-if="!isSingleProduct" :weight="0" name="container-resource-limit" :label="t('namespace.containerResourceLimit')">
187
+ <Tab v-if="showContainerResourceLimit" :weight="0" name="container-resource-limit" :label="t('namespace.containerResourceLimit')">
181
188
  <ContainerResourceLimit
182
189
  :key="JSON.stringify(containerResourceLimits)"
183
190
  :value="containerResourceLimits"
@@ -200,6 +207,6 @@ export default {
200
207
  />
201
208
  </Tab>
202
209
  </Tabbed>
203
- <MoveModal />
210
+ <MoveModal v-if="projects" />
204
211
  </CruResource>
205
212
  </template>
@@ -44,10 +44,11 @@ export default {
44
44
  }
45
45
  },
46
46
  async fetch() {
47
+ const ingressClassSchema = this.$store.getters[`cluster/schemaFor`](INGRESS_CLASS);
47
48
  const hash = await allHash({
48
49
  secrets: this.$store.dispatch('cluster/findAll', { type: SECRET }),
49
50
  services: this.$store.dispatch('cluster/findAll', { type: SERVICE }),
50
- ingressClasses: this.$store.dispatch('cluster/findAll', { type: INGRESS_CLASS }),
51
+ ingressClasses: ingressClassSchema ? this.$store.dispatch('cluster/findAll', { type: INGRESS_CLASS }) : Promise.resolve([]),
51
52
  });
52
53
 
53
54
  this.allServices = hash.services;
@@ -5,6 +5,7 @@ import CruResource from '@shell/components/CruResource';
5
5
  import NameNsDescription from '@shell/components/form/NameNsDescription';
6
6
  import Tab from '@shell/components/Tabbed/Tab';
7
7
  import { RadioGroup } from '@components/Form/Radio';
8
+ import LabeledInput from '@components/Form/LabeledInput/LabeledInput.vue';
8
9
  import LabeledSelect from '@shell/components/form/LabeledSelect';
9
10
  import UnitInput from '@shell/components/form/UnitInput';
10
11
  import uniq from 'lodash/uniq';
@@ -24,6 +25,7 @@ export default {
24
25
  Banner,
25
26
  Checkbox,
26
27
  CruResource,
28
+ LabeledInput,
27
29
  LabeledSelect,
28
30
  Labels,
29
31
  NameNsDescription,
@@ -38,7 +40,9 @@ export default {
38
40
  async fetch() {
39
41
  const storageClasses = await this.$store.dispatch('cluster/findAll', { type: STORAGE_CLASS });
40
42
 
41
- this.persistentVolumes = await this.$store.dispatch('cluster/findAll', { type: PV });
43
+ if (this.$store.getters['management/canList'](PV)) {
44
+ this.persistentVolumes = await this.$store.dispatch('cluster/findAll', { type: PV });
45
+ }
42
46
 
43
47
  this.storageClassOptions = storageClasses.map(s => s.name).sort();
44
48
  this.storageClassOptions.unshift(this.t('persistentVolumeClaim.useDefault'));
@@ -55,6 +59,8 @@ export default {
55
59
  this.$set(this.value.spec, 'storageClassName', this.value.spec.storageClassName || this.storageClassOptions[0]);
56
60
  },
57
61
  data() {
62
+ const canListPersistentVolumes = this.$store.getters['management/canList'](PV);
63
+ const canListStorageClasses = this.$store.getters['management/canList'](STORAGE_CLASS);
58
64
  const sourceOptions = [
59
65
  {
60
66
  label: this.t('persistentVolumeClaim.source.options.new'),
@@ -65,6 +71,7 @@ export default {
65
71
  value: 'existing'
66
72
  }
67
73
  ];
74
+
68
75
  const defaultAccessModes = ['ReadWriteOnce'];
69
76
 
70
77
  this.$set(this.value, 'spec', this.value.spec || {});
@@ -85,6 +92,8 @@ export default {
85
92
  persistentVolumes: [],
86
93
  storageClassOptions: [],
87
94
  defaultTab,
95
+ canListPersistentVolumes,
96
+ canListStorageClasses,
88
97
  };
89
98
  },
90
99
  computed: {
@@ -216,16 +225,37 @@ export default {
216
225
  <div class="col span-6">
217
226
  <div class="row">
218
227
  <div v-if="source === 'new'" class="col span-12">
219
- <LabeledSelect v-model="value.spec.storageClassName" :options="storageClassOptions" :label="t('persistentVolumeClaim.volumeClaim.storageClass')" :mode="immutableMode" />
228
+ <LabeledSelect
229
+ v-if="canListStorageClasses"
230
+ v-model="value.spec.storageClassName"
231
+ :options="storageClassOptions"
232
+ :label="t('persistentVolumeClaim.volumeClaim.storageClass')"
233
+ :mode="immutableMode"
234
+ />
235
+ <LabeledInput
236
+ v-else
237
+ v-model="value.spec.storageClassName"
238
+ :label="t('persistentVolumeClaim.volumeClaim.storageClass')"
239
+ :mode="immutableMode"
240
+ :tooltip="t('persistentVolumeClaim.volumeClaim.tooltips.noStorageClass')"
241
+ />
220
242
  </div>
221
243
  <div v-else class="col span-12">
222
244
  <LabeledSelect
245
+ v-if="canListPersistentVolumes"
223
246
  v-model="persistentVolume"
224
247
  :options="persistentVolumeOptions"
225
248
  :label="t('persistentVolumeClaim.volumeClaim.persistentVolume')"
226
249
  :selectable="isPersistentVolumeSelectable"
227
250
  :mode="immutableMode"
228
251
  />
252
+ <LabeledInput
253
+ v-else
254
+ v-model="persistentVolume"
255
+ :label="t('persistentVolumeClaim.volumeClaim.persistentVolume')"
256
+ :mode="immutableMode"
257
+ :tooltip="t('persistentVolumeClaim.volumeClaim.tooltips.noPersistentVolume')"
258
+ />
229
259
  </div>
230
260
  </div>
231
261
  <div class="row">
@@ -239,6 +269,7 @@ export default {
239
269
  :output-modifier="true"
240
270
  :increment="1024"
241
271
  :min="1"
272
+ :required="true"
242
273
  />
243
274
  <Banner v-if="isEdit && !value.expandable" color="info" class="mt-10">
244
275
  {{ t('persistentVolumeClaim.expand.notSupported') }}
@@ -71,7 +71,7 @@ export default {
71
71
  const e = sanitizeValue(t.effect);
72
72
 
73
73
  if ( k && v && e ) {
74
- out.push(`--taint ${ k }=${ v }:${ e }`);
74
+ out.push(`--taints ${ k }=${ v }:${ e }`);
75
75
  }
76
76
  }
77
77
 
@@ -1,5 +1,4 @@
1
1
  <script>
2
-
3
2
  import { LabeledInput } from '@components/Form/LabeledInput';
4
3
  import { Checkbox } from '@components/Form/Checkbox';
5
4
  import { _EDIT } from '@shell/config/query-params';
@@ -64,11 +63,40 @@ export default {
64
63
 
65
64
  data() {
66
65
  const parseDuration = (duration) => {
67
- // The back end stores the timeout in Duration format, for example, "10m".
68
- // Here we convert that string to an integer.
69
- const numberString = duration.split('m')[0];
66
+ // The back end stores the timeout in Duration format, for example, "42d31h10m30s".
67
+ // Here we convert that string to an integer and return the duration as seconds.
68
+ const splitStr = duration.split(/([a-z])/);
69
+
70
+ const durationsAsSeconds = splitStr.reduce((old, neu, idx) => {
71
+ const parsed = parseInt(neu);
72
+
73
+ if ( isNaN(parsed) ) {
74
+ return old;
75
+ }
76
+
77
+ const interval = splitStr[(idx + 1)];
78
+
79
+ switch (interval) {
80
+ case 'd':
81
+ old.push(parsed * 24 * 60 * 60);
82
+ break;
83
+ case 'h':
84
+ old.push(parsed * 60 * 60);
85
+ break;
86
+ case 'm':
87
+ old.push(parsed * 60);
88
+ break;
89
+ case 's':
90
+ old.push(parsed);
91
+ break;
92
+ default:
93
+ break;
94
+ }
95
+
96
+ return old;
97
+ }, []);
70
98
 
71
- return parseInt(numberString, 10);
99
+ return durationsAsSeconds.reduce((old, neu) => old + neu);
72
100
  };
73
101
 
74
102
  return {
@@ -210,7 +238,7 @@ export default {
210
238
  :mode="mode"
211
239
  :output-modifier="true"
212
240
  :base-unit="t('cluster.machinePool.autoReplace.unit')"
213
- @input="value.pool.unhealthyNodeTimeout = `${unhealthyNodeTimeoutInteger}m`"
241
+ @input="value.pool.unhealthyNodeTimeout = `${unhealthyNodeTimeoutInteger}s`"
214
242
  />
215
243
  </div>
216
244
  <div class="col span-4">
@@ -4,7 +4,7 @@ import Loading from '@shell/components/Loading';
4
4
  import CruResource from '@shell/components/CruResource';
5
5
  import SelectIconGrid from '@shell/components/SelectIconGrid';
6
6
  import EmberPage from '@shell/components/EmberPage';
7
- import ToggleSwitch from '@shell/components/form/ToggleSwitch';
7
+ import { ToggleSwitch } from '@components/Form/ToggleSwitch';
8
8
  import {
9
9
  CHART, FROM_CLUSTER, SUB_TYPE, _EDIT, _IMPORT, _CONFIG, _VIEW
10
10
  } from '@shell/config/query-params';
@@ -249,10 +249,6 @@ export default {
249
249
  set(this.value.spec, 'defaultPodSecurityPolicyTemplateName', '');
250
250
  }
251
251
 
252
- if (this.isHarvesterDriver && this.mode === _CREATE && this.agentConfig['cloud-provider-name'] === undefined) {
253
- this.agentConfig['cloud-provider-name'] = HARVESTER;
254
- }
255
-
256
252
  await this.initAddons();
257
253
  await this.initRegistry();
258
254
 
@@ -501,11 +497,17 @@ export default {
501
497
  // If we have a preferred provider... only show default, preferred and external
502
498
  const isPreferred = opt === preferred;
503
499
  const isExternal = opt === 'external';
500
+ let disabled = false;
501
+
502
+ if (this.isHarvesterExternalCredential && isPreferred) {
503
+ disabled = true;
504
+ }
504
505
 
505
506
  if (showAllOptions || isPreferred || isExternal) {
506
507
  out.push({
507
508
  label: this.$store.getters['i18n/withFallback'](`cluster.cloudProvider."${ opt }".label`, null, opt),
508
509
  value: opt,
510
+ disabled,
509
511
  });
510
512
  }
511
513
  }
@@ -843,7 +845,11 @@ export default {
843
845
 
844
846
  showForm() {
845
847
  return !!this.credentialId || !this.needCredential;
846
- }
848
+ },
849
+
850
+ isHarvesterExternalCredential() {
851
+ return this.credential?.harvestercredentialConfig?.clusterType === 'external';
852
+ },
847
853
  },
848
854
 
849
855
  watch: {
@@ -861,6 +867,7 @@ export default {
861
867
  credentialId(val) {
862
868
  if ( val ) {
863
869
  this.credential = this.$store.getters['rancher/byId'](NORMAN.CLOUD_CREDENTIAL, this.credentialId);
870
+ this.setHarvesterDefaultCloudProvider();
864
871
  } else {
865
872
  this.credential = null;
866
873
  }
@@ -1552,7 +1559,15 @@ export default {
1552
1559
  }
1553
1560
  });
1554
1561
  },
1555
- get
1562
+ get,
1563
+
1564
+ setHarvesterDefaultCloudProvider() {
1565
+ if (this.isHarvesterDriver && this.mode === _CREATE && this.agentConfig['cloud-provider-name'] === undefined && !this.isHarvesterExternalCredential) {
1566
+ this.agentConfig['cloud-provider-name'] = HARVESTER;
1567
+ } else {
1568
+ this.agentConfig['cloud-provider-name'] = '';
1569
+ }
1570
+ },
1556
1571
  },
1557
1572
  };
1558
1573
  </script>
package/edit/service.vue CHANGED
@@ -22,7 +22,7 @@ import HarvesterServiceAddOnConfig from '@shell/components/HarvesterServiceAddOn
22
22
  import { clone } from '@shell/utils/object';
23
23
  import { POD, CAPI } from '@shell/config/types';
24
24
  import { matching } from '@shell/utils/selector';
25
- import { NAME as HARVESTER } from '@shell/config/product/harvester';
25
+ import { HARVESTER_NAME as HARVESTER } from '@shell/config/product/harvester-manager';
26
26
  import { allHash } from '@shell/utils/promise';
27
27
  import { isHarvesterSatisfiesVersion } from '@shell/utils/cluster';
28
28
  import { Port } from '@shell/utils/validators/formRules';