@rancher/shell 0.4.0 → 0.5.0

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 (274) hide show
  1. package/assets/images/providers/ovhcloudmks.svg +122 -0
  2. package/assets/images/providers/ovhcloudpubliccloud.svg +122 -0
  3. package/assets/styles/global/_layout.scss +99 -0
  4. package/assets/translations/en-us.yaml +30 -5
  5. package/assets/translations/zh-hans.yaml +1 -1
  6. package/babel.config.js +7 -1
  7. package/chart/monitoring/alerting/index.vue +7 -21
  8. package/chart/monitoring/grafana/index.vue +55 -0
  9. package/chart/monitoring/index.vue +51 -17
  10. package/chart/monitoring/prometheus/index.vue +37 -43
  11. package/chart/rancher-backup/index.vue +2 -1
  12. package/cloud-credential/azure.vue +4 -17
  13. package/components/AsyncButton.vue +17 -5
  14. package/components/Certificates.vue +164 -0
  15. package/components/CodeMirror.vue +19 -21
  16. package/components/CruResource.vue +1 -0
  17. package/components/DraggableZone.vue +2 -2
  18. package/components/EtcdInfoBanner.vue +1 -1
  19. package/components/ExplorerProjectsNamespaces.vue +25 -1
  20. package/components/IconOrSvg.vue +1 -1
  21. package/components/LandingPagePreference.vue +1 -4
  22. package/components/PodSecurityAdmission.vue +2 -2
  23. package/components/Questions/index.vue +1 -1
  24. package/components/ResourceDetail/Masthead.vue +16 -3
  25. package/components/ResourceTable.vue +14 -2
  26. package/components/ResourceYaml.vue +5 -0
  27. package/components/SideNav.vue +1 -1
  28. package/components/SingleClusterInfo.vue +1 -4
  29. package/components/Tabbed/index.vue +12 -0
  30. package/components/fleet/FleetRepos.vue +62 -27
  31. package/components/fleet/FleetResources.vue +6 -1
  32. package/components/form/ArrayListSelect.vue +10 -0
  33. package/components/form/Error.vue +3 -3
  34. package/components/form/Footer.vue +2 -2
  35. package/components/form/GitPicker.vue +83 -38
  36. package/components/form/KeyValue.vue +4 -0
  37. package/components/form/LabeledSelect.vue +4 -0
  38. package/components/formatter/Checked.vue +11 -3
  39. package/components/formatter/FleetClusterSummaryGraph.vue +27 -0
  40. package/components/formatter/FleetSummaryGraph.vue +23 -11
  41. package/components/formatter/LiveDuration.vue +1 -1
  42. package/components/formatter/PercentageBar.vue +1 -1
  43. package/components/formatter/__tests__/Checked.test.ts +19 -0
  44. package/components/nav/Group.vue +2 -2
  45. package/components/nav/Header.vue +0 -1
  46. package/components/nav/TopLevelMenu.vue +36 -6
  47. package/components/nav/Type.vue +1 -3
  48. package/components/nav/WindowManager/ContainerLogs.vue +101 -3
  49. package/components/nav/WindowManager/ContainerShell.vue +6 -1
  50. package/components/nav/WindowManager/__tests__/ContainerLogs.test.ts +186 -0
  51. package/components/nav/WindowManager/index.vue +11 -10
  52. package/components/nav/__tests__/TopLevelMenu.test.ts +33 -0
  53. package/components/nav/__tests__/Type.test.ts +1 -1
  54. package/components/nuxt/nuxt-child.js +14 -78
  55. package/components/nuxt/nuxt.js +1 -1
  56. package/{layouts → components/templates}/blank.vue +1 -1
  57. package/{layouts → components/templates}/default.vue +8 -98
  58. package/{layouts → components/templates}/error.vue +10 -19
  59. package/{layouts → components/templates}/home.vue +4 -1
  60. package/{layouts → components/templates}/plain.vue +4 -1
  61. package/{layouts → components/templates}/standalone.vue +1 -1
  62. package/{layouts → components/templates}/unauthenticated.vue +1 -1
  63. package/composables/useCompactInput.test.ts +36 -0
  64. package/composables/useCompactInput.ts +20 -0
  65. package/composables/useLabeledFormElement.test.ts +135 -0
  66. package/composables/useLabeledFormElement.ts +138 -0
  67. package/config/harvester-manager-types.js +2 -0
  68. package/config/private-label.js +22 -0
  69. package/config/product/explorer.js +3 -0
  70. package/config/product/fleet.js +6 -1
  71. package/config/product/manager.js +8 -2
  72. package/config/query-params.js +1 -0
  73. package/config/router.js +385 -364
  74. package/config/settings.ts +1 -0
  75. package/config/store.js +1 -1
  76. package/config/system-namespaces.js +3 -0
  77. package/config/table-headers.js +47 -0
  78. package/core/plugin-routes.ts +56 -114
  79. package/core/plugin.ts +16 -10
  80. package/core/plugins-loader.js +7 -9
  81. package/core/plugins.js +0 -3
  82. package/creators/app/files/.gitlab-ci.yml +1 -1
  83. package/detail/fleet.cattle.io.cluster.vue +11 -1
  84. package/detail/provisioning.cattle.io.cluster.vue +4 -3
  85. package/dialog/ScaleMachineDownDialog.vue +34 -17
  86. package/edit/__tests__/service.test.ts +89 -0
  87. package/edit/auth/googleoauth.vue +1 -5
  88. package/edit/cloudcredential.vue +2 -0
  89. package/edit/configmap.vue +2 -1
  90. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +2 -2
  91. package/edit/networking.k8s.io.networkpolicy/__tests__/PolicyRuleTarget.spec.ts +1 -1
  92. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +15 -7
  93. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +112 -0
  94. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +473 -0
  95. package/edit/provisioning.cattle.io.cluster/__tests__/{CustomCommand.tests.ts → CustomCommand.test.ts} +4 -0
  96. package/edit/provisioning.cattle.io.cluster/__tests__/DrainOptions.test.ts +1 -1
  97. package/edit/provisioning.cattle.io.cluster/__tests__/index.test.ts +73 -0
  98. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +7 -1
  99. package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +386 -0
  100. package/edit/provisioning.cattle.io.cluster/import.vue +2 -2
  101. package/edit/provisioning.cattle.io.cluster/index.vue +92 -36
  102. package/edit/provisioning.cattle.io.cluster/rke2.vue +171 -583
  103. package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +137 -0
  104. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +157 -0
  105. package/edit/provisioning.cattle.io.cluster/{Basics.vue → tabs/Basics.vue} +94 -19
  106. package/edit/provisioning.cattle.io.cluster/{MachinePool.vue → tabs/MachinePool.vue} +1 -0
  107. package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +135 -0
  108. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +189 -0
  109. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +144 -0
  110. package/edit/provisioning.cattle.io.cluster/tabs/upgrade/index.vue +76 -0
  111. package/edit/service.vue +12 -0
  112. package/edit/workload/mixins/workload.js +1 -1
  113. package/initialize/App.js +25 -71
  114. package/initialize/client.js +21 -162
  115. package/initialize/index.js +27 -123
  116. package/list/management.cattle.io.feature.vue +1 -7
  117. package/list/node.vue +1 -0
  118. package/machine-config/__tests__/vmwarevsphere.test.ts +100 -21
  119. package/machine-config/vmwarevsphere.vue +73 -51
  120. package/middleware/authenticated.js +10 -17
  121. package/mixins/auth-config.js +2 -7
  122. package/mixins/brand.js +29 -41
  123. package/mixins/create-edit-view/index.js +2 -2
  124. package/mixins/labeled-form-element.ts +6 -1
  125. package/models/__tests__/management.cattle.io.node.ts +85 -0
  126. package/models/__tests__/management.cattle.io.nodepool.ts +83 -0
  127. package/models/__tests__/namespace.test.ts +49 -9
  128. package/models/__tests__/workload.test.ts +91 -0
  129. package/models/cluster/node.js +4 -4
  130. package/models/cluster.x-k8s.io.machinedeployment.js +14 -0
  131. package/models/fleet.cattle.io.cluster.js +4 -0
  132. package/models/fleet.cattle.io.gitrepo.js +56 -13
  133. package/models/management.cattle.io.kontainerdriver.js +1 -1
  134. package/models/management.cattle.io.node.js +18 -14
  135. package/models/management.cattle.io.nodepool.js +17 -0
  136. package/models/namespace.js +1 -1
  137. package/models/pod.js +20 -0
  138. package/models/provisioning.cattle.io.cluster.js +20 -3
  139. package/models/secret.js +117 -18
  140. package/models/workload.js +16 -0
  141. package/models/workload.service.js +18 -0
  142. package/package.json +10 -9
  143. package/pages/about.vue +0 -1
  144. package/pages/account/create-key.vue +0 -1
  145. package/pages/account/index.vue +0 -1
  146. package/pages/auth/login.vue +0 -1
  147. package/pages/auth/logout.vue +0 -2
  148. package/pages/auth/setup.vue +0 -4
  149. package/pages/auth/verify.vue +14 -8
  150. package/pages/c/_cluster/apps/charts/install.vue +4 -4
  151. package/pages/c/_cluster/apps/index.vue +0 -2
  152. package/pages/c/_cluster/auth/index.vue +0 -2
  153. package/pages/c/_cluster/ecm/index.vue +0 -2
  154. package/pages/c/_cluster/explorer/index.vue +28 -2
  155. package/pages/c/_cluster/fleet/index.vue +1 -1
  156. package/pages/c/_cluster/index.vue +0 -2
  157. package/pages/c/_cluster/settings/banners.vue +0 -2
  158. package/pages/c/_cluster/settings/brand.vue +0 -2
  159. package/pages/c/_cluster/settings/index.vue +0 -2
  160. package/pages/c/_cluster/settings/links.vue +0 -1
  161. package/pages/c/_cluster/settings/performance.vue +0 -1
  162. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +2 -1
  163. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +10 -46
  164. package/pages/c/_cluster/uiplugins/index.vue +0 -2
  165. package/pages/diagnostic.vue +1 -2
  166. package/pages/fail-whale.vue +0 -1
  167. package/pages/prefs.vue +0 -1
  168. package/pages/support/index.vue +2 -8
  169. package/pkg/auto-import.js +1 -1
  170. package/plugins/axios.js +0 -36
  171. package/plugins/back-button.js +3 -5
  172. package/plugins/codemirror-loader.js +1 -1
  173. package/plugins/codemirror.js +41 -0
  174. package/plugins/dashboard-store/__tests__/{mutations.spec.ts → mutations.test.ts} +1 -1
  175. package/plugins/dashboard-store/__tests__/resource-class.test.ts +49 -0
  176. package/plugins/dashboard-store/__tests__/utils/store-mocks.ts +7 -0
  177. package/plugins/dashboard-store/actions.js +30 -4
  178. package/plugins/dashboard-store/classify.js +1 -18
  179. package/plugins/dashboard-store/getters.js +10 -5
  180. package/plugins/dashboard-store/index.js +0 -12
  181. package/plugins/dashboard-store/mutations.js +0 -4
  182. package/plugins/dashboard-store/resource-class.js +59 -18
  183. package/plugins/steve/__tests__/steve-class.spec.ts +59 -0
  184. package/plugins/steve/__tests__/utils/steve-mocks.ts +31 -0
  185. package/plugins/steve/getters.js +4 -1
  186. package/plugins/steve/norman-class.js +19 -0
  187. package/plugins/steve/steve-class.js +22 -0
  188. package/plugins/steve/subscribe.js +4 -10
  189. package/rancher-components/Accordion/Accordion.test.ts +45 -0
  190. package/rancher-components/Accordion/Accordion.vue +86 -0
  191. package/rancher-components/Accordion/index.ts +1 -0
  192. package/rancher-components/BadgeState/BadgeState.vue +3 -3
  193. package/rancher-components/Banner/Banner.vue +2 -2
  194. package/rancher-components/Card/Card.vue +3 -3
  195. package/rancher-components/Form/Checkbox/Checkbox.vue +3 -3
  196. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +18 -1
  197. package/rancher-components/Form/LabeledInput/LabeledInput.vue +65 -24
  198. package/rancher-components/Form/Radio/RadioButton.test.ts +7 -3
  199. package/rancher-components/Form/Radio/RadioButton.vue +13 -7
  200. package/rancher-components/Form/Radio/RadioGroup.test.ts +30 -0
  201. package/rancher-components/Form/Radio/RadioGroup.vue +8 -3
  202. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +6 -4
  203. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  204. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
  205. package/rancher-components/StringList/StringList.test.ts +270 -0
  206. package/rancher-components/StringList/StringList.vue +65 -26
  207. package/rancher-components/components/Accordion/Accordion.test.ts +45 -0
  208. package/rancher-components/components/Accordion/Accordion.vue +86 -0
  209. package/rancher-components/components/Accordion/index.ts +1 -0
  210. package/rancher-components/components/BadgeState/BadgeState.vue +3 -3
  211. package/rancher-components/components/Banner/Banner.vue +2 -2
  212. package/rancher-components/components/Card/Card.vue +3 -3
  213. package/rancher-components/components/Form/Checkbox/Checkbox.vue +3 -3
  214. package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +18 -1
  215. package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +57 -24
  216. package/rancher-components/components/Form/Radio/RadioButton.vue +13 -7
  217. package/rancher-components/components/Form/Radio/RadioGroup.vue +4 -3
  218. package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +6 -4
  219. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  220. package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +9 -4
  221. package/rancher-components/components/StringList/StringList.vue +8 -8
  222. package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +50 -0
  223. package/scripts/extension/parse-tag-name +2 -2
  224. package/scripts/publish-shell.sh +10 -0
  225. package/scripts/test-plugins-build.sh +85 -9
  226. package/server/har-file.js +183 -0
  227. package/store/catalog.js +1 -1
  228. package/store/features.js +1 -0
  229. package/store/i18n.js +11 -0
  230. package/store/index.js +10 -11
  231. package/store/prefs.js +33 -35
  232. package/store/type-map.js +8 -7
  233. package/tsconfig.json +35 -9
  234. package/tsconfig.paths.json +21 -0
  235. package/types/shell/index.d.ts +427 -234
  236. package/types/vue-shim.d.ts +42 -0
  237. package/utils/__tests__/create-yaml.test.ts +60 -0
  238. package/utils/axios.js +0 -19
  239. package/utils/azure.js +24 -0
  240. package/utils/create-yaml.js +17 -10
  241. package/utils/git.ts +1 -1
  242. package/utils/monitoring.js +1 -1
  243. package/utils/nuxt.js +18 -39
  244. package/utils/object.js +14 -0
  245. package/utils/router.scrollBehavior.js +12 -14
  246. package/utils/time.js +1 -1
  247. package/utils/url.ts +1 -1
  248. package/vue.config.js +23 -2
  249. package/.DS_Store +0 -0
  250. package/assets/images/providers/aks-black.svg +0 -28
  251. package/assets/images/providers/aks.svg +0 -31
  252. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.tests.ts +0 -234
  253. package/initialize/layouts.ts +0 -26
  254. package/mixins/fetch.server.js +0 -73
  255. package/pages/c/index.vue +0 -9
  256. package/pages/rio/mesh.vue +0 -508
  257. package/plugins/transitions.js +0 -4
  258. package/scripts/.DS_Store +0 -0
  259. package/scripts/verdaccio.log +0 -205
  260. package/tsconfig.default.json +0 -46
  261. package/yarn-error.log +0 -200
  262. /package/components/form/__tests__/{NameNsDescription.ts → NameNsDescription.test.ts} +0 -0
  263. /package/edit/networking.k8s.io.networkpolicy/__tests__/utils/{selectors.ts → selectors.test.ts} +0 -0
  264. /package/edit/provisioning.cattle.io.cluster/{AgentConfiguration.vue → tabs/AgentConfiguration.vue} +0 -0
  265. /package/edit/provisioning.cattle.io.cluster/{MemberRoles.vue → tabs/MemberRoles.vue} +0 -0
  266. /package/edit/provisioning.cattle.io.cluster/{S3Config.vue → tabs/etcd/S3Config.vue} +0 -0
  267. /package/edit/provisioning.cattle.io.cluster/{ACE.vue → tabs/networking/ACE.vue} +0 -0
  268. /package/edit/provisioning.cattle.io.cluster/{RegistryConfigs.vue → tabs/registries/RegistryConfigs.vue} +0 -0
  269. /package/edit/provisioning.cattle.io.cluster/{RegistryMirrors.vue → tabs/registries/RegistryMirrors.vue} +0 -0
  270. /package/edit/provisioning.cattle.io.cluster/{DrainOptions.vue → tabs/upgrade/DrainOptions.vue} +0 -0
  271. /package/plugins/dashboard-store/__tests__/{actions.spec.ts → actions.test.ts} +0 -0
  272. /package/plugins/dashboard-store/__tests__/{getters.spec.ts → getters.test.ts} +0 -0
  273. /package/rancher-components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
  274. /package/rancher-components/components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
@@ -27,55 +27,42 @@ import {
27
27
  import { allHash } from '@shell/utils/promise';
28
28
  import { sortBy } from '@shell/utils/sort';
29
29
 
30
- import { camelToTitle } from '@shell/utils/string';
31
30
  import { compare, sortable } from '@shell/utils/version';
32
31
  import { isHarvesterSatisfiesVersion } from '@shell/utils/cluster';
33
32
 
34
- import ArrayList from '@shell/components/form/ArrayList';
35
- import ArrayListGrouped from '@shell/components/form/ArrayListGrouped';
36
33
  import { BadgeState } from '@components/BadgeState';
37
34
  import { Banner } from '@components/Banner';
38
- import { Checkbox } from '@components/Form/Checkbox';
39
35
  import CruResource, { CONTEXT_HOOK_EDIT_YAML } from '@shell/components/CruResource';
40
- import { LabeledInput } from '@components/Form/LabeledInput';
41
- import LabeledSelect from '@shell/components/form/LabeledSelect';
42
36
  import Loading from '@shell/components/Loading';
43
- import MatchExpressions from '@shell/components/form/MatchExpressions';
44
37
  import NameNsDescription from '@shell/components/form/NameNsDescription';
45
- import { RadioGroup } from '@components/Form/Radio';
46
38
  import Tab from '@shell/components/Tabbed/Tab';
47
39
  import Tabbed from '@shell/components/Tabbed';
48
- import UnitInput from '@shell/components/form/UnitInput';
49
- import YamlEditor from '@shell/components/YamlEditor';
50
- import Questions from '@shell/components/Questions';
51
40
 
52
41
  import { canViewClusterMembershipEditor } from '@shell/components/form/Members/ClusterMembershipEditor';
53
- import SelectOrCreateAuthSecret from '@shell/components/form/SelectOrCreateAuthSecret';
54
42
  import semver from 'semver';
55
43
 
56
44
  import { SETTING } from '@shell/config/settings';
57
45
  import { base64Encode } from '@shell/utils/crypto';
58
46
  import { CAPI as CAPI_ANNOTATIONS } from '@shell/config/labels-annotations';
59
- import ACE from './ACE';
60
- import AgentEnv from './AgentEnv';
61
- import DrainOptions from './DrainOptions';
62
- import Labels from './Labels';
63
- import MachinePool from './MachinePool';
64
- import RegistryConfigs from './RegistryConfigs';
65
- import RegistryMirrors from './RegistryMirrors';
66
- import S3Config from './S3Config';
47
+ import AgentEnv from '@shell/edit/provisioning.cattle.io.cluster/AgentEnv';
48
+ import Labels from '@shell/edit/provisioning.cattle.io.cluster/Labels';
49
+ import MachinePool from '@shell/edit/provisioning.cattle.io.cluster/tabs/MachinePool';
67
50
  import SelectCredential from './SelectCredential';
68
- import AdvancedSection from '@shell/components/AdvancedSection.vue';
69
51
  import { ELEMENTAL_SCHEMA_IDS, KIND, ELEMENTAL_CLUSTER_PROVIDER } from '../../config/elemental-types';
70
- import AgentConfiguration from './AgentConfiguration';
52
+ import AgentConfiguration from '@shell/edit/provisioning.cattle.io.cluster/tabs/AgentConfiguration';
71
53
  import { getApplicableExtensionEnhancements } from '@shell/core/plugin-helpers';
72
54
  import { ExtensionPoint, TabLocation } from '@shell/core/types';
73
- import MemberRoles from '@shell/edit/provisioning.cattle.io.cluster/MemberRoles';
74
- import Basics from '@shell/edit/provisioning.cattle.io.cluster/Basics';
55
+ import MemberRoles from '@shell/edit/provisioning.cattle.io.cluster/tabs/MemberRoles';
56
+ import Basics from '@shell/edit/provisioning.cattle.io.cluster/tabs/Basics';
57
+ import Etcd from '@shell/edit/provisioning.cattle.io.cluster/tabs/etcd';
58
+ import Networking from '@shell/edit/provisioning.cattle.io.cluster/tabs/networking';
59
+ import Upgrade from '@shell/edit/provisioning.cattle.io.cluster/tabs/upgrade';
60
+ import Registries from '@shell/edit/provisioning.cattle.io.cluster/tabs/registries';
61
+ import AddOnConfig from '@shell/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig';
62
+ import Advanced from '@shell/edit/provisioning.cattle.io.cluster/tabs/Advanced';
75
63
 
76
64
  const HARVESTER = 'harvester';
77
65
  const HARVESTER_CLOUD_PROVIDER = 'harvester-cloud-provider';
78
-
79
66
  const NETBIOS_TRUNCATION_LENGTH = 15;
80
67
 
81
68
  /**
@@ -100,37 +87,26 @@ const FLEET_AGENT_CUSTOMIZATION = 'fleetAgentDeploymentCustomization';
100
87
 
101
88
  export default {
102
89
  components: {
103
- ACE,
104
- AdvancedSection,
105
90
  AgentEnv,
106
- ArrayList,
107
- ArrayListGrouped,
108
91
  BadgeState,
109
92
  Banner,
110
- Checkbox,
111
93
  AgentConfiguration,
112
94
  CruResource,
113
- DrainOptions,
114
- LabeledInput,
115
- LabeledSelect,
116
95
  Labels,
117
96
  Loading,
118
97
  MachinePool,
119
- MatchExpressions,
120
98
  NameNsDescription,
121
- Questions,
122
- RadioGroup,
123
- RegistryConfigs,
124
- RegistryMirrors,
125
- S3Config,
126
99
  SelectCredential,
127
- SelectOrCreateAuthSecret,
128
100
  Tab,
129
101
  Tabbed,
130
- UnitInput,
131
- YamlEditor,
132
102
  MemberRoles,
133
- Basics
103
+ Basics,
104
+ Etcd,
105
+ Networking,
106
+ Upgrade,
107
+ Registries,
108
+ AddOnConfig,
109
+ Advanced
134
110
  },
135
111
 
136
112
  mixins: [CreateEditView, FormValidation],
@@ -193,7 +169,7 @@ export default {
193
169
  set(this.value.spec, 'rkeConfig.machineSelectorConfig', [{ config: {} }]);
194
170
  }
195
171
 
196
- const truncateLimit = this.value.defaultHostnameLengthLimit;
172
+ const truncateLimit = this.value.defaultHostnameLengthLimit || 0;
197
173
 
198
174
  return {
199
175
  loadedOnce: false,
@@ -225,13 +201,11 @@ export default {
225
201
  userChartValues: {},
226
202
  userChartValuesTemp: {},
227
203
  addonsRev: 0,
228
- clusterIsAlreadyCreated: !!this.value.id,
229
204
  fvFormRuleSets: [{
230
205
  path: 'metadata.name', rules: ['subDomain'], translationKey: 'nameNsDescription.name.label'
231
206
  }],
232
207
  harvesterVersionRange: {},
233
208
  cisOverride: false,
234
- truncateHostnames: truncateLimit === NETBIOS_TRUNCATION_LENGTH,
235
209
  truncateLimit,
236
210
  busy: false,
237
211
  machinePoolValidation: {}, // map of validation states for each machine pool
@@ -243,25 +217,14 @@ export default {
243
217
  },
244
218
 
245
219
  computed: {
246
-
247
220
  rkeConfig() {
248
221
  return this.value.spec.rkeConfig;
249
222
  },
250
223
 
251
- hostnameTruncationManuallySet() {
252
- return this.truncateLimit && this.truncateLimit !== NETBIOS_TRUNCATION_LENGTH;
253
- },
254
-
255
224
  isElementalCluster() {
256
225
  return this.provider === ELEMENTAL_CLUSTER_PROVIDER || this.value?.machineProvider?.toLowerCase() === KIND.MACHINE_INV_SELECTOR_TEMPLATES.toLowerCase();
257
226
  },
258
227
 
259
- advancedTitleAlt() {
260
- const machineSelectorLength = this.rkeConfig.machineSelectorConfig.length;
261
-
262
- return this.t('cluster.advanced.argInfo.machineSelector.titleAlt', { count: machineSelectorLength });
263
- },
264
-
265
228
  chartValues() {
266
229
  return this.value.spec.rkeConfig.chartValues;
267
230
  },
@@ -351,10 +314,6 @@ export default {
351
314
  return out;
352
315
  },
353
316
 
354
- isK3s() {
355
- return (this.value?.spec?.kubernetesVersion || '').includes('k3s');
356
- },
357
-
358
317
  /**
359
318
  * Kube Version
360
319
  */
@@ -562,11 +521,11 @@ export default {
562
521
  }
563
522
 
564
523
  if (this.showCloudProvider) { // Shouldn't be removed such that changes to it will re-trigger this watch
565
- if ( this.agentConfig['cloud-provider-name'] === 'rancher-vsphere' ) {
524
+ if ( this.agentConfig?.['cloud-provider-name'] === 'rancher-vsphere' ) {
566
525
  names.push('rancher-vsphere-cpi', 'rancher-vsphere-csi');
567
526
  }
568
527
 
569
- if ( this.agentConfig['cloud-provider-name'] === HARVESTER ) {
528
+ if ( this.agentConfig?.['cloud-provider-name'] === HARVESTER ) {
570
529
  names.push(HARVESTER_CLOUD_PROVIDER);
571
530
  }
572
531
  }
@@ -616,7 +575,7 @@ export default {
616
575
  }
617
576
  }
618
577
 
619
- const cur = this.agentConfig['cloud-provider-name'];
578
+ const cur = this.agentConfig?.['cloud-provider-name'];
620
579
 
621
580
  if (cur && !out.find((x) => x.value === cur)) {
622
581
  // Localization missing
@@ -681,13 +640,6 @@ export default {
681
640
  return out;
682
641
  },
683
642
 
684
- showIpv6Warning() {
685
- const clusterCIDR = this.serverConfig['cluster-cidr'] || '';
686
- const serviceCIDR = this.serverConfig['service-cidr'] || '';
687
-
688
- return clusterCIDR.includes(':') || serviceCIDR.includes(':');
689
- },
690
-
691
643
  appsOSWarning() {
692
644
  if (this.mode !== _EDIT ) {
693
645
  return null;
@@ -767,16 +719,6 @@ export default {
767
719
  },
768
720
 
769
721
  watch: {
770
- s3Backup(neu) {
771
- if ( neu ) {
772
- // We need to make sure that s3 doesn't already have an existing value otherwise when editing a cluster with s3 defined this will clear s3.
773
- if (isEmpty(this.rkeConfig.etcd?.s3)) {
774
- set(this.rkeConfig.etcd, 's3', {});
775
- }
776
- } else {
777
- set(this.rkeConfig.etcd, 's3', null);
778
- }
779
- },
780
722
 
781
723
  credentialId(val) {
782
724
  if ( val ) {
@@ -1027,10 +969,12 @@ export default {
1027
969
  /**
1028
970
  * set instanceNameLimit to 15 to all pool machine if truncateHostnames checkbox is clicked
1029
971
  */
1030
- truncateName() {
1031
- if (this.truncateHostnames) {
972
+ truncateHostname(neu) {
973
+ if (neu) {
1032
974
  this.value.defaultHostnameLengthLimit = NETBIOS_TRUNCATION_LENGTH;
975
+ this.truncateLimit = NETBIOS_TRUNCATION_LENGTH;
1033
976
  } else {
977
+ this.truncateLimit = 0;
1034
978
  this.value.removeDefaultHostnameLengthLimit();
1035
979
  }
1036
980
  },
@@ -1197,8 +1141,14 @@ export default {
1197
1141
  title: this.t('cluster.rke2.modal.editYamlMachinePool.title'),
1198
1142
  body: this.t('cluster.rke2.modal.editYamlMachinePool.body'),
1199
1143
  applyMode: 'editAndContinue',
1200
- confirm: (confirmed) => {
1144
+ confirm: async(confirmed) => {
1201
1145
  if (confirmed) {
1146
+ await this.validateMachinePool();
1147
+
1148
+ if (this.errors.length) {
1149
+ reject(new Error('Machine Pool validation errors'));
1150
+ }
1151
+
1202
1152
  resolve();
1203
1153
  } else {
1204
1154
  reject(new Error('User Cancelled'));
@@ -1346,10 +1296,6 @@ export default {
1346
1296
  // We cannot use the hook, because it is triggered on YAML toggle without restore initialized data
1347
1297
  this.agentConfigurationCleanup();
1348
1298
 
1349
- if ( this.errors ) {
1350
- clear(this.errors);
1351
- }
1352
-
1353
1299
  const isEditVersion = this.isEdit && this.liveValue?.spec?.kubernetesVersion !== this.value?.spec?.kubernetesVersion;
1354
1300
 
1355
1301
  if (isEditVersion) {
@@ -1360,31 +1306,9 @@ export default {
1360
1306
  }
1361
1307
  }
1362
1308
 
1363
- if (this.value.cloudProvider === 'aws') {
1364
- const missingProfileName = this.machinePools.some((mp) => !mp.config.iamInstanceProfile);
1309
+ this.validateClusterName();
1365
1310
 
1366
- if (missingProfileName) {
1367
- this.errors.push(this.t('cluster.validation.iamInstanceProfileName', {}, true));
1368
- }
1369
- }
1370
-
1371
- for (const [index] of this.machinePools.entries()) { // validator machine config
1372
- if ( typeof this.$refs.pool[index]?.test === 'function' ) {
1373
- try {
1374
- const res = await this.$refs.pool[index].test();
1375
-
1376
- if (Array.isArray(res) && res.length > 0) {
1377
- this.errors.push(...res);
1378
- }
1379
- } catch (e) {
1380
- this.errors.push(e);
1381
- }
1382
- }
1383
- }
1384
-
1385
- if (!this.value.metadata.name && this.agentConfig['cloud-provider-name'] === HARVESTER) {
1386
- this.errors.push(this.t('validation.required', { key: this.t('cluster.name.label') }, true));
1387
- }
1311
+ await this.validateMachinePool();
1388
1312
 
1389
1313
  if (this.errors.length) {
1390
1314
  btnCb(false);
@@ -1399,7 +1323,7 @@ export default {
1399
1323
 
1400
1324
  const isUpgrade = this.isEdit && this.liveValue?.spec?.kubernetesVersion !== this.value?.spec?.kubernetesVersion;
1401
1325
 
1402
- if (this.agentConfig['cloud-provider-name'] === HARVESTER && clusterId && (this.isCreate || isUpgrade)) {
1326
+ if (this.agentConfig?.['cloud-provider-name'] === HARVESTER && clusterId && (this.isCreate || isUpgrade)) {
1403
1327
  const namespace = this.machinePools?.[0]?.config?.vmNamespace;
1404
1328
 
1405
1329
  const res = await this.$store.dispatch('management/request', {
@@ -1531,27 +1455,28 @@ export default {
1531
1455
  }
1532
1456
  },
1533
1457
 
1534
- labelForAddon(name) {
1535
- const fallback = `${ camelToTitle(name.replace(/^(rke|rke2|rancher)-/, '')) } Configuration`;
1536
-
1537
- return this.$store.getters['i18n/withFallback'](`cluster.addonChart."${ name }"`, null, fallback);
1538
- },
1539
-
1540
- showAddons() {
1458
+ showAddons(key) {
1541
1459
  this.addonsRev++;
1542
1460
  this.addonNames.forEach((name) => {
1543
1461
  const chartValues = this.versionInfo[name]?.questions ? this.initYamlEditor(name) : {};
1544
1462
 
1545
1463
  set(this.userChartValuesTemp, name, chartValues);
1546
1464
  });
1547
- this.refreshYamls();
1465
+ this.refreshComponentWithYamls(key);
1548
1466
  },
1467
+ refreshComponentWithYamls(key) {
1468
+ const component = this.$refs[key];
1549
1469
 
1550
- refreshYamls() {
1551
- const keys = Object.keys(this.$refs).filter((x) => x.startsWith('yaml'));
1470
+ if ( component ) {
1471
+ this.refreshYamls(component.$refs);
1472
+ }
1473
+ },
1474
+
1475
+ refreshYamls(refs) {
1476
+ const keys = Object.keys(refs).filter((x) => x.startsWith('yaml'));
1552
1477
 
1553
1478
  for ( const k of keys ) {
1554
- const entry = this.$refs[k];
1479
+ const entry = refs[k];
1555
1480
  const list = isArray(entry) ? entry : [entry];
1556
1481
 
1557
1482
  for ( const component of list ) {
@@ -1573,10 +1498,6 @@ export default {
1573
1498
  this.userChartValues[this.chartVersionKey(name)] = different;
1574
1499
  }, 250, { leading: true }),
1575
1500
 
1576
- updateQuestions(name) {
1577
- this.syncChartValues(name);
1578
- },
1579
-
1580
1501
  initYamlEditor(name) {
1581
1502
  const defaultChartValue = this.versionInfo[name];
1582
1503
  const key = this.chartVersionKey(name);
@@ -1594,7 +1515,7 @@ export default {
1594
1515
  }
1595
1516
 
1596
1517
  for ( const k in this.agentArgs ) {
1597
- if ( this.agentConfig[k] === undefined ) {
1518
+ if ( this.agentConfig?.[k] === undefined ) {
1598
1519
  const def = this.agentArgs[k].default;
1599
1520
 
1600
1521
  set(this.agentConfig, k, (def !== undefined ? def : undefined));
@@ -1616,10 +1537,6 @@ export default {
1616
1537
  this.$set(this, 'membershipUpdate', update);
1617
1538
  },
1618
1539
 
1619
- canRemoveKubeletRow(row, idx) {
1620
- return idx !== 0;
1621
- },
1622
-
1623
1540
  async initRegistry() {
1624
1541
  // Check for an existing cluster scoped registry
1625
1542
  const clusterRegistry = this.agentConfig?.['system-default-registry'] || '';
@@ -1863,6 +1780,7 @@ export default {
1863
1780
  setHarvesterDefaultCloudProvider() {
1864
1781
  if (this.isHarvesterDriver &&
1865
1782
  this.mode === _CREATE &&
1783
+ this.agentConfig &&
1866
1784
  !this.agentConfig['cloud-provider-name'] &&
1867
1785
  !this.isHarvesterExternalCredential &&
1868
1786
  !this.isHarvesterIncompatible
@@ -1891,7 +1809,8 @@ export default {
1891
1809
  }
1892
1810
  this.setHarvesterDefaultCloudProvider();
1893
1811
  },
1894
- toggleCustomRegistry(e) {
1812
+ toggleCustomRegistry(neu) {
1813
+ this.showCustomRegistryInput = neu;
1895
1814
  if (this.registryHost) {
1896
1815
  this.registryHost = null;
1897
1816
  this.registrySecret = null;
@@ -1932,11 +1851,14 @@ export default {
1932
1851
  set(this.agentConfig, 'protect-kernel-defaults', false);
1933
1852
  }
1934
1853
  },
1854
+ updateAdditionalManifest(neu) {
1855
+ this.value.spec.rkeConfig.additionalManifest = neu;
1856
+ },
1935
1857
 
1936
1858
  /**
1937
1859
  * Handle k8s changes side effects, like PSA resets
1938
1860
  */
1939
- handleKubernetesChange(value) {
1861
+ handleKubernetesChange(value, old) {
1940
1862
  if (value) {
1941
1863
  this.togglePsaDefault();
1942
1864
 
@@ -1975,22 +1897,17 @@ export default {
1975
1897
  handleEnabledSystemServicesChanged(val) {
1976
1898
  set(this.serverConfig, 'disable', val);
1977
1899
  },
1978
- handleCiliumIpv6Changed(neu) {
1900
+
1901
+ handleCiliumValuesChanged(neu) {
1902
+ if (neu === undefined) {
1903
+ return;
1904
+ }
1905
+
1979
1906
  const name = this.chartVersionKey('rke2-cilium');
1980
- const values = this.userChartValues[name];
1981
1907
 
1982
1908
  set(this, 'userChartValues', {
1983
1909
  ...this.userChartValues,
1984
- [name]: {
1985
- ...values,
1986
- cilium: {
1987
- ...values?.cilium,
1988
- ipv6: {
1989
- ...values?.cilium?.ipv6,
1990
- enabled: neu
1991
- }
1992
- }
1993
- }
1910
+ [name]: { ...neu }
1994
1911
  });
1995
1912
  },
1996
1913
 
@@ -2034,8 +1951,59 @@ export default {
2034
1951
  }
2035
1952
 
2036
1953
  this.errors = errors;
1954
+ },
1955
+ handleS3BackupChanged(neu) {
1956
+ this.s3Backup = neu;
1957
+ if ( neu ) {
1958
+ // We need to make sure that s3 doesn't already have an existing value otherwise when editing a cluster with s3 defined this will clear s3.
1959
+ if (isEmpty(this.rkeConfig.etcd?.s3)) {
1960
+ set(this.rkeConfig.etcd, 's3', {});
1961
+ }
1962
+ } else {
1963
+ set(this.rkeConfig.etcd, 's3', null);
1964
+ }
1965
+ },
1966
+ handleConfigEtcdExposeMetricsChanged(neu) {
1967
+ set(this.serverConfig, 'etcd-expose-metrics', neu);
1968
+ },
1969
+ handleRegistryHostChanged(neu) {
1970
+ this.registryHost = neu;
1971
+ },
1972
+ handleRegistrySecretChanged(neu) {
1973
+ this.registrySecret = neu;
1974
+ },
1975
+ validateClusterName() {
1976
+ if (!this.value.metadata.name && this.agentConfig?.['cloud-provider-name'] === HARVESTER) {
1977
+ this.errors.push(this.t('validation.required', { key: this.t('cluster.name.label') }, true));
1978
+ }
1979
+ },
1980
+ async validateMachinePool() {
1981
+ if (this.errors) {
1982
+ clear(this.errors);
1983
+ }
1984
+ if (this.value.cloudProvider === 'aws') {
1985
+ const missingProfileName = this.machinePools.some((mp) => !mp.config.iamInstanceProfile);
1986
+
1987
+ if (missingProfileName) {
1988
+ this.errors.push(this.t('cluster.validation.iamInstanceProfileName', {}, true));
1989
+ }
1990
+ }
1991
+
1992
+ for (const [index] of this.machinePools.entries()) { // validator machine config
1993
+ if ( typeof this.$refs.pool[index]?.test === 'function' ) {
1994
+ try {
1995
+ const res = await this.$refs.pool[index].test();
1996
+
1997
+ if (Array.isArray(res) && res.length > 0) {
1998
+ this.errors.push(...res);
1999
+ }
2000
+ } catch (e) {
2001
+ this.errors.push(e);
2002
+ }
2003
+ }
2004
+ }
2037
2005
  }
2038
- },
2006
+ }
2039
2007
  };
2040
2008
  </script>
2041
2009
 
@@ -2062,7 +2030,7 @@ export default {
2062
2030
  @done="done"
2063
2031
  @finish="saveOverride"
2064
2032
  @cancel="cancel"
2065
- @error="fvUnreportedValidationErrors"
2033
+ @error="e=>errors = e"
2066
2034
  >
2067
2035
  <div class="header-warnings">
2068
2036
  <Banner
@@ -2079,6 +2047,7 @@ export default {
2079
2047
  :provider="provider"
2080
2048
  :cancel="cancelCredential"
2081
2049
  :showing-form="showForm"
2050
+ :default-on-cancel="true"
2082
2051
  class="mt-20"
2083
2052
  />
2084
2053
 
@@ -2190,10 +2159,11 @@ export default {
2190
2159
  name="basic"
2191
2160
  label-key="cluster.tabs.basic"
2192
2161
  :weight="11"
2193
- @active="refreshYamls"
2162
+ @active="refreshComponentWithYamls('tab-Basics')"
2194
2163
  >
2195
2164
  <!-- Basic -->
2196
2165
  <Basics
2166
+ ref="tab-Basics"
2197
2167
  v-model="value"
2198
2168
  :live-value="liveValue"
2199
2169
  :mode="mode"
@@ -2208,15 +2178,13 @@ export default {
2208
2178
  :is-harvester-driver="isHarvesterDriver"
2209
2179
  :is-harvester-incompatible="isHarvesterIncompatible"
2210
2180
  :version-options="versionOptions"
2211
- :cluster-is-already-created="clusterIsAlreadyCreated"
2212
2181
  :is-elemental-cluster="isElementalCluster"
2213
- :is-k3s="isK3s"
2214
2182
  :have-arg-info="haveArgInfo"
2215
2183
  :show-cni="showCni"
2216
2184
  :show-cloud-provider="showCloudProvider"
2217
2185
  :unsupported-cloud-provider="unsupportedCloudProvider"
2218
2186
  :cloud-provider-options="cloudProviderOptions"
2219
- @cilium-ipv6-changed="handleCiliumIpv6Changed"
2187
+ @cilium-values-changed="handleCiliumValuesChanged"
2220
2188
  @enabled-system-services-changed="handleEnabledSystemServicesChanged"
2221
2189
  @kubernetes-changed="handleKubernetesChange"
2222
2190
  @cis-changed="handleCisChanged"
@@ -2243,77 +2211,15 @@ export default {
2243
2211
  name="etcd"
2244
2212
  label-key="cluster.tabs.etcd"
2245
2213
  >
2246
- <div class="row">
2247
- <div class="col span-6">
2248
- <RadioGroup
2249
- v-model="rkeConfig.etcd.disableSnapshots"
2250
- name="etcd-disable-snapshots"
2251
- :options="[true, false]"
2252
- :label="t('cluster.rke2.etcd.disableSnapshots.label')"
2253
- :labels="[t('generic.disable'), t('generic.enable')]"
2254
- :mode="mode"
2255
- />
2256
- </div>
2257
- </div>
2258
- <div
2259
- v-if="rkeConfig.etcd.disableSnapshots !== true"
2260
- class="row"
2261
- >
2262
- <div class="col span-6">
2263
- <LabeledInput
2264
- v-model="rkeConfig.etcd.snapshotScheduleCron"
2265
- type="cron"
2266
- placeholder="0 * * * *"
2267
- :mode="mode"
2268
- :label="t('cluster.rke2.etcd.snapshotScheduleCron.label')"
2269
- />
2270
- </div>
2271
- <div class="col span-6">
2272
- <UnitInput
2273
- v-model="rkeConfig.etcd.snapshotRetention"
2274
- :mode="mode"
2275
- :label="t('cluster.rke2.etcd.snapshotRetention.label')"
2276
- :suffix="t('cluster.rke2.snapshots.suffix')"
2277
- />
2278
- </div>
2279
- </div>
2280
-
2281
- <template v-if="rkeConfig.etcd.disableSnapshots !== true">
2282
- <div class="spacer" />
2283
-
2284
- <RadioGroup
2285
- v-model="s3Backup"
2286
- name="etcd-s3"
2287
- :options="[false, true]"
2288
- label="Backup Snapshots to S3"
2289
- :labels="['Disable','Enable']"
2290
- :mode="mode"
2291
- />
2292
-
2293
- <S3Config
2294
- v-if="s3Backup"
2295
- v-model="rkeConfig.etcd.s3"
2296
- :namespace="value.metadata.namespace"
2297
- :register-before-hook="registerBeforeHook"
2298
- :mode="mode"
2299
- />
2300
- </template>
2301
-
2302
- <div class="spacer" />
2303
-
2304
- <div class="row">
2305
- <div class="col span-6">
2306
- <RadioGroup
2307
- v-if="serverArgs['etcd-expose-metrics']"
2308
- v-model="serverConfig['etcd-expose-metrics']"
2309
- name="etcd-expose-metrics"
2310
- :options="[false, true]"
2311
- :label="t('cluster.rke2.etcd.exportMetric.label')"
2312
- :labels="[t('cluster.rke2.etcd.exportMetric.false'), t('cluster.rke2.etcd.exportMetric.true')]"
2313
- :mode="mode"
2314
- />
2315
- </div>
2316
- </div>
2214
+ <Etcd
2215
+ v-model="value"
2216
+ :mode="mode"
2217
+ :s3-backup="s3Backup"
2218
+ :register-before-hook="registerBeforeHook"
2219
+ :selected-version="selectedVersion"
2220
+ @s3-backup-changed="handleS3BackupChanged"
2221
+ @config-etcd-expose-metrics-changed="handleConfigEtcdExposeMetricsChanged"
2222
+ />
2317
2223
  </Tab>
2318
2224
 
2319
2225
  <!-- Networking -->
@@ -2322,120 +2228,12 @@ export default {
2322
2228
  name="networking"
2323
2229
  label-key="cluster.tabs.networking"
2324
2230
  >
2325
- <h3>
2326
- {{ t('cluster.rke2.address.header') }}
2327
- <i
2328
- v-clean-tooltip="t('cluster.rke2.address.tooltip')"
2329
- class="icon icon-info"
2330
- />
2331
- </h3>
2332
- <Banner
2333
- v-if="showIpv6Warning"
2334
- color="warning"
2335
- >
2336
- {{ t('cluster.rke2.address.ipv6.warning') }}
2337
- </Banner>
2338
- <div class="row mb-20">
2339
- <div
2340
- v-if="serverArgs['cluster-cidr']"
2341
- class="col span-6"
2342
- >
2343
- <LabeledInput
2344
- v-model="serverConfig['cluster-cidr']"
2345
- :mode="mode"
2346
- :disabled="clusterIsAlreadyCreated"
2347
- :label="t('cluster.rke2.address.clusterCidr.label')"
2348
- />
2349
- </div>
2350
- <div
2351
- v-if="serverArgs['service-cidr']"
2352
- class="col span-6"
2353
- >
2354
- <LabeledInput
2355
- v-model="serverConfig['service-cidr']"
2356
- :mode="mode"
2357
- :disabled="clusterIsAlreadyCreated"
2358
- :label="t('cluster.rke2.address.serviceCidr.label')"
2359
- />
2360
- </div>
2361
- </div>
2362
-
2363
- <div class="row mb-20">
2364
- <div
2365
- v-if="serverArgs['cluster-dns']"
2366
- class="col span-6"
2367
- >
2368
- <LabeledInput
2369
- v-model="serverConfig['cluster-dns']"
2370
- :mode="mode"
2371
- :disabled="clusterIsAlreadyCreated"
2372
- :label="t('cluster.rke2.address.dns.label')"
2373
- />
2374
- </div>
2375
- <div
2376
- v-if="serverArgs['cluster-domain']"
2377
- class="col span-6"
2378
- >
2379
- <LabeledInput
2380
- v-model="serverConfig['cluster-domain']"
2381
- :mode="mode"
2382
- :disabled="clusterIsAlreadyCreated"
2383
- :label="t('cluster.rke2.address.domain.label')"
2384
- />
2385
- </div>
2386
- </div>
2387
-
2388
- <div
2389
- v-if="serverArgs['service-node-port-range']"
2390
- class="row mb-20"
2391
- >
2392
- <div class="col span-6">
2393
- <LabeledInput
2394
- v-model="serverConfig['service-node-port-range']"
2395
- :mode="mode"
2396
- :label="t('cluster.rke2.address.nodePortRange.label')"
2397
- />
2398
- </div>
2399
- <div
2400
- class="col span-6"
2401
- >
2402
- <Checkbox
2403
- v-if="!isView || isView && !hostnameTruncationManuallySet"
2404
- v-model="truncateHostnames"
2405
- class="mt-20"
2406
- :disabled="isEdit || isView || hostnameTruncationManuallySet"
2407
- :mode="mode"
2408
- :label="t('cluster.rke2.truncateHostnames')"
2409
- @input="truncateName"
2410
- />
2411
- <Banner
2412
- v-if="hostnameTruncationManuallySet"
2413
- color="info"
2414
- >
2415
- <div class="text">
2416
- {{ t('cluster.machinePool.truncationCluster', { limit: truncateLimit }) }}
2417
- </div>
2418
- </Banner>
2419
- </div>
2420
- </div>
2421
-
2422
- <div
2423
- v-if="serverArgs['tls-san']"
2424
- class="row mb-20"
2425
- >
2426
- <div class="col span-6">
2427
- <ArrayList
2428
- v-model="serverConfig['tls-san']"
2429
- :protip="false"
2430
- :mode="mode"
2431
- :title="t('cluster.rke2.address.tlsSan.label')"
2432
- />
2433
- </div>
2434
- </div>
2435
-
2436
- <ACE
2231
+ <Networking
2437
2232
  v-model="value"
2438
2233
  :mode="mode"
2234
+ :selected-version="selectedVersion"
2235
+ :truncate-limit="truncateLimit"
2236
+ @truncate-hostname="truncateHostname"
2439
2237
  />
2440
2238
  </Tab>
2441
2239
 
@@ -2444,44 +2242,10 @@ export default {
2444
2242
  name="upgrade"
2445
2243
  label-key="cluster.tabs.upgrade"
2446
2244
  >
2447
- <Banner
2448
- v-if="get(rkeConfig, 'upgradeStrategy.controlPlaneDrainOptions.deleteEmptyDirData')"
2449
- color="warning"
2450
- >
2451
- {{ t('cluster.rke2.drain.deleteEmptyDir.warning', {}, true) }}
2452
- </Banner>
2453
- <div class="row">
2454
- <div class="col span-6">
2455
- <h3>{{ t('cluster.rke2.controlPlaneConcurrency.header') }}</h3>
2456
- <LabeledInput
2457
- v-model="rkeConfig.upgradeStrategy.controlPlaneConcurrency"
2458
- :mode="mode"
2459
- :label="t('cluster.rke2.controlPlaneConcurrency.label')"
2460
- :tooltip="t('cluster.rke2.controlPlaneConcurrency.toolTip')"
2461
- />
2462
- <div class="spacer" />
2463
- <DrainOptions
2464
- v-model="rkeConfig.upgradeStrategy.controlPlaneDrainOptions"
2465
- :mode="mode"
2466
- />
2467
- </div>
2468
- <div class="col span-6">
2469
- <h3>
2470
- {{ t('cluster.rke2.workNode.label') }}
2471
- </h3>
2472
- <LabeledInput
2473
- v-model="rkeConfig.upgradeStrategy.workerConcurrency"
2474
- :mode="mode"
2475
- :label="t('cluster.rke2.workerConcurrency.label')"
2476
- :tooltip="t('cluster.rke2.workerConcurrency.toolTip')"
2477
- />
2478
- <div class="spacer" />
2479
- <DrainOptions
2480
- v-model="rkeConfig.upgradeStrategy.workerDrainOptions"
2481
- :mode="mode"
2482
- />
2483
- </div>
2484
- </div>
2245
+ <Upgrade
2246
+ v-model="value"
2247
+ :mode="mode"
2248
+ />
2485
2249
  </Tab>
2486
2250
 
2487
2251
  <!-- Registries -->
@@ -2489,147 +2253,40 @@ export default {
2489
2253
  name="registry"
2490
2254
  label-key="cluster.tabs.registry"
2491
2255
  >
2492
- <div class="row">
2493
- <h3>{{ t('cluster.privateRegistry.label') }}</h3>
2494
- </div>
2495
- <div class="row">
2496
- <div class="col span-12">
2497
- <Banner
2498
- :closable="false"
2499
- class="cluster-tools-tip"
2500
- color="info"
2501
- label-key="cluster.privateRegistry.description"
2502
- />
2503
- </div>
2504
- </div>
2505
- <div class="row">
2506
- <Checkbox
2507
- v-model="showCustomRegistryInput"
2508
- class="mb-20"
2509
- :label="t('cluster.privateRegistry.label')"
2510
- @input="toggleCustomRegistry"
2511
- />
2512
- </div>
2513
- <div
2514
- v-if="showCustomRegistryInput"
2515
- class="row"
2516
- >
2517
- <div class="col span-6">
2518
- <LabeledInput
2519
- v-model="registryHost"
2520
- label-key="catalog.chart.registry.custom.inputLabel"
2521
- placeholder-key="catalog.chart.registry.custom.placeholder"
2522
- :min-height="30"
2523
- />
2524
- <SelectOrCreateAuthSecret
2525
- v-model="registrySecret"
2526
- :register-before-hook="registerBeforeHook"
2527
- :hook-priority="1"
2528
- :mode="mode"
2529
- in-store="management"
2530
- :allow-ssh="false"
2531
- :allow-rke="true"
2532
- :vertical="true"
2533
- :namespace="value.metadata.namespace"
2534
- generate-name="registryconfig-auth-"
2535
- />
2536
- </div>
2537
- </div>
2538
- <template>
2539
- <div
2540
- v-if="showCustomRegistryInput"
2541
- class="row"
2542
- >
2543
- <AdvancedSection
2544
- class="col span-12 advanced"
2545
- :is-open-by-default="showCustomRegistryAdvancedInput"
2546
- :mode="mode"
2547
- >
2548
- <Banner
2549
- :closable="false"
2550
- class="cluster-tools-tip"
2551
- color="info"
2552
- :label-key="isK3s ? 'cluster.privateRegistry.docsLinkK3s' : 'cluster.privateRegistry.docsLinkRke2'"
2553
- />
2554
- <RegistryMirrors
2555
- v-model="value"
2556
- class="mt-20"
2557
- :mode="mode"
2558
- />
2559
- <RegistryConfigs
2560
- v-model="value"
2561
- class="mt-20"
2562
- :mode="mode"
2563
- :cluster-register-before-hook="registerBeforeHook"
2564
- @updateConfigs="updateConfigs"
2565
- />
2566
- </AdvancedSection>
2567
- </div>
2568
- </template>
2256
+ <Registries
2257
+ v-model="value"
2258
+ :mode="mode"
2259
+ :register-before-hook="registerBeforeHook"
2260
+ :show-custom-registry-input="showCustomRegistryInput"
2261
+ :registry-host="registryHost"
2262
+ :registry-secret="registrySecret"
2263
+ :show-custom-registry-advanced-input="showCustomRegistryAdvancedInput"
2264
+ @update-configs-changed="updateConfigs"
2265
+ @custom-registry-changed="toggleCustomRegistry"
2266
+ @registry-host-changed="handleRegistryHostChanged"
2267
+ @registry-secret-changed="handleRegistrySecretChanged"
2268
+ />
2569
2269
  </Tab>
2570
2270
 
2571
2271
  <!-- Add-on Config -->
2572
2272
  <Tab
2573
2273
  name="addons"
2574
2274
  label-key="cluster.tabs.addons"
2575
- @active="showAddons"
2275
+ @active="showAddons('tab-addOnConfig')"
2576
2276
  >
2577
- <Banner
2578
- v-if="isEdit"
2579
- color="warning"
2580
- >
2581
- {{ t('cluster.addOns.dependencyBanner') }}
2582
- </Banner>
2583
- <div
2584
- v-if="versionInfo && addonVersions.length"
2585
- :key="addonsRev"
2586
- >
2587
- <div
2588
- v-for="v in addonVersions"
2589
- :key="v._key"
2590
- >
2591
- <h3>{{ labelForAddon(v.name) }}</h3>
2592
- <Questions
2593
- v-if="versionInfo[v.name] && versionInfo[v.name].questions && v.name && userChartValuesTemp[v.name]"
2594
- v-model="userChartValuesTemp[v.name]"
2595
- :emit="true"
2596
- in-store="management"
2597
- :mode="mode"
2598
- :tabbed="false"
2599
- :source="versionInfo[v.name]"
2600
- :target-namespace="value.metadata.namespace"
2601
- @updated="updateQuestions(v.name)"
2602
- />
2603
- <YamlEditor
2604
- v-else
2605
- ref="yaml-values"
2606
- :value="initYamlEditor(v.name)"
2607
- :scrolling="true"
2608
- :as-object="true"
2609
- :editor-mode="mode === 'view' ? 'VIEW_CODE' : 'EDIT_CODE'"
2610
- :hide-preview-buttons="true"
2611
- @input="data => updateValues(v.name, data)"
2612
- />
2613
- <div class="spacer" />
2614
- </div>
2615
- </div>
2616
-
2617
- <div>
2618
- <h3>
2619
- {{ t('cluster.addOns.additionalManifest.title') }}
2620
- <i
2621
- v-clean-tooltip="t('cluster.addOns.additionalManifest.tooltip')"
2622
- class="icon icon-info"
2623
- />
2624
- </h3>
2625
- <YamlEditor
2626
- ref="yaml-additional"
2627
- v-model="rkeConfig.additionalManifest"
2628
- :editor-mode="mode === 'view' ? 'VIEW_CODE' : 'EDIT_CODE'"
2629
- initial-yaml-values="# Additional Manifest YAML"
2630
- class="yaml-editor"
2631
- />
2632
- </div>
2277
+ <AddOnConfig
2278
+ ref="tab-addOnConfig"
2279
+ v-model="value"
2280
+ :mode="mode"
2281
+ :version-info="versionInfo"
2282
+ :addon-versions="addonVersions"
2283
+ :addons-rev="addonsRev"
2284
+ :user-chart-values-temp="userChartValuesTemp"
2285
+ :init-yaml-editor="initYamlEditor"
2286
+ @update-questions="syncChartValues"
2287
+ @update-values="updateValues"
2288
+ @additional-manifest-changed="updateAdditionalManifest"
2289
+ />
2633
2290
  </Tab>
2634
2291
 
2635
2292
  <!-- Cluster Agent Configuration -->
@@ -2666,82 +2323,13 @@ export default {
2666
2323
  name="advanced"
2667
2324
  label-key="cluster.tabs.advanced"
2668
2325
  :weight="-1"
2669
- @active="refreshYamls"
2670
2326
  >
2671
- <template v-if="haveArgInfo">
2672
- <h3>{{ t('cluster.advanced.argInfo.title') }}</h3>
2673
- <ArrayListGrouped
2674
- v-if="agentArgs['kubelet-arg']"
2675
- v-model="rkeConfig.machineSelectorConfig"
2676
- class="mb-20"
2677
- :add-label="t('cluster.advanced.argInfo.machineSelector.label')"
2678
- :can-remove="canRemoveKubeletRow"
2679
- :default-add-value="{machineLabelSelector: { matchExpressions: [], matchLabels: {} }, config: {'kubelet-arg': []}}"
2680
- >
2681
- <template #default="{row}">
2682
- <template v-if="row.value.machineLabelSelector">
2683
- <h3>{{ t('cluster.advanced.argInfo.machineSelector.title') }}</h3>
2684
- <MatchExpressions
2685
- v-model="row.value.machineLabelSelector"
2686
- class="mb-20"
2687
- :mode="mode"
2688
- :show-remove="false"
2689
- :initial-empty-row="true"
2690
- />
2691
- <h3>{{ t('cluster.advanced.argInfo.machineSelector.subTitle') }}</h3>
2692
- </template>
2693
- <h3 v-else>
2694
- {{ advancedTitleAlt }}
2695
- </h3>
2696
-
2697
- <ArrayList
2698
- v-model="row.value.config['kubelet-arg']"
2699
- :mode="mode"
2700
- :add-label="t('cluster.advanced.argInfo.machineSelector.listLabel')"
2701
- :initial-empty-row="!!row.value.machineLabelSelector"
2702
- />
2703
- </template>
2704
- </ArrayListGrouped>
2705
- <Banner
2706
- v-if="rkeConfig.machineSelectorConfig.length > 1"
2707
- color="info"
2708
- :label="t('cluster.advanced.argInfo.machineSelector.bannerLabel')"
2709
- />
2710
-
2711
- <ArrayList
2712
- v-if="serverArgs['kube-controller-manager-arg']"
2713
- v-model="serverConfig['kube-controller-manager-arg']"
2714
- :mode="mode"
2715
- :title="t('cluster.advanced.argInfo.machineSelector.kubeControllerManagerTitle')"
2716
- class="mb-20"
2717
- />
2718
- <ArrayList
2719
- v-if="serverArgs['kube-apiserver-arg']"
2720
- v-model="serverConfig['kube-apiserver-arg']"
2721
- :mode="mode"
2722
- :title="t('cluster.advanced.argInfo.machineSelector.kubeApiServerTitle')"
2723
- class="mb-20"
2724
- />
2725
- <ArrayList
2726
- v-if="serverArgs['kube-scheduler-arg']"
2727
- v-model="serverConfig['kube-scheduler-arg']"
2728
- :mode="mode"
2729
- :title="t('cluster.advanced.argInfo.machineSelector.kubeSchedulerTitle')"
2730
- />
2731
- </template>
2732
- <template v-if="agentArgs['protect-kernel-defaults']">
2733
- <div class="spacer" />
2734
-
2735
- <div class="row">
2736
- <div class="col span-12">
2737
- <Checkbox
2738
- v-model="agentConfig['protect-kernel-defaults']"
2739
- :mode="mode"
2740
- :label="t('cluster.advanced.agentArgs.label')"
2741
- />
2742
- </div>
2743
- </div>
2744
- </template>
2327
+ <Advanced
2328
+ v-model="value"
2329
+ :mode="mode"
2330
+ :have-arg-info="haveArgInfo"
2331
+ :selected-version="selectedVersion"
2332
+ />
2745
2333
  </Tab>
2746
2334
 
2747
2335
  <AgentEnv