@rancher/shell 0.1.2 → 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 (258) hide show
  1. package/assets/translations/en-us.yaml +27 -769
  2. package/assets/translations/zh-hans.yaml +8 -769
  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 +18 -11
  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/WorkloadPorts.vue +1 -1
  24. package/components/formatter/WorkloadHealthScale.vue +1 -1
  25. package/components/nav/Header.vue +9 -9
  26. package/components/nav/NamespaceFilter.vue +7 -4
  27. package/components/nav/TopLevelMenu.vue +6 -43
  28. package/components/nav/WindowManager/ContainerLogs.vue +1 -1
  29. package/config/product/harvester-manager.js +64 -2
  30. package/config/product/manager.js +9 -0
  31. package/config/settings.js +17 -71
  32. package/config/table-headers.js +0 -1
  33. package/config/types.js +5 -25
  34. package/core/plugin-routes.ts +34 -22
  35. package/core/plugin.ts +15 -3
  36. package/core/plugins-loader.js +2 -0
  37. package/core/plugins.js +79 -36
  38. package/core/types.ts +7 -1
  39. package/detail/provisioning.cattle.io.cluster.vue +13 -0
  40. package/detail/workload/index.vue +11 -5
  41. package/{components/dialog → dialog}/AddClusterMemberDialog.vue +0 -0
  42. package/{components/dialog → dialog}/AddCustomBadgeDialog.vue +0 -0
  43. package/{components/dialog → dialog}/AddProjectMemberDialog.vue +0 -0
  44. package/{components/dialog → dialog}/AddonConfigConfirmationDialog.vue +0 -0
  45. package/{components/dialog → dialog}/DrainNode.vue +0 -0
  46. package/{components/dialog → dialog}/ForceMachineRemoveDialog.vue +0 -0
  47. package/{components/dialog → dialog}/GenericPrompt.vue +0 -0
  48. package/{components/dialog → dialog}/RollbackWorkloadDialog.vue +0 -0
  49. package/{components/dialog → dialog}/RotateCertificatesDialog.vue +0 -0
  50. package/{components/dialog → dialog}/RotateEncryptionKeyDialog.vue +0 -0
  51. package/{components/dialog → dialog}/SaveAsRKETemplateDialog.vue +0 -0
  52. package/{components/dialog → dialog}/ScaleMachineDownDialog.vue +0 -0
  53. package/edit/auth/azuread.vue +20 -1
  54. package/edit/management.cattle.io.project.vue +2 -2
  55. package/edit/namespace.vue +17 -10
  56. package/edit/persistentvolumeclaim.vue +1 -0
  57. package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +1 -1
  58. package/edit/provisioning.cattle.io.cluster/MachinePool.vue +33 -5
  59. package/edit/service.vue +1 -1
  60. package/edit/workload/index.vue +363 -15
  61. package/edit/workload/mixins/workload.js +62 -7
  62. package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +1 -0
  63. package/layouts/default.vue +52 -27
  64. package/layouts/error.vue +5 -1
  65. package/layouts/home.vue +6 -2
  66. package/list/harvesterhci.io.management.cluster.vue +74 -33
  67. package/list/namespace.vue +3 -5
  68. package/machine-config/amazonec2.vue +2 -0
  69. package/machine-config/harvester.vue +96 -49
  70. package/middleware/authenticated.js +56 -52
  71. package/mixins/form-validation.js +1 -1
  72. package/mixins/resource-fetch.js +3 -1
  73. package/models/fleet.cattle.io.bundle.js +26 -19
  74. package/models/harvesterhci.io.management.cluster.js +194 -5
  75. package/models/management.cattle.io.cluster.js +1 -1
  76. package/models/management.cattle.io.clusterroletemplatebinding.js +9 -0
  77. package/models/management.cattle.io.project.js +23 -2
  78. package/models/namespace.js +19 -3
  79. package/models/pod.js +19 -2
  80. package/models/provisioning.cattle.io.cluster.js +4 -0
  81. package/models/workload.js +4 -243
  82. package/models/workload.service.js +314 -0
  83. package/nuxt.config.js +11 -9
  84. package/package.json +3 -3
  85. package/pages/auth/login.vue +11 -2
  86. package/pages/auth/setup.vue +1 -1
  87. package/pages/c/_cluster/_product/members/index.vue +3 -93
  88. package/pages/c/_cluster/_product/projectsnamespaces.vue +6 -403
  89. package/pages/c/_cluster/settings/performance.vue +19 -16
  90. package/pages/fail-whale.vue +1 -10
  91. package/pages/index.vue +18 -4
  92. package/pages/plugins.vue +2 -2
  93. package/pages/prefs.vue +8 -6
  94. package/pkg/auto-import.js +44 -7
  95. package/pkg/dynamic-plugin-loader.js +28 -0
  96. package/pkg/import.js +2 -2
  97. package/pkg/model-loader-require.lib.js +3 -0
  98. package/pkg/vue.config.js +9 -6
  99. package/plugins/dashboard-store/model-loader-require.js +12 -0
  100. package/plugins/dashboard-store/model-loader.js +4 -1
  101. package/plugins/dashboard-store/resource-class.js +10 -3
  102. package/plugins/steve/actions.js +1 -1
  103. package/plugins/steve/index.js +6 -4
  104. package/plugins/steve/subscribe.js +34 -23
  105. package/rancher-components/Form/Checkbox/Checkbox.test.ts +77 -0
  106. package/rancher-components/Form/Checkbox/Checkbox.vue +12 -2
  107. package/scripts/build-pkg.sh +48 -2
  108. package/scripts/drone-build-pkg.sh +31 -0
  109. package/scripts/publish-shell.sh +10 -11
  110. package/scripts/serve-pkgs +17 -10
  111. package/store/catalog.js +3 -1
  112. package/store/i18n.js +16 -11
  113. package/store/index.js +4 -181
  114. package/store/prefs.js +30 -2
  115. package/store/type-map.js +16 -29
  116. package/utils/cluster.js +1 -1
  117. package/utils/custom-validators.js +1 -12
  118. package/utils/dynamic-importer.js +1 -1
  119. package/utils/validators/setting.js +0 -35
  120. package/components/FilterLabel.vue +0 -254
  121. package/components/HarvesterUpgradeProgressBarList.vue +0 -109
  122. package/components/VMConsoleBar.vue +0 -87
  123. package/components/dialog/harvester/AddHotplugModal.vue +0 -159
  124. package/components/dialog/harvester/BackupModal.vue +0 -117
  125. package/components/dialog/harvester/CloneTemplate.vue +0 -125
  126. package/components/dialog/harvester/EjectCDROMDialog.vue +0 -157
  127. package/components/dialog/harvester/ExportImageDialog.vue +0 -152
  128. package/components/dialog/harvester/MaintenanceDialog.vue +0 -94
  129. package/components/dialog/harvester/MigrationDialog.vue +0 -154
  130. package/components/dialog/harvester/RestoreDialog.vue +0 -153
  131. package/components/dialog/harvester/SupportBundle.vue +0 -217
  132. package/components/dialog/harvester/UnplugVolume.vue +0 -108
  133. package/components/form/SerialConsole/index.vue +0 -267
  134. package/components/formatter/AttachVMWithName.vue +0 -46
  135. package/components/formatter/CloudInitType.vue +0 -27
  136. package/components/formatter/HarvesterBackupTargetValidation.vue +0 -43
  137. package/components/formatter/HarvesterCPUUsed.vue +0 -122
  138. package/components/formatter/HarvesterDiskState.vue +0 -66
  139. package/components/formatter/HarvesterHostName.vue +0 -66
  140. package/components/formatter/HarvesterIpAddress.vue +0 -90
  141. package/components/formatter/HarvesterMemoryUsed.vue +0 -140
  142. package/components/formatter/HarvesterMigrationState.vue +0 -85
  143. package/components/formatter/HarvesterNodeName.vue +0 -49
  144. package/components/formatter/HarvesterStorageUsed.vue +0 -194
  145. package/components/formatter/HarvesterVmState.vue +0 -123
  146. package/components/nav/HarvesterUpgrade.vue +0 -232
  147. package/components/novnc/NovncConsole.vue +0 -93
  148. package/components/novnc/NovncConsoleItem.vue +0 -89
  149. package/components/novnc/NovncConsoleWrapper.vue +0 -243
  150. package/config/harvester-map.js +0 -44
  151. package/config/harvester-table-headers.js +0 -27
  152. package/config/product/harvester.js +0 -305
  153. package/detail/harvesterhci.io.host/HarvesterHostBasic.vue +0 -364
  154. package/detail/harvesterhci.io.host/HarvesterHostDisk.vue +0 -200
  155. package/detail/harvesterhci.io.host/HarvesterHostNetwork.vue +0 -89
  156. package/detail/harvesterhci.io.host/VirtualMachineInstance.vue +0 -134
  157. package/detail/harvesterhci.io.host/index.vue +0 -243
  158. package/detail/harvesterhci.io.virtualmachinebackup/index.vue +0 -221
  159. package/detail/harvesterhci.io.virtualmachineimage.vue +0 -118
  160. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineBasics.vue +0 -279
  161. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineEvents.vue +0 -75
  162. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineKeypairs.vue +0 -114
  163. package/detail/kubevirt.io.virtualmachine/VirtualMachineTabs/VirtualMachineMigration.vue +0 -79
  164. package/detail/kubevirt.io.virtualmachine/index.vue +0 -213
  165. package/edit/harvesterhci.io.cloudtemplate.vue +0 -123
  166. package/edit/harvesterhci.io.host/HarvesterDisk.vue +0 -262
  167. package/edit/harvesterhci.io.host/index.vue +0 -533
  168. package/edit/harvesterhci.io.keypair.vue +0 -112
  169. package/edit/harvesterhci.io.managedchart/index.vue +0 -25
  170. package/edit/harvesterhci.io.managedchart/rancher-monitoring.vue +0 -172
  171. package/edit/harvesterhci.io.networkattachmentdefinition.vue +0 -210
  172. package/edit/harvesterhci.io.setting/additional-ca.vue +0 -36
  173. package/edit/harvesterhci.io.setting/backup-target.vue +0 -182
  174. package/edit/harvesterhci.io.setting/http-proxy.vue +0 -79
  175. package/edit/harvesterhci.io.setting/index.vue +0 -201
  176. package/edit/harvesterhci.io.setting/overcommit-config.vue +0 -94
  177. package/edit/harvesterhci.io.setting/ssl-certificates.vue +0 -117
  178. package/edit/harvesterhci.io.setting/ssl-parameters.vue +0 -161
  179. package/edit/harvesterhci.io.setting/support-bundle-image.vue +0 -134
  180. package/edit/harvesterhci.io.setting/support-bundle-namespaces.vue +0 -73
  181. package/edit/harvesterhci.io.setting/vip-pools.vue +0 -244
  182. package/edit/harvesterhci.io.setting/vm-force-reset-policy.vue +0 -81
  183. package/edit/harvesterhci.io.virtualmachinebackup.vue +0 -256
  184. package/edit/harvesterhci.io.virtualmachineimage.vue +0 -364
  185. package/edit/harvesterhci.io.virtualmachinetemplateversion.vue +0 -340
  186. package/edit/harvesterhci.io.volume.vue +0 -195
  187. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/AccessCredentialsUsers.vue +0 -190
  188. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/index.vue +0 -212
  189. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/type/basicAuth.vue +0 -94
  190. package/edit/kubevirt.io.virtualmachine/VirtualMachineAccessCredentials/type/sshkey.vue +0 -85
  191. package/edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig/DataTemplate.vue +0 -153
  192. package/edit/kubevirt.io.virtualmachine/VirtualMachineCloudConfig/index.vue +0 -279
  193. package/edit/kubevirt.io.virtualmachine/VirtualMachineCpuMemory.vue +0 -113
  194. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/__tests__/HarvesterEditNetwork.test.ts +0 -41
  195. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/base.vue +0 -281
  196. package/edit/kubevirt.io.virtualmachine/VirtualMachineNetwork/index.vue +0 -142
  197. package/edit/kubevirt.io.virtualmachine/VirtualMachineReserved.vue +0 -54
  198. package/edit/kubevirt.io.virtualmachine/VirtualMachineSSHKey.vue +0 -256
  199. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/index.vue +0 -391
  200. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditContainer.test.ts +0 -40
  201. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditExisting.test.ts +0 -102
  202. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditVMImage.test.ts +0 -117
  203. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/__tests__/HarvesterEditVolume.test.ts +0 -74
  204. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/container.vue +0 -132
  205. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/existing.vue +0 -303
  206. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/vmImage.vue +0 -285
  207. package/edit/kubevirt.io.virtualmachine/VirtualMachineVolume/type/volume.vue +0 -188
  208. package/edit/kubevirt.io.virtualmachine/index.vue +0 -642
  209. package/edit/network.harvesterhci.io.clusternetwork/index.vue +0 -19
  210. package/edit/network.harvesterhci.io.clusternetwork/vlan.vue +0 -134
  211. package/edit/workload/types/Deployment.vue +0 -377
  212. package/edit/workload/types/Generic.vue +0 -295
  213. package/list/harvesterhci.io.cloudtemplate.vue +0 -78
  214. package/list/harvesterhci.io.dashboard/HarvesterUpgrade.vue +0 -211
  215. package/list/harvesterhci.io.dashboard/UpgradeInfo.vue +0 -40
  216. package/list/harvesterhci.io.dashboard/index.vue +0 -752
  217. package/list/harvesterhci.io.host/index.vue +0 -186
  218. package/list/harvesterhci.io.networkattachmentdefinition.vue +0 -167
  219. package/list/harvesterhci.io.setting.vue +0 -241
  220. package/list/harvesterhci.io.virtualmachinebackup.vue +0 -172
  221. package/list/harvesterhci.io.virtualmachineimage.vue +0 -80
  222. package/list/harvesterhci.io.virtualmachinetemplateversion.vue +0 -173
  223. package/list/harvesterhci.io.volume.vue +0 -122
  224. package/list/kubevirt.io.virtualmachine.vue +0 -193
  225. package/mixins/harvester-vm/impl.js +0 -267
  226. package/mixins/harvester-vm/index.js +0 -1357
  227. package/models/harvester/configmap.js +0 -32
  228. package/models/harvester/harvesterhci.io.blockdevice.js +0 -55
  229. package/models/harvester/harvesterhci.io.keypair.js +0 -12
  230. package/models/harvester/harvesterhci.io.setting.js +0 -127
  231. package/models/harvester/harvesterhci.io.supportbundle.js +0 -35
  232. package/models/harvester/harvesterhci.io.upgrade.js +0 -226
  233. package/models/harvester/harvesterhci.io.virtualmachinebackup.js +0 -116
  234. package/models/harvester/harvesterhci.io.virtualmachineimage.js +0 -255
  235. package/models/harvester/harvesterhci.io.virtualmachinerestore.js +0 -43
  236. package/models/harvester/harvesterhci.io.virtualmachinetemplate.js +0 -69
  237. package/models/harvester/harvesterhci.io.virtualmachinetemplateversion.js +0 -227
  238. package/models/harvester/k8s.cni.cncf.io.networkattachmentdefinition.js +0 -32
  239. package/models/harvester/kubevirt.io.virtualmachine.js +0 -850
  240. package/models/harvester/kubevirt.io.virtualmachineinstance.js +0 -142
  241. package/models/harvester/management.cattle.io.managedchart.js +0 -191
  242. package/models/harvester/management.cattle.io.setting.js +0 -40
  243. package/models/harvester/network.harvesterhci.io.clusternetwork.js +0 -100
  244. package/models/harvester/network.harvesterhci.io.nodenetwork.js +0 -34
  245. package/models/harvester/node.js +0 -255
  246. package/models/harvester/persistentvolumeclaim.js +0 -166
  247. package/models/harvester/pod.js +0 -185
  248. package/pages/c/_cluster/harvester/airgapupgrade/index.vue +0 -309
  249. package/pages/c/_cluster/harvester/console/_uid/serial.vue +0 -51
  250. package/pages/c/_cluster/harvester/console/_uid/vnc.vue +0 -52
  251. package/pages/c/_cluster/harvester/index.vue +0 -24
  252. package/pages/c/_cluster/harvester/support/index.vue +0 -154
  253. package/pkg/model-loader.lib.js +0 -3
  254. package/promptRemove/kubevirt.io.virtualmachine.vue +0 -164
  255. package/store/harvester-common.js +0 -126
  256. package/utils/validators/vm-datavolumes.js +0 -38
  257. package/utils/validators/vm-image.js +0 -32
  258. package/utils/validators/vm.js +0 -221
@@ -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 },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rancher/shell",
3
- "version": "0.1.2",
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
+ }
@@ -3,6 +3,7 @@ import { removeObject } from '@shell/utils/array';
3
3
  import { USERNAME } from '@shell/config/cookies';
4
4
  import { LabeledInput } from '@components/Form/LabeledInput';
5
5
  import AsyncButton from '@shell/components/AsyncButton';
6
+ import LocaleSelector from '@shell/components/LocaleSelector';
6
7
  import BrandImage from '@shell/components/BrandImage';
7
8
  import InfoBox from '@shell/components/InfoBox';
8
9
  import CopyCode from '@shell/components/CopyCode';
@@ -30,7 +31,7 @@ export default {
30
31
  name: 'Login',
31
32
  layout: 'unauthenticated',
32
33
  components: {
33
- LabeledInput, AsyncButton, Checkbox, BrandImage, Banner, InfoBox, CopyCode, Password
34
+ LabeledInput, AsyncButton, Checkbox, BrandImage, Banner, InfoBox, CopyCode, Password, LocaleSelector
34
35
  },
35
36
 
36
37
  async asyncData({ route, redirect, store }) {
@@ -164,7 +165,7 @@ export default {
164
165
 
165
166
  kubectlCmd() {
166
167
  return "kubectl get secret --namespace cattle-system bootstrap-secret -o go-template='{{.data.bootstrapPassword|base64decode}}{{\"\\n\"}}'";
167
- }
168
+ },
168
169
 
169
170
  },
170
171
 
@@ -393,6 +394,9 @@ export default {
393
394
  {{ nonLocalPrompt }}
394
395
  </a>
395
396
  </div>
397
+ <div class="locale-elector">
398
+ <LocaleSelector></LocaleSelector>
399
+ </div>
396
400
  </template>
397
401
  </div>
398
402
 
@@ -435,4 +439,9 @@ export default {
435
439
  }
436
440
  }
437
441
  }
442
+
443
+ .locale-elector {
444
+ position: absolute;
445
+ bottom: 30px;
446
+ }
438
447
  </style>
@@ -114,7 +114,7 @@ export default {
114
114
  setVendor(plSetting.value);
115
115
  }
116
116
 
117
- const productName = plSetting.default === 'Harvester' ? 'Harvester' : 'Rancher';
117
+ const productName = plSetting.default;
118
118
 
119
119
  const principals = await store.dispatch('rancher/findAll', { type: NORMAN.PRINCIPAL, opt: { url: '/v3/principals' } });
120
120
  const me = findBy(principals, 'me', true);
@@ -1,96 +1,6 @@
1
1
  <script>
2
- import { MANAGEMENT, NORMAN, VIRTUAL_TYPES } from '@shell/config/types';
3
- import ResourceTable from '@shell/components/ResourceTable';
4
- import Loading from '@shell/components/Loading';
5
- import Masthead from '@shell/components/ResourceList/Masthead';
6
- import { AGE, ROLE, STATE, PRINCIPAL } from '@shell/config/table-headers';
7
- import { canViewClusterPermissionsEditor } from '@shell/components/form/Members/ClusterPermissionsEditor.vue';
8
- import Banner from '@components/Banner/Banner.vue';
9
-
10
- /**
11
- * Explorer members page.
12
- * Route: /c/local/explorer/members
13
- */
14
- export default {
15
-
16
- name: 'ExplorerMembers',
17
-
18
- components: {
19
- Banner, Loading, Masthead, ResourceTable
20
- },
21
-
22
- async fetch() {
23
- const clusterRoleTemplateBindingSchema = this.$store.getters[`rancher/schemaFor`](NORMAN.CLUSTER_ROLE_TEMPLATE_BINDING);
24
-
25
- const hydration = [
26
- clusterRoleTemplateBindingSchema ? this.$store.dispatch(`rancher/findAll`, { type: NORMAN.CLUSTER_ROLE_TEMPLATE_BINDING }, { root: true }) : [],
27
- clusterRoleTemplateBindingSchema ? this.$store.dispatch(`management/findAll`, { type: MANAGEMENT.CLUSTER_ROLE_TEMPLATE_BINDING }) : [],
28
- this.$store.dispatch('rancher/findAll', { type: NORMAN.PRINCIPAL }),
29
- this.$store.dispatch(`management/findAll`, { type: MANAGEMENT.USER }),
30
- this.$store.dispatch(`management/findAll`, { type: MANAGEMENT.ROLE_TEMPLATE }),
31
- ];
32
- const [clusterRoleTemplateBindings] = await Promise.all(hydration);
33
- const steveBindings = await Promise.all(clusterRoleTemplateBindings.map(b => b.steve));
34
-
35
- this.$set(this, 'clusterRoleTemplateBindings', steveBindings);
36
- },
37
-
38
- data() {
39
- return {
40
- schema: this.$store.getters[`management/schemaFor`](MANAGEMENT.CLUSTER_ROLE_TEMPLATE_BINDING),
41
- headers: [
42
- STATE,
43
- PRINCIPAL,
44
- ROLE,
45
- AGE
46
- ],
47
- createLocation: {
48
- name: 'c-cluster-product-resource-create',
49
- params: {
50
- product: this.$store.getters['currentProduct'].name,
51
- resource: MANAGEMENT.CLUSTER_ROLE_TEMPLATE_BINDING,
52
- }
53
- },
54
- resource: MANAGEMENT.CLUSTER_ROLE_TEMPLATE_BINDING,
55
- clusterRoleTemplateBindings: [],
56
- VIRTUAL_TYPES
57
- };
58
- },
59
-
60
- computed: {
61
- filteredClusterRoleTemplateBindings() {
62
- return this.clusterRoleTemplateBindings
63
- .filter(b => b.clusterName === this.$store.getters['currentCluster'].id);
64
- },
65
- canManageMembers() {
66
- return canViewClusterPermissionsEditor(this.$store);
67
- },
68
- isLocal() {
69
- return this.$store.getters['currentCluster'].isLocal;
70
- }
71
- },
72
- };
2
+ import ExplorerMembers from '@shell/components/ExplorerMembers';
3
+ export default { components: { ExplorerMembers } };
73
4
  </script>
74
5
 
75
- <template>
76
- <Loading v-if="$fetchState.pending" />
77
- <div v-else>
78
- <Masthead
79
- :schema="schema"
80
- :resource="resource"
81
- :favorite-resource="VIRTUAL_TYPES.CLUSTER_MEMBERS"
82
- :create-location="createLocation"
83
- :create-button-label="t('members.createActionLabel')"
84
- />
85
- <Banner v-if="isLocal" color="error" :label="t('members.localClusterWarning')" />
86
- <ResourceTable
87
- :schema="schema"
88
- :headers="headers"
89
- :rows="filteredClusterRoleTemplateBindings"
90
- :groupable="false"
91
- :namespaced="false"
92
- sub-search="subSearch"
93
- :sub-fields="['nameDisplay']"
94
- />
95
- </div>
96
- </template>
6
+ <template><ExplorerMembers v-bind="$attrs" /></template>