@rancher/shell 3.0.0-rc.6 → 3.0.0-rc.7

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.
@@ -81,27 +81,15 @@ export default {
81
81
  watch: {
82
82
  filteredSecrets(newValue) {
83
83
  if (isEmpty(newValue)) {
84
- this.$set(
85
- this.value.alertmanager.alertmanagerSpec,
86
- 'useExistingSecret',
87
- false
88
- );
84
+ this.value.alertmanager.alertmanagerSpec.useExistingSecret = false;
89
85
  }
90
86
 
91
87
  const { existingSecret } = this;
92
88
 
93
89
  if (existingSecret) {
94
90
  this.$nextTick(() => {
95
- this.$set(
96
- this.value.alertmanager.alertmanagerSpec,
97
- 'useExistingSecret',
98
- true
99
- );
100
- this.$set(
101
- this.value.alertmanager.alertmanagerSpec,
102
- 'configSecret',
103
- existingSecret.metadata.name
104
- );
91
+ this.value.alertmanager.alertmanagerSpec.useExistingSecret = true;
92
+ this.value.alertmanager.alertmanagerSpec.configSecret = existingSecret.metadata.name;
105
93
  });
106
94
  }
107
95
  },
@@ -110,11 +98,7 @@ export default {
110
98
 
111
99
  if (useExistingSecret) {
112
100
  if (existingSecret?.metadata?.name) {
113
- this.$set(
114
- this.value.alertmanager.alertmanagerSpec,
115
- 'configSecret',
116
- existingSecret.metadata.name
117
- );
101
+ this.value.alertmanager.alertmanagerSpec.configSecret = existingSecret.metadata.name;
118
102
  }
119
103
  } else {
120
104
  this.value.alertmanager.alertmanagerSpec['configSecret'] = '';
@@ -249,7 +249,7 @@ export default {
249
249
  :mode="mode"
250
250
  :options="pvcs"
251
251
  :label="t('monitoring.grafana.storage.existingClaim')"
252
- @updateName="(name) => $set(value.grafana.persistence, 'existingClaim', name)"
252
+ @updateName="(name) => value.grafana.persistence.existingClaim = name"
253
253
  />
254
254
  </div>
255
255
  </div>
@@ -271,7 +271,7 @@ export default {
271
271
  :mode="mode"
272
272
  :options="storageClasses"
273
273
  :label="t('monitoring.prometheus.storage.className')"
274
- @updateName="(name) => $set(value.grafana.persistence, 'storageClassName', name)"
274
+ @updateName="(name) => value.grafana.persistence.storageClassName = name"
275
275
  />
276
276
  </div>
277
277
  </div>
@@ -338,7 +338,7 @@ export default {
338
338
  :mode="mode"
339
339
  :options="storageClasses"
340
340
  :label="t('monitoring.prometheus.storage.className')"
341
- @updateName="(name) => $set(value.grafana.persistence, 'storageClassName', name)"
341
+ @updateName="(name) => value.grafana.persistence.storageClassName = name"
342
342
  />
343
343
  </div>
344
344
  </div>
@@ -123,21 +123,14 @@ export default {
123
123
  watch: {
124
124
  enablePersistentStorage(enabled) {
125
125
  if (!!enabled) {
126
- this.$set(
127
- this.value.prometheus.prometheusSpec.storageSpec,
128
- 'volumeClaimTemplate',
129
- {
130
- spec: {
131
- accessModes: ['ReadWriteOnce'],
132
- resources: { requests: { storage: '50Gi' } },
133
- }
126
+ this.value.prometheus.prometheusSpec.storageSpec.volumeClaimTemplate = {
127
+ spec: {
128
+ accessModes: ['ReadWriteOnce'],
129
+ resources: { requests: { storage: '50Gi' } },
134
130
  }
135
- );
131
+ };
136
132
  } else {
137
- this.$delete(
138
- this.value.prometheus.prometheusSpec.storageSpec,
139
- 'volumeClaimTemplate'
140
- );
133
+ delete this.value.prometheus.prometheusSpec.storageSpec['volumeClaimTemplate'];
141
134
  }
142
135
  },
143
136
  },
@@ -328,7 +321,7 @@ export default {
328
321
  :options="storageClasses"
329
322
  :value="value.prometheus.prometheusSpec.storageSpec.volumeClaimTemplate.spec.storageClassName"
330
323
  :label="t('monitoring.prometheus.storage.className')"
331
- @updateName="(name) => $set(value.prometheus.prometheusSpec.storageSpec.volumeClaimTemplate.spec, 'storageClassName', name)"
324
+ @updateName="(name) => value.prometheus.prometheusSpec.storageSpec.volumeClaimTemplate.spec.storageClassName = name"
332
325
  />
333
326
  </div>
334
327
  </div>
@@ -332,7 +332,11 @@ export default {
332
332
 
333
333
  const queryDiff = Object.keys(diff(neu, old));
334
334
 
335
- if ( queryDiff.includes(MODE) || queryDiff.includes(AS)) {
335
+ if (Object.keys(neu).length <= 0) {
336
+ return;
337
+ }
338
+
339
+ if (queryDiff.includes(MODE) || queryDiff.includes(AS)) {
336
340
  this.$fetch();
337
341
  }
338
342
  },
@@ -379,7 +379,7 @@ export default {
379
379
  :value="props.row.value._anti ?t('workload.scheduling.affinity.antiAffinityOption') :t('workload.scheduling.affinity.affinityOption') "
380
380
  :label="t('workload.scheduling.affinity.type')"
381
381
  :data-testid="`pod-affinity-type-index${props.i}`"
382
- @update:value="$set(props.row.value, '_anti',!props.row.value._anti)"
382
+ @update:value="props.row.value._anti = !props.row.value._anti"
383
383
  />
384
384
  </div>
385
385
  <div class="col span-6">
@@ -231,12 +231,16 @@ export default {
231
231
  }
232
232
  },
233
233
  // since the Header is a "persistent component" we need to update it at every route change...
234
- $route(nue) {
235
- if (nue) {
236
- this.extensionHeaderActions = getApplicableExtensionEnhancements(this, ExtensionPoint.ACTION, ActionLocation.HEADER, nue);
234
+ $route: {
235
+ handler(nue) {
236
+ if (nue) {
237
+ this.extensionHeaderActions = getApplicableExtensionEnhancements(this, ExtensionPoint.ACTION, ActionLocation.HEADER, nue);
237
238
 
238
- this.navHeaderRight = this.$plugin?.getDynamic('component', 'NavHeaderRight');
239
- }
239
+ this.navHeaderRight = this.$plugin?.getDynamic('component', 'NavHeaderRight');
240
+ }
241
+ },
242
+ immediate: true,
243
+ deep: true,
240
244
  }
241
245
  },
242
246
 
package/core/types.ts CHANGED
@@ -26,7 +26,7 @@ export type CoreStoreInit = (store: any, ctx: any) => void;
26
26
  export type RegisterStore = () => (store: any) => void
27
27
  export type UnregisterStore = (store: any) => void
28
28
 
29
- export type PluginRouteRecordRaw = {parent?: string, route: RouteRecordRaw}
29
+ export type PluginRouteRecordRaw = { [key: string]: any }
30
30
 
31
31
  export type OnEnterLeavePackageConfig = {
32
32
  clusterId: string,
@@ -196,7 +196,7 @@ export default {
196
196
  class="role-tertiary add mt-5"
197
197
  :label="t('generic.readFromFile')"
198
198
  :mode="mode"
199
- @selected="$set(model, 'oauthCredential', $event)"
199
+ @selected="model.oauthCredential = $event"
200
200
  />
201
201
  </div>
202
202
  </div>
@@ -231,7 +231,7 @@ export default {
231
231
  class="role-tertiary add mt-5"
232
232
  :label="t('generic.readFromFile')"
233
233
  :mode="mode"
234
- @selected="$set(model, 'serviceAccountCredential', $event)"
234
+ @selected="model.serviceAccountCredential = $event"
235
235
  />
236
236
  </div>
237
237
  </div>
@@ -120,7 +120,7 @@ export default {
120
120
  :step="1"
121
121
  :mode="mode"
122
122
  :label="t('authConfig.ldap.port')"
123
- @update:value="e=>$set(model, 'port', e.replace(/[^0-9]*/g, ''))"
123
+ @update:value="e=> model.port = e.replace(/[^0-9]*/g, '')"
124
124
  />
125
125
  </div>
126
126
 
@@ -158,7 +158,7 @@ export default {
158
158
  class="role-tertiary add mt-5"
159
159
  :label="t('generic.readFromFile')"
160
160
  :mode="mode"
161
- @selected="$set(model, 'certificate', $event)"
161
+ @selected="model.certificate = $event"
162
162
  />
163
163
  </div>
164
164
  </div>
@@ -233,7 +233,7 @@ export default {
233
233
  class="role-tertiary add mt-5"
234
234
  :label="t('generic.readFromFile')"
235
235
  :mode="mode"
236
- @selected="$set(model, 'privateKey', $event)"
236
+ @selected="model.privateKey = $event"
237
237
  />
238
238
  </div>
239
239
  <div class="col span-6">
@@ -248,7 +248,7 @@ export default {
248
248
  class="role-tertiary add mt-5"
249
249
  :label="t('generic.readFromFile')"
250
250
  :mode="mode"
251
- @selected="$set(model, 'certificate', $event)"
251
+ @selected="model.certificate = $event"
252
252
  />
253
253
  </div>
254
254
  </div>
@@ -84,29 +84,28 @@ export default {
84
84
 
85
85
  watch: {
86
86
  'value.type'(neuType, oldType) {
87
- const { $set } = this;
88
87
  let resourceSpec, podSpec, objectSpec, externalSpec;
89
88
 
90
89
  switch (neuType) {
91
90
  case 'External':
92
91
  externalSpec = this.initExternalSpec();
93
92
 
94
- $set(this.value, 'external', externalSpec);
93
+ this.value.external = externalSpec;
95
94
  break;
96
95
  case 'Object':
97
96
  objectSpec = this.initObjectSpec();
98
97
 
99
- $set(this.value, 'object', objectSpec);
98
+ this.value.object = objectSpec;
100
99
  break;
101
100
  case 'Pods':
102
101
  podSpec = this.initPodsSpec();
103
102
 
104
- $set(this.value, 'pods', podSpec);
103
+ this.value.pods = podSpec;
105
104
  break;
106
105
  case 'Resource':
107
106
  resourceSpec = this.initResourceSpec();
108
107
 
109
- $set(this.value, 'resource', resourceSpec.resource);
108
+ this.value.resource = resourceSpec.resource;
110
109
  break;
111
110
  default:
112
111
  break;
@@ -64,11 +64,7 @@ export default {
64
64
  initializeType(authOptions, type) {
65
65
  authOptions.forEach((authOption) => {
66
66
  if (authOption.value === type && type !== 'none') {
67
- this.$set(
68
- this.value,
69
- authOption.value,
70
- this.value[authOption.value] || authOption.default
71
- );
67
+ this.value.authOption.value = this.value[authOption.value] || authOption.default;
72
68
  } else if (typeof this.value[authOption.value] !== 'undefined') {
73
69
  delete this.value[authOption.value];
74
70
  }
@@ -28,11 +28,7 @@ export default {
28
28
  this.value['sendResolved'] = this.value.sendResolved || false;
29
29
 
30
30
  if (this.mode === _CREATE) {
31
- this.$set(
32
- this.value,
33
- 'text',
34
- this.value.text || '{{ template "slack.rancher.text" . }}'
35
- );
31
+ this.value.text = this.value.text || '{{ template "slack.rancher.text" . }}';
36
32
  }
37
33
 
38
34
  return {
@@ -28,11 +28,7 @@ export default {
28
28
  this.value['send_resolved'] = this.value.send_resolved || false;
29
29
 
30
30
  if (this.mode === _CREATE) {
31
- this.$set(
32
- this.value,
33
- 'text',
34
- this.value.text || '{{ template "slack.rancher.text" . }}'
35
- );
31
+ this.value.text = this.value.text || '{{ template "slack.rancher.text" . }}';
36
32
  }
37
33
 
38
34
  return {};
package/edit/service.vue CHANGED
@@ -226,11 +226,7 @@ export default {
226
226
  this.value.spec.sessionAffinityConfig = { clientIP: { timeoutSeconds: null } };
227
227
 
228
228
  // set it null and then set it with vue to make reactive.
229
- this.$set(
230
- this.value.spec.sessionAffinityConfig.clientIP,
231
- 'timeoutSeconds',
232
- SESSION_STICKY_TIME_DEFAULT
233
- );
229
+ this.value.spec.sessionAffinityConfig.clientIP.timeoutSeconds = SESSION_STICKY_TIME_DEFAULT;
234
230
  } else if (
235
231
  this.value?.spec?.sessionAffinityConfig?.clientIP?.timeoutSeconds
236
232
  ) {
@@ -425,7 +421,7 @@ export default {
425
421
  :mode="mode"
426
422
  :initial-empty-row="true"
427
423
  :protip="false"
428
- @update:value="(e) => $set(value.spec, 'selector', e)"
424
+ @update:value="(e) => value.spec.selector = e"
429
425
  />
430
426
  </div>
431
427
  </div>
@@ -448,7 +444,7 @@ export default {
448
444
  :tooltip-key="
449
445
  hasClusterIp ? 'servicesPage.ips.clusterIpHelpText' : null
450
446
  "
451
- @update:value="(e) => $set(value.spec, 'clusterIP', e)"
447
+ @update:value="(e) => value.spec.clusterIP = e"
452
448
  />
453
449
  </div>
454
450
  </div>
@@ -465,7 +461,7 @@ export default {
465
461
  :tooltip-key="
466
462
  hasClusterIp ? 'servicesPage.ips.loadBalancerIp.helpText' : null
467
463
  "
468
- @update:value="(e) => $set(value.spec, 'loadBalancerIP', e)"
464
+ @update:value="(e) => value.spec.loadBalancerIP = e"
469
465
  />
470
466
  </div>
471
467
  </div>
@@ -478,7 +474,7 @@ export default {
478
474
  :value-placeholder="t('servicesPage.ips.external.placeholder')"
479
475
  :mode="mode"
480
476
  :protip="false"
481
- @update:value="(e) => $set(value.spec, 'externalIPs', e)"
477
+ @update:value="(e) => value.spec.externalIPs = e"
482
478
  />
483
479
  </div>
484
480
  </div>
@@ -527,12 +523,7 @@ export default {
527
523
  :label="t('servicesPage.affinity.timeout.label')"
528
524
  :placeholder="t('servicesPage.affinity.timeout.placeholder')"
529
525
  @input="
530
- (e) =>
531
- $set(
532
- value.spec.sessionAffinityConfig.clientIP,
533
- 'timeoutSeconds',
534
- e
535
- )
526
+ (e) => value.spec.sessionAffinityConfig.clientIP.timeoutSeconds = e
536
527
  "
537
528
  />
538
529
  </div>
@@ -12,6 +12,8 @@ export default {
12
12
 
13
13
  mixins: [ChildHook],
14
14
 
15
+ emits: ['done'],
16
+
15
17
  data() {
16
18
  // Keep label and annotation filters in data so each resource CRUD page can alter individually
17
19
  return { errors: [] };
@@ -10,6 +10,8 @@ interface LabeledFormElement {
10
10
  export default {
11
11
  inheritAttrs: false,
12
12
 
13
+ emits: ['update:validation', 'on-focus', 'on-blur'],
14
+
13
15
  props: {
14
16
  mode: {
15
17
  type: String,
@@ -1,5 +1,6 @@
1
1
 
2
2
  export default {
3
+ emits: ['option:selecting', 'option:created', 'option:selected'],
3
4
  methods: {
4
5
  mappedKeys(map, vm) {
5
6
  // Defaults found at - https://github.com/sagalbot/vue-select/blob/master/src/components/Select.vue#L947
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rancher/shell",
3
- "version": "3.0.0-rc.6",
3
+ "version": "3.0.0-rc.7",
4
4
  "description": "Rancher Dashboard Shell",
5
5
  "repository": "https://github.com/rancherlabs/dashboard",
6
6
  "license": "Apache-2.0",
@@ -2168,6 +2168,7 @@ declare module '@shell/mixins/create-edit-view/impl' {
2168
2168
  declare namespace _default {
2169
2169
  const name: string;
2170
2170
  const mixins: any[];
2171
+ const emits: string[];
2171
2172
  function data(): {
2172
2173
  errors: any[];
2173
2174
  };
@@ -2274,7 +2275,7 @@ declare var _default: import("vue").DefineComponent<{
2274
2275
  save(buttonDone: any, url: any, depth?: number): any;
2275
2276
  actuallySave(url: any): Promise<void>;
2276
2277
  setErrors(errors: any): void;
2277
- }, any, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
2278
+ }, any, import("vue").ComponentOptionsMixin, string[], string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
2278
2279
  mode: {
2279
2280
  type: StringConstructor;
2280
2281
  default: any;
@@ -2303,7 +2304,9 @@ declare var _default: import("vue").DefineComponent<{
2303
2304
  type: BooleanConstructor;
2304
2305
  default: boolean;
2305
2306
  };
2306
- }>>, {
2307
+ }>> & {
2308
+ [x: string & `on${string}`]: (...args: any[]) => any;
2309
+ }, {
2307
2310
  mode: string;
2308
2311
  as: string;
2309
2312
  doneEvent: boolean;
package/utils/v-sphere.ts CHANGED
@@ -96,7 +96,7 @@ class VSphereUtils {
96
96
  */
97
97
  async handleVsphereCpiSecret(rke2Component: Rke2Component) {
98
98
  const generateName = `${ rootGenerateName }cpi-`;
99
- const downstreamName = 'vsphere-cpi-creds';
99
+ const downstreamName = 'rancher-vsphere-cpi-credentials';
100
100
  const downstreamNamespace = 'kube-system';
101
101
  const { value } = rke2Component;
102
102
 
@@ -104,6 +104,13 @@ class VSphereUtils {
104
104
  const { userValues, combined } = this.findChartValues(rke2Component, 'rancher-vsphere-cpi') || {};
105
105
 
106
106
  if (!combined?.vCenter?.credentialsSecret?.generate) {
107
+ if (userValues?.vCenter?.username) {
108
+ userValues.vCenter.username = '';
109
+ }
110
+ if (userValues?.vCenter?.password) {
111
+ userValues.vCenter.password = '';
112
+ }
113
+
107
114
  return;
108
115
  }
109
116
 
@@ -162,7 +169,7 @@ class VSphereUtils {
162
169
  */
163
170
  async handleVsphereCsiSecret(rke2Component: Rke2Component) {
164
171
  const generateName = `${ rootGenerateName }csi-`;
165
- const downstreamName = 'vsphere-csi-creds';
172
+ const downstreamName = 'rancher-vsphere-csi-credentials';
166
173
  const downstreamNamespace = 'kube-system';
167
174
  const { value } = rke2Component;
168
175
 
@@ -170,6 +177,13 @@ class VSphereUtils {
170
177
  const { userValues, combined } = this.findChartValues(rke2Component, 'rancher-vsphere-csi') || {};
171
178
 
172
179
  if (!combined?.vCenter?.configSecret?.generate) {
180
+ if (userValues?.vCenter?.username) {
181
+ userValues.vCenter.username = '';
182
+ }
183
+ if (userValues?.vCenter?.password) {
184
+ userValues.vCenter.password = '';
185
+ }
186
+
173
187
  return;
174
188
  }
175
189
 
@@ -184,7 +198,7 @@ class VSphereUtils {
184
198
 
185
199
  // This is a copy of https://github.com/rancher/vsphere-charts/blob/a5c99d716df960dc50cf417d9ecffad6b55ca0ad/charts/rancher-vsphere-csi/values.yaml#L12-L21
186
200
  // Which makes it's way into the secret via https://github.com/rancher/vsphere-charts/blob/main/charts/rancher-vsphere-csi/templates/secret.yaml#L8
187
- let configTemplateString = ' |\n [Global]\n cluster-id = {{ required \".Values.vCenter.clusterId must be provided\" (default .Values.vCenter.clusterId .Values.global.cattle.clusterId) | quote }}\n user = {{ .Values.vCenter.username | quote }}\n password = {{ .Values.vCenter.password | quote }}\n port = {{ .Values.vCenter.port | quote }}\n insecure-flag = {{ .Values.vCenter.insecureFlag | quote }}\n\n [VirtualCenter {{ .Values.vCenter.host | quote }}]\n datacenters = {{ .Values.vCenter.datacenters | quote }}';
201
+ let configTemplateString = ' [Global]\n cluster-id = {{ required \".Values.vCenter.clusterId must be provided\" (default .Values.vCenter.clusterId .Values.global.cattle.clusterId) | quote }}\n user = {{ .Values.vCenter.username | quote }}\n password = {{ .Values.vCenter.password | quote }}\n port = {{ .Values.vCenter.port | quote }}\n insecure-flag = {{ .Values.vCenter.insecureFlag | quote }}\n\n [VirtualCenter {{ .Values.vCenter.host | quote }}]\n datacenters = {{ .Values.vCenter.datacenters | quote }}';
188
202
 
189
203
  configTemplateString = configTemplateString.replace('{{ required \".Values.vCenter.clusterId must be provided\" (default .Values.vCenter.clusterId .Values.global.cattle.clusterId) | quote }}', `"{{clusterId}}"`);
190
204
  configTemplateString = configTemplateString.replace('{{ .Values.vCenter.username | quote }}', `"${ username }"`);
package/vue.config.js CHANGED
@@ -551,6 +551,8 @@ module.exports = function(dir, _appConfig) {
551
551
  // The static assets need to be in the built assets directory in order to get served (primarily the favicon)
552
552
  config.plugins.push(new CopyWebpackPlugin({ patterns: [{ from: path.join(SHELL_ABS, 'static'), to: '.' }] }));
553
553
 
554
+ config.plugins.push(new webpack.IgnorePlugin({ resourceRegExp: /\/__tests__\// }));
555
+
554
556
  config.resolve.extensions.push(...['.tsx', '.ts', '.js', '.vue', '.scss']);
555
557
  config.watchOptions = {
556
558
  ...(config.watchOptions || {}),