@rancher/shell 0.3.29 → 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 (301) 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 +31 -6
  5. package/assets/translations/zh-hans.yaml +2 -2
  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/CopyCode.vue +6 -2
  17. package/components/CopyToClipboard.vue +2 -1
  18. package/components/CopyToClipboardText.vue +14 -9
  19. package/components/CruResource.vue +1 -0
  20. package/components/DraggableZone.vue +2 -2
  21. package/components/EtcdInfoBanner.vue +5 -5
  22. package/components/ExplorerProjectsNamespaces.vue +25 -1
  23. package/components/IconOrSvg.vue +1 -1
  24. package/components/LandingPagePreference.vue +1 -4
  25. package/components/Markdown.vue +16 -12
  26. package/components/PodSecurityAdmission.vue +2 -2
  27. package/components/Questions/index.vue +1 -1
  28. package/components/ResourceDetail/Masthead.vue +25 -9
  29. package/components/ResourceTable.vue +14 -2
  30. package/components/ResourceYaml.vue +5 -0
  31. package/components/SideNav.vue +1 -1
  32. package/components/SingleClusterInfo.vue +1 -4
  33. package/components/StatusTable.vue +5 -1
  34. package/components/Tabbed/index.vue +12 -0
  35. package/components/__tests__/CopyCode.test.ts +5 -4
  36. package/components/fleet/FleetBundles.vue +5 -11
  37. package/components/fleet/FleetRepos.vue +62 -27
  38. package/components/fleet/FleetResources.vue +6 -1
  39. package/components/fleet/FleetSummary.vue +3 -3
  40. package/components/fleet/__tests__/FleetSummary.test.ts +316 -0
  41. package/components/form/ArrayListSelect.vue +10 -0
  42. package/components/form/Error.vue +3 -3
  43. package/components/form/Footer.vue +2 -2
  44. package/components/form/GitPicker.vue +83 -38
  45. package/components/form/KeyValue.vue +4 -0
  46. package/components/form/LabeledSelect.vue +4 -0
  47. package/components/form/Password.vue +3 -1
  48. package/components/formatter/Checked.vue +11 -3
  49. package/components/formatter/FleetClusterSummaryGraph.vue +27 -0
  50. package/components/formatter/FleetSummaryGraph.vue +23 -11
  51. package/components/formatter/LiveDuration.vue +1 -1
  52. package/components/formatter/PercentageBar.vue +1 -1
  53. package/components/formatter/__tests__/Checked.test.ts +19 -0
  54. package/components/nav/Group.vue +2 -2
  55. package/components/nav/Header.vue +1 -2
  56. package/components/nav/TopLevelMenu.vue +36 -6
  57. package/components/nav/Type.vue +1 -3
  58. package/components/nav/WindowManager/ContainerLogs.vue +101 -3
  59. package/components/nav/WindowManager/ContainerShell.vue +6 -1
  60. package/components/nav/WindowManager/__tests__/ContainerLogs.test.ts +186 -0
  61. package/components/nav/WindowManager/index.vue +11 -10
  62. package/components/nav/__tests__/TopLevelMenu.test.ts +33 -0
  63. package/components/nav/__tests__/Type.test.ts +1 -1
  64. package/components/nuxt/nuxt-child.js +14 -78
  65. package/components/nuxt/nuxt.js +1 -1
  66. package/{layouts → components/templates}/blank.vue +1 -1
  67. package/{layouts → components/templates}/default.vue +8 -98
  68. package/{layouts → components/templates}/error.vue +10 -19
  69. package/{layouts → components/templates}/home.vue +4 -1
  70. package/{layouts → components/templates}/plain.vue +4 -1
  71. package/{layouts → components/templates}/standalone.vue +1 -1
  72. package/{layouts → components/templates}/unauthenticated.vue +1 -1
  73. package/composables/useCompactInput.test.ts +36 -0
  74. package/composables/useCompactInput.ts +20 -0
  75. package/composables/useLabeledFormElement.test.ts +135 -0
  76. package/composables/useLabeledFormElement.ts +138 -0
  77. package/config/harvester-manager-types.js +2 -0
  78. package/config/home-links.js +1 -1
  79. package/config/private-label.js +22 -0
  80. package/config/product/explorer.js +3 -0
  81. package/config/product/fleet.js +6 -1
  82. package/config/product/manager.js +8 -2
  83. package/config/query-params.js +1 -0
  84. package/config/router.js +385 -364
  85. package/config/settings.ts +1 -0
  86. package/config/store.js +1 -1
  87. package/config/system-namespaces.js +3 -0
  88. package/config/table-headers.js +47 -0
  89. package/core/plugin-helpers.js +3 -5
  90. package/core/plugin-routes.ts +56 -114
  91. package/core/plugin.ts +16 -10
  92. package/core/plugins-loader.js +7 -9
  93. package/core/plugins.js +0 -3
  94. package/creators/app/files/.gitlab-ci.yml +14 -0
  95. package/creators/app/init +19 -0
  96. package/detail/fleet.cattle.io.cluster.vue +11 -1
  97. package/detail/provisioning.cattle.io.cluster.vue +4 -3
  98. package/dialog/ScaleMachineDownDialog.vue +34 -17
  99. package/edit/__tests__/service.test.ts +89 -0
  100. package/edit/auth/googleoauth.vue +1 -5
  101. package/edit/cloudcredential.vue +2 -0
  102. package/edit/configmap.vue +2 -1
  103. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +2 -2
  104. package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +12 -3
  105. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +2 -1
  106. package/edit/networking.k8s.io.networkpolicy/__tests__/PolicyRuleTarget.spec.ts +1 -1
  107. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +15 -7
  108. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +112 -0
  109. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +473 -0
  110. package/edit/provisioning.cattle.io.cluster/__tests__/{CustomCommand.tests.ts → CustomCommand.test.ts} +6 -0
  111. package/edit/provisioning.cattle.io.cluster/__tests__/DrainOptions.test.ts +1 -1
  112. package/edit/provisioning.cattle.io.cluster/__tests__/index.test.ts +73 -0
  113. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +7 -1
  114. package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +386 -0
  115. package/edit/provisioning.cattle.io.cluster/import.vue +2 -2
  116. package/edit/provisioning.cattle.io.cluster/index.vue +92 -36
  117. package/edit/provisioning.cattle.io.cluster/rke2.vue +171 -583
  118. package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +137 -0
  119. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +157 -0
  120. package/edit/provisioning.cattle.io.cluster/{Basics.vue → tabs/Basics.vue} +94 -19
  121. package/edit/provisioning.cattle.io.cluster/{MachinePool.vue → tabs/MachinePool.vue} +1 -0
  122. package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +135 -0
  123. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +189 -0
  124. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +144 -0
  125. package/edit/provisioning.cattle.io.cluster/tabs/upgrade/index.vue +76 -0
  126. package/edit/service.vue +12 -0
  127. package/edit/workload/Upgrading.vue +3 -2
  128. package/edit/workload/mixins/workload.js +1 -1
  129. package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +2 -1
  130. package/initialize/App.js +25 -71
  131. package/initialize/client.js +21 -162
  132. package/initialize/index.js +47 -124
  133. package/list/management.cattle.io.feature.vue +1 -7
  134. package/list/node.vue +1 -0
  135. package/machine-config/__tests__/vmwarevsphere.test.ts +100 -21
  136. package/machine-config/vmwarevsphere.vue +73 -51
  137. package/middleware/authenticated.js +10 -17
  138. package/mixins/auth-config.js +2 -7
  139. package/mixins/brand.js +29 -41
  140. package/mixins/create-edit-view/index.js +2 -2
  141. package/mixins/labeled-form-element.ts +6 -1
  142. package/models/__tests__/management.cattle.io.cluster.test.ts +4 -0
  143. package/models/__tests__/management.cattle.io.node.ts +85 -0
  144. package/models/__tests__/management.cattle.io.nodepool.ts +83 -0
  145. package/models/__tests__/namespace.test.ts +49 -9
  146. package/models/__tests__/workload.test.ts +91 -0
  147. package/models/cluster/node.js +4 -4
  148. package/models/cluster.x-k8s.io.machinedeployment.js +14 -0
  149. package/models/fleet.cattle.io.cluster.js +4 -0
  150. package/models/fleet.cattle.io.gitrepo.js +56 -13
  151. package/models/management.cattle.io.cluster.js +7 -3
  152. package/models/management.cattle.io.kontainerdriver.js +1 -1
  153. package/models/management.cattle.io.node.js +18 -14
  154. package/models/management.cattle.io.nodepool.js +17 -0
  155. package/models/namespace.js +1 -1
  156. package/models/pod.js +20 -0
  157. package/models/provisioning.cattle.io.cluster.js +39 -4
  158. package/models/secret.js +117 -18
  159. package/models/workload.js +16 -0
  160. package/models/workload.service.js +18 -0
  161. package/package.json +11 -10
  162. package/pages/about.vue +0 -1
  163. package/pages/account/create-key.vue +0 -1
  164. package/pages/account/index.vue +0 -1
  165. package/pages/auth/login.vue +0 -1
  166. package/pages/auth/logout.vue +0 -2
  167. package/pages/auth/setup.vue +0 -4
  168. package/pages/auth/verify.vue +14 -8
  169. package/pages/c/_cluster/apps/charts/index.vue +64 -43
  170. package/pages/c/_cluster/apps/charts/install.vue +4 -4
  171. package/pages/c/_cluster/apps/index.vue +0 -2
  172. package/pages/c/_cluster/auth/index.vue +0 -2
  173. package/pages/c/_cluster/ecm/index.vue +0 -2
  174. package/pages/c/_cluster/explorer/index.vue +28 -2
  175. package/pages/c/_cluster/fleet/index.vue +1 -1
  176. package/pages/c/_cluster/index.vue +0 -2
  177. package/pages/c/_cluster/settings/banners.vue +0 -2
  178. package/pages/c/_cluster/settings/brand.vue +0 -2
  179. package/pages/c/_cluster/settings/index.vue +0 -2
  180. package/pages/c/_cluster/settings/links.vue +0 -1
  181. package/pages/c/_cluster/settings/performance.vue +0 -1
  182. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +2 -1
  183. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +10 -46
  184. package/pages/c/_cluster/uiplugins/index.vue +0 -2
  185. package/pages/diagnostic.vue +1 -2
  186. package/pages/fail-whale.vue +0 -1
  187. package/pages/prefs.vue +0 -1
  188. package/pages/support/index.vue +2 -8
  189. package/pkg/auto-import.js +1 -1
  190. package/plugins/axios.js +0 -36
  191. package/plugins/back-button.js +3 -5
  192. package/plugins/clean-html-directive.js +1 -19
  193. package/plugins/clean-html.js +53 -0
  194. package/plugins/clean-tooltip-directive.js +1 -1
  195. package/plugins/codemirror-loader.js +1 -1
  196. package/plugins/codemirror.js +41 -0
  197. package/plugins/dashboard-store/__tests__/{mutations.spec.ts → mutations.test.ts} +1 -1
  198. package/plugins/dashboard-store/__tests__/resource-class.test.ts +49 -0
  199. package/plugins/dashboard-store/__tests__/utils/store-mocks.ts +7 -0
  200. package/plugins/dashboard-store/actions.js +30 -4
  201. package/plugins/dashboard-store/classify.js +1 -18
  202. package/plugins/dashboard-store/getters.js +10 -5
  203. package/plugins/dashboard-store/index.js +0 -12
  204. package/plugins/dashboard-store/mutations.js +0 -4
  205. package/plugins/dashboard-store/resource-class.js +59 -18
  206. package/plugins/index.js +11 -0
  207. package/plugins/steve/__tests__/steve-class.spec.ts +59 -0
  208. package/plugins/steve/__tests__/utils/steve-mocks.ts +31 -0
  209. package/plugins/steve/getters.js +4 -1
  210. package/plugins/steve/norman-class.js +19 -0
  211. package/plugins/steve/steve-class.js +22 -0
  212. package/plugins/steve/subscribe.js +4 -10
  213. package/rancher-components/Accordion/Accordion.test.ts +45 -0
  214. package/rancher-components/Accordion/Accordion.vue +86 -0
  215. package/rancher-components/Accordion/index.ts +1 -0
  216. package/rancher-components/BadgeState/BadgeState.vue +3 -3
  217. package/rancher-components/Banner/Banner.vue +2 -2
  218. package/rancher-components/Card/Card.vue +3 -3
  219. package/rancher-components/Form/Checkbox/Checkbox.vue +3 -3
  220. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +18 -1
  221. package/rancher-components/Form/LabeledInput/LabeledInput.vue +65 -24
  222. package/rancher-components/Form/Radio/RadioButton.test.ts +7 -3
  223. package/rancher-components/Form/Radio/RadioButton.vue +13 -7
  224. package/rancher-components/Form/Radio/RadioGroup.test.ts +30 -0
  225. package/rancher-components/Form/Radio/RadioGroup.vue +8 -3
  226. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +6 -4
  227. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  228. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
  229. package/rancher-components/StringList/StringList.test.ts +270 -0
  230. package/rancher-components/StringList/StringList.vue +65 -26
  231. package/rancher-components/components/Accordion/Accordion.test.ts +45 -0
  232. package/rancher-components/components/Accordion/Accordion.vue +86 -0
  233. package/rancher-components/components/Accordion/index.ts +1 -0
  234. package/rancher-components/components/BadgeState/BadgeState.vue +3 -3
  235. package/rancher-components/components/Banner/Banner.vue +2 -2
  236. package/rancher-components/components/Card/Card.vue +3 -3
  237. package/rancher-components/components/Form/Checkbox/Checkbox.vue +3 -3
  238. package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +18 -1
  239. package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +57 -24
  240. package/rancher-components/components/Form/Radio/RadioButton.vue +13 -7
  241. package/rancher-components/components/Form/Radio/RadioGroup.vue +4 -3
  242. package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +6 -4
  243. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  244. package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +9 -4
  245. package/rancher-components/components/StringList/StringList.vue +8 -8
  246. package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +50 -0
  247. package/scripts/extension/bundle +19 -7
  248. package/scripts/extension/helm/scripts/package +11 -3
  249. package/scripts/extension/parse-tag-name +2 -2
  250. package/scripts/extension/publish +20 -9
  251. package/scripts/publish-shell.sh +10 -0
  252. package/scripts/test-plugins-build.sh +85 -9
  253. package/server/har-file.js +183 -0
  254. package/store/catalog.js +1 -1
  255. package/store/features.js +1 -0
  256. package/store/i18n.js +11 -0
  257. package/store/index.js +13 -15
  258. package/store/prefs.js +33 -35
  259. package/store/type-map.js +8 -7
  260. package/tsconfig.json +35 -9
  261. package/tsconfig.paths.json +21 -0
  262. package/types/shell/index.d.ts +433 -234
  263. package/types/vue-shim.d.ts +42 -0
  264. package/utils/__tests__/create-yaml.test.ts +60 -0
  265. package/utils/axios.js +0 -19
  266. package/utils/azure.js +24 -0
  267. package/utils/clipboard.js +5 -0
  268. package/utils/create-yaml.js +17 -10
  269. package/utils/git.ts +1 -1
  270. package/utils/monitoring.js +1 -1
  271. package/utils/nuxt.js +18 -39
  272. package/utils/object.js +14 -0
  273. package/utils/router.scrollBehavior.js +12 -14
  274. package/utils/time.js +1 -1
  275. package/utils/url.ts +1 -1
  276. package/vue.config.js +23 -2
  277. package/.DS_Store +0 -0
  278. package/assets/images/providers/aks-black.svg +0 -28
  279. package/assets/images/providers/aks.svg +0 -31
  280. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.tests.ts +0 -234
  281. package/initialize/layouts.ts +0 -26
  282. package/mixins/fetch.server.js +0 -73
  283. package/pages/c/index.vue +0 -9
  284. package/pages/rio/mesh.vue +0 -508
  285. package/plugins/transitions.js +0 -4
  286. package/plugins/vue-clipboard2.js +0 -4
  287. package/tsconfig.default.json +0 -46
  288. package/yarn-error.log +0 -200
  289. /package/components/form/__tests__/{NameNsDescription.ts → NameNsDescription.test.ts} +0 -0
  290. /package/edit/networking.k8s.io.networkpolicy/__tests__/utils/{selectors.ts → selectors.test.ts} +0 -0
  291. /package/edit/provisioning.cattle.io.cluster/{AgentConfiguration.vue → tabs/AgentConfiguration.vue} +0 -0
  292. /package/edit/provisioning.cattle.io.cluster/{MemberRoles.vue → tabs/MemberRoles.vue} +0 -0
  293. /package/edit/provisioning.cattle.io.cluster/{S3Config.vue → tabs/etcd/S3Config.vue} +0 -0
  294. /package/edit/provisioning.cattle.io.cluster/{ACE.vue → tabs/networking/ACE.vue} +0 -0
  295. /package/edit/provisioning.cattle.io.cluster/{RegistryConfigs.vue → tabs/registries/RegistryConfigs.vue} +0 -0
  296. /package/edit/provisioning.cattle.io.cluster/{RegistryMirrors.vue → tabs/registries/RegistryMirrors.vue} +0 -0
  297. /package/edit/provisioning.cattle.io.cluster/{DrainOptions.vue → tabs/upgrade/DrainOptions.vue} +0 -0
  298. /package/plugins/dashboard-store/__tests__/{actions.spec.ts → actions.test.ts} +0 -0
  299. /package/plugins/dashboard-store/__tests__/{getters.spec.ts → getters.test.ts} +0 -0
  300. /package/rancher-components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
  301. /package/rancher-components/components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
@@ -0,0 +1,137 @@
1
+ <script>
2
+ import { Banner } from '@components/Banner';
3
+
4
+ import Questions from '@shell/components/Questions';
5
+ import YamlEditor from '@shell/components/YamlEditor';
6
+ import { camelToTitle } from '@shell/utils/string';
7
+ import { _EDIT } from '@shell/config/query-params';
8
+
9
+ export default {
10
+ components: {
11
+ Banner,
12
+ Questions,
13
+ YamlEditor
14
+ },
15
+
16
+ props: {
17
+ mode: {
18
+ type: String,
19
+ required: true,
20
+ },
21
+
22
+ value: {
23
+ type: Object,
24
+ required: true,
25
+ },
26
+
27
+ versionInfo: {
28
+ type: Object,
29
+ required: true,
30
+ },
31
+
32
+ addonVersions: {
33
+ type: Array,
34
+ required: false,
35
+ default: null
36
+ },
37
+
38
+ addonsRev: {
39
+ type: Number,
40
+ required: true,
41
+ },
42
+ userChartValuesTemp: {
43
+ type: Object,
44
+ required: true,
45
+ },
46
+ initYamlEditor: {
47
+ type: Function,
48
+ required: true,
49
+ }
50
+
51
+ },
52
+
53
+ computed: {
54
+ additionalManifest: {
55
+ get() {
56
+ return this.value.spec.rkeConfig.additionalManifest;
57
+ },
58
+ set(neu) {
59
+ this.$emit('additional-manifest-changed', neu);
60
+ }
61
+ },
62
+ isEdit() {
63
+ return this.mode === _EDIT;
64
+ },
65
+ },
66
+
67
+ methods: {
68
+
69
+ labelForAddon(name) {
70
+ const fallback = `${ camelToTitle(name.replace(/^(rke|rke2|rancher)-/, '')) } Configuration`;
71
+
72
+ return this.$store.getters['i18n/withFallback'](`cluster.addonChart."${ name }"`, null, fallback);
73
+ },
74
+ },
75
+ };
76
+ </script>
77
+
78
+ <template>
79
+ <div>
80
+ <Banner
81
+ v-if="isEdit"
82
+ color="warning"
83
+ >
84
+ {{ t('cluster.addOns.dependencyBanner') }}
85
+ </Banner>
86
+ <div
87
+ v-if="versionInfo && addonVersions.length"
88
+ :key="addonsRev"
89
+ >
90
+ <div
91
+ v-for="v in addonVersions"
92
+ :key="v._key"
93
+ >
94
+ <h3>{{ labelForAddon(v.name) }}</h3>
95
+ <Questions
96
+ v-if="versionInfo[v.name] && versionInfo[v.name].questions && v.name && userChartValuesTemp[v.name]"
97
+ v-model="userChartValuesTemp[v.name]"
98
+ :emit="true"
99
+ in-store="management"
100
+ :mode="mode"
101
+ :tabbed="false"
102
+ :source="versionInfo[v.name]"
103
+ :target-namespace="value.metadata.namespace"
104
+ @updated="$emit('update-questions', v.name)"
105
+ />
106
+ <YamlEditor
107
+ v-else
108
+ ref="yaml-values"
109
+ :value="initYamlEditor(v.name)"
110
+ :scrolling="true"
111
+ :as-object="true"
112
+ :editor-mode="mode === 'view' ? 'VIEW_CODE' : 'EDIT_CODE'"
113
+ :hide-preview-buttons="true"
114
+ @input="data => $emit('update-values', v.name, data)"
115
+ />
116
+ <div class="spacer" />
117
+ </div>
118
+ </div>
119
+
120
+ <div>
121
+ <h3>
122
+ {{ t('cluster.addOns.additionalManifest.title') }}
123
+ <i
124
+ v-clean-tooltip="t('cluster.addOns.additionalManifest.tooltip')"
125
+ class="icon icon-info"
126
+ />
127
+ </h3>
128
+ <YamlEditor
129
+ ref="yaml-additional"
130
+ v-model="additionalManifest"
131
+ :editor-mode="mode === 'view' ? 'VIEW_CODE' : 'EDIT_CODE'"
132
+ initial-yaml-values="# Additional Manifest YAML"
133
+ class="yaml-editor"
134
+ />
135
+ </div>
136
+ </div>
137
+ </template>
@@ -0,0 +1,157 @@
1
+ <script>
2
+ import Vue from 'vue';
3
+ import { Banner } from '@components/Banner';
4
+ import ArrayListGrouped from '@shell/components/form/ArrayListGrouped';
5
+ import MatchExpressions from '@shell/components/form/MatchExpressions';
6
+ import ArrayList from '@shell/components/form/ArrayList';
7
+ import { Checkbox } from '@components/Form/Checkbox';
8
+
9
+ export default {
10
+ components: {
11
+ Banner,
12
+ ArrayListGrouped,
13
+ MatchExpressions,
14
+ ArrayList,
15
+ Checkbox
16
+ },
17
+
18
+ props: {
19
+ mode: {
20
+ type: String,
21
+ required: true,
22
+ },
23
+
24
+ value: {
25
+ type: Object,
26
+ required: true,
27
+ },
28
+
29
+ haveArgInfo: {
30
+ type: Boolean,
31
+ required: true
32
+ },
33
+
34
+ selectedVersion: {
35
+ type: Object,
36
+ required: true
37
+ },
38
+
39
+ },
40
+
41
+ computed: {
42
+ rkeConfig() {
43
+ return this.value.spec.rkeConfig;
44
+ },
45
+ agentArgs() {
46
+ return this.selectedVersion?.agentArgs || {};
47
+ },
48
+ canRemoveKubeletRow(row, idx) {
49
+ return idx !== 0;
50
+ },
51
+ serverArgs() {
52
+ return this.selectedVersion?.serverArgs || {};
53
+ },
54
+ serverConfig() {
55
+ return this.value.spec.rkeConfig.machineGlobalConfig;
56
+ },
57
+ agentConfig() {
58
+ return this.value.agentConfig;
59
+ },
60
+ advancedTitleAlt() {
61
+ const machineSelectorLength = this.rkeConfig.machineSelectorConfig.length;
62
+
63
+ return this.t('cluster.advanced.argInfo.machineSelector.titleAlt', { count: machineSelectorLength });
64
+ },
65
+ protectKernelDefaults() {
66
+ return (this.agentConfig || this.serverConfig)['protect-kernel-defaults'];
67
+ }
68
+ },
69
+
70
+ methods: {
71
+ onInputProtectKernelDefaults(value) {
72
+ Vue.set(this.agentConfig || this.serverConfig, 'protect-kernel-defaults', value);
73
+ }
74
+ }
75
+ };
76
+ </script>
77
+
78
+ <template>
79
+ <div>
80
+ <template v-if="haveArgInfo">
81
+ <h3>{{ t('cluster.advanced.argInfo.title') }}</h3>
82
+ <ArrayListGrouped
83
+ v-if="agentArgs['kubelet-arg']"
84
+ v-model="rkeConfig.machineSelectorConfig"
85
+ class="mb-20"
86
+ :add-label="t('cluster.advanced.argInfo.machineSelector.label')"
87
+ :can-remove="canRemoveKubeletRow"
88
+ :default-add-value="{machineLabelSelector: { matchExpressions: [], matchLabels: {} }, config: {'kubelet-arg': []}}"
89
+ >
90
+ <template #default="{row}">
91
+ <template v-if="row.value.machineLabelSelector">
92
+ <h3>{{ t('cluster.advanced.argInfo.machineSelector.title') }}</h3>
93
+ <MatchExpressions
94
+ v-model="row.value.machineLabelSelector"
95
+ class="mb-20"
96
+ :mode="mode"
97
+ :show-remove="false"
98
+ :initial-empty-row="true"
99
+ />
100
+ <h3>{{ t('cluster.advanced.argInfo.machineSelector.subTitle') }}</h3>
101
+ </template>
102
+ <h3 v-else>
103
+ {{ advancedTitleAlt }}
104
+ </h3>
105
+
106
+ <ArrayList
107
+ v-model="row.value.config['kubelet-arg']"
108
+ :mode="mode"
109
+ :add-label="t('cluster.advanced.argInfo.machineSelector.listLabel')"
110
+ :initial-empty-row="!!row.value.machineLabelSelector"
111
+ />
112
+ </template>
113
+ </ArrayListGrouped>
114
+ <Banner
115
+ v-if="rkeConfig.machineSelectorConfig.length > 1"
116
+ color="info"
117
+ :label="t('cluster.advanced.argInfo.machineSelector.bannerLabel')"
118
+ />
119
+
120
+ <ArrayList
121
+ v-if="serverArgs['kube-controller-manager-arg']"
122
+ v-model="serverConfig['kube-controller-manager-arg']"
123
+ :mode="mode"
124
+ :title="t('cluster.advanced.argInfo.machineSelector.kubeControllerManagerTitle')"
125
+ class="mb-20"
126
+ />
127
+ <ArrayList
128
+ v-if="serverArgs['kube-apiserver-arg']"
129
+ v-model="serverConfig['kube-apiserver-arg']"
130
+ :mode="mode"
131
+ :title="t('cluster.advanced.argInfo.machineSelector.kubeApiServerTitle')"
132
+ class="mb-20"
133
+ />
134
+ <ArrayList
135
+ v-if="serverArgs['kube-scheduler-arg']"
136
+ v-model="serverConfig['kube-scheduler-arg']"
137
+ :mode="mode"
138
+ :title="t('cluster.advanced.argInfo.machineSelector.kubeSchedulerTitle')"
139
+ />
140
+ </template>
141
+ <template v-if="agentArgs && agentArgs['protect-kernel-defaults']">
142
+ <div class="spacer" />
143
+
144
+ <div class="row">
145
+ <div class="col span-12">
146
+ <Checkbox
147
+ data-testid="protect-kernel-defaults"
148
+ :value="protectKernelDefaults"
149
+ :mode="mode"
150
+ :label="t('cluster.advanced.agentArgs.label')"
151
+ @input="onInputProtectKernelDefaults($event)"
152
+ />
153
+ </div>
154
+ </div>
155
+ </template>
156
+ </div>
157
+ </template>
@@ -11,6 +11,7 @@ import LabeledSelect from '@shell/components/form/LabeledSelect';
11
11
  import YamlEditor from '@shell/components/YamlEditor';
12
12
  import { LEGACY } from '@shell/store/features';
13
13
  import semver from 'semver';
14
+ import { _EDIT } from '@shell/config/query-params';
14
15
 
15
16
  const HARVESTER = 'harvester';
16
17
 
@@ -86,18 +87,10 @@ export default {
86
87
  type: Boolean,
87
88
  required: true
88
89
  },
89
- clusterIsAlreadyCreated: {
90
- type: Boolean,
91
- required: true
92
- },
93
90
  isElementalCluster: {
94
91
  type: Boolean,
95
92
  required: true
96
93
  },
97
- isK3s: {
98
- type: Boolean,
99
- required: true
100
- },
101
94
  haveArgInfo: {
102
95
  type: Boolean,
103
96
  required: true
@@ -117,7 +110,16 @@ export default {
117
110
  cloudProviderOptions: {
118
111
  type: Array,
119
112
  required: true
120
- },
113
+ }
114
+ },
115
+
116
+ watch: {
117
+ selectedVersion(neu, old) {
118
+ if (neu?.value !== old?.value && this.ciliumIpv6) {
119
+ // Re-assign so that the setter updates the structure for the new k8s version if needed
120
+ this.ciliumIpv6 = !!this.ciliumIpv6;
121
+ }
122
+ }
121
123
  },
122
124
 
123
125
  computed: {
@@ -166,7 +168,7 @@ export default {
166
168
  * Get the default label for the PSA template option
167
169
  */
168
170
  defaultPsaOptionLabel() {
169
- const optionCase = !this.isK3s ? 'default' : 'none';
171
+ const optionCase = !this.value.isK3s ? 'default' : 'none';
170
172
 
171
173
  return this.$store.getters['i18n/t'](`cluster.rke2.defaultPodSecurityAdmissionConfigurationTemplateName.option.${ optionCase }`);
172
174
  },
@@ -209,7 +211,7 @@ export default {
209
211
  disableOptions() {
210
212
  return (this.serverArgs.disable.options || []).map((value) => {
211
213
  return {
212
- label: this.$store.getters['i18n/withFallback'](`cluster.${ this.isK3s ? 'k3s' : 'rke2' }.systemService."${ value }"`, null, value.replace(/^(rke2|rancher)-/, '')),
214
+ label: this.$store.getters['i18n/withFallback'](`cluster.${ this.value.isK3s ? 'k3s' : 'rke2' }.systemService."${ value }"`, null, value.replace(/^(rke2|rancher)-/, '')),
213
215
  value,
214
216
  };
215
217
  });
@@ -255,7 +257,7 @@ export default {
255
257
  return false;
256
258
  }
257
259
 
258
- const name = this.agentConfig['cloud-provider-name'];
260
+ const name = this.agentConfig?.['cloud-provider-name'];
259
261
 
260
262
  if ( !name ) {
261
263
  return false;
@@ -275,7 +277,7 @@ export default {
275
277
  return false;
276
278
  }
277
279
 
278
- const name = this.agentConfig['cloud-provider-name'];
280
+ const name = this.agentConfig?.['cloud-provider-name'];
279
281
 
280
282
  return name === 'rancher-vsphere';
281
283
  },
@@ -296,15 +298,78 @@ export default {
296
298
  // eslint-disable-next-line no-unused-vars
297
299
  const cni = this.serverConfig.cni; // force this property to recalculate if cni was changed away from cilium and chartValues['rke-cilium'] deleted
298
300
 
299
- return this.userChartValues[this.chartVersionKey('rke2-cilium')]?.cilium?.ipv6?.enabled || false;
301
+ const chart = this.userChartValues[this.chartVersionKey('rke2-cilium')];
302
+
303
+ return chart?.cilium?.ipv6?.enabled || chart?.ipv6?.enabled || false;
304
+ },
305
+ set(neu) {
306
+ const name = this.chartVersionKey('rke2-cilium');
307
+ const values = this.userChartValues[name];
308
+
309
+ // RKE2 older than 1.23.5 uses different Helm chart values structure - need to take that into account
310
+ const version = this.selectedVersion.value;
311
+ let ciliumValues = {};
312
+
313
+ if (semver.gt(version, '1.23.5')) {
314
+ // New style
315
+ ciliumValues = {
316
+ ...values,
317
+ ipv6: {
318
+ ...values?.ipv6,
319
+ enabled: neu
320
+ }
321
+ };
322
+
323
+ delete ciliumValues.cilium;
324
+ } else {
325
+ // Old style
326
+ ciliumValues = {
327
+ ...values,
328
+ cilium: {
329
+ ...values?.cilium,
330
+ ipv6: {
331
+ ...values?.cilium?.ipv6,
332
+ enabled: neu
333
+ }
334
+ }
335
+ };
336
+
337
+ delete ciliumValues.ipv6;
338
+ }
339
+
340
+ this.$emit('cilium-values-changed', ciliumValues);
341
+ }
342
+ },
343
+
344
+ ciliumBandwidthManager: {
345
+ get() {
346
+ // eslint-disable-next-line no-unused-vars
347
+ const cni = this.serverConfig.cni; // force this property to recalculate if cni was changed away from cilium and chartValues['rke-cilium'] deleted
348
+
349
+ return this.userChartValues[this.chartVersionKey('rke2-cilium')]?.bandwidthManager?.enabled || false;
300
350
  },
301
- set(val) {
302
- this.$emit('cilium-ipv6-changed', val);
351
+ set(neu) {
352
+ const name = this.chartVersionKey('rke2-cilium');
353
+ const values = this.userChartValues[name];
354
+
355
+ const ciliumValues = {
356
+ ...values,
357
+ bandwidthManager: {
358
+ ...values?.bandwidthManager,
359
+ enabled: neu
360
+ }
361
+ };
362
+
363
+ this.$emit('cilium-values-changed', ciliumValues);
303
364
  }
304
365
  },
305
366
 
367
+ isEdit() {
368
+ return this.mode === _EDIT;
369
+ },
370
+
306
371
  canNotEditCloudProvider() {
307
- const canNotEdit = this.clusterIsAlreadyCreated && !this.unsupportedCloudProvider;
372
+ const canNotEdit = this.isEdit && !this.unsupportedCloudProvider;
308
373
 
309
374
  return canNotEdit;
310
375
  },
@@ -313,7 +378,7 @@ export default {
313
378
  * Display warning about additional configuration needed for cloud provider Amazon if kube >= 1.27
314
379
  */
315
380
  showCloudProviderAmazonAdditionalConfigWarning() {
316
- return !!semver.gte(this.value.spec.kubernetesVersion, 'v1.27.0') && this.agentConfig['cloud-provider-name'] === 'aws';
381
+ return !!semver.gte(this.value.spec.kubernetesVersion, 'v1.27.0') && this.agentConfig?.['cloud-provider-name'] === 'aws';
317
382
  }
318
383
  },
319
384
 
@@ -378,6 +443,7 @@ export default {
378
443
  class="col span-6"
379
444
  >
380
445
  <LabeledSelect
446
+ v-if="agentConfig"
381
447
  v-model="agentConfig['cloud-provider-name']"
382
448
  :mode="mode"
383
449
  :disabled="canNotEditCloudProvider"
@@ -394,8 +460,9 @@ export default {
394
460
  <div class="col span-6">
395
461
  <LabeledSelect
396
462
  v-model="serverConfig.cni"
463
+ data-testid="cluster-rke2-cni-select"
397
464
  :mode="mode"
398
- :disabled="clusterIsAlreadyCreated"
465
+ :disabled="isEdit"
399
466
  :options="serverArgs.cni.options"
400
467
  :label="t('cluster.rke2.cni.label')"
401
468
  />
@@ -406,9 +473,16 @@ export default {
406
473
  >
407
474
  <Checkbox
408
475
  v-model="ciliumIpv6"
476
+ data-testid="cluster-rke2-cni-ipv6-checkbox"
409
477
  :mode="mode"
410
478
  :label="t('cluster.rke2.address.ipv6.enable')"
411
479
  />
480
+ <Checkbox
481
+ v-model="ciliumBandwidthManager"
482
+ data-testid="cluster-rke2-cni-cilium-bandwidth-manager-checkbox"
483
+ :mode="mode"
484
+ :label="t('cluster.rke2.cni.cilium.BandwidthManager.enable')"
485
+ />
412
486
  </div>
413
487
  </div>
414
488
  <template v-if="showVsphereNote">
@@ -431,6 +505,7 @@ export default {
431
505
  {{ t('cluster.rke2.cloudProvider.header') }}
432
506
  </h3>
433
507
  <YamlEditor
508
+ v-if="agentConfig"
434
509
  ref="yaml"
435
510
  v-model="agentConfig['cloud-provider-config']"
436
511
  :editor-mode="mode === 'view' ? 'VIEW_CODE' : 'EDIT_CODE'"
@@ -335,6 +335,7 @@ export default {
335
335
  v-model="value.pool.labels"
336
336
  :add-label="t('labels.addLabel')"
337
337
  :disabled="busy"
338
+ :mode="mode"
338
339
  :title="t('cluster.machinePool.labels.label')"
339
340
  :read-allowed="false"
340
341
  :value-can-be-empty="true"
@@ -0,0 +1,135 @@
1
+ <script>
2
+ import { LabeledInput } from '@components/Form/LabeledInput';
3
+
4
+ import { RadioGroup } from '@components/Form/Radio';
5
+
6
+ import S3Config from '@shell/edit/provisioning.cattle.io.cluster/tabs/etcd/S3Config';
7
+ import UnitInput from '@shell/components/form/UnitInput';
8
+
9
+ export default {
10
+ components: {
11
+ LabeledInput,
12
+ RadioGroup,
13
+ S3Config,
14
+ UnitInput
15
+ },
16
+
17
+ props: {
18
+ mode: {
19
+ type: String,
20
+ required: true,
21
+ },
22
+
23
+ value: {
24
+ type: Object,
25
+ required: true,
26
+ },
27
+ selectedVersion: {
28
+ type: Object,
29
+ required: true,
30
+ },
31
+
32
+ s3Backup: {
33
+ type: Boolean,
34
+ required: false,
35
+ default: false
36
+ },
37
+ registerBeforeHook: {
38
+ type: Function,
39
+ required: true,
40
+ },
41
+
42
+ },
43
+
44
+ computed: {
45
+ etcd() {
46
+ return this.value.spec.rkeConfig.etcd;
47
+ },
48
+ argsEtcdExposeMetrics() {
49
+ return !!this.selectedVersion?.serverArgs['etcd-expose-metrics'];
50
+ },
51
+ configEtcdExposeMetrics() {
52
+ return !!this.value.spec.rkeConfig.machineGlobalConfig['etcd-expose-metrics'];
53
+ },
54
+
55
+ },
56
+ };
57
+ </script>
58
+
59
+ <template>
60
+ <div>
61
+ <div class="row">
62
+ <div class="col span-6">
63
+ <RadioGroup
64
+ v-model="etcd.disableSnapshots"
65
+ name="etcd-disable-snapshots"
66
+ :options="[true, false]"
67
+ :label="t('cluster.rke2.etcd.disableSnapshots.label')"
68
+ :labels="[t('generic.disable'), t('generic.enable')]"
69
+ :mode="mode"
70
+ />
71
+ </div>
72
+ </div>
73
+ <div
74
+ v-if="etcd.disableSnapshots !== true"
75
+ class="row"
76
+ >
77
+ <div class="col span-6">
78
+ <LabeledInput
79
+ v-model="etcd.snapshotScheduleCron"
80
+ type="cron"
81
+ placeholder="0 * * * *"
82
+ :mode="mode"
83
+ :label="t('cluster.rke2.etcd.snapshotScheduleCron.label')"
84
+ />
85
+ </div>
86
+ <div class="col span-6">
87
+ <UnitInput
88
+ v-model="etcd.snapshotRetention"
89
+ :mode="mode"
90
+ :label="t('cluster.rke2.etcd.snapshotRetention.label')"
91
+ :suffix="t('cluster.rke2.snapshots.suffix')"
92
+ />
93
+ </div>
94
+ </div>
95
+
96
+ <template v-if="etcd.disableSnapshots !== true">
97
+ <div class="spacer" />
98
+
99
+ <RadioGroup
100
+ :value="s3Backup"
101
+ name="etcd-s3"
102
+ :options="[false, true]"
103
+ label="Backup Snapshots to S3"
104
+ :labels="['Disable','Enable']"
105
+ :mode="mode"
106
+ @input="$emit('s3-backup-changed', $event)"
107
+ />
108
+
109
+ <S3Config
110
+ v-if="s3Backup"
111
+ v-model="etcd.s3"
112
+ :namespace="value.metadata.namespace"
113
+ :register-before-hook="registerBeforeHook"
114
+ :mode="mode"
115
+ />
116
+ </template>
117
+
118
+ <div class="spacer" />
119
+
120
+ <div class="row">
121
+ <div class="col span-6">
122
+ <RadioGroup
123
+ v-if="argsEtcdExposeMetrics"
124
+ :value="configEtcdExposeMetrics"
125
+ name="etcd-expose-metrics"
126
+ :options="[false, true]"
127
+ :label="t('cluster.rke2.etcd.exportMetric.label')"
128
+ :labels="[t('cluster.rke2.etcd.exportMetric.false'), t('cluster.rke2.etcd.exportMetric.true')]"
129
+ :mode="mode"
130
+ @input="$emit('config-etcd-expose-metrics-changed', $event)"
131
+ />
132
+ </div>
133
+ </div>
134
+ </div>
135
+ </template>