@rancher/shell 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (342) hide show
  1. package/assets/styles/global/_button.scss +5 -1
  2. package/assets/styles/global/_columns.scss +4 -0
  3. package/assets/styles/global/_gauges.scss +1 -1
  4. package/assets/styles/global/_layout.scss +5 -2
  5. package/assets/styles/global/_select.scss +1 -4
  6. package/assets/styles/themes/_dark.scss +5 -4
  7. package/assets/styles/themes/_light.scss +4 -3
  8. package/assets/styles/themes/_suse.scss +1 -1
  9. package/assets/styles/vendor/vue-select.scss +4 -3
  10. package/assets/translations/en-us.yaml +673 -73
  11. package/assets/translations/zh-hans.yaml +720 -207
  12. package/chart/monitoring/steps/uninstall-v1.vue +2 -2
  13. package/cloud-credential/azure.vue +23 -0
  14. package/cloud-credential/harvester.vue +25 -62
  15. package/cloud-credential/pnap.vue +80 -0
  16. package/components/.DS_Store +0 -0
  17. package/components/ActionMenu.vue +28 -7
  18. package/components/AdvancedSection.vue +9 -2
  19. package/components/Alert.vue +2 -2
  20. package/components/ButtonDropdown.vue +0 -2
  21. package/components/ButtonGroup.vue +1 -0
  22. package/components/CollapsibleCard.vue +0 -1
  23. package/components/CruResource.vue +41 -4
  24. package/components/DetailTop.vue +72 -4
  25. package/components/DisableAuthProviderModal.vue +106 -0
  26. package/{rancher-components/components/Utils/DraggableZone → components}/DraggableZone.vue +0 -0
  27. package/components/ExplorerMembers.vue +253 -30
  28. package/components/ExplorerProjectsNamespaces.vue +77 -33
  29. package/components/ExtensionPanel.vue +42 -0
  30. package/components/GrowlManager.vue +3 -3
  31. package/components/IconOrSvg.vue +178 -0
  32. package/components/LogItem.vue +69 -0
  33. package/components/PodSecurityAdmission.vue +302 -0
  34. package/components/PromptModal.vue +1 -0
  35. package/components/ResourceDetail/Masthead.vue +69 -4
  36. package/components/ResourceDetail/index.vue +12 -5
  37. package/components/ResourceList/Masthead.vue +11 -1
  38. package/components/ResourceList/ResourceLoadingIndicator.vue +12 -2
  39. package/components/ResourceList/index.vue +66 -12
  40. package/components/ResourceList/resource-list.config.js +7 -0
  41. package/components/ResourceTable.vue +33 -6
  42. package/components/SimpleBox.vue +1 -1
  43. package/components/SortableTable/THead.vue +21 -14
  44. package/components/SortableTable/filtering.js +1 -1
  45. package/components/SortableTable/index.vue +21 -10
  46. package/components/SortableTable/selection.js +15 -3
  47. package/components/Tabbed/Tab.vue +1 -1
  48. package/components/Tabbed/index.vue +20 -15
  49. package/components/__tests__/.DS_Store +0 -0
  50. package/components/__tests__/AsyncButton.test.ts +140 -0
  51. package/components/__tests__/BackLink.test.ts +33 -0
  52. package/components/__tests__/ButtonGroup.test.ts +124 -0
  53. package/components/__tests__/ClusterBadge.test.ts +32 -0
  54. package/components/__tests__/CollapsibleCard.test.ts +64 -0
  55. package/components/__tests__/ConsumptionGauge.test.ts +88 -0
  56. package/components/__tests__/CruResource.test.ts +3 -2
  57. package/components/__tests__/FixedBanner.test.ts +129 -0
  58. package/components/__tests__/GrowlManager.test.ts +147 -0
  59. package/components/__tests__/NamespaceFilter.test.ts +33 -25
  60. package/components/__tests__/PercentageBar.test.ts +32 -0
  61. package/components/__tests__/PodSecurityAdmission.test.ts +398 -0
  62. package/components/auth/AuthBanner.vue +20 -10
  63. package/components/auth/RoleDetailEdit.vue +26 -17
  64. package/components/auth/SelectPrincipal.vue +36 -5
  65. package/components/form/ArrayList.vue +3 -35
  66. package/components/form/ArrayListGrouped.vue +13 -4
  67. package/components/form/ArrayListSelect.vue +5 -5
  68. package/components/form/Error.vue +8 -0
  69. package/components/form/KeyValue.vue +39 -7
  70. package/components/form/LabeledSelect.vue +5 -2
  71. package/components/form/Labels.vue +46 -16
  72. package/components/form/Members/ClusterPermissionsEditor.vue +17 -17
  73. package/components/form/Members/MembershipEditor.vue +12 -12
  74. package/components/form/NameNsDescription.vue +1 -1
  75. package/components/form/NodeScheduling.vue +1 -1
  76. package/components/form/Probe.vue +3 -3
  77. package/components/form/ResourceQuota/Project.vue +6 -6
  78. package/components/form/ResourceTabs/index.vue +24 -6
  79. package/components/form/Security.vue +7 -6
  80. package/components/form/Select.vue +3 -2
  81. package/components/form/SelectOrCreateAuthSecret.vue +22 -29
  82. package/components/form/ServicePorts.vue +8 -0
  83. package/components/form/WorkloadPorts.vue +7 -1
  84. package/components/form/__tests__/ArrayList.test.ts +74 -0
  85. package/components/form/__tests__/ArrayListGrouped.test.ts +6 -4
  86. package/components/formatter/Checked.vue +1 -1
  87. package/components/formatter/ClusterLink.vue +5 -0
  88. package/components/formatter/IconIsDefault.vue +2 -2
  89. package/components/formatter/InternalExternalIP.vue +11 -8
  90. package/components/formatter/LiveDuration.vue +78 -0
  91. package/components/formatter/WorkloadHealthScale.vue +5 -3
  92. package/components/nav/Header.vue +74 -7
  93. package/components/nav/NamespaceFilter.vue +146 -63
  94. package/components/nav/TopLevelMenu.vue +22 -19
  95. package/components/nav/WindowManager/ContainerLogs.vue +83 -126
  96. package/components/nav/WindowManager/ContainerShell.vue +9 -7
  97. package/components/nav/WindowManager/Window.vue +2 -0
  98. package/components/nav/WindowManager/index.vue +10 -0
  99. package/config/elemental-types.js +9 -0
  100. package/config/features.js +2 -0
  101. package/config/home-links.js +4 -1
  102. package/config/pod-security-admission.ts +82 -0
  103. package/config/product/apps.js +1 -1
  104. package/config/product/auth.js +6 -5
  105. package/config/product/backup.js +1 -1
  106. package/config/product/explorer.js +6 -6
  107. package/config/product/fleet.js +1 -1
  108. package/config/product/manager.js +6 -2
  109. package/config/query-params.js +1 -0
  110. package/config/secret.js +0 -1
  111. package/config/settings.ts +26 -9
  112. package/config/table-headers.js +22 -11
  113. package/config/types.js +4 -1
  114. package/config/uiplugins.js +3 -3
  115. package/content/docs/zh-hans/getting-started.md +113 -137
  116. package/content/docs/zh-hans/whats-new.md +8 -46
  117. package/core/plugin-helpers.js +171 -0
  118. package/core/plugin.ts +61 -1
  119. package/core/plugins.js +33 -0
  120. package/core/types.ts +128 -2
  121. package/creators/pkg/package-lock.json +37 -0
  122. package/creators/pkg/package.json +1 -1
  123. package/detail/catalog.cattle.io.app.vue +1 -1
  124. package/detail/pod.vue +1 -1
  125. package/detail/provisioning.cattle.io.cluster.vue +35 -9
  126. package/detail/service.vue +2 -9
  127. package/detail/workload/index.vue +0 -1
  128. package/dialog/AddClusterMemberDialog.vue +22 -28
  129. package/dialog/AddProjectMemberDialog.vue +53 -9
  130. package/dialog/DiagnosticTimingsDialog.vue +8 -7
  131. package/dialog/DrainNode.vue +44 -48
  132. package/dialog/ForceMachineRemoveDialog.vue +5 -7
  133. package/dialog/GenericPrompt.vue +15 -20
  134. package/dialog/RollbackWorkloadDialog.vue +15 -46
  135. package/dialog/RotateCertificatesDialog.vue +5 -7
  136. package/dialog/RotateEncryptionKeyDialog.vue +5 -9
  137. package/dialog/SaveAsRKETemplateDialog.vue +5 -13
  138. package/dialog/ScaleMachineDownDialog.vue +1 -1
  139. package/dialog/ScalePoolDownDialog.vue +121 -0
  140. package/edit/__tests__/management.cattle.io.setting.test.ts +3 -3
  141. package/edit/auth/azuread.vue +16 -16
  142. package/edit/auth/github.vue +8 -0
  143. package/edit/auth/googleoauth.vue +10 -1
  144. package/edit/auth/ldap/index.vue +10 -0
  145. package/edit/auth/oidc.vue +10 -0
  146. package/edit/auth/saml.vue +10 -0
  147. package/edit/autoscaling.horizontalpodautoscaler/index.vue +1 -1
  148. package/edit/catalog.cattle.io.clusterrepo.vue +3 -0
  149. package/edit/cloudcredential.vue +3 -7
  150. package/edit/logging-flow/Match.vue +39 -8
  151. package/edit/logging-flow/index.vue +27 -4
  152. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +107 -0
  153. package/edit/management.cattle.io.project.vue +8 -1
  154. package/edit/management.cattle.io.setting.vue +5 -2
  155. package/edit/management.cattle.io.user.vue +7 -1
  156. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +36 -8
  157. package/edit/monitoring.coreos.com.alertmanagerconfig/types/email.vue +2 -2
  158. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +14 -6
  159. package/edit/namespace.vue +18 -4
  160. package/edit/networking.k8s.io.ingress/Certificate.vue +1 -0
  161. package/edit/networking.k8s.io.ingress/IngressClass.vue +8 -6
  162. package/edit/networking.k8s.io.ingress/RulePath.vue +12 -6
  163. package/edit/networking.k8s.io.ingress/index.vue +8 -6
  164. package/edit/persistentvolume/index.vue +30 -27
  165. package/edit/persistentvolume/plugins/cephfs.vue +29 -29
  166. package/edit/persistentvolume/plugins/csi.vue +102 -62
  167. package/edit/persistentvolume/plugins/fc.vue +19 -19
  168. package/edit/persistentvolume/plugins/iscsi.vue +45 -45
  169. package/edit/persistentvolume/plugins/rbd.vue +39 -39
  170. package/edit/persistentvolumeclaim.vue +78 -75
  171. package/edit/provisioning.cattle.io.cluster/MachinePool.vue +11 -7
  172. package/edit/provisioning.cattle.io.cluster/RegistryConfigs.vue +10 -1
  173. package/edit/provisioning.cattle.io.cluster/RegistryMirrors.vue +87 -27
  174. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +3 -6
  175. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +96 -0
  176. package/edit/provisioning.cattle.io.cluster/import.vue +1 -1
  177. package/edit/provisioning.cattle.io.cluster/index.vue +29 -6
  178. package/edit/provisioning.cattle.io.cluster/rke2.vue +445 -154
  179. package/edit/secret/index.vue +3 -7
  180. package/edit/service.vue +3 -1
  181. package/edit/storage.k8s.io.storageclass/index.vue +100 -16
  182. package/edit/storage.k8s.io.storageclass/provisioners/driver.harvesterhci.io.vue +114 -0
  183. package/edit/workload/__tests__/index.test.ts +98 -0
  184. package/edit/workload/index.vue +58 -8
  185. package/edit/workload/mixins/workload.js +107 -70
  186. package/edit/workload/storage/ContainerMountPaths.vue +0 -10
  187. package/edit/workload/storage/emptyDir.vue +88 -0
  188. package/edit/workload/storage/ephemeralVolume/index.vue +1 -1
  189. package/edit/workload/storage/index.vue +8 -0
  190. package/edit/workload/storage/persistentVolumeClaim/index.vue +1 -1
  191. package/layouts/default.vue +57 -44
  192. package/list/__tests__/workload.test.ts +5 -2
  193. package/list/catalog.cattle.io.app.vue +1 -0
  194. package/list/cis.cattle.io.clusterscan.vue +1 -0
  195. package/list/fleet.cattle.io.bundle.vue +5 -6
  196. package/list/fleet.cattle.io.cluster.vue +6 -3
  197. package/list/fleet.cattle.io.clusterregistrationtoken.vue +5 -6
  198. package/list/fleet.cattle.io.gitrepo.vue +4 -9
  199. package/list/helm.cattle.io.projecthelmchart.vue +1 -5
  200. package/list/logging.banzaicloud.io.clusterflow.vue +4 -1
  201. package/list/logging.banzaicloud.io.flow.vue +6 -5
  202. package/list/management.cattle.io.cluster.vue +1 -0
  203. package/list/management.cattle.io.feature.vue +3 -4
  204. package/list/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +47 -0
  205. package/list/management.cattle.io.setting.vue +2 -2
  206. package/list/management.cattle.io.user.vue +4 -10
  207. package/list/monitoring.coreos.com.alertmanagerconfig.vue +2 -7
  208. package/list/node.vue +8 -5
  209. package/list/persistentvolume.vue +3 -3
  210. package/list/persistentvolumeclaim.vue +3 -4
  211. package/list/provisioning.cattle.io.cluster.vue +18 -19
  212. package/list/service.vue +6 -14
  213. package/list/workload.vue +43 -38
  214. package/machine-config/azure.vue +429 -60
  215. package/machine-config/pnap.vue +288 -0
  216. package/mixins/auth-config.js +1 -3
  217. package/mixins/browser-tab-visibility.js +8 -14
  218. package/mixins/chart.js +1 -1
  219. package/mixins/create-edit-view/impl.js +4 -0
  220. package/mixins/create-edit-view/index.js +4 -2
  221. package/mixins/resource-fetch-namespaced.js +98 -0
  222. package/mixins/resource-fetch.js +79 -45
  223. package/mixins/resource-manager.js +1 -23
  224. package/models/apps.controllerrevision.js +7 -0
  225. package/models/apps.daemonset.js +18 -0
  226. package/models/apps.deployment.js +44 -0
  227. package/models/apps.replicaset.js +7 -0
  228. package/models/apps.statefulset.js +18 -0
  229. package/models/batch.job.js +7 -14
  230. package/models/cluster/node.js +10 -2
  231. package/models/cluster.x-k8s.io.machine.js +26 -4
  232. package/models/cluster.x-k8s.io.machinedeployment.js +12 -2
  233. package/models/event.js +7 -0
  234. package/models/logging.banzaicloud.io.flow.js +4 -0
  235. package/models/management.cattle.io.cluster.js +1 -1
  236. package/models/management.cattle.io.clusterroletemplatebinding.js +1 -1
  237. package/models/management.cattle.io.globalrole.js +2 -2
  238. package/models/management.cattle.io.node.js +37 -2
  239. package/models/management.cattle.io.podsecurityadmissionconfigurationtemplate.ts +4 -0
  240. package/models/management.cattle.io.project.js +30 -11
  241. package/models/management.cattle.io.setting.js +1 -1
  242. package/models/management.cattle.io.user.js +37 -1
  243. package/models/namespace.js +42 -5
  244. package/models/persistentvolume.js +14 -2
  245. package/models/pod.js +15 -0
  246. package/models/projectroletemplatebinding.js +7 -0
  247. package/models/provisioning.cattle.io.cluster.js +61 -10
  248. package/models/rke-machine.cattle.io.pnapmachinetemplate.js +15 -0
  249. package/models/service.js +14 -13
  250. package/models/storage.k8s.io.storageclass.js +33 -18
  251. package/models/workload.js +38 -7
  252. package/nuxt.config.js +27 -17
  253. package/package.json +7 -7
  254. package/pages/about.vue +14 -2
  255. package/pages/c/_cluster/apps/charts/index.vue +21 -3
  256. package/pages/c/_cluster/apps/charts/install.vue +59 -22
  257. package/pages/c/_cluster/auth/config/_id.vue +6 -0
  258. package/pages/c/_cluster/auth/config/index.vue +8 -6
  259. package/pages/c/_cluster/auth/group.principal/assign-edit.vue +1 -1
  260. package/pages/c/_cluster/auth/roles/index.vue +1 -1
  261. package/pages/c/_cluster/explorer/index.vue +51 -6
  262. package/pages/c/_cluster/longhorn/index.vue +1 -1
  263. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +15 -4
  264. package/pages/c/_cluster/monitoring/index.vue +1 -1
  265. package/pages/c/_cluster/neuvector/index.vue +1 -1
  266. package/pages/c/_cluster/settings/performance.vue +48 -2
  267. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +2 -0
  268. package/pages/c/_cluster/uiplugins/InstallDialog.vue +3 -0
  269. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +42 -2
  270. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +2 -0
  271. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +1 -0
  272. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +2 -0
  273. package/pages/c/_cluster/uiplugins/index.vue +42 -3
  274. package/pages/diagnostic.vue +5 -4
  275. package/pages/home.vue +105 -30
  276. package/pages/prefs.vue +23 -12
  277. package/pages/rio/mesh.vue +1 -1
  278. package/pkg/dynamic-importer.lib.js +8 -0
  279. package/pkg/vue.config.js +4 -0
  280. package/plugins/dashboard-store/__tests__/mutations.spec.js +406 -0
  281. package/plugins/dashboard-store/actions.js +32 -25
  282. package/plugins/dashboard-store/getters.js +50 -33
  283. package/plugins/dashboard-store/mutations.js +134 -28
  284. package/plugins/dashboard-store/resource-class.js +37 -42
  285. package/plugins/steve/actions.js +30 -0
  286. package/plugins/steve/caches/resourceCache.js +60 -0
  287. package/plugins/steve/getters.js +44 -1
  288. package/plugins/steve/mutations.js +97 -36
  289. package/plugins/steve/resourceWatcher.js +277 -0
  290. package/plugins/steve/schema.utils.js +25 -0
  291. package/plugins/steve/subscribe.js +288 -115
  292. package/plugins/steve/worker/index.js +17 -0
  293. package/plugins/steve/worker/web-worker.advanced.js +302 -0
  294. package/plugins/steve/{web-worker.steve-sub-worker.js → worker/web-worker.basic.js} +3 -44
  295. package/rancher-components/Card/Card.vue +3 -3
  296. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +1 -0
  297. package/rancher-components/StringList/StringList.test.ts +45 -420
  298. package/rancher-components/StringList/StringList.vue +1 -10
  299. package/rancher-components/components/Banner/Banner.test.ts +44 -0
  300. package/rancher-components/components/Banner/Banner.vue +130 -61
  301. package/rancher-components/components/Form/Checkbox/Checkbox.test.ts +13 -22
  302. package/rancher-components/components/Form/Checkbox/Checkbox.vue +8 -6
  303. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.test.ts +9 -9
  304. package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +0 -1
  305. package/rancher-components/components/StringList/StringList.test.ts +7 -7
  306. package/rancher-components/components/StringList/StringList.vue +21 -15
  307. package/scripts/test-plugins-build.sh +8 -0
  308. package/static/loading-indicator.html +1 -1
  309. package/store/action-menu.js +4 -3
  310. package/store/index.js +54 -3
  311. package/store/plugins.js +0 -17
  312. package/store/pnap.js +128 -0
  313. package/store/prefs.js +4 -2
  314. package/store/type-map.js +81 -13
  315. package/types/pod-security-admission.ts +36 -0
  316. package/types/shell/index.d.ts +497 -396
  317. package/utils/__tests__/object.test.ts +17 -1
  318. package/utils/__tests__/pod-security-admission.test.ts +61 -0
  319. package/utils/async.ts +36 -0
  320. package/utils/color.js +45 -0
  321. package/utils/crypto/browserHashUtils.js +18 -0
  322. package/utils/dynamic-importer.js +8 -0
  323. package/utils/install-redirect.js +1 -1
  324. package/utils/object.js +24 -0
  325. package/utils/pod-security-admission.ts +39 -0
  326. package/utils/socket.js +61 -24
  327. package/utils/string.js +2 -0
  328. package/utils/svg-filter.js +301 -0
  329. package/utils/time.js +49 -0
  330. package/utils/validators/cidr.js +4 -0
  331. package/utils/validators/formRules/__tests__/index.test.ts +23 -3
  332. package/utils/validators/formRules/index.ts +14 -0
  333. package/config/product/harvester-manager.js +0 -162
  334. package/edit/harvesterhci.io.management.cluster.vue +0 -153
  335. package/list/harvesterhci.io.management.cluster.vue +0 -241
  336. package/machine-config/harvester.vue +0 -693
  337. package/models/harvesterhci.io.management.cluster.js +0 -228
  338. package/pages/c/_cluster/harvesterManager/index.vue +0 -24
  339. package/rancher-components/Card/Card.test.ts +0 -39
  340. package/rancher-components/Utils/DraggableZone/DraggableZone.vue +0 -181
  341. package/rancher-components/Utils/DraggableZone/index.ts +0 -1
  342. package/rancher-components/components/Utils/DraggableZone/index.ts +0 -1
@@ -11,6 +11,9 @@ import { Checkbox } from '@components/Form/Checkbox';
11
11
  import ArrayList from '@shell/components/form/ArrayList';
12
12
  import { randomStr } from '@shell/utils/string';
13
13
  import { addParam, addParams } from '@shell/utils/url';
14
+ import KeyValue from '@shell/components/form/KeyValue';
15
+ import { RadioGroup } from '@components/Form/Radio';
16
+ import { _CREATE } from '@shell/config/query-params';
14
17
 
15
18
  export const azureEnvironments = [
16
19
  { value: 'AzurePublicCloud' },
@@ -20,33 +23,34 @@ export const azureEnvironments = [
20
23
  ];
21
24
 
22
25
  const defaultConfig = {
23
- availabilitySet: 'docker-machine',
24
- clientId: '',
25
- clientSecret: '',
26
- customData: '',
27
- diskSize: '30',
28
- dns: '',
29
- environment: 'AzurePublicCloud',
30
- faultDomainCount: '3',
31
- image: 'canonical:UbuntuServer:18.04-LTS:latest',
32
- location: 'westus',
33
- managedDisks: false,
34
- noPublicIp: false,
35
- nsg: null,
36
- privateIpAddress: null,
37
- resourceGroup: 'docker-machine',
38
- size: 'Standard_D2_v2',
39
- sshUser: 'docker-user',
40
- staticPublicIp: false,
41
- storageType: 'Standard_LRS',
42
- subnet: 'docker-machine',
43
- subnetPrefix: '192.168.0.0/16',
44
- subscriptionId: '',
45
- tenantId: '',
46
- updateDomainCount: '5',
47
- usePrivateIp: false,
48
- vnet: 'docker-machine-vnet',
49
- openPort: [
26
+ acceleratedNetworking: false,
27
+ availabilitySet: 'docker-machine',
28
+ clientId: '',
29
+ clientSecret: '',
30
+ customData: '',
31
+ diskSize: '30',
32
+ dns: '',
33
+ environment: 'AzurePublicCloud',
34
+ faultDomainCount: '3',
35
+ image: 'canonical:UbuntuServer:18.04-LTS:latest',
36
+ location: 'westus',
37
+ managedDisks: false,
38
+ noPublicIp: false,
39
+ nsg: null,
40
+ privateIpAddress: null,
41
+ resourceGroup: 'docker-machine',
42
+ size: 'Standard_D2_v2',
43
+ sshUser: 'docker-user',
44
+ staticPublicIp: false,
45
+ storageType: 'Standard_LRS',
46
+ subnet: 'docker-machine',
47
+ subnetPrefix: '192.168.0.0/16',
48
+ subscriptionId: '',
49
+ tenantId: '',
50
+ updateDomainCount: '5',
51
+ usePrivateIp: false,
52
+ vnet: 'docker-machine-vnet',
53
+ openPort: [
50
54
  '6443/tcp',
51
55
  '2379/tcp',
52
56
  '2380/tcp',
@@ -58,6 +62,7 @@ const defaultConfig = {
58
62
  '10251/tcp',
59
63
  '10252/tcp',
60
64
  ],
65
+ tags: null
61
66
  };
62
67
 
63
68
  const storageTypes = [
@@ -81,16 +86,23 @@ const storageTypes = [
81
86
  name: 'Premium LRS',
82
87
  value: 'Premium_LRS',
83
88
  },
89
+ {
90
+ name: 'Standard SSD LRS',
91
+ value: 'StandardSSD_LRS'
92
+ }
84
93
  ];
94
+ const DEFAULT_REGION = 'westus';
85
95
 
86
96
  export default {
87
97
  components: {
88
98
  ArrayList,
89
99
  Banner,
90
100
  Checkbox,
101
+ KeyValue,
91
102
  LabeledInput,
92
103
  LabeledSelect,
93
104
  Loading,
105
+ RadioGroup
94
106
  },
95
107
 
96
108
  mixins: [CreateEditView],
@@ -116,6 +128,7 @@ export default {
116
128
 
117
129
  async fetch() {
118
130
  this.errors = [];
131
+ this.initTags();
119
132
 
120
133
  try {
121
134
  const {
@@ -147,8 +160,15 @@ export default {
147
160
  method: 'GET',
148
161
  });
149
162
 
163
+ if (this.mode === _CREATE) {
164
+ this.value.location = DEFAULT_REGION;
165
+ }
166
+
150
167
  this.vmSizes = await this.$store.dispatch('management/request', {
151
- url: addParams('/meta/aksVMSizes', { cloudCredentialId: this.credentialId, region: 'westus' }),
168
+ url: addParams('/meta/aksVMSizesV2', {
169
+ cloudCredentialId: this.credentialId,
170
+ region: this.value.location
171
+ }),
152
172
  method: 'GET',
153
173
  });
154
174
  } catch (e) {
@@ -157,13 +177,24 @@ export default {
157
177
  },
158
178
 
159
179
  data() {
180
+ let useAvailabilitySet = false;
181
+
182
+ if (this.mode === _CREATE) {
183
+ useAvailabilitySet = true;
184
+ } else {
185
+ useAvailabilitySet = !!this.value.availabilitySet;
186
+ }
187
+
160
188
  return {
161
189
  azureEnvironments,
162
190
  defaultConfig,
163
191
  storageTypes,
164
192
  credential: null,
165
- locationOptions: null,
166
- vmSizes: null,
193
+ locationOptions: [],
194
+ loading: false,
195
+ useAvailabilitySet,
196
+ vmSizes: [],
197
+ valueCopy: this.value
167
198
  };
168
199
  },
169
200
 
@@ -173,8 +204,180 @@ export default {
173
204
  },
174
205
  },
175
206
 
207
+ computed: {
208
+ locationOptionsInDropdown() {
209
+ const locationOptionsCopy = [...this.locationOptions];
210
+
211
+ return locationOptionsCopy.sort((a, b) => {
212
+ // Hopefully it's easier to find a region if the list is in
213
+ // alphabetical order.
214
+ if (a.name > b.name) {
215
+ return 1;
216
+ }
217
+ if (a.name < b.name) {
218
+ return -1;
219
+ }
220
+
221
+ return 0;
222
+ } )
223
+ .map((option) => {
224
+ return {
225
+ displayName: `${ option.displayName } (${ option.name })`,
226
+ name: option.name,
227
+ };
228
+ });
229
+ },
230
+ vmsWithAcceleratedNetworking() {
231
+ return this.vmSizes.filter((vmData) => {
232
+ return vmData.AcceleratedNetworkingSupported;
233
+ });
234
+ },
235
+ vmsWithoutAcceleratedNetworking() {
236
+ return this.vmSizes.filter((vmData) => {
237
+ return !vmData.AcceleratedNetworkingSupported;
238
+ });
239
+ },
240
+ selectedVmSizeSupportsAN() {
241
+ const selectedSizeIsValid = !!this.vmsWithAcceleratedNetworking.find((vmData) => {
242
+ return this.value.size === vmData.Name;
243
+ });
244
+
245
+ return selectedSizeIsValid;
246
+ },
247
+ vmSizeAcceleratedNetworkingWarning() {
248
+ if (!this.selectedVmSizeSupportsAN && this.value.acceleratedNetworking) {
249
+ return this.t('cluster.machineConfig.azure.size.selectedSizeAcceleratedNetworkingWarning');
250
+ }
251
+
252
+ return '';
253
+ },
254
+ vmsWithAvailabilityZones() {
255
+ return this.vmSizes.filter((vmData) => {
256
+ return vmData.AvailabilityZones.length > 0;
257
+ });
258
+ },
259
+ vmSizeAvailabilityWarning() {
260
+ const selectedVmIsAvailableInSelectedRegion = this.vmSizes.filter((vmData) => {
261
+ return vmData.Name === this.value.size;
262
+ }).length > 0;
263
+
264
+ if (!selectedVmIsAvailableInSelectedRegion) {
265
+ return this.t('cluster.machineConfig.azure.size.availabilityWarning');
266
+ }
267
+
268
+ return '';
269
+ },
270
+ selectedVmSizeHasZones() {
271
+ const dataForSelectedSize = this.vmsWithAvailabilityZones.filter((vmData) => {
272
+ const { Name } = vmData;
273
+
274
+ return Name === this.value.size;
275
+ });
276
+
277
+ if (dataForSelectedSize.length > 0) {
278
+ return dataForSelectedSize[0].AvailabilityZones.length > 0;
279
+ }
280
+
281
+ return false;
282
+ },
283
+ vmAvailabilityZoneWarning() {
284
+ if (this.useAvailabilitySet) {
285
+ return '';
286
+ }
287
+ if (this.vmsWithAvailabilityZones.length === 0) {
288
+ /**
289
+ * Show UI warning: Availability zones are not supported in the selected
290
+ * region. Please select a different region or use an
291
+ * availability set instead.
292
+ */
293
+ return this.t('cluster.machineConfig.azure.size.regionDoesNotSupportAzs');
294
+ }
295
+
296
+ if (this.vmsWithAvailabilityZones.length > 0 && !this.selectedVmSizeHasZones) {
297
+ /**
298
+ * Show UI warning: The selected region does not support availability
299
+ * zones for the selected VM size. Please select a
300
+ * different region or VM size.
301
+ */
302
+ return this.t('cluster.machineConfig.azure.size.regionSupportsAzsButNotThisSize');
303
+ }
304
+
305
+ return '';
306
+ },
307
+ vmSizeOptionsForDropdown() {
308
+ // example vmSize option from backend:
309
+ // {
310
+ // AcceleratedNetworkingSupported: false,
311
+ // AvailabilityZones: [],
312
+ // Name: "Basic_A0"
313
+ // }
314
+
315
+ const out = [
316
+ { kind: 'group', label: this.t('cluster.machineConfig.azure.size.supportsAcceleratedNetworking') },
317
+ ...this.vmsWithAcceleratedNetworking,
318
+ { kind: 'group', label: this.t('cluster.machineConfig.azure.size.doesNotSupportAcceleratedNetworking') },
319
+ ...this.vmsWithoutAcceleratedNetworking,
320
+ ];
321
+
322
+ if (!this.selectedVmSizeExistsInSelectedRegion) {
323
+ out.push({
324
+ Name: this.value.size,
325
+ disabled: true
326
+ });
327
+ }
328
+
329
+ return out.map((vmData) => {
330
+ const { Name } = vmData;
331
+
332
+ if (vmData.kind === 'group') {
333
+ return vmData;
334
+ }
335
+
336
+ return {
337
+ label: Name,
338
+ value: Name,
339
+ disabled: vmData.disabled || false,
340
+ };
341
+ });
342
+ },
343
+ selectedVmSizeExistsInSelectedRegion() {
344
+ // If the user selects a region and then a VM size
345
+ // that does not exist in the region, the list of VM
346
+ // sizes will update, causing the selected VM size
347
+ // to disappear. A disappearing VM size seems like a
348
+ // bad UX, so this value allows the value to be
349
+ // added to the VM size dropdown, while an error message
350
+ // indicates that the size is invalid.
351
+ if (this.vmSizes.find((size) => {
352
+ return size.Name === this.value.size;
353
+ })) {
354
+ return true;
355
+ }
356
+
357
+ return false;
358
+ },
359
+ availableZones() {
360
+ const data = this.vmSizes.filter((vmData) => {
361
+ return vmData.Name === this.value.size;
362
+ });
363
+
364
+ if (data.length > 0) {
365
+ return data[0].AvailabilityZones.sort((a, b) => {
366
+ return a - b;
367
+ });
368
+ }
369
+
370
+ return [];
371
+ }
372
+ },
373
+
176
374
  created() {
177
375
  if (this.mode === 'create') {
376
+ for (const key in this.defaultConfig) {
377
+ if (this.value[key] === undefined) {
378
+ this.$set(this.value, key, this.defaultConfig[key]);
379
+ }
380
+ }
178
381
  merge(this.value, this.defaultConfig);
179
382
 
180
383
  this.value.nsg = `rancher-managed-${ randomStr(8) }`;
@@ -182,10 +385,81 @@ export default {
182
385
  },
183
386
 
184
387
  methods: {
388
+ getVmSizeOptionLabel(vmData) {
389
+ return vmData.label;
390
+ },
391
+ handleVmSizeInput($event) {
392
+ if (this.vmSizeAcceleratedNetworkingWarning) {
393
+ this.$emit('error', this.vmSizeAcceleratedNetworkingWarning);
394
+ }
395
+ },
185
396
  stringify,
397
+ async getVmSizes() {
398
+ this.loading = true;
399
+ // The list of VM sizes should update when the
400
+ // selected region is changed because different
401
+ // VMs are supported in different regions.
402
+
403
+ // Example vmSize option from backend:
404
+ // {
405
+ // AcceleratedNetworkingSupported: false,
406
+ // AvailabilityZones: [],
407
+ // Name: "Basic_A0"
408
+ // }
409
+ try {
410
+ this.vmSizes = await this.$store.dispatch('management/request', {
411
+ url: addParams('/meta/aksVMSizesV2', {
412
+ cloudCredentialId: this.credentialId,
413
+ region: this.value.location
414
+ }),
415
+ method: 'GET',
416
+ });
417
+ } catch (e) {
418
+ this.errors = exceptionToErrorsArray(e);
419
+ }
420
+ this.loading = false;
421
+ },
186
422
  setLocation(location) {
187
423
  this.value.location = location?.name;
424
+ this.getVmSizes();
188
425
  },
426
+ initTags() {
427
+ const parts = (this.value.tags || '').split(/,/);
428
+ const out = {};
429
+
430
+ let i = 0;
431
+
432
+ while ( i + 1 < parts.length ) {
433
+ const key = `${ parts[i] }`.trim();
434
+ const value = `${ parts[i + 1] }`.trim();
435
+
436
+ if ( key ) {
437
+ out[key] = value;
438
+ }
439
+
440
+ i += 2;
441
+ }
442
+
443
+ this.tags = out;
444
+ },
445
+
446
+ updateTags(tags) {
447
+ const ary = [];
448
+
449
+ for ( const k in tags ) {
450
+ ary.push(k, tags[k]);
451
+ }
452
+
453
+ this.$set(this.value, 'tags', ary.join(','));
454
+ },
455
+ handleAzChange() {
456
+ if (this.value.availabilitySet) {
457
+ // If an availability set exists, clear it out when
458
+ // an availability zone is selected. Otherwise the
459
+ // set will take precedent and the zone will not be saved.
460
+ this.value.availabilitySet = null;
461
+ }
462
+ }
189
463
  },
190
464
  };
191
465
  </script>
@@ -225,7 +499,7 @@ export default {
225
499
  <LabeledSelect
226
500
  :value="value.location"
227
501
  :mode="mode"
228
- :options="locationOptions"
502
+ :options="locationOptionsInDropdown"
229
503
  option-key="name"
230
504
  option-label="displayName"
231
505
  :searchable="true"
@@ -237,7 +511,7 @@ export default {
237
511
  </div>
238
512
  </div>
239
513
  <div class="row mt-20">
240
- <div class="col span-6">
514
+ <div class="col span-4">
241
515
  <LabeledInput
242
516
  v-model="value.resourceGroup"
243
517
  :mode="mode"
@@ -245,14 +519,52 @@ export default {
245
519
  :disabled="disabled"
246
520
  />
247
521
  </div>
248
- <div class="col span-6">
522
+
523
+ <div
524
+ v-if="useAvailabilitySet"
525
+ class="col span-4"
526
+ >
249
527
  <LabeledInput
250
528
  v-model="value.availabilitySet"
251
529
  :mode="mode"
252
530
  :label="t('cluster.machineConfig.azure.availabilitySet.label')"
531
+ :tooltip="t('cluster.machineConfig.azure.availabilitySet.description')"
253
532
  :disabled="disabled"
254
533
  />
255
534
  </div>
535
+ <div
536
+ v-if="!useAvailabilitySet"
537
+ class="col span-4"
538
+ >
539
+ <i
540
+ v-if="loading"
541
+ class="icon icon-spinner delayed-loader"
542
+ />
543
+ <LabeledSelect
544
+ v-else
545
+ v-model="value.availabilityZone"
546
+ :mode="mode"
547
+ :options="availableZones"
548
+ :label="t('cluster.machineConfig.azure.availabilityZone.label')"
549
+ :tooltip="t('cluster.machineConfig.azure.availabilityZone.description')"
550
+ :disabled="disabled || !!vmAvailabilityZoneWarning"
551
+ @input="handleAzChange"
552
+ />
553
+ <Banner
554
+ v-if="vmAvailabilityZoneWarning"
555
+ color="error"
556
+ :label="vmAvailabilityZoneWarning"
557
+ />
558
+ </div>
559
+ <div class="col span-4">
560
+ <RadioGroup
561
+ v-model="useAvailabilitySet"
562
+ name="etcd-s3"
563
+ :options="[true, false]"
564
+ :labels="[t('cluster.machineConfig.azure.availabilitySet.label'),t('cluster.machineConfig.azure.availabilityZone.label')]"
565
+ :mode="mode"
566
+ />
567
+ </div>
256
568
  </div>
257
569
  <hr class="mt-20">
258
570
  <div class="row mt-20">
@@ -266,40 +578,62 @@ export default {
266
578
  />
267
579
  </div>
268
580
  <div class="col span-6">
581
+ <i
582
+ v-if="loading"
583
+ class="icon icon-spinner delayed-loader"
584
+ />
269
585
  <LabeledSelect
586
+ v-else
270
587
  v-model="value.size"
271
588
  :mode="mode"
272
- :options="vmSizes"
589
+ :options="vmSizeOptionsForDropdown"
590
+ :get-option-label="getVmSizeOptionLabel"
273
591
  :searchable="true"
274
592
  :required="true"
275
593
  :label="t('cluster.machineConfig.azure.size.label')"
594
+ :tooltip="value.acceleratedNetworking ? t('cluster.machineConfig.azure.size.tooltip') : ''"
276
595
  :disabled="disabled"
596
+ @selecting="handleVmSizeInput"
597
+ />
598
+ <Banner
599
+ v-if="vmSizeAcceleratedNetworkingWarning"
600
+ color="error"
601
+ :label="vmSizeAcceleratedNetworkingWarning"
602
+ />
603
+ <Banner
604
+ v-else-if="vmSizeAvailabilityWarning"
605
+ color="error"
606
+ :label="vmSizeAvailabilityWarning"
277
607
  />
278
608
  </div>
279
609
  </div>
280
610
 
281
611
  <portal :to="'advanced-' + uuid">
282
- <div class="row mt-20">
283
- <div class="col span-6">
284
- <LabeledInput
285
- v-model="value.faultDomainCount"
286
- :mode="mode"
287
- :label="t('cluster.machineConfig.azure.faultDomainCount.label')"
288
- :tooltip="t('cluster.machineConfig.azure.faultDomainCount.help')"
289
- :disabled="disabled"
290
- />
291
- </div>
292
- <div class="col span-6">
293
- <LabeledInput
294
- v-model="value.updateDomainCount"
295
- :mode="mode"
296
- :label="t('cluster.machineConfig.azure.updateDomainCount.label')"
297
- :tooltip="t('cluster.machineConfig.azure.updateDomainCount.help')"
298
- :disabled="disabled"
299
- />
612
+ <div v-if="useAvailabilitySet">
613
+ <h2>Availability Set Configuration</h2>
614
+ <div class="row mt-20">
615
+ <div class="col span-6">
616
+ <LabeledInput
617
+ v-model="value.faultDomainCount"
618
+ :mode="mode"
619
+ :label="t('cluster.machineConfig.azure.faultDomainCount.label')"
620
+ :tooltip="t('cluster.machineConfig.azure.faultDomainCount.help')"
621
+ :disabled="disabled"
622
+ />
623
+ </div>
624
+ <div class="col span-6">
625
+ <LabeledInput
626
+ v-model="value.updateDomainCount"
627
+ :mode="mode"
628
+ :label="t('cluster.machineConfig.azure.updateDomainCount.label')"
629
+ :tooltip="t('cluster.machineConfig.azure.updateDomainCount.help')"
630
+ :disabled="disabled"
631
+ />
632
+ </div>
300
633
  </div>
301
634
  </div>
302
- <hr class="mt-20">
635
+ <hr class="mt-20 mb-20">
636
+ <h2>Purchase Plan</h2>
303
637
  <div class="row mt-20">
304
638
  <div class="col span-6">
305
639
  <LabeledInput
@@ -311,7 +645,8 @@ export default {
311
645
  />
312
646
  </div>
313
647
  </div>
314
- <hr class="mt-20">
648
+ <hr class="mt-20 mb-20">
649
+ <h2>Network</h2>
315
650
  <div class="row mt-20">
316
651
  <div class="col span-6">
317
652
  <LabeledInput
@@ -330,6 +665,19 @@ export default {
330
665
  />
331
666
  </div>
332
667
  </div>
668
+ <div class="row mt-20">
669
+ <Checkbox
670
+ v-model="value.acceleratedNetworking"
671
+ :disabled="(!value.acceleratedNetworking && !selectedVmSizeSupportsAN)"
672
+ :mode="mode"
673
+ :label="t('cluster.machineConfig.azure.acceleratedNetworking.label')"
674
+ />
675
+ </div>
676
+ <Banner
677
+ v-if="!selectedVmSizeSupportsAN && value.acceleratedNetworking"
678
+ color="error"
679
+ :label="t('cluster.machineConfig.azure.size.selectedSizeAcceleratedNetworkingWarning')"
680
+ />
333
681
  <div class="row mt-20">
334
682
  <div class="col span-6">
335
683
  <LabeledInput
@@ -392,7 +740,8 @@ export default {
392
740
  />
393
741
  </div>
394
742
  </div>
395
- <hr class="mt-20">
743
+ <hr class="mt-20 mb-20">
744
+ <h2>Disks</h2>
396
745
  <div class="row mt-20">
397
746
  <div class="col span-6">
398
747
  <LabeledSelect
@@ -406,9 +755,12 @@ export default {
406
755
  option-key="value"
407
756
  option-label="name"
408
757
  />
758
+ <Banner
759
+ v-if="value.storageType === 'StandardSSD_LRS' && !value.managedDisks"
760
+ color="error"
761
+ :label="t('cluster.machineConfig.azure.storageType.warning')"
762
+ />
409
763
  </div>
410
- </div>
411
- <div class="row mt-20">
412
764
  <div class="col span-6">
413
765
  <Checkbox
414
766
  v-model="value.managedDisks"
@@ -416,16 +768,17 @@ export default {
416
768
  :label="t('cluster.machineConfig.azure.managedDisks.label')"
417
769
  :disabled="disabled"
418
770
  />
771
+ </div>
772
+ </div>
773
+ <div class="row mt-20">
774
+ <div class="col span-6">
419
775
  <LabeledInput
420
776
  v-model="value.diskSize"
421
777
  :mode="mode"
422
- class="mt-10"
423
778
  :label="t('cluster.machineConfig.azure.managedDisksSize.label')"
424
779
  :disabled="disabled"
425
780
  />
426
781
  </div>
427
- </div>
428
- <div class="row mt-20">
429
782
  <div class="col span-6">
430
783
  <LabeledInput
431
784
  v-model="value.sshUser"
@@ -449,6 +802,22 @@ export default {
449
802
  />
450
803
  </div>
451
804
  </div>
805
+
806
+ <div class="row mt-20">
807
+ <div class="col span-12">
808
+ <h3><t k="cluster.machineConfig.azure.tags.label" /></h3>
809
+ <KeyValue
810
+ :value="tags"
811
+ :mode="mode"
812
+ :read-allowed="false"
813
+ :label="t('cluster.machineConfig.amazonEc2.tagTitle')"
814
+ :add-label="t('labels.addTag')"
815
+ :initial-empty-row="true"
816
+ :disabled="disabled"
817
+ @input="updateTags"
818
+ />
819
+ </div>
820
+ </div>
452
821
  </portal>
453
822
  </div>
454
823
  </template>