@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
@@ -1,16 +1,13 @@
1
1
  import { findBy, insertAt } from '@shell/utils/array';
2
- import {
3
- TARGET_WORKLOADS, TIMESTAMP, UI_MANAGED, HCI as HCI_LABELS_ANNOTATIONS, CATTLE_PUBLIC_ENDPOINTS
4
- } from '@shell/config/labels-annotations';
2
+ import { TIMESTAMP, CATTLE_PUBLIC_ENDPOINTS } from '@shell/config/labels-annotations';
5
3
  import { WORKLOAD_TYPES, SERVICE, POD } from '@shell/config/types';
6
- import { clone, get, set } from '@shell/utils/object';
4
+ import { get, set } from '@shell/utils/object';
7
5
  import day from 'dayjs';
8
- import SteveModel from '@shell/plugins/steve/steve-class';
9
- import { shortenedImage } from '@shell/utils/string';
10
6
  import { convertSelectorObj, matching, matches } from '@shell/utils/selector';
11
7
  import { SEPARATOR } from '@shell/components/DetailTop';
8
+ import WorkloadService from '@shell/models/workload.service';
12
9
 
13
- export default class Workload extends SteveModel {
10
+ export default class Workload extends WorkloadService {
14
11
  // remove clone as yaml/edit as yaml until API supported
15
12
  get _availableActions() {
16
13
  let out = super._availableActions;
@@ -279,30 +276,6 @@ export default class Workload extends SteveModel {
279
276
  return out;
280
277
  }
281
278
 
282
- get containers() {
283
- if (this.type === WORKLOAD_TYPES.CRON_JOB) {
284
- // cronjob pod template is nested slightly different than other types
285
- const { spec: { jobTemplate: { spec: { template: { spec: { containers } } } } } } = this;
286
-
287
- return containers;
288
- }
289
- const { spec:{ template:{ spec:{ containers } } } } = this;
290
-
291
- return containers;
292
- }
293
-
294
- get initContainers() {
295
- if (this.type === WORKLOAD_TYPES.CRON_JOB) {
296
- // cronjob pod template is nested slightly different than other types
297
- const { spec: { jobTemplate: { spec: { template: { spec: { initContainers } } } } } } = this;
298
-
299
- return initContainers;
300
- }
301
- const { spec:{ template:{ spec:{ initContainers } } } } = this;
302
-
303
- return initContainers;
304
- }
305
-
306
279
  get endpoint() {
307
280
  return this?.metadata?.annotations[CATTLE_PUBLIC_ENDPOINTS];
308
281
  }
@@ -441,46 +414,6 @@ export default class Workload extends SteveModel {
441
414
  return out;
442
415
  }
443
416
 
444
- async getServicesOwned(force = false) {
445
- const normanTypes = {
446
- [WORKLOAD_TYPES.REPLICA_SET]: 'replicaSet',
447
- [WORKLOAD_TYPES.DEPLOYMENT]: 'deployment',
448
- [WORKLOAD_TYPES.STATEFUL_SET]: 'statefulSet',
449
- [WORKLOAD_TYPES.DAEMON_SET]: 'daemonSet'
450
- };
451
- const selectorKey = Object.keys(this.workloadSelector)[0];
452
-
453
- const normanSelectorValue =
454
- `${ normanTypes[this._type ? this._type : this.type] }-${
455
- this.metadata.namespace
456
- }-${ this.metadata.name }`;
457
-
458
- const steveSelectorValue = this.workloadSelector[selectorKey];
459
- const allSvc = await this.$dispatch('cluster/findAll', { type: SERVICE, opt: { force } }, { root: true });
460
-
461
- return (allSvc || []).filter(svc => (svc.spec?.selector || {})[selectorKey] === steveSelectorValue || (svc.spec?.selector || {})[selectorKey] === normanSelectorValue );
462
- }
463
-
464
- get imageNames() {
465
- let containers;
466
- const images = [];
467
-
468
- if (this.type === WORKLOAD_TYPES.CRON_JOB) {
469
- containers = get(this, 'spec.jobTemplate.spec.template.spec.containers');
470
- } else {
471
- containers = get(this, 'spec.template.spec.containers');
472
- }
473
- if (containers) {
474
- containers.forEach((container) => {
475
- if (!images.includes(container.image)) {
476
- images.push(container.image);
477
- }
478
- });
479
- }
480
-
481
- return images.map(shortenedImage);
482
- }
483
-
484
417
  redeploy() {
485
418
  const now = (new Date()).toISOString().replace(/\.\d+Z$/, 'Z');
486
419
 
@@ -496,14 +429,6 @@ export default class Workload extends SteveModel {
496
429
  this.save();
497
430
  }
498
431
 
499
- get workloadSelector() {
500
- return {
501
- 'workload.user.cattle.io/workloadselector': `${ this._type ? this._type : this.type }-${
502
- this.metadata.namespace
503
- }-${ this.metadata.name }`
504
- };
505
- }
506
-
507
432
  // match existing container ports with services created for this workload
508
433
  async getPortsWithServiceType() {
509
434
  const ports = [];
@@ -574,170 +499,6 @@ export default class Workload extends SteveModel {
574
499
  return ports;
575
500
  }
576
501
 
577
- // create clusterip, nodeport, loadbalancer services from container port spec
578
- async servicesFromContainerPorts(mode, ports) {
579
- const ownerRef = {
580
- apiVersion: this.apiVersion,
581
- controller: true,
582
- kind: this.kind,
583
- name: this.metadata.name,
584
- uid: this.metadata.uid
585
- };
586
-
587
- const annotations = { [TARGET_WORKLOADS]: JSON.stringify([`${ this.metadata.namespace }/${ this.metadata.name }`]), [UI_MANAGED]: 'true' };
588
-
589
- let clusterIP = {
590
- type: SERVICE,
591
- spec: {
592
- ports: [],
593
- selector: this.workloadSelector,
594
- type: 'ClusterIP'
595
- },
596
- metadata: {
597
- name: this.metadata.name,
598
- namespace: this.metadata.namespace,
599
- annotations,
600
- ownerReferences: [ownerRef]
601
- },
602
- };
603
-
604
- let nodePort = {
605
- type: SERVICE,
606
- spec: {
607
- ports: [],
608
- selector: this.workloadSelector,
609
- type: 'NodePort'
610
- },
611
- metadata: {
612
- name: `${ this.metadata.name }-nodeport`,
613
- namespace: this.metadata.namespace,
614
- annotations,
615
- ownerReferences: [ownerRef]
616
- },
617
- };
618
-
619
- let loadBalancer = {
620
- type: SERVICE,
621
- spec: {
622
- ports: [],
623
- selector: this.workloadSelector,
624
- type: 'LoadBalancer',
625
- externalTrafficPolicy: 'Cluster'
626
- },
627
- metadata: {
628
- name: `${ this.metadata.name }-loadbalancer`,
629
- namespace: this.metadata.namespace,
630
- annotations,
631
- ownerReferences: [ownerRef]
632
- },
633
- };
634
-
635
- const existing = await this.getServicesOwned(this.isFromNorman);
636
-
637
- if (existing && existing.length) {
638
- existing.forEach((service) => {
639
- switch (service.spec.type) {
640
- case 'ClusterIP':
641
- clusterIP = service;
642
- clusterIP.spec.ports = [];
643
- break;
644
- case 'NodePort':
645
- nodePort = service;
646
- nodePort.spec.ports = [];
647
- break;
648
- case 'LoadBalancer':
649
- loadBalancer = service;
650
- loadBalancer.spec.ports = [];
651
- break;
652
- default:
653
- break;
654
- }
655
- });
656
- }
657
- ports.forEach((port) => {
658
- const portSpec = {
659
- name: port.name, protocol: port.protocol, port: port.containerPort, targetPort: port.containerPort
660
- };
661
-
662
- if (port._serviceType !== '') {
663
- clusterIP.spec.ports.push(portSpec);
664
- switch (port._serviceType) {
665
- case 'NodePort': {
666
- const npPort = clone(portSpec);
667
-
668
- if (port._listeningPort) {
669
- npPort.nodePort = port._listeningPort;
670
- }
671
- nodePort.spec.ports.push(npPort);
672
- break; }
673
- case 'LoadBalancer': {
674
- const lbPort = clone(portSpec);
675
-
676
- if (port._listeningPort) {
677
- lbPort.port = port._listeningPort;
678
- }
679
- loadBalancer.spec.ports.push(lbPort);
680
- break; }
681
- default:
682
- break;
683
- }
684
- }
685
- });
686
-
687
- const toSave = [];
688
- const toRemove = [];
689
- let clusterIPProxy;
690
-
691
- if (clusterIP.spec.ports.length > 0) {
692
- if (clusterIP.id) {
693
- clusterIPProxy = clusterIP;
694
- } else {
695
- clusterIPProxy = await this.$dispatch(`cluster/create`, clusterIP, { root: true });
696
- }
697
- toSave.push(clusterIPProxy);
698
- } else if (clusterIP.id) {
699
- toRemove.push(clusterIP);
700
- }
701
-
702
- if (nodePort.spec.ports.length > 0) {
703
- let nodePortProxy;
704
-
705
- // if id is defined it's a preexisting service
706
- if (nodePort.id) {
707
- nodePortProxy = nodePort;
708
- } else {
709
- nodePortProxy = await this.$dispatch(`cluster/create`, nodePort, { root: true });
710
- }
711
- toSave.push(nodePortProxy);
712
- // if id defined but no ports, the service already exists but should be removed (user has removed all container ports mapping to it)
713
- } else if (nodePort.id) {
714
- toRemove.push(nodePort);
715
- }
716
-
717
- if (loadBalancer.spec.ports.length > 0) {
718
- let loadBalancerProxy;
719
-
720
- if (loadBalancer.id) {
721
- loadBalancerProxy = loadBalancer;
722
- } else {
723
- loadBalancer = clone(loadBalancer);
724
-
725
- const portsWithIpam = ports.filter(p => p._ipam) || [];
726
-
727
- if (portsWithIpam.length > 0) {
728
- loadBalancer.metadata.annotations[HCI_LABELS_ANNOTATIONS.CLOUD_PROVIDER_IPAM] = portsWithIpam[0]._ipam;
729
- }
730
-
731
- loadBalancerProxy = await this.$dispatch(`cluster/create`, loadBalancer, { root: true });
732
- }
733
- toSave.push(loadBalancerProxy);
734
- } else if (loadBalancer.id) {
735
- toRemove.push(loadBalancer);
736
- }
737
-
738
- return { toSave, toRemove };
739
- }
740
-
741
502
  get showAsWorkload() {
742
503
  const types = Object.values(WORKLOAD_TYPES);
743
504
 
@@ -0,0 +1,314 @@
1
+
2
+ import { findBy } from '@shell/utils/array';
3
+ import { TARGET_WORKLOADS, UI_MANAGED, HCI as HCI_LABELS_ANNOTATIONS } from '@shell/config/labels-annotations';
4
+ import { WORKLOAD_TYPES, SERVICE } from '@shell/config/types';
5
+ import { clone, get } from '@shell/utils/object';
6
+ import SteveModel from '@shell/plugins/steve/steve-class';
7
+ import { shortenedImage } from '@shell/utils/string';
8
+
9
+ export default class WorkloadService extends SteveModel {
10
+ async getPortsWithServiceType() {
11
+ const ports = [];
12
+
13
+ this.containers.forEach(container => ports.push(...(container.ports || [])));
14
+ (this.initContainers || []).forEach(container => ports.push(...(container.ports || [])));
15
+
16
+ // Only get services owned if we can access the service resource
17
+ const canAccessServices = this.$getters['schemaFor'](SERVICE);
18
+ const services = canAccessServices ? await this.getServicesOwned() : [];
19
+ const clusterIPServicePorts = [];
20
+ const loadBalancerServicePorts = [];
21
+ const nodePortServicePorts = [];
22
+
23
+ if (services.length) {
24
+ services.forEach((svc) => {
25
+ switch (svc.spec.type) {
26
+ case 'ClusterIP':
27
+ clusterIPServicePorts.push(...(svc?.spec?.ports || []));
28
+ break;
29
+ case 'LoadBalancer':
30
+ loadBalancerServicePorts.push(...(svc?.spec?.ports || []));
31
+ break;
32
+ case 'NodePort':
33
+ nodePortServicePorts.push(...(svc?.spec?.ports || []));
34
+ break;
35
+ default:
36
+ break;
37
+ }
38
+ });
39
+ }
40
+ ports.forEach((port) => {
41
+ const name = port.name ? port.name : `${ port.containerPort }${ port.protocol.toLowerCase() }${ port.hostPort || port._listeningPort || '' }`;
42
+
43
+ port.name = name;
44
+
45
+ if (port._serviceType && port._serviceType !== '') {
46
+ return;
47
+ }
48
+
49
+ if (loadBalancerServicePorts.length) {
50
+ const portSpec = findBy(loadBalancerServicePorts, 'name', name);
51
+
52
+ if (portSpec) {
53
+ port._listeningPort = portSpec.port;
54
+
55
+ port._serviceType = 'LoadBalancer';
56
+
57
+ return;
58
+ }
59
+ } if (nodePortServicePorts.length) {
60
+ const portSpec = findBy(nodePortServicePorts, 'name', name);
61
+
62
+ if (portSpec) {
63
+ port._listeningPort = portSpec.nodePort;
64
+
65
+ port._serviceType = 'NodePort';
66
+
67
+ return;
68
+ }
69
+ } if (clusterIPServicePorts.length) {
70
+ if (findBy(clusterIPServicePorts, 'name', name)) {
71
+ port._serviceType = 'ClusterIP';
72
+ }
73
+ }
74
+ });
75
+
76
+ return ports;
77
+ }
78
+
79
+ async getServicesOwned(force = false) {
80
+ const normanTypes = {
81
+ [WORKLOAD_TYPES.REPLICA_SET]: 'replicaSet',
82
+ [WORKLOAD_TYPES.DEPLOYMENT]: 'deployment',
83
+ [WORKLOAD_TYPES.STATEFUL_SET]: 'statefulSet',
84
+ [WORKLOAD_TYPES.DAEMON_SET]: 'daemonSet',
85
+ };
86
+ const selectorKey = Object.keys(this.workloadSelector)[0];
87
+
88
+ const normanSelectorValue =
89
+ `${ normanTypes[this._type ? this._type : this.type] }-${
90
+ this.metadata.namespace
91
+ }-${ this.metadata.name }`;
92
+
93
+ const steveSelectorValue = this.workloadSelector[selectorKey];
94
+ const allSvc = await this.$dispatch('cluster/findAll', { type: SERVICE, opt: { force } }, { root: true });
95
+
96
+ return (allSvc || []).filter(svc => (svc.spec?.selector || {})[selectorKey] === steveSelectorValue || (svc.spec?.selector || {})[selectorKey] === normanSelectorValue );
97
+ }
98
+
99
+ get imageNames() {
100
+ let containers;
101
+ const images = [];
102
+
103
+ if (this.type === WORKLOAD_TYPES.CRON_JOB) {
104
+ containers = get(this, 'spec.jobTemplate.spec.template.spec.containers');
105
+ } else {
106
+ containers = get(this, 'spec.template.spec.containers');
107
+ }
108
+ if (containers) {
109
+ containers.forEach((container) => {
110
+ if (!images.includes(container.image)) {
111
+ images.push(container.image);
112
+ }
113
+ });
114
+ }
115
+
116
+ return images.map(shortenedImage);
117
+ }
118
+
119
+ get containers() {
120
+ if (this.type === WORKLOAD_TYPES.CRON_JOB) {
121
+ // cronjob pod template is nested slightly different than other types
122
+ const { spec: { jobTemplate: { spec: { template: { spec: { containers } } } } } } = this;
123
+
124
+ return containers;
125
+ }
126
+ const { spec:{ template:{ spec:{ containers } } } } = this;
127
+
128
+ return containers;
129
+ }
130
+
131
+ get initContainers() {
132
+ if (this.type === WORKLOAD_TYPES.CRON_JOB) {
133
+ // cronjob pod template is nested slightly different than other types
134
+ const { spec: { jobTemplate: { spec: { template: { spec: { initContainers } } } } } } = this;
135
+
136
+ return initContainers;
137
+ }
138
+ const { spec:{ template:{ spec:{ initContainers } } } } = this;
139
+
140
+ return initContainers;
141
+ }
142
+
143
+ get workloadSelector() {
144
+ return {
145
+ 'workload.user.cattle.io/workloadselector': `${ this._type ? this._type : this.type }-${
146
+ this.metadata.namespace
147
+ }-${ this.metadata.name }`
148
+ };
149
+ }
150
+
151
+ // create clusterip, nodeport, loadbalancer services from container port spec
152
+ async servicesFromContainerPorts(mode, ports) {
153
+ const ownerRef = {
154
+ apiVersion: this.apiVersion,
155
+ controller: true,
156
+ kind: this.kind,
157
+ name: this.metadata.name,
158
+ uid: this.metadata.uid
159
+ };
160
+
161
+ const annotations = { [TARGET_WORKLOADS]: JSON.stringify([`${ this.metadata.namespace }/${ this.metadata.name }`]), [UI_MANAGED]: 'true' };
162
+
163
+ let clusterIP = {
164
+ type: SERVICE,
165
+ spec: {
166
+ ports: [],
167
+ selector: this.workloadSelector,
168
+ type: 'ClusterIP'
169
+ },
170
+ metadata: {
171
+ name: this.metadata.name,
172
+ namespace: this.metadata.namespace,
173
+ annotations,
174
+ ownerReferences: [ownerRef]
175
+ },
176
+ };
177
+
178
+ let nodePort = {
179
+ type: SERVICE,
180
+ spec: {
181
+ ports: [],
182
+ selector: this.workloadSelector,
183
+ type: 'NodePort'
184
+ },
185
+ metadata: {
186
+ name: `${ this.metadata.name }-nodeport`,
187
+ namespace: this.metadata.namespace,
188
+ annotations,
189
+ ownerReferences: [ownerRef]
190
+ },
191
+ };
192
+
193
+ let loadBalancer = {
194
+ type: SERVICE,
195
+ spec: {
196
+ ports: [],
197
+ selector: this.workloadSelector,
198
+ type: 'LoadBalancer',
199
+ externalTrafficPolicy: 'Cluster'
200
+ },
201
+ metadata: {
202
+ name: `${ this.metadata.name }-loadbalancer`,
203
+ namespace: this.metadata.namespace,
204
+ annotations,
205
+ ownerReferences: [ownerRef]
206
+ },
207
+ };
208
+
209
+ const existing = await this.getServicesOwned(this.isFromNorman);
210
+
211
+ if (existing && existing.length) {
212
+ existing.forEach((service) => {
213
+ switch (service.spec.type) {
214
+ case 'ClusterIP':
215
+ clusterIP = service;
216
+ clusterIP.spec.ports = [];
217
+ break;
218
+ case 'NodePort':
219
+ nodePort = service;
220
+ nodePort.spec.ports = [];
221
+ break;
222
+ case 'LoadBalancer':
223
+ loadBalancer = service;
224
+ loadBalancer.spec.ports = [];
225
+ break;
226
+ default:
227
+ break;
228
+ }
229
+ });
230
+ }
231
+ ports.forEach((port) => {
232
+ const portSpec = {
233
+ name: port.name, protocol: port.protocol, port: port.containerPort, targetPort: port.containerPort
234
+ };
235
+
236
+ if (port._serviceType !== '') {
237
+ clusterIP.spec.ports.push(portSpec);
238
+ switch (port._serviceType) {
239
+ case 'NodePort': {
240
+ const npPort = clone(portSpec);
241
+
242
+ if (port._listeningPort) {
243
+ npPort.nodePort = port._listeningPort;
244
+ }
245
+ nodePort.spec.ports.push(npPort);
246
+ break; }
247
+ case 'LoadBalancer': {
248
+ const lbPort = clone(portSpec);
249
+
250
+ if (port._listeningPort) {
251
+ lbPort.port = port._listeningPort;
252
+ }
253
+ loadBalancer.spec.ports.push(lbPort);
254
+ break; }
255
+ default:
256
+ break;
257
+ }
258
+ }
259
+ });
260
+
261
+ const toSave = [];
262
+ const toRemove = [];
263
+ let clusterIPProxy;
264
+
265
+ if (clusterIP.spec.ports.length > 0) {
266
+ if (clusterIP.id) {
267
+ clusterIPProxy = clusterIP;
268
+ } else {
269
+ clusterIPProxy = await this.$dispatch(`cluster/create`, clusterIP, { root: true });
270
+ }
271
+ toSave.push(clusterIPProxy);
272
+ } else if (clusterIP.id) {
273
+ toRemove.push(clusterIP);
274
+ }
275
+
276
+ if (nodePort.spec.ports.length > 0) {
277
+ let nodePortProxy;
278
+
279
+ // if id is defined it's a preexisting service
280
+ if (nodePort.id) {
281
+ nodePortProxy = nodePort;
282
+ } else {
283
+ nodePortProxy = await this.$dispatch(`cluster/create`, nodePort, { root: true });
284
+ }
285
+ toSave.push(nodePortProxy);
286
+ // if id defined but no ports, the service already exists but should be removed (user has removed all container ports mapping to it)
287
+ } else if (nodePort.id) {
288
+ toRemove.push(nodePort);
289
+ }
290
+
291
+ if (loadBalancer.spec.ports.length > 0) {
292
+ let loadBalancerProxy;
293
+
294
+ if (loadBalancer.id) {
295
+ loadBalancerProxy = loadBalancer;
296
+ } else {
297
+ loadBalancer = clone(loadBalancer);
298
+
299
+ const portsWithIpam = ports.filter(p => p._ipam) || [];
300
+
301
+ if (portsWithIpam.length > 0) {
302
+ loadBalancer.metadata.annotations[HCI_LABELS_ANNOTATIONS.CLOUD_PROVIDER_IPAM] = portsWithIpam[0]._ipam;
303
+ }
304
+
305
+ loadBalancerProxy = await this.$dispatch(`cluster/create`, loadBalancer, { root: true });
306
+ }
307
+ toSave.push(loadBalancerProxy);
308
+ } else if (loadBalancer.id) {
309
+ toRemove.push(loadBalancer);
310
+ }
311
+
312
+ return { toSave, toRemove };
313
+ }
314
+ }
package/nuxt.config.js CHANGED
@@ -141,16 +141,16 @@ export default function(dir, _appConfig) {
141
141
  // Package file must have rancher field to be a plugin
142
142
  if (includePkg(name) && f.rancher) {
143
143
  reqs += `$plugin.initPlugin('${ name }', require(\'~/pkg/${ name }\')); `;
144
- }
145
144
 
146
- // // Serve the code for the UI package in case its used for dynamic loading (but not if the same package was provided in node_modules)
147
- // if (!nmPackages[name]) {
148
- // const pkgPackageFile = require(path.join(dir, 'pkg', name, 'package.json'));
149
- // const pkgRef = `${ name }-${ pkgPackageFile.version }`;
145
+ // // Serve the code for the UI package in case its used for dynamic loading (but not if the same package was provided in node_modules)
146
+ // if (!nmPackages[name]) {
147
+ // const pkgPackageFile = require(path.join(dir, 'pkg', name, 'package.json'));
148
+ // const pkgRef = `${ name }-${ pkgPackageFile.version }`;
150
149
 
151
- // serverMiddleware.push({ path: `/pkg/${ pkgRef }`, handler: serveStatic(`${ dir }/dist-pkg/${ pkgRef }`) });
152
- // }
153
- autoImportTypes[`@rancher/auto-import/${ name }`] = generateDynamicTypeImport(`@pkg/${ name }`, path.join(dir, `pkg/${ name }`));
150
+ // serverMiddleware.push({ path: `/pkg/${ pkgRef }`, handler: serveStatic(`${ dir }/dist-pkg/${ pkgRef }`) });
151
+ // }
152
+ autoImportTypes[`@rancher/auto-import/${ name }`] = generateDynamicTypeImport(`@pkg/${ name }`, path.join(dir, `pkg/${ name }`));
153
+ }
154
154
  });
155
155
  }
156
156
 
@@ -265,7 +265,9 @@ export default function(dir, _appConfig) {
265
265
  dev,
266
266
  pl,
267
267
  perfTest,
268
- rancherEnv
268
+ rancherEnv,
269
+ harvesterPkgUrl: process.env.HARVESTER_PKG_URL,
270
+ api
269
271
  },
270
272
 
271
273
  publicRuntimeConfig: { rancherEnv },
@@ -305,8 +307,9 @@ export default function(dir, _appConfig) {
305
307
  },
306
308
 
307
309
  router: {
308
- base: routerBasePath,
309
- middleware: ['i18n'],
310
+ base: routerBasePath,
311
+ middleware: ['i18n'],
312
+ prefetchLinks: false
310
313
  },
311
314
 
312
315
  alias: {
@@ -570,7 +573,6 @@ export default function(dir, _appConfig) {
570
573
  path.join(NUXT_SHELL, 'plugins/global-formatters'),
571
574
  path.join(NUXT_SHELL, 'plugins/trim-whitespace'),
572
575
  { src: path.join(NUXT_SHELL, 'plugins/extend-router') },
573
- { src: path.join(NUXT_SHELL, 'plugins/lookup'), ssr: false },
574
576
  { src: path.join(NUXT_SHELL, 'plugins/console'), ssr: false },
575
577
  { src: path.join(NUXT_SHELL, 'plugins/int-number'), ssr: false },
576
578
  { src: path.join(NUXT_SHELL, 'plugins/nuxt-client-init'), ssr: false },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rancher/shell",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "Rancher Dashboard Shell",
5
5
  "repository": "https://github.com/rancherlabs/dashboard",
6
6
  "license": "Apache-2.0",
@@ -84,8 +84,8 @@
84
84
  "eslint-import-resolver-node": "0.3.4",
85
85
  "eslint-module-utils": "2.6.1",
86
86
  "eslint-plugin-cypress": "^2.11.3",
87
- "eslint-plugin-jest": "^23.6.0",
88
87
  "eslint-plugin-import": "2.23.4",
88
+ "eslint-plugin-jest": "^23.6.0",
89
89
  "eslint-plugin-n": "^15.2.0",
90
90
  "eslint-plugin-vue": "7.14.0",
91
91
  "event-target-shim": "^5.0.1",
@@ -158,4 +158,4 @@
158
158
  ".vue"
159
159
  ]
160
160
  }
161
- }
161
+ }