@rancher/shell 3.0.10 → 3.0.11

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 (64) hide show
  1. package/assets/translations/en-us.yaml +7 -5
  2. package/chart/__tests__/rancher-backup-index.test.ts +248 -0
  3. package/chart/rancher-backup/index.vue +41 -2
  4. package/components/BrandImage.vue +6 -5
  5. package/components/ConsumptionGauge.vue +12 -4
  6. package/components/DynamicContent/DynamicContentIcon.vue +3 -2
  7. package/components/ExplorerProjectsNamespaces.vue +1 -4
  8. package/components/LazyImage.vue +2 -1
  9. package/components/Resource/Detail/Card/Scaler.vue +4 -4
  10. package/components/Tabbed/index.vue +6 -0
  11. package/components/__tests__/ConsumptionGauge.test.ts +31 -0
  12. package/components/form/ProjectMemberEditor.vue +0 -10
  13. package/components/nav/TopLevelMenu.helper.ts +7 -79
  14. package/components/nav/__tests__/TopLevelMenu.helper.test.ts +2 -53
  15. package/config/private-label.js +2 -1
  16. package/config/product/apps.js +1 -0
  17. package/core/__tests__/extension-manager-impl.test.js +187 -2
  18. package/core/extension-manager-impl.js +4 -2
  19. package/core/plugin-helpers.ts +31 -0
  20. package/detail/__tests__/node.test.ts +83 -0
  21. package/detail/management.cattle.io.oidcclient.vue +2 -1
  22. package/detail/node.vue +1 -0
  23. package/edit/catalog.cattle.io.clusterrepo.vue +17 -3
  24. package/edit/cloudcredential.vue +2 -1
  25. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +11 -6
  26. package/edit/provisioning.cattle.io.cluster/index.vue +5 -4
  27. package/edit/provisioning.cattle.io.cluster/shared.ts +4 -2
  28. package/edit/secret/generic.vue +1 -0
  29. package/edit/secret/index.vue +2 -1
  30. package/edit/service.vue +2 -14
  31. package/list/management.cattle.io.feature.vue +7 -1
  32. package/list/provisioning.cattle.io.cluster.vue +0 -49
  33. package/mixins/brand.js +2 -1
  34. package/models/catalog.cattle.io.clusterrepo.js +9 -0
  35. package/models/cluster.x-k8s.io.machinedeployment.js +8 -3
  36. package/models/management.cattle.io.authconfig.js +2 -1
  37. package/models/management.cattle.io.cluster.js +4 -3
  38. package/models/monitoring.coreos.com.receiver.js +11 -6
  39. package/models/provisioning.cattle.io.cluster.js +2 -2
  40. package/package.json +5 -5
  41. package/pages/c/_cluster/apps/charts/index.vue +3 -8
  42. package/pages/c/_cluster/apps/charts/install.vue +8 -9
  43. package/pages/c/_cluster/istio/index.vue +4 -2
  44. package/pages/c/_cluster/longhorn/index.vue +2 -1
  45. package/pages/c/_cluster/monitoring/index.vue +2 -2
  46. package/pages/c/_cluster/neuvector/index.vue +2 -1
  47. package/pages/c/_cluster/settings/performance.vue +0 -5
  48. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +2 -1
  49. package/pages/c/_cluster/uiplugins/index.vue +2 -1
  50. package/plugins/steve/steve-pagination-utils.ts +1 -2
  51. package/plugins/steve/subscribe.js +29 -4
  52. package/rancher-components/RcButton/RcButton.vue +3 -3
  53. package/rancher-components/RcButtonSplit/RcButtonSplit.test.ts +253 -0
  54. package/rancher-components/RcButtonSplit/RcButtonSplit.vue +158 -0
  55. package/rancher-components/RcButtonSplit/index.ts +1 -0
  56. package/scripts/test-plugins-build.sh +4 -4
  57. package/types/shell/index.d.ts +1 -0
  58. package/utils/__tests__/require-asset.test.ts +98 -0
  59. package/utils/async.ts +1 -5
  60. package/utils/brand.ts +3 -1
  61. package/utils/favicon.js +4 -3
  62. package/utils/require-asset.ts +95 -0
  63. package/vue.config.js +4 -3
  64. package/components/HarvesterServiceAddOnConfig.vue +0 -207
@@ -1,5 +1,6 @@
1
1
  <script lang="ts">
2
2
  import CreateEditView from '@shell/mixins/create-edit-view';
3
+ import AsyncButton from '@shell/components/AsyncButton.vue';
3
4
  import Footer from '@shell/components/form/Footer';
4
5
  import { LabeledInput } from '@components/Form/LabeledInput';
5
6
  import NameNsDescription from '@shell/components/form/NameNsDescription';
@@ -16,6 +17,7 @@ import { getVersionData } from '@shell/config/version';
16
17
  import { RcItemCard } from '@components/RcItemCard';
17
18
  import { _CREATE, _EDIT, TARGET, _VIEW } from '@shell/config/query-params';
18
19
  import { RcIconType } from '@components/RcIcon/types';
20
+ import { requireAsset } from '@shell/utils/require-asset';
19
21
 
20
22
  export default {
21
23
  name: 'CruCatalogRepo',
@@ -23,6 +25,7 @@ export default {
23
25
  emits: ['input'],
24
26
 
25
27
  components: {
28
+ AsyncButton,
26
29
  Footer,
27
30
  LabeledInput,
28
31
  NameNsDescription,
@@ -64,7 +67,7 @@ export default {
64
67
  {
65
68
  id: CLUSTER_REPO_TYPES.OCI_URL,
66
69
  header: { title: { key: 'catalog.repo.target.oci.title' } },
67
- image: { src: require('@shell/assets/images/providers/oci-open-containers.svg'), alt: { key: 'catalog.repo.target.oci.title' } },
70
+ image: { src: requireAsset('@shell/assets/images/providers/oci-open-containers.svg'), alt: { key: 'catalog.repo.target.oci.title' } },
68
71
  content: { key: 'catalog.repo.target.oci.description' },
69
72
  },
70
73
  ];
@@ -74,7 +77,7 @@ export default {
74
77
  clusterRepoTargets.push({
75
78
  id: CLUSTER_REPO_TYPES.SUSE_APP_COLLECTION,
76
79
  header: { title: { key: 'catalog.repo.target.suseAppCollection.title' } },
77
- image: { src: require('@shell/assets/images/content/suse.svg'), alt: { key: 'catalog.repo.target.suseAppCollection.title' } },
80
+ image: { src: requireAsset('@shell/assets/images/content/suse.svg'), alt: { key: 'catalog.repo.target.suseAppCollection.title' } },
78
81
  content: { key: 'catalog.repo.target.suseAppCollection.description' },
79
82
  });
80
83
  }
@@ -90,6 +93,7 @@ export default {
90
93
  ociMaxRetries: this.value.spec.exponentialBackOffValues?.maxRetries,
91
94
  getVersionData,
92
95
  isView: this.mode === _VIEW,
96
+ isCreate: this.mode === _CREATE,
93
97
  clusterRepoTargets,
94
98
  previousName: '',
95
99
  previousDescription: '',
@@ -450,7 +454,17 @@ export default {
450
454
  :errors="errors"
451
455
  @save="save"
452
456
  @done="done"
453
- />
457
+ >
458
+ <template
459
+ v-if="isCreate"
460
+ #save
461
+ >
462
+ <AsyncButton
463
+ :action-label="t('catalog.repo.add')"
464
+ @click="save"
465
+ />
466
+ </template>
467
+ </Footer>
454
468
  </form>
455
469
  </template>
456
470
 
@@ -3,6 +3,7 @@ import { SECRET_TYPES as TYPES } from '@shell/config/secret';
3
3
  import { MANAGEMENT, NORMAN, SCHEMA, DEFAULT_WORKSPACE } from '@shell/config/types';
4
4
  import CreateEditView from '@shell/mixins/create-edit-view';
5
5
  import NameNsDescription from '@shell/components/form/NameNsDescription';
6
+ import { requireAsset } from '@shell/utils/require-asset';
6
7
  import CruResource from '@shell/components/CruResource';
7
8
  import { _CREATE, _EDIT } from '@shell/config/query-params';
8
9
  import Loading from '@shell/components/Loading';
@@ -177,7 +178,7 @@ export default {
177
178
 
178
179
  if (!bannerImage) {
179
180
  try {
180
- bannerImage = require(`~shell/assets/images/providers/${ id }.svg`);
181
+ bannerImage = requireAsset(`~shell/assets/images/providers/${ id }.svg`);
181
182
  } catch (e) {
182
183
  bannerImage = null;
183
184
  bannerAbbrv = this.initialDisplayFor(id);
@@ -13,6 +13,11 @@ import ButtonDropdown from '@shell/components/ButtonDropdown';
13
13
  import { _CREATE, _VIEW } from '@shell/config/query-params';
14
14
  import FormValidation from '@shell/mixins/form-validation';
15
15
  import { fetchAlertManagerConfigSpecs } from '@shell/utils/alertmanagerconfig';
16
+ import slackLogo from '@shell/assets/images/vendor/slack.svg';
17
+ import emailLogo from '@shell/assets/images/vendor/email.svg';
18
+ import pagerdutyLogo from '@shell/assets/images/vendor/pagerduty.svg';
19
+ import webhookLogo from '@shell/assets/images/vendor/webhook.svg';
20
+ import customLogo from '@shell/assets/images/vendor/custom.svg';
16
21
 
17
22
  // i18n-uses monitoringReceiver.slack.*, monitoringReceiver.email.*, monitoringReceiver.pagerduty.*
18
23
  // i18n-uses monitoringReceiver.opsgenie.*, monitoringReceiver.webhook.*, monitoringReceiver.custom.*
@@ -23,14 +28,14 @@ export const RECEIVERS_TYPES = [
23
28
  title: 'monitoringReceiver.slack.title',
24
29
  info: 'monitoringReceiver.slack.info',
25
30
  key: 'slackConfigs',
26
- logo: require(`@shell/assets/images/vendor/slack.svg`)
31
+ logo: slackLogo
27
32
  },
28
33
  {
29
34
  name: 'email',
30
35
  label: 'monitoringReceiver.email.label',
31
36
  title: 'monitoringReceiver.email.title',
32
37
  key: 'emailConfigs',
33
- logo: require(`@shell/assets/images/vendor/email.svg`)
38
+ logo: emailLogo
34
39
  },
35
40
  {
36
41
  name: 'pagerduty',
@@ -38,21 +43,21 @@ export const RECEIVERS_TYPES = [
38
43
  title: 'monitoringReceiver.pagerduty.title',
39
44
  info: 'monitoringReceiver.pagerduty.info',
40
45
  key: 'pagerdutyConfigs',
41
- logo: require(`@shell/assets/images/vendor/pagerduty.svg`)
46
+ logo: pagerdutyLogo
42
47
  },
43
48
  {
44
49
  name: 'opsgenie',
45
50
  label: 'monitoringReceiver.opsgenie.label',
46
51
  title: 'monitoringReceiver.opsgenie.title',
47
52
  key: 'opsgenieConfigs',
48
- logo: require(`@shell/assets/images/vendor/email.svg`)
53
+ logo: emailLogo
49
54
  },
50
55
  {
51
56
  name: 'webhook',
52
57
  label: 'monitoringReceiver.webhook.label',
53
58
  title: 'monitoringReceiver.webhook.title',
54
59
  key: 'webhookConfigs',
55
- logo: require(`@shell/assets/images/vendor/webhook.svg`),
60
+ logo: webhookLogo,
56
61
  },
57
62
  {
58
63
  name: 'custom',
@@ -60,7 +65,7 @@ export const RECEIVERS_TYPES = [
60
65
  title: 'monitoringReceiver.custom.title',
61
66
  info: 'monitoringReceiver.custom.info',
62
67
  key: 'webhookConfigs',
63
- logo: require(`@shell/assets/images/vendor/custom.svg`)
68
+ logo: customLogo
64
69
  },
65
70
  ];
66
71
 
@@ -20,6 +20,7 @@ import { BLANK_CLUSTER } from '@shell/store/store-types.js';
20
20
  import { ELEMENTAL_PRODUCT_NAME, ELEMENTAL_CLUSTER_PROVIDER } from '../../config/elemental-types';
21
21
  import Rke2Config from './rke2';
22
22
  import { DRIVER_TO_IMPORT } from '@shell/models/management.cattle.io.kontainerdriver';
23
+ import { requireAsset } from '@shell/utils/require-asset';
23
24
 
24
25
  const SORT_GROUPS = {
25
26
  template: 1,
@@ -343,7 +344,7 @@ export default {
343
344
  id: `chart:${ chart.id }`,
344
345
  label: chart.chartNameDisplay,
345
346
  description: chart.chartDescription,
346
- icon: chart.icon || require('~shell/assets/images/generic-catalog.svg'),
347
+ icon: chart.icon || requireAsset('~shell/assets/images/generic-catalog.svg'),
347
348
  group: 'template',
348
349
  tag: getters['i18n/t']('generic.techPreview')
349
350
  });
@@ -389,7 +390,7 @@ export default {
389
390
  if (icon) {
390
391
  iconClass = undefined;
391
392
  } else if (!iconClass) {
392
- icon = require('~shell/assets/images/generic-driver.svg');
393
+ icon = requireAsset('~shell/assets/images/generic-driver.svg');
393
394
  }
394
395
 
395
396
  const subtype = {
@@ -420,14 +421,14 @@ export default {
420
421
 
421
422
  if (!icon) {
422
423
  try {
423
- icon = require(`~shell/assets/images/providers/${ id }.svg`);
424
+ icon = requireAsset(`~shell/assets/images/providers/${ id }.svg`);
424
425
  } catch (e) {}
425
426
  }
426
427
 
427
428
  if (icon) {
428
429
  iconClass = undefined;
429
430
  } else if (!iconClass) {
430
- icon = require('~shell/assets/images/generic-driver.svg');
431
+ icon = requireAsset('~shell/assets/images/generic-driver.svg');
431
432
  }
432
433
 
433
434
  const subtype = {
@@ -1,3 +1,5 @@
1
+ import { requireAsset } from '@shell/utils/require-asset';
2
+
1
3
  export const RETENTION_DEFAULT = 5;
2
4
  export const RKE2_INGRESS_NGINX = 'rke2-ingress-nginx';
3
5
  export const RKE2_TRAEFIK = 'rke2-traefik';
@@ -10,7 +12,7 @@ export const INGRESS_NONE = 'none';
10
12
  export const INGRESS_OPTIONS = [
11
13
  {
12
14
  id: TRAEFIK,
13
- image: { src: require('@shell/assets/images/providers/traefik.png'), alt: 'Traefik' },
15
+ image: { src: requireAsset('@shell/assets/images/providers/traefik.png'), alt: 'Traefik' },
14
16
  header: { title: { key: 'cluster.ingress.traefik.header' } },
15
17
  subHeader: { label: { key: 'cluster.ingress.recommended' } },
16
18
  content: { key: 'cluster.ingress.traefik.content' },
@@ -18,7 +20,7 @@ export const INGRESS_OPTIONS = [
18
20
  },
19
21
  {
20
22
  id: INGRESS_NGINX,
21
- image: { src: require('@shell/assets/images/providers/kubernetes.svg'), alt: 'NGINX' },
23
+ image: { src: requireAsset('@shell/assets/images/providers/kubernetes.svg'), alt: 'NGINX' },
22
24
  header: { title: { key: 'cluster.ingress.nginx.header' } },
23
25
  subHeader: { label: { key: 'cluster.ingress.legacy' } },
24
26
  content: { key: 'cluster.ingress.nginx.content' },
@@ -51,6 +51,7 @@ export default {
51
51
  v-model:value="value.data"
52
52
  :mode="mode"
53
53
  :initial-empty-row="true"
54
+ :value-can-be-empty="true"
54
55
  :handle-base64="true"
55
56
  :value-trim="false"
56
57
  :add-allowed="true"
@@ -1,5 +1,6 @@
1
1
  <script>
2
2
  import { SECRET_TYPES as TYPES } from '@shell/config/secret';
3
+ import { requireAsset } from '@shell/utils/require-asset';
3
4
  import {
4
5
  SECRET_SCOPE, SECRET_QUERY_PARAMS,
5
6
  CLOUD_CREDENTIAL, _CLONE, _CREATE, _EDIT, _FLAGGED
@@ -211,7 +212,7 @@ export default {
211
212
  let bannerImage, bannerAbbrv;
212
213
 
213
214
  try {
214
- bannerImage = require(`~shell/assets/images/providers/${ id }.svg`);
215
+ bannerImage = requireAsset(`~shell/assets/images/providers/${ id }.svg`);
215
216
  } catch (e) {
216
217
  bannerImage = null;
217
218
  bannerAbbrv = this.initialDisplayFor(id);
package/edit/service.vue CHANGED
@@ -18,7 +18,6 @@ import { ucFirst } from '@shell/utils/string';
18
18
  import CruResource from '@shell/components/CruResource';
19
19
  import { Banner } from '@components/Banner';
20
20
  import Labels from '@shell/components/form/Labels';
21
- import HarvesterServiceAddOnConfig from '@shell/components/HarvesterServiceAddOnConfig';
22
21
  import { clone } from '@shell/utils/object';
23
22
  import { POD, CAPI, HCI } from '@shell/config/types';
24
23
  import { matching } from '@shell/utils/selector-typed';
@@ -58,7 +57,6 @@ export default {
58
57
  Tab,
59
58
  Tabbed,
60
59
  UnitInput,
61
- HarvesterServiceAddOnConfig,
62
60
  },
63
61
 
64
62
  mixins: [CreateEditView, FormValidation],
@@ -350,8 +348,10 @@ export default {
350
348
 
351
349
  <Tabbed
352
350
  :side-tabs="true"
351
+ :resource="value"
353
352
  :use-hash="useTabbedHash"
354
353
  :default-tab="defaultTab"
354
+ :extension-params="{ showHarvesterAddOnConfig: String(showHarvesterAddOnConfig) }"
355
355
  >
356
356
  <Tab
357
357
  v-if="checkTypeIs('ExternalName')"
@@ -471,18 +471,6 @@ export default {
471
471
  </div>
472
472
  </div>
473
473
  </Tab>
474
- <Tab
475
- v-if="showHarvesterAddOnConfig"
476
- name="add-on-config"
477
- :label="t('servicesPage.harvester.title')"
478
- :weight="-1"
479
- >
480
- <HarvesterServiceAddOnConfig
481
- :mode="mode"
482
- :value="value"
483
- :register-before-hook="registerBeforeHook"
484
- />
485
- </Tab>
486
474
  <Tab
487
475
  v-if="!checkTypeIs('ExternalName') && !checkTypeIs('Headless')"
488
476
  name="session-affinity"
@@ -3,6 +3,12 @@ import { mapGetters } from 'vuex';
3
3
  import ResourceTable from '@shell/components/ResourceTable';
4
4
  import { MANAGEMENT } from '@shell/config/types';
5
5
  import ResourceFetch from '@shell/mixins/resource-fetch';
6
+ import { STEVE_CACHE } from '@shell/store/features';
7
+
8
+ const hideFeatureFlags = [
9
+ 'fleet', // Note - this is the id of the ff we want, not sure what FLEET in store/features is
10
+ STEVE_CACHE
11
+ ];
6
12
 
7
13
  export default {
8
14
  components: { ResourceTable },
@@ -32,7 +38,7 @@ export default {
32
38
  ...mapGetters({ t: 'i18n/t' }),
33
39
 
34
40
  filteredRows() {
35
- return this.rows.filter((x) => x.name !== 'fleet');
41
+ return this.rows.filter((x) => hideFeatureFlags.indexOf(x.metadata.name) === -1);
36
42
  },
37
43
 
38
44
  enableRowActions() {
@@ -167,12 +167,6 @@ export default {
167
167
 
168
168
  },
169
169
 
170
- methods: {
171
- getCustomDetailLink(cluster) {
172
- return cluster.isCapiHybrid ? null : cluster.detailLocation;
173
- }
174
- },
175
-
176
170
  $loadingResources() {
177
171
  // results are filtered so we wouldn't get the correct count on indicator...
178
172
  return { loadIndeterminate: true };
@@ -226,7 +220,6 @@ export default {
226
220
  :use-query-params-for-simple-filtering="useQueryParamsForSimpleFiltering"
227
221
  :data-testid="'cluster-list'"
228
222
  :force-update-live-and-delayed="forceUpdateLiveAndDelayed"
229
- :get-custom-detail-link="getCustomDetailLink"
230
223
  :sub-rows="true"
231
224
  >
232
225
  <!-- Why are state column and subrow overwritten here? -->
@@ -273,48 +266,6 @@ export default {
273
266
  {{ t('cluster.explore') }}
274
267
  </button>
275
268
  </template>
276
- <template #additional-sub-row="{row, fullColspan, tableActions}">
277
- <tr
278
- class="capi-unsupported"
279
- :class="{'has-description': !!row.stateDescription}"
280
- >
281
- <td
282
- v-if="row.isCapiHybrid"
283
- class="row-check"
284
- />
285
- <td
286
- v-if="row.isCapiHybrid"
287
- :data-testid="`capi-unsupported-warning-${row?.metadata?.name}`"
288
- :colspan="fullColspan - (tableActions ? 1: 0)"
289
- >
290
- <div
291
- class="text-warning"
292
- :class="{'mt-5': !!row.stateDescription.trim()}"
293
- >
294
- <i class="icon icon-warning" />{{ t('cluster.capi.notSupported') }}
295
- </div>
296
- </td>
297
- </tr>
298
- </template>
299
269
  </ResourceTable>
300
270
  </div>
301
271
  </template>
302
-
303
- <style scoped lang="scss">
304
- .capi-unsupported {
305
- &.has-description {
306
- border-bottom: none;
307
- padding: 0px;
308
- td {
309
- padding-top: 0px;
310
- }
311
- }
312
-
313
- & div {
314
- & i {
315
- margin-right: 0.1em;
316
- }
317
- display: flex;
318
- }
319
- }
320
- </style>
package/mixins/brand.js CHANGED
@@ -3,6 +3,7 @@ import { MANAGEMENT } from '@shell/config/types';
3
3
  import { SETTING } from '@shell/config/settings';
4
4
  import { createCssVars } from '@shell/utils/color';
5
5
  import { setTitle } from '@shell/config/private-label';
6
+ import { requireJson } from '@shell/utils/require-asset';
6
7
  import { setFavIcon, haveSetFavIcon } from '@shell/utils/favicon';
7
8
  import { allHash } from '@shell/utils/promise';
8
9
  import { fetchInitialSettings } from '@shell/utils/settings';
@@ -187,7 +188,7 @@ export default {
187
188
 
188
189
  if ( this.brand ) {
189
190
  try {
190
- const brandMeta = require(`~shell/assets/brand/${ this.brand }/metadata.json`);
191
+ const brandMeta = requireJson(`~shell/assets/brand/${ this.brand }/metadata.json`);
191
192
 
192
193
  if (brandMeta?.hasStylesheet === 'true') {
193
194
  bodyClass = `${ cssClass } ${ this.brand } theme-${ this.theme }`;
@@ -3,6 +3,7 @@ import { CATALOG } from '@shell/config/labels-annotations';
3
3
  import { insertAt } from '@shell/utils/array';
4
4
  import { CLUSTER_REPO_APPCO_AUTH_GENERATE_NAME, CATALOG as CATALOG_TYPE } from '@shell/config/types';
5
5
  import { colorForState, stateDisplay } from '@shell/plugins/dashboard-store/resource-class';
6
+ import { _CREATE } from '@shell/config/query-params';
6
7
 
7
8
  import SteveModel from '@shell/plugins/steve/steve-class';
8
9
 
@@ -173,6 +174,14 @@ export default class ClusterRepo extends SteveModel {
173
174
  return this.$rootGetters['i18n/withFallback'](key, null, name);
174
175
  }
175
176
 
177
+ detailPageHeaderActionOverride(realMode) {
178
+ if (realMode === _CREATE) {
179
+ return this.t('catalog.repo.add');
180
+ }
181
+
182
+ return null;
183
+ }
184
+
176
185
  get urlDisplay() {
177
186
  return this.status?.url || this.spec.gitRepo || this.spec.url;
178
187
  }
@@ -111,12 +111,17 @@ export default class CapiMachineDeployment extends SteveModel {
111
111
  return `${ this.spec?.template?.metadata?.labels?.[MACHINE_ROLES.ETCD] }` === 'true';
112
112
  }
113
113
 
114
- // use this pool's definition in the cluster's rkeConfig to scale, not this.spec.replicas
114
+ // use this pool's definition in the provisioning cluster spec to scale, not this.spec.replicas
115
115
  get inClusterSpec() {
116
- const machineConfigName = this.template?.metadata?.annotations['rke.cattle.io/cloned-from-name'];
116
+ // infra from Rancher node driver: provisioning cluster has reference to Rancher-generated crd <provider name>Config from the rke-machine-config.cattle.io api group
117
+ const rkeMachineConfigName = this.template?.metadata?.annotations['rke.cattle.io/cloned-from-name'];
118
+ // infra from upstream CAPI provider: provisioning cluster has reference to an upstream provider-specific machine template crd in the infrastructure.cluster.x-k8s.io api group
119
+ const infrastructureRefName = this.spec?.template?.spec?.infrastructureRef?.name;
120
+ const machineTemplateName = rkeMachineConfigName || infrastructureRefName;
121
+
117
122
  const machinePools = this.cluster.spec.rkeConfig.machinePools;
118
123
 
119
- return machinePools.find((pool) => pool.machineConfigRef.name === machineConfigName);
124
+ return machinePools.find((pool) => pool.machineConfigRef.name === machineTemplateName);
120
125
  }
121
126
 
122
127
  scalePool(delta, save = true, depth = 0) {
@@ -1,5 +1,6 @@
1
1
  import { insertAt } from '@shell/utils/array';
2
2
  import SteveModel from '@shell/plugins/steve/steve-class';
3
+ import { requireAsset } from '@shell/utils/require-asset';
3
4
 
4
5
  export const configType = {
5
6
  activedirectory: 'ldap',
@@ -56,7 +57,7 @@ export default class AuthConfig extends SteveModel {
56
57
 
57
58
  get icon() {
58
59
  try {
59
- return require(`~shell/assets/images/vendor/${ imageOverrides[this.id] || this.id }.svg`);
60
+ return requireAsset(`~shell/assets/images/vendor/${ imageOverrides[this.id] || this.id }.svg`);
60
61
  } catch (e) {
61
62
  return '';
62
63
  }
@@ -13,6 +13,7 @@ import { isHarvesterCluster } from '@shell/utils/cluster';
13
13
  import SteveModel from '@shell/plugins/steve/steve-class';
14
14
  import { LINUX, WINDOWS } from '@shell/store/catalog';
15
15
  import { KONTAINER_TO_DRIVER } from './management.cattle.io.kontainerdriver';
16
+ import { requireAsset } from '@shell/utils/require-asset';
16
17
  import { PINNED_CLUSTERS } from '@shell/store/prefs';
17
18
  import { copyTextToClipboard } from '@shell/utils/clipboard';
18
19
  import { isHostedProvider } from '@shell/utils/provider';
@@ -221,7 +222,7 @@ export default class MgmtCluster extends SteveModel {
221
222
  }
222
223
 
223
224
  get providerOsLogo() {
224
- return require(`~shell/assets/images/vendor/${ this.providerOs }.svg`);
225
+ return requireAsset(`~shell/assets/images/vendor/${ this.providerOs }.svg`);
225
226
  }
226
227
 
227
228
  get workerOSs() {
@@ -282,11 +283,11 @@ export default class MgmtCluster extends SteveModel {
282
283
  let icon;
283
284
 
284
285
  try {
285
- icon = require(`~shell/assets/images/providers/${ prv }.svg`);
286
+ icon = requireAsset(`~shell/assets/images/providers/${ prv }.svg`);
286
287
  } catch (e) {
287
288
  console.warn(`Can not find provider logo for provider ${ logo }`); // eslint-disable-line no-console
288
289
  // Use fallback generic Kubernetes icon
289
- icon = require(`~shell/assets/images/providers/kubernetes.svg`);
290
+ icon = requireAsset(`~shell/assets/images/providers/kubernetes.svg`);
290
291
  }
291
292
 
292
293
  return icon;
@@ -3,6 +3,11 @@ import { isEmpty } from '@shell/utils/object';
3
3
  import { MONITORING } from '@shell/config/types';
4
4
  import jsyaml from 'js-yaml';
5
5
  import SteveModel from '@shell/plugins/steve/steve-class';
6
+ import slackLogo from '~shell/assets/images/vendor/slack.svg';
7
+ import emailLogo from '~shell/assets/images/vendor/email.svg';
8
+ import pagerdutyLogo from '~shell/assets/images/vendor/pagerduty.svg';
9
+ import webhookLogo from '~shell/assets/images/vendor/webhook.svg';
10
+ import customLogo from '~shell/assets/images/vendor/custom.svg';
6
11
 
7
12
  // i18n-uses monitoringReceiver.slack.*, monitoringReceiver.email.*, monitoringReceiver.pagerduty.*
8
13
  // i18n-uses monitoringReceiver.opsgenie.*, monitoringReceiver.webhook.*, monitoringReceiver.custom.*
@@ -13,14 +18,14 @@ export const RECEIVERS_TYPES = [
13
18
  title: 'monitoringReceiver.slack.title',
14
19
  info: 'monitoringReceiver.slack.info',
15
20
  key: 'slack_configs',
16
- logo: require(`~shell/assets/images/vendor/slack.svg`)
21
+ logo: slackLogo
17
22
  },
18
23
  {
19
24
  name: 'email',
20
25
  label: 'monitoringReceiver.email.label',
21
26
  title: 'monitoringReceiver.email.title',
22
27
  key: 'email_configs',
23
- logo: require(`~shell/assets/images/vendor/email.svg`)
28
+ logo: emailLogo
24
29
  },
25
30
  {
26
31
  name: 'pagerduty',
@@ -28,21 +33,21 @@ export const RECEIVERS_TYPES = [
28
33
  title: 'monitoringReceiver.pagerduty.title',
29
34
  info: 'monitoringReceiver.pagerduty.info',
30
35
  key: 'pagerduty_configs',
31
- logo: require(`~shell/assets/images/vendor/pagerduty.svg`)
36
+ logo: pagerdutyLogo
32
37
  },
33
38
  {
34
39
  name: 'opsgenie',
35
40
  label: 'monitoringReceiver.opsgenie.label',
36
41
  title: 'monitoringReceiver.opsgenie.title',
37
42
  key: 'opsgenie_configs',
38
- logo: require(`~shell/assets/images/vendor/email.svg`)
43
+ logo: emailLogo
39
44
  },
40
45
  {
41
46
  name: 'webhook',
42
47
  label: 'monitoringReceiver.webhook.label',
43
48
  title: 'monitoringReceiver.webhook.title',
44
49
  key: 'webhook_configs',
45
- logo: require(`~shell/assets/images/vendor/webhook.svg`),
50
+ logo: webhookLogo,
46
51
  banner: 'webhook.banner',
47
52
  addButton: 'webhook.add'
48
53
  },
@@ -52,7 +57,7 @@ export const RECEIVERS_TYPES = [
52
57
  title: 'monitoringReceiver.custom.title',
53
58
  info: 'monitoringReceiver.custom.info',
54
59
  key: 'webhook_configs',
55
- logo: require(`~shell/assets/images/vendor/custom.svg`)
60
+ logo: customLogo
56
61
  },
57
62
  ];
58
63
 
@@ -127,9 +127,9 @@ export default class ProvCluster extends SteveModel {
127
127
  }
128
128
  const ready = this.mgmt?.isReady;
129
129
 
130
- const canEditRKE2cluster = this.isRke2 && ready && this.canUpdate && !this.isCapiHybrid;
130
+ const canEditRKE2cluster = this.isRke2 && ready && this.canUpdate;
131
131
 
132
- const canSnapshot = ready && this.isRke2 && this.canUpdate && !this.isCapiHybrid;
132
+ const canSnapshot = ready && this.isRke2 && this.canUpdate;
133
133
 
134
134
  const actions = [
135
135
  // Note: Actions are not supported in the Steve API, so we check
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rancher/shell",
3
- "version": "3.0.10",
3
+ "version": "3.0.11",
4
4
  "description": "Rancher Dashboard Shell",
5
5
  "repository": "https://github.com/rancher/dashboard",
6
6
  "license": "Apache-2.0",
@@ -53,7 +53,7 @@
53
53
  "add": "2.0.6",
54
54
  "ansi_up": "5.0.0",
55
55
  "axios-retry": "3.1.9",
56
- "axios": "1.13.2",
56
+ "axios": "1.13.5",
57
57
  "babel-eslint": "10.1.0",
58
58
  "babel-plugin-module-resolver": "5.0.2",
59
59
  "babel-preset-vue": "2.0.2",
@@ -109,9 +109,9 @@
109
109
  "js-yaml": "4.1.1",
110
110
  "jsdiff": "1.1.1",
111
111
  "jsonpath-plus": "10.3.0",
112
- "jsrsasign": "11.0.0",
112
+ "jsrsasign": "11.1.1",
113
113
  "jszip": "3.10.1",
114
- "lodash": "4.17.23",
114
+ "lodash": "4.18.1",
115
115
  "marked": "4.0.17",
116
116
  "node-polyfill-webpack-plugin": "3.0.0",
117
117
  "nodemon": "2.0.22",
@@ -148,7 +148,7 @@
148
148
  "xterm-addon-web-links": "0.9.0",
149
149
  "xterm-addon-webgl": "0.16.0",
150
150
  "xterm": "5.2.1",
151
- "yarn": "1.22.18"
151
+ "yarn": "1.22.22"
152
152
  },
153
153
  "resolutions": {
154
154
  "d3-color": "3.1.0",
@@ -624,7 +624,6 @@ export default {
624
624
  <RichTranslation
625
625
  k="catalog.charts.appCollectionRepoMissing"
626
626
  tag="div"
627
- :raw="true"
628
627
  >
629
628
  <template #repoCreate="{ content }">
630
629
  <router-link
@@ -661,10 +660,7 @@ export default {
661
660
  {{ t('catalog.charts.noCharts.title') }}
662
661
  </h1>
663
662
  <div class="empty-state-tips">
664
- <RichTranslation
665
- k="catalog.charts.noCharts.message"
666
- :raw="true"
667
- >
663
+ <RichTranslation k="catalog.charts.noCharts.message">
668
664
  <template #resetAllFilters="{ content }">
669
665
  <a
670
666
  tabindex="0"
@@ -684,8 +680,7 @@ export default {
684
680
  </RichTranslation>
685
681
  <RichTranslation
686
682
  k="catalog.charts.noCharts.docsMessage"
687
- tag="div"
688
- :raw="true"
683
+ tag="span"
689
684
  >
690
685
  <template #docsUrl="{ content }">
691
686
  <a
@@ -891,7 +886,7 @@ export default {
891
886
 
892
887
  .charts-empty-state {
893
888
  width: 100%;
894
- padding: 72px 120px;
889
+ padding: 72px 72px;
895
890
  text-align: center;
896
891
 
897
892
  .empty-state-title {