@rancher/shell 3.0.1 → 3.0.2-rc.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 (96) hide show
  1. package/assets/styles/base/_basic.scss +17 -5
  2. package/assets/styles/base/_mixins.scss +2 -1
  3. package/assets/styles/global/_button.scss +10 -0
  4. package/assets/styles/global/_form.scss +2 -2
  5. package/assets/translations/en-us.yaml +33 -5
  6. package/assets/translations/zh-hans.yaml +1 -1
  7. package/components/ActionMenu.vue +8 -0
  8. package/components/AsyncButton.vue +9 -3
  9. package/components/BannerGraphic.vue +10 -0
  10. package/components/ButtonGroup.vue +2 -0
  11. package/components/ButtonMultiAction.vue +6 -0
  12. package/components/ClusterIconMenu.vue +1 -1
  13. package/components/CodeMirror.vue +28 -1
  14. package/components/CommunityLinks.vue +13 -0
  15. package/components/CruResource.vue +6 -0
  16. package/components/GrowlManager.vue +14 -4
  17. package/components/LocaleSelector.vue +49 -5
  18. package/components/PaginatedResourceTable.vue +4 -3
  19. package/components/ResourceDetail/Masthead.vue +11 -4
  20. package/components/ResourceList/index.vue +5 -3
  21. package/components/ResourceTable.vue +1 -1
  22. package/components/SortableTable/THead.vue +19 -4
  23. package/components/SortableTable/index.vue +13 -9
  24. package/components/SortableTable/selection.js +19 -5
  25. package/components/YamlEditor.vue +2 -1
  26. package/components/auth/SelectPrincipal.vue +1 -1
  27. package/components/fleet/FleetBundles.vue +2 -1
  28. package/components/form/LabeledSelect.vue +20 -7
  29. package/components/form/NodeScheduling.vue +5 -1
  30. package/components/form/Password.vue +23 -13
  31. package/components/form/ResourceLabeledSelect.vue +1 -1
  32. package/components/form/Select.vue +28 -6
  33. package/components/form/SelectOrCreateAuthSecret.vue +39 -11
  34. package/components/form/__tests__/NodeScheduling.test.ts +44 -0
  35. package/components/formatter/Endpoints.vue +1 -1
  36. package/components/formatter/LiveExpiryDate.vue +5 -1
  37. package/components/formatter/ServiceTargets.vue +1 -1
  38. package/components/formatter/ServiceType.vue +19 -17
  39. package/components/nav/Pinned.vue +6 -1
  40. package/components/nav/TopLevelMenu.helper.ts +17 -1
  41. package/components/nav/TopLevelMenu.vue +154 -19
  42. package/config/pagination-table-headers.js +9 -1
  43. package/config/product/apps.js +63 -30
  44. package/config/product/explorer.js +182 -17
  45. package/config/product/settings.js +9 -1
  46. package/config/router/routes.js +0 -1
  47. package/config/settings.ts +20 -2
  48. package/config/table-headers.js +23 -15
  49. package/config/types.js +2 -1
  50. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +12 -3
  51. package/edit/fleet.cattle.io.gitrepo.vue +40 -33
  52. package/edit/provisioning.cattle.io.cluster/rke2.vue +13 -2
  53. package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +10 -2
  54. package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +8 -2
  55. package/edit/provisioning.cattle.io.cluster/tabs/registries/__tests__/RegistryConfigs.test.ts +6 -3
  56. package/edit/workload/mixins/workload.js +15 -7
  57. package/list/catalog.cattle.io.app.vue +4 -11
  58. package/list/catalog.cattle.io.clusterrepo.vue +59 -25
  59. package/list/fleet.cattle.io.bundle.vue +2 -2
  60. package/list/management.cattle.io.feature.vue +12 -5
  61. package/list/management.cattle.io.setting.vue +30 -19
  62. package/list/namespace.vue +4 -1
  63. package/list/networking.k8s.io.ingress.vue +14 -11
  64. package/list/node.vue +65 -63
  65. package/list/persistentvolume.vue +55 -20
  66. package/list/persistentvolumeclaim.vue +3 -15
  67. package/list/service.vue +16 -21
  68. package/list/workload.vue +35 -49
  69. package/mixins/resource-fetch.js +8 -1
  70. package/mixins/vue-select-overrides.js +10 -16
  71. package/models/management.cattle.io.cluster.js +6 -1
  72. package/models/persistentvolume.js +1 -3
  73. package/models/storage.k8s.io.storageclass.js +4 -0
  74. package/package.json +28 -29
  75. package/pages/c/_cluster/explorer/EventsTable.vue +58 -16
  76. package/pages/c/_cluster/explorer/index.vue +3 -16
  77. package/pages/c/_cluster/settings/performance.vue +49 -23
  78. package/pages/home.vue +24 -3
  79. package/pages/support/index.vue +1 -1
  80. package/plugins/floating-vue.js +1 -1
  81. package/plugins/steve/steve-pagination-utils.ts +85 -15
  82. package/rancher-components/Banner/Banner.vue +12 -0
  83. package/rancher-components/Form/Checkbox/Checkbox.vue +27 -5
  84. package/rancher-components/Form/Radio/RadioButton.vue +0 -6
  85. package/rancher-components/Form/Radio/RadioGroup.vue +5 -1
  86. package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +2 -2
  87. package/scripts/test-plugins-build.sh +21 -6
  88. package/scripts/typegen.sh +1 -0
  89. package/store/index.js +16 -0
  90. package/store/type-map.utils.ts +14 -1
  91. package/types/shell/index.d.ts +467 -418
  92. package/types/store/vuex.d.ts +1 -1
  93. package/types/vue-shim.d.ts +2 -8
  94. package/utils/cluster.js +2 -2
  95. package/utils/string.js +6 -0
  96. package/vue.config.js +3 -4
@@ -10,6 +10,7 @@ import {
10
10
 
11
11
  import { CATALOG } from '@shell/config/types';
12
12
  import { DSL } from '@shell/store/type-map';
13
+ import { STEVE_AGE_COL, STEVE_NAMESPACE_COL, STEVE_NAME_COL, STEVE_STATE_COL } from '@shell/config/pagination-table-headers';
13
14
 
14
15
  export const NAME = 'apps';
15
16
 
@@ -75,41 +76,73 @@ export function init(store) {
75
76
  dashIfEmpty: true,
76
77
  };
77
78
 
78
- headers(CATALOG.APP, [STATE, NAME_COL, NAMESPACE, CHART, CHART_UPGRADE, APP_SUMMARY, AGE]);
79
+ headers(CATALOG.APP,
80
+ [STATE, NAME_COL, NAMESPACE, CHART, CHART_UPGRADE, APP_SUMMARY, AGE],
81
+ [STEVE_STATE_COL, STEVE_NAME_COL, STEVE_NAMESPACE_COL, {
82
+ ...CHART,
83
+ sort: ['spec.chart.metadata.name'],
84
+ search: ['spec.chart.metadata.name'],
85
+ }, {
86
+ ...CHART_UPGRADE,
87
+ sort: false,
88
+ search: false,
89
+ },
90
+ APP_SUMMARY,
91
+ STEVE_AGE_COL]
92
+ );
79
93
  headers(CATALOG.REPO, [STATE, NAME_COL, NAMESPACE, repoType, repoUrl, repoBranch, AGE]);
80
- headers(CATALOG.CLUSTER_REPO, [STATE, NAME_COL, repoType, repoUrl, repoBranch, AGE]);
94
+ headers(CATALOG.CLUSTER_REPO,
95
+ [STATE, NAME_COL, repoType, repoUrl, repoBranch, AGE],
96
+ [STEVE_STATE_COL, STEVE_NAME_COL, {
97
+ ...repoType,
98
+ sort: false,
99
+ search: false,
100
+ }, {
101
+ ...repoUrl,
102
+ sort: false,
103
+ search: false,
104
+ },
105
+ repoBranch]
106
+ );
107
+
108
+ const opAction = {
109
+ name: 'action',
110
+ label: 'Action',
111
+ sort: 'status.action',
112
+ value: 'status.action',
113
+ labelKey: 'catalog.operation.tableHeaders.action',
114
+ };
115
+ const opReleaseNs = {
116
+ name: 'releaseNamespace',
117
+ label: 'Tgt Namespace',
118
+ sort: 'status.namespace',
119
+ value: 'status.namespace',
120
+ labelKey: 'catalog.operation.tableHeaders.releaseNamespace',
121
+ };
122
+ const opReleaseName = {
123
+ name: 'releaseName',
124
+ label: 'Tgt Release',
125
+ sort: 'status.releaseName',
126
+ value: 'status.releaseName',
127
+ labelKey: 'catalog.operation.tableHeaders.releaseName',
128
+ };
129
+
81
130
  headers(CATALOG.OPERATION, [
82
131
  STATE,
83
132
  NAME_COL,
84
133
  NAMESPACE,
85
- {
86
- name: 'action',
87
- label: 'Action',
88
- sort: 'status.action',
89
- value: 'status.action',
90
- labelKey: 'catalog.operation.tableHeaders.action',
91
- },
92
- {
93
- name: 'releaseNamespace',
94
- label: 'Tgt Namespace',
95
- sort: 'status.namespace',
96
- value: 'status.namespace',
97
- labelKey: 'catalog.operation.tableHeaders.releaseNamespace',
98
- },
99
- {
100
- name: 'releaseName',
101
- label: 'Tgt Release',
102
- sort: 'status.releaseName',
103
- value: 'status.releaseName',
104
- labelKey: 'catalog.operation.tableHeaders.releaseName',
105
- },
134
+ opAction,
135
+ opReleaseNs,
136
+ opReleaseName,
106
137
  AGE
138
+ ],
139
+ [
140
+ STEVE_STATE_COL,
141
+ STEVE_NAME_COL,
142
+ STEVE_NAMESPACE_COL,
143
+ opAction,
144
+ opReleaseNs,
145
+ opReleaseName,
146
+ STEVE_AGE_COL
107
147
  ]);
108
148
  }
109
-
110
- // name: 'cpu',
111
- // labelKey: 'tableHeaders.cpu',
112
- // sort: 'cpu',
113
- // value: 'cpuUsagePercentage',
114
- // formatter: 'PercentageBar'
115
- // };
@@ -19,18 +19,19 @@ import {
19
19
  USER_ID, USERNAME, USER_DISPLAY_NAME, USER_PROVIDER, USER_LAST_LOGIN, USER_DISABLED_IN, USER_DELETED_IN, WORKLOAD_ENDPOINTS, STORAGE_CLASS_DEFAULT,
20
20
  STORAGE_CLASS_PROVISIONER, PERSISTENT_VOLUME_SOURCE,
21
21
  HPA_REFERENCE, MIN_REPLICA, MAX_REPLICA, CURRENT_REPLICA,
22
- ACCESS_KEY, DESCRIPTION, EXPIRES, EXPIRY_STATE, SUB_TYPE, AGE_NORMAN, SCOPE_NORMAN, PERSISTENT_VOLUME_CLAIM, RECLAIM_POLICY, PV_REASON, WORKLOAD_HEALTH_SCALE, POD_RESTARTS,
22
+ ACCESS_KEY, DESCRIPTION, EXPIRES, EXPIRY_STATE, LAST_USED, SUB_TYPE, AGE_NORMAN, SCOPE_NORMAN, PERSISTENT_VOLUME_CLAIM, RECLAIM_POLICY, PV_REASON, WORKLOAD_HEALTH_SCALE, POD_RESTARTS,
23
23
  DURATION, MESSAGE, REASON, LAST_SEEN_TIME, EVENT_TYPE, OBJECT, ROLE, ROLES, VERSION, INTERNAL_EXTERNAL_IP, KUBE_NODE_OS, CPU, RAM, SECRET_DATA
24
24
  } from '@shell/config/table-headers';
25
25
 
26
26
  import { DSL } from '@shell/store/type-map';
27
27
  import {
28
- STEVE_AGE_COL, STEVE_LIST_GROUPS, STEVE_NAMESPACE_COL, STEVE_NAME_COL, STEVE_STATE_COL
28
+ STEVE_AGE_COL, STEVE_EVENT_OBJECT, STEVE_LIST_GROUPS, STEVE_NAMESPACE_COL, STEVE_NAME_COL, STEVE_STATE_COL
29
29
  } from '@shell/config/pagination-table-headers';
30
30
 
31
31
  import { COLUMN_BREAKPOINTS } from '@shell/types/store/type-map';
32
32
  import { STEVE_CACHE } from '@shell/store/features';
33
33
  import { configureConditionalDepaginate } from '@shell/store/type-map.utils';
34
+ import { CATTLE_PUBLIC_ENDPOINTS } from '@shell/config/labels-annotations';
34
35
 
35
36
  export const NAME = 'explorer';
36
37
 
@@ -81,6 +82,7 @@ export function init(store) {
81
82
  POD_DISRUPTION_BUDGET,
82
83
  RESOURCE_QUOTA,
83
84
  ], 'policy');
85
+
84
86
  basicType([
85
87
  SERVICE,
86
88
  INGRESS,
@@ -216,7 +218,25 @@ export function init(store) {
216
218
  */
217
219
  configureType(MANAGEMENT.PSA, { localOnly: true });
218
220
 
219
- headers(PV, [STATE, NAME_COL, RECLAIM_POLICY, PERSISTENT_VOLUME_CLAIM, PERSISTENT_VOLUME_SOURCE, PV_REASON, AGE]);
221
+ headers(PV,
222
+ [STATE, NAME_COL, RECLAIM_POLICY, PERSISTENT_VOLUME_CLAIM, PERSISTENT_VOLUME_SOURCE, PV_REASON, AGE],
223
+ [
224
+ STEVE_STATE_COL,
225
+ STEVE_NAME_COL,
226
+ RECLAIM_POLICY,
227
+ {
228
+ ...PERSISTENT_VOLUME_CLAIM,
229
+ sort: ['metadata.fields.5'],
230
+ search: ['metadata.fields.5'],
231
+ }, {
232
+ ...PERSISTENT_VOLUME_SOURCE,
233
+ sort: false,
234
+ search: false,
235
+ },
236
+ PV_REASON,
237
+ STEVE_AGE_COL,
238
+ ]
239
+ );
220
240
 
221
241
  headers(CONFIG_MAP,
222
242
  [NAME_COL, NAMESPACE_COL, KEYS, AGE],
@@ -254,18 +274,142 @@ export function init(store) {
254
274
  STEVE_AGE_COL
255
275
  ]);
256
276
 
257
- headers(INGRESS, [STATE, NAME_COL, NAMESPACE_COL, INGRESS_TARGET, INGRESS_DEFAULT_BACKEND, INGRESS_CLASS, AGE]);
258
- headers(SERVICE, [STATE, NAME_COL, NAMESPACE_COL, TARGET_PORT, SELECTOR, SPEC_TYPE, AGE]);
259
- headers(EVENT, [STATE, { ...LAST_SEEN_TIME, defaultSort: true }, EVENT_TYPE, REASON, OBJECT, 'Subobject', 'Source', MESSAGE, 'First Seen', 'Count', NAME_COL, NAMESPACE_COL]);
260
- headers(HPA, [STATE, NAME_COL, HPA_REFERENCE, MIN_REPLICA, MAX_REPLICA, CURRENT_REPLICA, AGE]);
277
+ headers(INGRESS,
278
+ [STATE, NAME_COL, NAMESPACE_COL, INGRESS_TARGET, INGRESS_DEFAULT_BACKEND, INGRESS_CLASS, AGE],
279
+ [
280
+ STEVE_STATE_COL,
281
+ STEVE_NAME_COL,
282
+ STEVE_NAMESPACE_COL,
283
+ {
284
+ ...INGRESS_TARGET,
285
+ sort: 'spec.rules[0].host', // Pending API support https://github.com/rancher/rancher/issues/48473 (index fields)
286
+ search: false, // This is broken in normal world, so disable here
287
+ },
288
+ {
289
+ ...INGRESS_DEFAULT_BACKEND,
290
+ sort: false,
291
+ search: false,
292
+ },
293
+ {
294
+ ...INGRESS_CLASS,
295
+ sort: 'spec.ingressClassName',
296
+ search: 'spec.ingressClassName', // Pending API support (blocked https://github.com/rancher/rancher/issues/48473 (index fields)
297
+ },
298
+ STEVE_AGE_COL
299
+ ]
300
+ );
301
+
302
+ headers(SERVICE,
303
+ [STATE, NAME_COL, NAMESPACE_COL, TARGET_PORT, SELECTOR, SPEC_TYPE, AGE],
304
+ [
305
+ STEVE_STATE_COL,
306
+ STEVE_NAME_COL,
307
+ STEVE_NAMESPACE_COL,
308
+ TARGET_PORT,
309
+ {
310
+ // Selector is an object. This is broken in non-SSP world anyway (won't sort on object, filtering on `$[x][y]` paths are broken )
311
+ ...SELECTOR,
312
+ sort: false,
313
+ search: false,
314
+ },
315
+ {
316
+ ...SPEC_TYPE,
317
+ sort: false, // ['spec.type', 'spec.clusterIP'] Pending API support (blocked https://github.com/rancher/rancher/issues/48473 (index fields)
318
+ search: 'spec.type',
319
+ },
320
+ STEVE_AGE_COL
321
+ ]
322
+ );
323
+
324
+ const eventLastSeenTime = {
325
+ ...LAST_SEEN_TIME,
326
+ defaultSort: true,
327
+ };
328
+
329
+ headers(EVENT,
330
+ [STATE, eventLastSeenTime, EVENT_TYPE, REASON, OBJECT, 'Subobject', 'Source', MESSAGE, 'First Seen', 'Count', NAME_COL, NAMESPACE_COL],
331
+ [
332
+ STEVE_STATE_COL, {
333
+ ...eventLastSeenTime,
334
+ value: 'metadata.fields.0',
335
+ sort: 'metadata.fields.0',
336
+ }, {
337
+ ...EVENT_TYPE,
338
+ value: '_type',
339
+ sort: '_type',
340
+ },
341
+ REASON,
342
+ STEVE_EVENT_OBJECT,
343
+ 'Subobject',
344
+ 'Source',
345
+ MESSAGE,
346
+ 'First Seen',
347
+ 'Count',
348
+ STEVE_NAME_COL,
349
+ STEVE_NAMESPACE_COL,
350
+ ]
351
+ );
352
+ headers(HPA,
353
+ [STATE, NAME_COL, NAMESPACE_COL, HPA_REFERENCE, MIN_REPLICA, MAX_REPLICA, CURRENT_REPLICA, AGE],
354
+ [
355
+ STEVE_STATE_COL,
356
+ STEVE_NAME_COL,
357
+ STEVE_NAMESPACE_COL,
358
+ HPA_REFERENCE, // Pending API support https://github.com/rancher/rancher/issues/48479 (hpa filtering)
359
+ MIN_REPLICA, // Pending API support https://github.com/rancher/rancher/issues/48479 (hpa filtering)
360
+ MAX_REPLICA, // Pending API support https://github.com/rancher/rancher/issues/48479 (hpa filtering)
361
+ CURRENT_REPLICA, // Pending API support https://github.com/rancher/rancher/issues/48479 (hpa filtering)
362
+ STEVE_AGE_COL
363
+ ]
364
+ );
365
+
366
+ const STEVE_WORKLOAD_ENDPOINTS = {
367
+ ...WORKLOAD_ENDPOINTS,
368
+ sort: [`metadata.annotations[${ CATTLE_PUBLIC_ENDPOINTS }]`],
369
+ search: [`metadata.annotations[${ CATTLE_PUBLIC_ENDPOINTS }]`],
370
+ };
371
+
372
+ const createSteveWorkloadImageCol = (resourceFieldPos) => ({
373
+ ...WORKLOAD_IMAGES,
374
+ sort: `metadata.fields.${ resourceFieldPos }`,
375
+ search: `metadata.fields.${ resourceFieldPos }`,
376
+ });
377
+
261
378
  headers(WORKLOAD, [STATE, NAME_COL, NAMESPACE_COL, TYPE, WORKLOAD_IMAGES, WORKLOAD_ENDPOINTS, POD_RESTARTS, AGE, WORKLOAD_HEALTH_SCALE]);
262
- headers(WORKLOAD_TYPES.DEPLOYMENT, [STATE, NAME_COL, NAMESPACE_COL, WORKLOAD_IMAGES, WORKLOAD_ENDPOINTS, 'Ready', 'Up-to-date', 'Available', POD_RESTARTS, AGE, WORKLOAD_HEALTH_SCALE]);
263
- headers(WORKLOAD_TYPES.DAEMON_SET, [STATE, NAME_COL, NAMESPACE_COL, WORKLOAD_IMAGES, WORKLOAD_ENDPOINTS, 'Ready', 'Current', 'Desired', POD_RESTARTS, AGE, WORKLOAD_HEALTH_SCALE]);
264
- headers(WORKLOAD_TYPES.REPLICA_SET, [STATE, NAME_COL, NAMESPACE_COL, WORKLOAD_IMAGES, WORKLOAD_ENDPOINTS, 'Ready', 'Current', 'Desired', POD_RESTARTS, AGE, WORKLOAD_HEALTH_SCALE]);
265
- headers(WORKLOAD_TYPES.STATEFUL_SET, [STATE, NAME_COL, NAMESPACE_COL, WORKLOAD_IMAGES, WORKLOAD_ENDPOINTS, 'Ready', POD_RESTARTS, AGE, WORKLOAD_HEALTH_SCALE]);
266
- headers(WORKLOAD_TYPES.JOB, [STATE, NAME_COL, NAMESPACE_COL, WORKLOAD_IMAGES, WORKLOAD_ENDPOINTS, 'Completions', DURATION, POD_RESTARTS, AGE, WORKLOAD_HEALTH_SCALE]);
267
- headers(WORKLOAD_TYPES.CRON_JOB, [STATE, NAME_COL, NAMESPACE_COL, WORKLOAD_IMAGES, WORKLOAD_ENDPOINTS, 'Schedule', 'Last Schedule', POD_RESTARTS, AGE, WORKLOAD_HEALTH_SCALE]);
268
- headers(WORKLOAD_TYPES.REPLICATION_CONTROLLER, [STATE, NAME_COL, NAMESPACE_COL, WORKLOAD_IMAGES, WORKLOAD_ENDPOINTS, 'Ready', 'Current', 'Desired', POD_RESTARTS, AGE, WORKLOAD_HEALTH_SCALE]);
379
+ headers(WORKLOAD_TYPES.DEPLOYMENT,
380
+ [STATE, NAME_COL, NAMESPACE_COL, WORKLOAD_IMAGES, WORKLOAD_ENDPOINTS, 'Ready', 'Up-to-date', 'Available', POD_RESTARTS, AGE, WORKLOAD_HEALTH_SCALE],
381
+ [STEVE_STATE_COL, STEVE_NAME_COL, STEVE_NAMESPACE_COL, createSteveWorkloadImageCol(6), STEVE_WORKLOAD_ENDPOINTS, 'Ready', 'Up-to-date', 'Available', STEVE_AGE_COL],
382
+ );
383
+ headers(WORKLOAD_TYPES.DAEMON_SET,
384
+ [STATE, NAME_COL, NAMESPACE_COL, WORKLOAD_IMAGES, WORKLOAD_ENDPOINTS, 'Ready', 'Current', 'Desired', POD_RESTARTS, AGE, WORKLOAD_HEALTH_SCALE],
385
+ [STEVE_STATE_COL, STEVE_NAME_COL, STEVE_NAMESPACE_COL, createSteveWorkloadImageCol(9), STEVE_WORKLOAD_ENDPOINTS, 'Ready', 'Current', 'Desired', STEVE_AGE_COL]
386
+ );
387
+ headers(WORKLOAD_TYPES.REPLICA_SET,
388
+ [STATE, NAME_COL, NAMESPACE_COL, WORKLOAD_IMAGES, WORKLOAD_ENDPOINTS, 'Ready', 'Current', 'Desired', POD_RESTARTS, AGE, WORKLOAD_HEALTH_SCALE],
389
+ [STEVE_STATE_COL, STEVE_NAME_COL, STEVE_NAMESPACE_COL, createSteveWorkloadImageCol(6), STEVE_WORKLOAD_ENDPOINTS, 'Ready', 'Current', 'Desired', STEVE_AGE_COL],
390
+ );
391
+ headers(WORKLOAD_TYPES.STATEFUL_SET,
392
+ [STATE, NAME_COL, NAMESPACE_COL, WORKLOAD_IMAGES, WORKLOAD_ENDPOINTS, 'Ready', POD_RESTARTS, AGE, WORKLOAD_HEALTH_SCALE],
393
+ [STEVE_STATE_COL, STEVE_NAME_COL, STEVE_NAMESPACE_COL, createSteveWorkloadImageCol(4), STEVE_WORKLOAD_ENDPOINTS, 'Ready', STEVE_AGE_COL],
394
+ );
395
+ headers(WORKLOAD_TYPES.JOB,
396
+ [STATE, NAME_COL, NAMESPACE_COL, WORKLOAD_IMAGES, WORKLOAD_ENDPOINTS, 'Completions', DURATION, POD_RESTARTS, AGE, WORKLOAD_HEALTH_SCALE],
397
+ [STEVE_STATE_COL, STEVE_NAME_COL, STEVE_NAMESPACE_COL, createSteveWorkloadImageCol(6), STEVE_WORKLOAD_ENDPOINTS, 'Completions', {
398
+ ...DURATION,
399
+ value: 'metadata.fields.3',
400
+ sort: false,
401
+ search: 'metadata.fields.3',
402
+ formatter: undefined, // Now that sort/search is remote we're not doing weird things with start time (see `duration` in model)
403
+ }, STEVE_AGE_COL],
404
+ );
405
+ headers(WORKLOAD_TYPES.CRON_JOB,
406
+ [STATE, NAME_COL, NAMESPACE_COL, WORKLOAD_IMAGES, WORKLOAD_ENDPOINTS, 'Schedule', 'Last Schedule', POD_RESTARTS, AGE, WORKLOAD_HEALTH_SCALE],
407
+ [STEVE_STATE_COL, STEVE_NAME_COL, STEVE_NAMESPACE_COL, createSteveWorkloadImageCol(8), STEVE_WORKLOAD_ENDPOINTS, 'Schedule', 'Last Schedule', STEVE_AGE_COL]
408
+ );
409
+ headers(WORKLOAD_TYPES.REPLICATION_CONTROLLER,
410
+ [STATE, NAME_COL, NAMESPACE_COL, WORKLOAD_IMAGES, WORKLOAD_ENDPOINTS, 'Ready', 'Current', 'Desired', POD_RESTARTS, AGE, WORKLOAD_HEALTH_SCALE],
411
+ [STEVE_STATE_COL, STEVE_NAME_COL, STEVE_NAMESPACE_COL, createSteveWorkloadImageCol(6), STEVE_WORKLOAD_ENDPOINTS, 'Ready', 'Current', 'Desired', STEVE_AGE_COL],
412
+ );
269
413
 
270
414
  headers(POD,
271
415
  [STATE, NAME_COL, NAMESPACE_COL, POD_IMAGES, 'Ready', 'Restarts', 'IP', NODE_COL, AGE],
@@ -281,7 +425,8 @@ export function init(store) {
281
425
  search: 'spec.nodeName'
282
426
  },
283
427
  STEVE_AGE_COL
284
- ]);
428
+ ]
429
+ );
285
430
 
286
431
  headers(NODE,
287
432
  [
@@ -341,13 +486,32 @@ export function init(store) {
341
486
  search: false,
342
487
  },
343
488
  STEVE_AGE_COL
344
- ]);
489
+ ]
490
+ );
345
491
 
346
492
  headers(MANAGEMENT.PSA, [STATE, NAME_COL, {
347
493
  ...DESCRIPTION,
348
494
  width: undefined
349
495
  }, AGE]);
350
- headers(STORAGE_CLASS, [STATE, NAME_COL, STORAGE_CLASS_PROVISIONER, STORAGE_CLASS_DEFAULT, AGE]);
496
+
497
+ headers(STORAGE_CLASS,
498
+ [STATE, NAME_COL, STORAGE_CLASS_PROVISIONER, STORAGE_CLASS_DEFAULT, AGE],
499
+ [
500
+ STEVE_STATE_COL,
501
+ STEVE_NAME_COL,
502
+ {
503
+ ...STORAGE_CLASS_PROVISIONER,
504
+ sort: ['provisioner'],
505
+ search: ['provisioner']
506
+ },
507
+ {
508
+ ...STORAGE_CLASS_DEFAULT,
509
+ sort: false, // [`metadata.annotations[${ STORAGE.DEFAULT_STORAGE_CLASS }]`], // Pending API Support - https://github.com/rancher/rancher/issues/48453
510
+ search: false, // [`metadata.annotations[${ STORAGE.DEFAULT_STORAGE_CLASS }]`], // Pending API Support - https://github.com/rancher/rancher/issues/48453
511
+ },
512
+ STEVE_AGE_COL
513
+ ]
514
+ );
351
515
 
352
516
  configureType(MANAGEMENT.CLUSTER_ROLE_TEMPLATE_BINDING, {
353
517
  listGroups: [
@@ -378,6 +542,7 @@ export function init(store) {
378
542
  ACCESS_KEY,
379
543
  DESCRIPTION,
380
544
  SCOPE_NORMAN,
545
+ LAST_USED,
381
546
  EXPIRES,
382
547
  AGE_NORMAN
383
548
  ]);
@@ -6,6 +6,7 @@ import {
6
6
  RESTART,
7
7
  NAME_UNLINKED,
8
8
  } from '@shell/config/table-headers';
9
+ import { getVendor } from '@shell/config/private-label';
9
10
 
10
11
  export const NAME = 'settings';
11
12
 
@@ -142,11 +143,18 @@ export function init(store) {
142
143
  canYaml: true,
143
144
  });
144
145
 
146
+ // Change the restart header to 'Restart <VENDOR>' so that it is clearer what is being restarted
147
+ const t = store.getters['i18n/t'];
148
+
145
149
  headers(MANAGEMENT.FEATURE, [
146
150
  STATE,
147
151
  NAME_UNLINKED,
148
152
  FEATURE_DESCRIPTION,
149
- RESTART,
153
+ {
154
+ ...RESTART,
155
+ labelKey: undefined,
156
+ label: t('tableHeaders.restartSystem', { vendor: getVendor() })
157
+ }
150
158
  ]);
151
159
 
152
160
  hideBulkActions(MANAGEMENT.FEATURE, true);
@@ -25,7 +25,6 @@ export default [
25
25
  {
26
26
  path: '/',
27
27
  component: () => interopDefault(import('@shell/pages/index.vue')),
28
- name: 'index',
29
28
  meta: { requiresAuthentication: true },
30
29
  children: [
31
30
  {
@@ -1,7 +1,16 @@
1
1
  // Settings
2
2
  import { GC_DEFAULTS, GC_PREFERENCES } from '@shell/utils/gc/gc-types';
3
3
  import { PaginationSettings } from '@shell/types/resources/settings';
4
- import { CAPI, MANAGEMENT } from '@shell/config/types';
4
+ import {
5
+ CAPI, MANAGEMENT, EVENT, CATALOG, HPA, INGRESS, SERVICE,
6
+ CONFIG_MAP,
7
+ SECRET,
8
+ POD, NODE,
9
+ STORAGE_CLASS,
10
+ PVC,
11
+ PV,
12
+ WORKLOAD_TYPES
13
+ } from '@shell/config/types';
5
14
 
6
15
  interface GlobalSettingRuleset {
7
16
  name: string,
@@ -250,7 +259,16 @@ export const DEFAULT_PERF_SETTING: PerfSettings = {
250
259
  resources: {
251
260
  enableAll: false,
252
261
  enableSome: {
253
- enabled: ['configmap', 'secret', 'pod', 'node'],
262
+ // if a resource list is shown by a custom resource list component or has specific list headers then it's not generically shown
263
+ // and must be included here.
264
+ enabled: [
265
+ NODE, EVENT,
266
+ WORKLOAD_TYPES.CRON_JOB, WORKLOAD_TYPES.DAEMON_SET, WORKLOAD_TYPES.DEPLOYMENT, WORKLOAD_TYPES.JOB, WORKLOAD_TYPES.STATEFUL_SET, POD,
267
+ CATALOG.APP, CATALOG.CLUSTER_REPO, CATALOG.OPERATION,
268
+ HPA, INGRESS, SERVICE,
269
+ PV, CONFIG_MAP, STORAGE_CLASS, PVC, SECRET,
270
+ WORKLOAD_TYPES.REPLICA_SET, WORKLOAD_TYPES.REPLICATION_CONTROLLER
271
+ ],
254
272
  generic: true,
255
273
  }
256
274
  }
@@ -82,7 +82,7 @@ export const EFFECT = {
82
82
  export const STORAGE_CLASS_PROVISIONER = {
83
83
  name: 'storage_class_provisioner',
84
84
  labelKey: 'tableHeaders.storage_class_provisioner',
85
- value: 'provisionerDisplay',
85
+ value: 'provisionerListDisplay',
86
86
  sort: ['provisioner'],
87
87
  };
88
88
 
@@ -94,6 +94,9 @@ export const STORAGE_CLASS_DEFAULT = {
94
94
  formatter: 'Checked',
95
95
  };
96
96
 
97
+ /**
98
+ * spec.csi.driver OR spec[known driver type]
99
+ */
97
100
  export const PERSISTENT_VOLUME_SOURCE = {
98
101
  name: 'persistent_volume_source',
99
102
  labelKey: 'tableHeaders.persistentVolumeSource',
@@ -101,13 +104,16 @@ export const PERSISTENT_VOLUME_SOURCE = {
101
104
  sort: ['provisioner'],
102
105
  };
103
106
 
107
+ /**
108
+ * Link to the PVC associated with PV
109
+ */
104
110
  export const PERSISTENT_VOLUME_CLAIM = {
105
111
  name: 'persistent-volume-claim',
106
112
  labelKey: 'tableHeaders.persistentVolumeClaim',
107
- sort: ['nameSort'],
113
+ sort: ['claimName'],
108
114
  value: 'claimName',
109
115
  formatter: 'LinkDetail',
110
- formatterOpts: { reference: 'claim.detailLocation' },
116
+ formatterOpts: { reference: 'claim.detailLocation' }
111
117
  };
112
118
 
113
119
  export const OUTPUT = {
@@ -320,15 +326,6 @@ export const POD_RESTARTS = {
320
326
  liveUpdates: true
321
327
  };
322
328
 
323
- export const ENDPOINTS = {
324
- name: 'endpoint',
325
- labelKey: 'tableHeaders.endpoints',
326
- value: 'status.endpoints',
327
- formatter: 'Endpoints',
328
- width: 60,
329
- align: 'center',
330
- };
331
-
332
329
  export const SCALE = {
333
330
  name: 'scale',
334
331
  labelKey: 'tableHeaders.scale',
@@ -657,8 +654,8 @@ export const TARGET_PORT = {
657
654
  formatter: 'ServiceTargets',
658
655
  labelKey: 'tableHeaders.targetPort',
659
656
  name: 'targetPort',
660
- sort: `$['spec']['targetPort']`,
661
- value: `$['spec']['targetPort']`,
657
+ sort: false,
658
+ value: false,
662
659
  };
663
660
 
664
661
  export const SELECTOR = {
@@ -963,13 +960,24 @@ export const EXPIRES = {
963
960
  formatter: 'LiveExpiryDate'
964
961
  };
965
962
 
963
+ export const LAST_USED = {
964
+ name: 'lastUsed',
965
+ value: 'lastUsedAt',
966
+ labelKey: 'tableHeaders.lastUsed',
967
+ align: 'left',
968
+ sort: ['lastUsedAt'],
969
+ width: 200,
970
+ formatter: 'LiveExpiryDate',
971
+ formatterOpts: { missingKey: 'generic.unknown' },
972
+ };
973
+
966
974
  export const RESTART = {
967
975
  name: 'restart',
968
976
  labelKey: 'tableHeaders.restart',
969
977
  value: 'restartRequired',
970
978
  sort: ['restartRequired', 'nameSort'],
971
979
  formatter: 'Checked',
972
- width: 75,
980
+ width: 125,
973
981
  align: 'center'
974
982
  };
975
983
 
package/config/types.js CHANGED
@@ -333,7 +333,8 @@ export const AUTH_TYPE = {
333
333
  _NONE: '_none',
334
334
  _BASIC: '_basic',
335
335
  _SSH: '_ssh',
336
- _S3: '_S3'
336
+ _S3: '_S3',
337
+ _RKE: '_RKE',
337
338
  };
338
339
 
339
340
  export const LOCAL_CLUSTER = 'local';
@@ -33,12 +33,21 @@ describe('view: fleet.cattle.io.gitrepo should', () => {
33
33
  global: { mocks }
34
34
  });
35
35
 
36
- it('should have self-healing checkbox and banner', () => {
36
+ it('should have self-healing checkbox and tooltip', () => {
37
37
  const correctDriftCheckbox = wrapper.find('[data-testid="GitRepo-correctDrift-checkbox"]');
38
- const correctDriftBanner = wrapper.find('[data-testid="GitRepo-correctDrift-banner"]');
38
+ const tooltip = wrapper.find('[data-testid="GitRepo-correctDrift-checkbox"]');
39
39
 
40
+ expect(tooltip.element.classList).toContain('v-popper--has-tooltip');
41
+ expect(correctDriftCheckbox.exists()).toBeTruthy();
42
+ expect(correctDriftCheckbox.attributes().value).toBeFalsy();
43
+ });
44
+
45
+ it('should have keep-resources checkbox and tooltip', () => {
46
+ const correctDriftCheckbox = wrapper.find('[data-testid="GitRepo-keepResources-checkbox"]');
47
+ const tooltip = wrapper.find('[data-testid="GitRepo-keepResources-checkbox"]');
48
+
49
+ expect(tooltip.element.classList).toContain('v-popper--has-tooltip');
40
50
  expect(correctDriftCheckbox.exists()).toBeTruthy();
41
- expect(correctDriftBanner.exists()).toBeTruthy();
42
51
  expect(correctDriftCheckbox.attributes().value).toBeFalsy();
43
52
  });
44
53