@rancher/shell 0.4.0 → 0.5.1

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 (243) 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/Certificates.vue +164 -0
  14. package/components/CodeMirror.vue +19 -21
  15. package/components/CruResource.vue +1 -0
  16. package/components/EtcdInfoBanner.vue +1 -1
  17. package/components/ExplorerProjectsNamespaces.vue +25 -1
  18. package/components/IconOrSvg.vue +1 -1
  19. package/components/LandingPagePreference.vue +1 -4
  20. package/components/Questions/index.vue +1 -1
  21. package/components/ResourceDetail/Masthead.vue +16 -3
  22. package/components/ResourceTable.vue +14 -2
  23. package/components/ResourceYaml.vue +5 -0
  24. package/components/SideNav.vue +1 -1
  25. package/components/SingleClusterInfo.vue +1 -4
  26. package/components/Tabbed/index.vue +12 -0
  27. package/components/fleet/FleetRepos.vue +62 -27
  28. package/components/fleet/FleetResources.vue +6 -1
  29. package/components/form/ArrayListSelect.vue +10 -0
  30. package/components/form/KeyValue.vue +4 -0
  31. package/components/form/LabeledSelect.vue +4 -0
  32. package/components/formatter/Checked.vue +11 -3
  33. package/components/formatter/FleetClusterSummaryGraph.vue +27 -0
  34. package/components/formatter/FleetSummaryGraph.vue +23 -11
  35. package/components/formatter/LiveDuration.vue +1 -1
  36. package/components/formatter/PercentageBar.vue +1 -1
  37. package/components/formatter/__tests__/Checked.test.ts +19 -0
  38. package/components/nav/Group.vue +2 -2
  39. package/components/nav/Header.vue +0 -1
  40. package/components/nav/TopLevelMenu.vue +36 -6
  41. package/components/nav/Type.vue +1 -3
  42. package/components/nav/WindowManager/ContainerLogs.vue +101 -3
  43. package/components/nav/WindowManager/ContainerShell.vue +6 -1
  44. package/components/nav/WindowManager/__tests__/ContainerLogs.test.ts +186 -0
  45. package/components/nav/WindowManager/index.vue +11 -10
  46. package/components/nav/__tests__/TopLevelMenu.test.ts +33 -0
  47. package/components/nav/__tests__/Type.test.ts +1 -1
  48. package/components/nuxt/nuxt-child.js +14 -78
  49. package/components/nuxt/nuxt.js +1 -1
  50. package/{layouts → components/templates}/blank.vue +1 -1
  51. package/{layouts → components/templates}/default.vue +8 -98
  52. package/{layouts → components/templates}/error.vue +10 -19
  53. package/{layouts → components/templates}/home.vue +4 -1
  54. package/{layouts → components/templates}/plain.vue +4 -1
  55. package/{layouts → components/templates}/standalone.vue +1 -1
  56. package/{layouts → components/templates}/unauthenticated.vue +1 -1
  57. package/composables/useCompactInput.ts +20 -0
  58. package/composables/useLabeledFormElement.ts +138 -0
  59. package/config/harvester-manager-types.js +2 -0
  60. package/config/private-label.js +22 -0
  61. package/config/product/explorer.js +3 -0
  62. package/config/product/fleet.js +6 -1
  63. package/config/product/manager.js +8 -2
  64. package/config/query-params.js +1 -0
  65. package/config/router.js +385 -364
  66. package/config/settings.ts +1 -0
  67. package/config/store.js +1 -1
  68. package/config/system-namespaces.js +3 -0
  69. package/config/table-headers.js +47 -0
  70. package/core/plugin-routes.ts +56 -114
  71. package/core/plugin.ts +16 -10
  72. package/core/plugins-loader.js +7 -9
  73. package/core/plugins.js +0 -3
  74. package/creators/app/files/.gitlab-ci.yml +1 -1
  75. package/detail/fleet.cattle.io.cluster.vue +11 -1
  76. package/detail/provisioning.cattle.io.cluster.vue +4 -3
  77. package/dialog/ScaleMachineDownDialog.vue +34 -17
  78. package/edit/__tests__/service.test.ts +89 -0
  79. package/edit/auth/googleoauth.vue +1 -5
  80. package/edit/catalog.cattle.io.clusterrepo.vue +18 -0
  81. package/edit/cloudcredential.vue +2 -0
  82. package/edit/configmap.vue +2 -1
  83. package/edit/networking.k8s.io.networkpolicy/__tests__/PolicyRuleTarget.spec.ts +1 -1
  84. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +15 -7
  85. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +112 -0
  86. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +473 -0
  87. package/edit/provisioning.cattle.io.cluster/__tests__/{CustomCommand.tests.ts → CustomCommand.test.ts} +4 -0
  88. package/edit/provisioning.cattle.io.cluster/__tests__/DrainOptions.test.ts +1 -1
  89. package/edit/provisioning.cattle.io.cluster/__tests__/index.test.ts +73 -0
  90. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +7 -1
  91. package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +386 -0
  92. package/edit/provisioning.cattle.io.cluster/import.vue +2 -2
  93. package/edit/provisioning.cattle.io.cluster/index.vue +92 -36
  94. package/edit/provisioning.cattle.io.cluster/rke2.vue +171 -583
  95. package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +137 -0
  96. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +157 -0
  97. package/edit/provisioning.cattle.io.cluster/{Basics.vue → tabs/Basics.vue} +94 -19
  98. package/edit/provisioning.cattle.io.cluster/{MachinePool.vue → tabs/MachinePool.vue} +1 -0
  99. package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +135 -0
  100. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +189 -0
  101. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +144 -0
  102. package/edit/provisioning.cattle.io.cluster/tabs/upgrade/index.vue +76 -0
  103. package/edit/service.vue +12 -0
  104. package/edit/workload/mixins/workload.js +1 -1
  105. package/initialize/App.js +25 -71
  106. package/initialize/client.js +21 -162
  107. package/initialize/index.js +27 -123
  108. package/list/management.cattle.io.feature.vue +1 -7
  109. package/list/node.vue +1 -0
  110. package/machine-config/__tests__/vmwarevsphere.test.ts +100 -21
  111. package/machine-config/vmwarevsphere.vue +73 -51
  112. package/middleware/authenticated.js +10 -17
  113. package/mixins/auth-config.js +2 -7
  114. package/mixins/brand.js +29 -41
  115. package/mixins/labeled-form-element.ts +6 -1
  116. package/models/__tests__/management.cattle.io.node.ts +85 -0
  117. package/models/__tests__/management.cattle.io.nodepool.ts +83 -0
  118. package/models/__tests__/namespace.test.ts +49 -9
  119. package/models/__tests__/workload.test.ts +91 -0
  120. package/models/cluster/node.js +4 -4
  121. package/models/cluster.x-k8s.io.machinedeployment.js +14 -0
  122. package/models/fleet.cattle.io.cluster.js +4 -0
  123. package/models/fleet.cattle.io.gitrepo.js +56 -13
  124. package/models/management.cattle.io.kontainerdriver.js +1 -1
  125. package/models/management.cattle.io.node.js +18 -14
  126. package/models/management.cattle.io.nodepool.js +17 -0
  127. package/models/namespace.js +1 -1
  128. package/models/pod.js +20 -0
  129. package/models/provisioning.cattle.io.cluster.js +20 -3
  130. package/models/secret.js +117 -18
  131. package/models/workload.js +16 -0
  132. package/models/workload.service.js +18 -0
  133. package/package.json +10 -9
  134. package/pages/about.vue +0 -1
  135. package/pages/account/create-key.vue +0 -1
  136. package/pages/account/index.vue +0 -1
  137. package/pages/auth/login.vue +0 -1
  138. package/pages/auth/logout.vue +0 -2
  139. package/pages/auth/setup.vue +0 -4
  140. package/pages/auth/verify.vue +14 -8
  141. package/pages/c/_cluster/apps/charts/install.vue +4 -4
  142. package/pages/c/_cluster/apps/index.vue +0 -2
  143. package/pages/c/_cluster/auth/index.vue +0 -2
  144. package/pages/c/_cluster/ecm/index.vue +0 -2
  145. package/pages/c/_cluster/explorer/index.vue +28 -2
  146. package/pages/c/_cluster/fleet/index.vue +1 -1
  147. package/pages/c/_cluster/index.vue +0 -2
  148. package/pages/c/_cluster/settings/banners.vue +0 -2
  149. package/pages/c/_cluster/settings/brand.vue +0 -2
  150. package/pages/c/_cluster/settings/index.vue +0 -2
  151. package/pages/c/_cluster/settings/links.vue +0 -1
  152. package/pages/c/_cluster/settings/performance.vue +0 -1
  153. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +2 -1
  154. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +10 -46
  155. package/pages/c/_cluster/uiplugins/index.vue +0 -2
  156. package/pages/diagnostic.vue +1 -2
  157. package/pages/fail-whale.vue +0 -1
  158. package/pages/prefs.vue +0 -1
  159. package/pages/support/index.vue +2 -8
  160. package/pkg/auto-import.js +1 -1
  161. package/plugins/axios.js +0 -36
  162. package/plugins/back-button.js +3 -5
  163. package/plugins/codemirror-loader.js +1 -1
  164. package/plugins/codemirror.js +41 -0
  165. package/plugins/dashboard-store/__tests__/{mutations.spec.ts → mutations.test.ts} +1 -1
  166. package/plugins/dashboard-store/__tests__/resource-class.test.ts +49 -0
  167. package/plugins/dashboard-store/__tests__/utils/store-mocks.ts +7 -0
  168. package/plugins/dashboard-store/actions.js +30 -4
  169. package/plugins/dashboard-store/classify.js +1 -18
  170. package/plugins/dashboard-store/getters.js +10 -5
  171. package/plugins/dashboard-store/index.js +0 -12
  172. package/plugins/dashboard-store/mutations.js +0 -4
  173. package/plugins/dashboard-store/resource-class.js +59 -18
  174. package/plugins/steve/__tests__/steve-class.spec.ts +59 -0
  175. package/plugins/steve/__tests__/utils/steve-mocks.ts +31 -0
  176. package/plugins/steve/getters.js +4 -1
  177. package/plugins/steve/norman-class.js +19 -0
  178. package/plugins/steve/steve-class.js +22 -0
  179. package/plugins/steve/subscribe.js +4 -10
  180. package/rancher-components/Accordion/Accordion.test.ts +45 -0
  181. package/rancher-components/Accordion/Accordion.vue +85 -0
  182. package/rancher-components/Accordion/index.ts +1 -0
  183. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +19 -2
  184. package/rancher-components/Form/LabeledInput/LabeledInput.vue +12 -1
  185. package/rancher-components/Form/Radio/RadioButton.test.ts +7 -3
  186. package/rancher-components/Form/Radio/RadioGroup.test.ts +30 -0
  187. package/rancher-components/Form/Radio/RadioGroup.vue +4 -0
  188. package/rancher-components/StringList/StringList.test.ts +270 -0
  189. package/rancher-components/StringList/StringList.vue +57 -18
  190. package/rancher-components/components/Accordion/Accordion.test.ts +45 -0
  191. package/rancher-components/components/Accordion/Accordion.vue +85 -0
  192. package/rancher-components/components/Accordion/index.ts +1 -0
  193. package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +19 -2
  194. package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +4 -1
  195. package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +50 -0
  196. package/scripts/extension/parse-tag-name +2 -2
  197. package/scripts/publish-shell.sh +10 -0
  198. package/scripts/test-plugins-build.sh +85 -9
  199. package/server/har-file.js +183 -0
  200. package/store/catalog.js +1 -1
  201. package/store/features.js +1 -0
  202. package/store/i18n.js +11 -0
  203. package/store/index.js +10 -11
  204. package/store/prefs.js +33 -35
  205. package/store/type-map.js +8 -7
  206. package/tsconfig.json +35 -9
  207. package/tsconfig.paths.json +18 -0
  208. package/types/shell/index.d.ts +345 -214
  209. package/utils/__tests__/create-yaml.test.ts +60 -0
  210. package/utils/axios.js +0 -19
  211. package/utils/azure.js +24 -0
  212. package/utils/create-yaml.js +17 -10
  213. package/utils/monitoring.js +1 -1
  214. package/utils/nuxt.js +18 -39
  215. package/utils/object.js +14 -0
  216. package/utils/router.scrollBehavior.js +12 -14
  217. package/utils/time.js +1 -1
  218. package/utils/url.ts +1 -1
  219. package/vue.config.js +23 -2
  220. package/.DS_Store +0 -0
  221. package/assets/images/providers/aks-black.svg +0 -28
  222. package/assets/images/providers/aks.svg +0 -31
  223. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.tests.ts +0 -234
  224. package/initialize/layouts.ts +0 -26
  225. package/mixins/fetch.server.js +0 -73
  226. package/pages/c/index.vue +0 -9
  227. package/pages/rio/mesh.vue +0 -508
  228. package/plugins/transitions.js +0 -4
  229. package/scripts/.DS_Store +0 -0
  230. package/scripts/verdaccio.log +0 -205
  231. package/tsconfig.default.json +0 -46
  232. package/yarn-error.log +0 -200
  233. /package/components/form/__tests__/{NameNsDescription.ts → NameNsDescription.test.ts} +0 -0
  234. /package/edit/networking.k8s.io.networkpolicy/__tests__/utils/{selectors.ts → selectors.test.ts} +0 -0
  235. /package/edit/provisioning.cattle.io.cluster/{AgentConfiguration.vue → tabs/AgentConfiguration.vue} +0 -0
  236. /package/edit/provisioning.cattle.io.cluster/{MemberRoles.vue → tabs/MemberRoles.vue} +0 -0
  237. /package/edit/provisioning.cattle.io.cluster/{S3Config.vue → tabs/etcd/S3Config.vue} +0 -0
  238. /package/edit/provisioning.cattle.io.cluster/{ACE.vue → tabs/networking/ACE.vue} +0 -0
  239. /package/edit/provisioning.cattle.io.cluster/{RegistryConfigs.vue → tabs/registries/RegistryConfigs.vue} +0 -0
  240. /package/edit/provisioning.cattle.io.cluster/{RegistryMirrors.vue → tabs/registries/RegistryMirrors.vue} +0 -0
  241. /package/edit/provisioning.cattle.io.cluster/{DrainOptions.vue → tabs/upgrade/DrainOptions.vue} +0 -0
  242. /package/plugins/dashboard-store/__tests__/{actions.spec.ts → actions.test.ts} +0 -0
  243. /package/plugins/dashboard-store/__tests__/{getters.spec.ts → getters.test.ts} +0 -0
@@ -0,0 +1,189 @@
1
+ <script>
2
+ import { LabeledInput } from '@components/Form/LabeledInput';
3
+ import { Banner } from '@components/Banner';
4
+ import { Checkbox } from '@components/Form/Checkbox';
5
+ import { _EDIT, _VIEW } from '@shell/config/query-params';
6
+ import ArrayList from '@shell/components/form/ArrayList';
7
+ import ACE from '@shell/edit/provisioning.cattle.io.cluster/tabs/networking/ACE';
8
+
9
+ const NETBIOS_TRUNCATION_LENGTH = 15;
10
+
11
+ export default {
12
+ components: {
13
+ LabeledInput,
14
+ Banner,
15
+ Checkbox,
16
+ ArrayList,
17
+ ACE
18
+ },
19
+
20
+ props: {
21
+ mode: {
22
+ type: String,
23
+ required: true,
24
+ },
25
+
26
+ value: {
27
+ type: Object,
28
+ required: true,
29
+ },
30
+ selectedVersion: {
31
+ type: Object,
32
+ required: true,
33
+ },
34
+ truncateLimit: {
35
+ type: Number,
36
+ required: false,
37
+ default: 0
38
+ }
39
+ },
40
+
41
+ computed: {
42
+ truncateHostnames() {
43
+ return this.truncateLimit === NETBIOS_TRUNCATION_LENGTH;
44
+ },
45
+ serverConfig() {
46
+ return this.value.spec.rkeConfig.machineGlobalConfig;
47
+ },
48
+ serverArgs() {
49
+ return this.selectedVersion?.serverArgs || {};
50
+ },
51
+
52
+ showIpv6Warning() {
53
+ const clusterCIDR = this.serverConfig['cluster-cidr'] || '';
54
+ const serviceCIDR = this.serverConfig['service-cidr'] || '';
55
+
56
+ return clusterCIDR.includes(':') || serviceCIDR.includes(':');
57
+ },
58
+ hostnameTruncationManuallySet() {
59
+ return !!this.truncateLimit && this.truncateLimit !== NETBIOS_TRUNCATION_LENGTH;
60
+ },
61
+ isEdit() {
62
+ return this.mode === _EDIT;
63
+ },
64
+ isView() {
65
+ return this.mode === _VIEW;
66
+ }
67
+ },
68
+ };
69
+ </script>
70
+
71
+ <template>
72
+ <div>
73
+ <h3>
74
+ {{ t('cluster.rke2.address.header') }}
75
+ <i
76
+ v-clean-tooltip="t('cluster.rke2.address.tooltip')"
77
+ class="icon icon-info"
78
+ />
79
+ </h3>
80
+ <Banner
81
+ v-if="showIpv6Warning"
82
+ color="warning"
83
+ >
84
+ {{ t('cluster.rke2.address.ipv6.warning') }}
85
+ </Banner>
86
+ <div class="row mb-20">
87
+ <div
88
+ v-if="serverArgs['cluster-cidr']"
89
+ class="col span-6"
90
+ >
91
+ <LabeledInput
92
+ v-model="serverConfig['cluster-cidr']"
93
+ :mode="mode"
94
+ :disabled="isEdit"
95
+ :label="t('cluster.rke2.address.clusterCidr.label')"
96
+ />
97
+ </div>
98
+ <div
99
+ v-if="serverArgs['service-cidr']"
100
+ class="col span-6"
101
+ >
102
+ <LabeledInput
103
+ v-model="serverConfig['service-cidr']"
104
+ :mode="mode"
105
+ :disabled="isEdit"
106
+ :label="t('cluster.rke2.address.serviceCidr.label')"
107
+ />
108
+ </div>
109
+ </div>
110
+
111
+ <div class="row mb-20">
112
+ <div
113
+ v-if="serverArgs['cluster-dns']"
114
+ class="col span-6"
115
+ >
116
+ <LabeledInput
117
+ v-model="serverConfig['cluster-dns']"
118
+ :mode="mode"
119
+ :disabled="isEdit"
120
+ :label="t('cluster.rke2.address.dns.label')"
121
+ />
122
+ </div>
123
+ <div
124
+ v-if="serverArgs['cluster-domain']"
125
+ class="col span-6"
126
+ >
127
+ <LabeledInput
128
+ v-model="serverConfig['cluster-domain']"
129
+ :mode="mode"
130
+ :disabled="isEdit"
131
+ :label="t('cluster.rke2.address.domain.label')"
132
+ />
133
+ </div>
134
+ </div>
135
+
136
+ <div
137
+ v-if="serverArgs['service-node-port-range']"
138
+ class="row mb-20"
139
+ >
140
+ <div class="col span-6">
141
+ <LabeledInput
142
+ v-model="serverConfig['service-node-port-range']"
143
+ :mode="mode"
144
+ :label="t('cluster.rke2.address.nodePortRange.label')"
145
+ />
146
+ </div>
147
+ <div
148
+ class="col span-6"
149
+ >
150
+ <Checkbox
151
+ v-if="!isView || isView && !hostnameTruncationManuallySet"
152
+ :value="truncateHostnames"
153
+ class="mt-20"
154
+ :disabled="isEdit || isView || hostnameTruncationManuallySet"
155
+ :mode="mode"
156
+ :label="t('cluster.rke2.truncateHostnames')"
157
+ @input="$emit('truncate-hostname', $event)"
158
+ />
159
+ <Banner
160
+ v-if="hostnameTruncationManuallySet"
161
+ color="info"
162
+ >
163
+ <div class="text">
164
+ {{ t('cluster.machinePool.truncationCluster', { limit: truncateLimit }) }}
165
+ </div>
166
+ </Banner>
167
+ </div>
168
+ </div>
169
+
170
+ <div
171
+ v-if="serverArgs['tls-san']"
172
+ class="row mb-20"
173
+ >
174
+ <div class="col span-6">
175
+ <ArrayList
176
+ v-model="serverConfig['tls-san']"
177
+ :protip="false"
178
+ :mode="mode"
179
+ :title="t('cluster.rke2.address.tlsSan.label')"
180
+ />
181
+ </div>
182
+ </div>
183
+
184
+ <ACE
185
+ v-model="value"
186
+ :mode="mode"
187
+ />
188
+ </div>
189
+ </template>
@@ -0,0 +1,144 @@
1
+ <script>
2
+ import { LabeledInput } from '@components/Form/LabeledInput';
3
+ import { Banner } from '@components/Banner';
4
+ import { Checkbox } from '@components/Form/Checkbox';
5
+ import SelectOrCreateAuthSecret from '@shell/components/form/SelectOrCreateAuthSecret';
6
+ import AdvancedSection from '@shell/components/AdvancedSection.vue';
7
+ import RegistryConfigs from '@shell/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs';
8
+ import RegistryMirrors from '@shell/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryMirrors';
9
+
10
+ export default {
11
+ components: {
12
+ LabeledInput,
13
+ Banner,
14
+ Checkbox,
15
+ SelectOrCreateAuthSecret,
16
+ AdvancedSection,
17
+ RegistryConfigs,
18
+ RegistryMirrors
19
+ },
20
+
21
+ props: {
22
+ registerBeforeHook: {
23
+ type: Function,
24
+ required: true,
25
+ },
26
+
27
+ mode: {
28
+ type: String,
29
+ required: true,
30
+ },
31
+
32
+ value: {
33
+ type: Object,
34
+ required: true,
35
+ },
36
+
37
+ showCustomRegistryInput: {
38
+ type: Boolean,
39
+ required: true,
40
+ },
41
+
42
+ registryHost: {
43
+ type: String,
44
+ required: false,
45
+ default: null
46
+ },
47
+
48
+ registrySecret: {
49
+ type: String,
50
+ required: false,
51
+ default: null
52
+ },
53
+
54
+ showCustomRegistryAdvancedInput: {
55
+ type: Boolean,
56
+ required: true,
57
+ }
58
+ }
59
+ };
60
+ </script>
61
+
62
+ <template>
63
+ <div>
64
+ <div class="row">
65
+ <h3>{{ t('cluster.privateRegistry.label') }}</h3>
66
+ </div>
67
+ <div class="row">
68
+ <div class="col span-12">
69
+ <Banner
70
+ :closable="false"
71
+ class="cluster-tools-tip"
72
+ color="info"
73
+ label-key="cluster.privateRegistry.description"
74
+ />
75
+ </div>
76
+ </div>
77
+ <div class="row">
78
+ <Checkbox
79
+ :value="showCustomRegistryInput"
80
+ class="mb-20"
81
+ :label="t('cluster.privateRegistry.label')"
82
+ @input="$emit('custom-registry-changed', $event)"
83
+ />
84
+ </div>
85
+ <div
86
+ v-if="showCustomRegistryInput"
87
+ class="row"
88
+ >
89
+ <div class="col span-6">
90
+ <LabeledInput
91
+ :value="registryHost"
92
+ label-key="catalog.chart.registry.custom.inputLabel"
93
+ placeholder-key="catalog.chart.registry.custom.placeholder"
94
+ :min-height="30"
95
+ @input="$emit('registry-host-changed', $event)"
96
+ />
97
+ <SelectOrCreateAuthSecret
98
+ v-model="registrySecret"
99
+ :register-before-hook="registerBeforeHook"
100
+ :hook-priority="1"
101
+ :mode="mode"
102
+ in-store="management"
103
+ :allow-ssh="false"
104
+ :allow-rke="true"
105
+ :vertical="true"
106
+ :namespace="value.metadata.namespace"
107
+ generate-name="registryconfig-auth-"
108
+ @input="$emit('registry-secret-changed', $event)"
109
+ />
110
+ </div>
111
+ </div>
112
+ <template>
113
+ <div
114
+ v-if="showCustomRegistryInput"
115
+ class="row"
116
+ >
117
+ <AdvancedSection
118
+ class="col span-12 advanced"
119
+ :is-open-by-default="showCustomRegistryAdvancedInput"
120
+ :mode="mode"
121
+ >
122
+ <Banner
123
+ :closable="false"
124
+ class="cluster-tools-tip"
125
+ color="info"
126
+ :label-key="value.isK3s ? 'cluster.privateRegistry.docsLinkK3s' : 'cluster.privateRegistry.docsLinkRke2'"
127
+ />
128
+ <RegistryMirrors
129
+ v-model="value"
130
+ class="mt-20"
131
+ :mode="mode"
132
+ />
133
+ <RegistryConfigs
134
+ v-model="value"
135
+ class="mt-20"
136
+ :mode="mode"
137
+ :cluster-register-before-hook="registerBeforeHook"
138
+ @updateConfigs="$emit('update-configs-changed', $event)"
139
+ />
140
+ </AdvancedSection>
141
+ </div>
142
+ </template>
143
+ </div>
144
+ </template>
@@ -0,0 +1,76 @@
1
+ <script>
2
+ import { get } from '@shell/utils/object';
3
+ import { LabeledInput } from '@components/Form/LabeledInput';
4
+ import { Banner } from '@components/Banner';
5
+ import DrainOptions from '@shell/edit/provisioning.cattle.io.cluster/tabs/upgrade/DrainOptions';
6
+
7
+ export default {
8
+ components: {
9
+ LabeledInput,
10
+ Banner,
11
+ DrainOptions
12
+ },
13
+
14
+ props: {
15
+ mode: {
16
+ type: String,
17
+ required: true,
18
+ },
19
+
20
+ value: {
21
+ type: Object,
22
+ required: true,
23
+ },
24
+ },
25
+
26
+ computed: {
27
+ rkeConfig() {
28
+ return this.value.spec.rkeConfig;
29
+ },
30
+ },
31
+ methods: { get }
32
+ };
33
+ </script>
34
+
35
+ <template>
36
+ <div>
37
+ <Banner
38
+ v-if="get(rkeConfig, 'upgradeStrategy.controlPlaneDrainOptions.deleteEmptyDirData')"
39
+ color="warning"
40
+ >
41
+ {{ t('cluster.rke2.drain.deleteEmptyDir.warning', {}, true) }}
42
+ </Banner>
43
+ <div class="row">
44
+ <div class="col span-6">
45
+ <h3>{{ t('cluster.rke2.controlPlaneConcurrency.header') }}</h3>
46
+ <LabeledInput
47
+ v-model="rkeConfig.upgradeStrategy.controlPlaneConcurrency"
48
+ :mode="mode"
49
+ :label="t('cluster.rke2.controlPlaneConcurrency.label')"
50
+ :tooltip="t('cluster.rke2.controlPlaneConcurrency.toolTip')"
51
+ />
52
+ <div class="spacer" />
53
+ <DrainOptions
54
+ v-model="rkeConfig.upgradeStrategy.controlPlaneDrainOptions"
55
+ :mode="mode"
56
+ />
57
+ </div>
58
+ <div class="col span-6">
59
+ <h3>
60
+ {{ t('cluster.rke2.workNode.label') }}
61
+ </h3>
62
+ <LabeledInput
63
+ v-model="rkeConfig.upgradeStrategy.workerConcurrency"
64
+ :mode="mode"
65
+ :label="t('cluster.rke2.workerConcurrency.label')"
66
+ :tooltip="t('cluster.rke2.workerConcurrency.toolTip')"
67
+ />
68
+ <div class="spacer" />
69
+ <DrainOptions
70
+ v-model="rkeConfig.upgradeStrategy.workerDrainOptions"
71
+ :mode="mode"
72
+ />
73
+ </div>
74
+ </div>
75
+ </div>
76
+ </template>
package/edit/service.vue CHANGED
@@ -26,6 +26,7 @@ import { HARVESTER_NAME as HARVESTER } from '@shell/config/features';
26
26
  import { allHash } from '@shell/utils/promise';
27
27
  import { isHarvesterSatisfiesVersion } from '@shell/utils/cluster';
28
28
  import { Port } from '@shell/utils/validators/formRules';
29
+ import { _CLONE } from '@shell/config/query-params';
29
30
 
30
31
  const SESSION_AFFINITY_ACTION_VALUES = {
31
32
  NONE: 'None',
@@ -75,6 +76,17 @@ export default {
75
76
  }
76
77
  }
77
78
 
79
+ // Set clusterIP to an empty string, if it exists and the value is not None when clone a service
80
+ // Remove clusterIPs if it exists when clone a service
81
+ if (this.realMode === _CLONE) {
82
+ if (this.value?.spec?.clusterIP && this.value?.spec?.clusterIP !== 'None') {
83
+ this.value.spec.clusterIP = '';
84
+ }
85
+ if (this.value?.spec?.clusterIPs) {
86
+ this.$delete(this.value.spec, 'clusterIPs');
87
+ }
88
+ }
89
+
78
90
  const matchingPods = {
79
91
  matched: 0,
80
92
  matches: [],
@@ -707,7 +707,7 @@ export default {
707
707
  return Promise.all([
708
708
  ...toSave.map((svc) => svc.save()),
709
709
  ...toRemove.map((svc) => {
710
- const ui = svc?.metadata?.annotations[UI_MANAGED];
710
+ const ui = svc?.metadata?.annotations?.[UI_MANAGED];
711
711
 
712
712
  if (ui) {
713
713
  svc.remove();
package/initialize/App.js CHANGED
@@ -2,52 +2,34 @@
2
2
 
3
3
  import Vue from 'vue';
4
4
 
5
- import { getMatchedComponentsInstances, getChildrenComponentInstancesUsingFetch, promisify, globalHandleError } from '../utils/nuxt';
6
- import NuxtError from '../layouts/error.vue';
5
+ import {
6
+ getMatchedComponentsInstances, getChildrenComponentInstancesUsingFetch, promisify, globalHandleError, sanitizeComponent
7
+ } from '../utils/nuxt';
8
+ import NuxtError from '../components/templates/error.vue';
7
9
  import NuxtLoading from '../components/nav/GlobalLoading.vue';
8
10
 
9
11
  import '../assets/styles/app.scss';
10
- import { getLayouts } from './layouts';
11
-
12
- const layouts = getLayouts();
13
12
 
14
13
  export default {
15
14
  render(h) {
16
15
  const loadingEl = h('NuxtLoading', { ref: 'loading' });
17
16
 
18
- const layoutEl = h(this.layout || 'nuxt');
19
17
  const templateEl = h('div', {
20
18
  domProps: { id: '__layout' },
21
- key: this.layoutName
22
- }, [layoutEl]);
23
-
24
- const transitionEl = h('transition', {
25
- props: {
26
- name: 'layout',
27
- mode: 'out-in'
28
- },
29
- on: {
30
- beforeEnter(el) {
31
- // Ensure to trigger scroll event after calling scrollBehavior
32
- window.$nuxt.$nextTick(() => {
33
- window.$nuxt.$emit('triggerScroll');
34
- });
35
- }
36
- }
37
- }, [templateEl]);
19
+ key: this.showErrorPage
20
+ }, [this.showErrorPage ? h(sanitizeComponent(NuxtError)) : h('router-view')]);
38
21
 
39
22
  return h('div', { domProps: { id: '__nuxt' } }, [
40
23
  loadingEl,
41
24
  // h(NuxtBuildIndicator), // The build indicator doesn't work as is right now and emits an error in the console so I'm leaving it out for now
42
- transitionEl
25
+ templateEl
43
26
  ]);
44
27
  },
45
28
 
46
29
  data: () => ({
47
30
  isOnline: true,
48
31
 
49
- layout: null,
50
- layoutName: '',
32
+ showErrorPage: false,
51
33
 
52
34
  nbFetching: 0
53
35
  }),
@@ -59,15 +41,14 @@ export default {
59
41
  // Add this.$nuxt in child instances
60
42
  this.$root.$options.$nuxt = this;
61
43
 
62
- if (process.client) {
63
- // add to window so we can listen when ready
64
- window.$nuxt = this;
44
+ // add to window so we can listen when ready
45
+ window.$nuxt = this;
46
+
47
+ this.refreshOnlineStatus();
48
+ // Setup the listeners
49
+ window.addEventListener('online', this.refreshOnlineStatus);
50
+ window.addEventListener('offline', this.refreshOnlineStatus);
65
51
 
66
- this.refreshOnlineStatus();
67
- // Setup the listeners
68
- window.addEventListener('online', this.refreshOnlineStatus);
69
- window.addEventListener('offline', this.refreshOnlineStatus);
70
- }
71
52
  // Add $nuxt.error()
72
53
  this.error = this.nuxt.error;
73
54
  // Add $nuxt.context
@@ -92,15 +73,13 @@ export default {
92
73
 
93
74
  methods: {
94
75
  refreshOnlineStatus() {
95
- if (process.client) {
96
- if (typeof window.navigator.onLine === 'undefined') {
97
- // If the browser doesn't support connection status reports
98
- // assume that we are online because most apps' only react
99
- // when they now that the connection has been interrupted
100
- this.isOnline = true;
101
- } else {
102
- this.isOnline = window.navigator.onLine;
103
- }
76
+ if (typeof window.navigator.onLine === 'undefined') {
77
+ // If the browser doesn't support connection status reports
78
+ // assume that we are online because most apps' only react
79
+ // when they now that the connection has been interrupted
80
+ this.isOnline = true;
81
+ } else {
82
+ this.isOnline = window.navigator.onLine;
104
83
  }
105
84
  },
106
85
 
@@ -162,36 +141,11 @@ export default {
162
141
  }
163
142
  }
164
143
 
165
- let errorLayout = (NuxtError.options || NuxtError).layout;
166
-
167
- if (typeof errorLayout === 'function') {
168
- errorLayout = errorLayout(this.context);
169
- }
170
-
171
- this.setLayout(errorLayout);
144
+ this.showErrorPage = true;
145
+ } else {
146
+ this.showErrorPage = false;
172
147
  }
173
148
  },
174
-
175
- setLayout(layout) {
176
- if (layout && typeof layout !== 'string') {
177
- throw new Error('[nuxt] Avoid using non-string value as layout property.');
178
- }
179
-
180
- if (!layout || !layouts[`_${ layout }`]) {
181
- layout = 'default';
182
- }
183
- this.layoutName = layout;
184
- this.layout = layouts[`_${ layout }`];
185
-
186
- return this.layout;
187
- },
188
- loadLayout(layout) {
189
- if (!layout || !layouts[`_${ layout }`]) {
190
- layout = 'default';
191
- }
192
-
193
- return Promise.resolve(layouts[`_${ layout }`]);
194
- },
195
149
  },
196
150
 
197
151
  components: { NuxtLoading }