@rancher/shell 3.0.12-rc.2 → 3.0.12-rc.3
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.
- package/apis/impl/apis.ts +6 -0
- package/apis/index.ts +26 -0
- package/apis/intf/resources-api/cluster-api.ts +18 -0
- package/apis/intf/resources-api/mgmt-api.ts +15 -0
- package/apis/intf/resources-api/resource-base.ts +107 -0
- package/apis/intf/resources-api/resource-constants.ts +147 -0
- package/apis/intf/resources-api/resources-api.ts +143 -0
- package/apis/intf/resources.ts +49 -0
- package/apis/intf/{modal.ts → shell-api/modal.ts} +21 -26
- package/apis/intf/shell-api/proxy.ts +216 -0
- package/apis/intf/{slide-in.ts → shell-api/slide-in.ts} +4 -3
- package/apis/intf/{system.ts → shell-api/system.ts} +4 -1
- package/apis/intf/shell.ts +12 -6
- package/apis/resources/__tests__/resources-api-class.test.ts +550 -0
- package/apis/resources/index.ts +22 -0
- package/apis/resources/resources-api-class.ts +187 -0
- package/apis/shell/__tests__/proxy.test.ts +369 -0
- package/apis/shell/index.ts +8 -1
- package/apis/shell/modal.ts +4 -1
- package/apis/shell/notifications.ts +9 -6
- package/apis/shell/proxy.ts +256 -0
- package/apis/shell/slide-in.ts +4 -1
- package/apis/vue-shim.d.ts +2 -1
- package/assets/data/aws-regions.json +4 -0
- package/assets/fonts/lato/LatoLatin-Black.woff +0 -0
- package/assets/fonts/lato/LatoLatin-Black.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-BlackItalic.woff +0 -0
- package/assets/fonts/lato/LatoLatin-BlackItalic.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-Bold.woff +0 -0
- package/assets/fonts/lato/LatoLatin-Bold.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-BoldItalic.woff +0 -0
- package/assets/fonts/lato/LatoLatin-BoldItalic.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-Heavy.woff +0 -0
- package/assets/fonts/lato/LatoLatin-Heavy.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-HeavyItalic.woff +0 -0
- package/assets/fonts/lato/LatoLatin-HeavyItalic.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-Italic.woff +0 -0
- package/assets/fonts/lato/LatoLatin-Italic.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-Light.woff +0 -0
- package/assets/fonts/lato/LatoLatin-Light.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-LightItalic.woff +0 -0
- package/assets/fonts/lato/LatoLatin-LightItalic.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-Medium.woff +0 -0
- package/assets/fonts/lato/LatoLatin-Medium.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-MediumItalic.woff +0 -0
- package/assets/fonts/lato/LatoLatin-MediumItalic.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-Regular.woff +0 -0
- package/assets/fonts/lato/LatoLatin-Regular.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-Semibold.woff +0 -0
- package/assets/fonts/lato/LatoLatin-Semibold.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-SemiboldItalic.woff +0 -0
- package/assets/fonts/lato/LatoLatin-SemiboldItalic.woff2 +0 -0
- package/assets/styles/base/_variables.scss +2 -0
- package/assets/styles/fonts/_fontstack.scss +132 -8
- package/assets/translations/en-us.yaml +22 -5
- package/chart/monitoring/index.vue +10 -1
- package/components/ActionDropdownShell.vue +2 -1
- package/components/CruResourceFooter.vue +9 -5
- package/components/ExplorerProjectsNamespaces.vue +1 -1
- package/components/InstallHelmCharts.vue +2 -2
- package/components/LandingPagePreference.vue +14 -5
- package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +15 -1
- package/components/Resource/Detail/Metadata/index.vue +6 -0
- package/components/Resource/Detail/ResourcePopover/index.vue +12 -1
- package/components/Resource/Detail/SpacedRow.vue +3 -1
- package/components/Resource/Detail/TitleBar/index.vue +10 -11
- package/components/ResourceList/Masthead.vue +12 -8
- package/components/SelectIconGrid.vue +0 -10
- package/components/SingleClusterInfo.vue +1 -0
- package/components/SortableTable/__tests__/sorting.test.ts +126 -0
- package/components/SortableTable/index.vue +6 -9
- package/components/SortableTable/selection.js +23 -5
- package/components/SortableTable/sorting.js +6 -3
- package/components/Wizard.vue +14 -13
- package/components/fleet/FleetBundles.vue +100 -12
- package/components/fleet/FleetClusterTargets/index.vue +37 -15
- package/components/fleet/__tests__/FleetClusterTargets.test.ts +149 -115
- package/components/fleet/__tests__/FleetClusters.test.ts +12 -12
- package/components/form/LabeledSelect.vue +20 -3
- package/components/form/NameNsDescription.vue +11 -0
- package/components/form/Security.vue +6 -2
- package/components/form/WorkloadPorts.vue +2 -7
- package/components/form/__tests__/Security.test.ts +76 -0
- package/components/formatter/Autoscaler.vue +4 -4
- package/components/formatter/ClusterKubeVersion.vue +27 -0
- package/components/formatter/ClusterLink.vue +1 -7
- package/components/formatter/ClusterProvider.vue +6 -10
- package/components/formatter/FleetSummaryGraph.vue +0 -3
- package/components/formatter/MachineSummaryGraph.vue +1 -1
- package/components/formatter/PodsUsage.vue +2 -2
- package/components/formatter/__tests__/Autoscaler.test.ts +19 -22
- package/components/formatter/__tests__/FleetSummaryGraph.test.ts +216 -0
- package/components/formatter/__tests__/PodsUsage.test.ts +6 -10
- package/components/nav/NamespaceFilter.vue +2 -2
- package/components/nav/TopLevelMenu.helper.ts +15 -3
- package/components/nav/TopLevelMenu.vue +16 -5
- package/components/nav/__tests__/TopLevelMenu.test.ts +145 -21
- package/components/templates/home.vue +18 -0
- package/components/templates/plain.vue +18 -0
- package/components/templates/standalone.vue +17 -0
- package/composables/useFormValidation.ts +93 -0
- package/composables/useVeeValidateField.test.ts +159 -0
- package/composables/useVeeValidateField.ts +67 -0
- package/config/pagination-table-headers.js +18 -1
- package/config/product/manager.js +82 -21
- package/config/router/routes.js +6 -0
- package/config/table-headers.js +20 -1
- package/config/types.js +2 -1
- package/core/__tests__/plugin-products.test.ts +904 -20
- package/core/plugin-products-base.ts +107 -7
- package/core/plugin-products.ts +4 -0
- package/core/plugin-types.ts +111 -1
- package/core/plugin.ts +15 -7
- package/core/productDebugger.js +9 -4
- package/core/types-provisioning.ts +43 -30
- package/core/types.ts +57 -20
- package/detail/__tests__/pod.test.ts +41 -0
- package/detail/harvesterhci.io.management.cluster.vue +6 -2
- package/detail/pod.vue +1 -1
- package/detail/provisioning.cattle.io.cluster.vue +4 -10
- package/edit/auth/__tests__/azuread.test.ts +217 -34
- package/edit/auth/azuread.vue +122 -14
- package/edit/auth/oidc.vue +2 -2
- package/edit/networking.k8s.io.ingress/DefaultBackend.vue +13 -4
- package/edit/networking.k8s.io.ingress/RulePath.vue +8 -4
- package/edit/networking.k8s.io.ingress/index.vue +75 -20
- package/edit/provisioning.cattle.io.cluster/__tests__/MachinePool.test.ts +104 -0
- package/edit/provisioning.cattle.io.cluster/index.vue +11 -7
- package/edit/provisioning.cattle.io.cluster/rke2.vue +8 -4
- package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +11 -0
- package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +37 -4
- package/edit/provisioning.cattle.io.cluster/tabs/registries/__tests__/RegistryConfigs.test.ts +132 -7
- package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +2 -1
- package/edit/secret/__tests__/ssh.test.ts +5 -6
- package/edit/secret/basic.vue +31 -0
- package/edit/secret/index.vue +68 -17
- package/edit/secret/registry.vue +38 -0
- package/edit/secret/ssh.vue +29 -0
- package/edit/secret/tls.vue +30 -0
- package/edit/service.vue +4 -4
- package/edit/workload/Upgrading.vue +3 -3
- package/edit/workload/__tests__/Upgrading.test.ts +6 -9
- package/edit/workload/mixins/workload.js +2 -1
- package/list/fleet.cattle.io.bundle.vue +7 -104
- package/list/fleet.cattle.io.clusterregistrationtoken.vue +20 -0
- package/list/provisioning.cattle.io.cluster.vue +262 -180
- package/list/utils/management.cattle.io.cluster.utils.ts +128 -0
- package/mixins/__tests__/chart.test.ts +112 -0
- package/mixins/brand.js +2 -1
- package/mixins/chart.js +12 -8
- package/mixins/resource-fetch-api-pagination.js +41 -5
- package/models/__tests__/ext.cattle.io.kubeconfig.test.ts +67 -67
- package/models/__tests__/management.cattle.io.cluster.test.ts +1 -1
- package/models/__tests__/management.cattle.io.node.ts +6 -5
- package/models/__tests__/management.cattle.io.nodepool.ts +5 -4
- package/models/__tests__/provisioning.cattle.io.cluster.test.ts +32 -11
- package/models/base-cluster.x-k8s.io.js +26 -0
- package/models/cluster.js +1 -1
- package/models/cluster.x-k8s.io.machine.js +4 -22
- package/models/cluster.x-k8s.io.machinedeployment.js +2 -20
- package/models/cluster.x-k8s.io.machineset.js +2 -20
- package/models/compliance.cattle.io.clusterscan.js +130 -2
- package/models/ext.cattle.io.kubeconfig.ts +4 -7
- package/models/fleet-application.js +3 -1
- package/models/management.cattle.io.cluster.js +417 -40
- package/models/management.cattle.io.node.js +6 -4
- package/models/management.cattle.io.nodepool.js +1 -1
- package/models/networking.k8s.io.ingress.js +12 -4
- package/models/provisioning.cattle.io.cluster.js +47 -330
- package/models/rke.cattle.io.etcdsnapshot.js +1 -2
- package/package.json +11 -29
- package/pages/__tests__/readme.test.ts +49 -0
- package/pages/auth/setup.vue +2 -3
- package/pages/c/_cluster/apps/charts/__tests__/chart.test.ts +76 -0
- package/pages/c/_cluster/apps/charts/chart.vue +60 -8
- package/pages/c/_cluster/apps/charts/install.vue +10 -7
- package/pages/c/_cluster/explorer/__tests__/index.test.ts +23 -25
- package/pages/c/_cluster/explorer/index.vue +5 -49
- package/pages/c/_cluster/istio/__tests__/istio.index.test.ts +194 -0
- package/pages/c/_cluster/istio/index.vue +21 -6
- package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +1 -0
- package/pages/c/_cluster/uiplugins/__tests__/index.test.ts +719 -2
- package/pages/c/_cluster/uiplugins/index.vue +203 -197
- package/pages/diagnostic.vue +13 -17
- package/pages/fail-whale.vue +18 -0
- package/pages/home.vue +77 -260
- package/pages/readme.vue +88 -0
- package/plugins/dashboard-store/__tests__/resource-class.test.ts +88 -0
- package/plugins/dashboard-store/actions.js +40 -18
- package/plugins/dashboard-store/resource-class.js +5 -2
- package/plugins/steve/__tests__/subscribe.spec.ts +6 -3
- package/plugins/steve/steve-pagination-utils.ts +11 -3
- package/plugins/steve/subscribe.js +35 -5
- package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +10 -4
- package/rancher-components/Form/LabeledInput/LabeledInput.vue +7 -52
- package/rancher-components/RcButton/RcButton.test.ts +37 -1
- package/rancher-components/RcButton/RcButton.vue +38 -8
- package/rancher-components/RcDropdown/RcDropdownTrigger.vue +10 -8
- package/store/__tests__/catalog.test.ts +115 -1
- package/store/__tests__/type-map.test.ts +556 -1
- package/store/action-menu.js +8 -3
- package/store/auth.js +1 -1
- package/store/aws.js +27 -16
- package/store/catalog.js +27 -3
- package/store/digitalocean.js +20 -38
- package/store/index.js +2 -0
- package/store/linode.js +25 -40
- package/store/pnap.js +1 -0
- package/store/type-map.js +111 -29
- package/tsconfig.paths.json +8 -8
- package/types/kube/kube-api.ts +14 -1
- package/types/rancher/steve.api.ts +12 -12
- package/types/resources/settings.d.ts +2 -1
- package/types/shell/index.d.ts +102 -2
- package/types/store/dashboard-store.types.ts +108 -11
- package/types/store/pagination.types.ts +6 -3
- package/utils/__tests__/alertmanagerconfig.test.ts +117 -0
- package/utils/__tests__/async.test.ts +87 -0
- package/utils/__tests__/aws.test.ts +140 -0
- package/utils/__tests__/banners.test.ts +176 -0
- package/utils/__tests__/chart.test.ts +64 -1
- package/utils/__tests__/color.test.ts +226 -0
- package/utils/__tests__/duration.test.ts +140 -0
- package/utils/__tests__/fleet.test.ts +340 -0
- package/utils/__tests__/ingress.test.ts +553 -0
- package/utils/__tests__/kube.test.ts +68 -0
- package/utils/__tests__/namespace-filter.test.ts +109 -0
- package/utils/__tests__/pagination-utils.test.ts +361 -0
- package/utils/__tests__/parse-externalid.test.ts +137 -0
- package/utils/__tests__/perf-setting.utils.test.ts +98 -0
- package/utils/__tests__/poller-sequential.test.ts +177 -0
- package/utils/__tests__/poller.test.ts +170 -0
- package/utils/__tests__/promise.test.ts +346 -0
- package/utils/__tests__/settings.test.ts +140 -0
- package/utils/__tests__/sort-utils.test.ts +301 -0
- package/utils/__tests__/string-utils.test.ts +798 -0
- package/utils/__tests__/string.test.ts +23 -1
- package/utils/__tests__/style.test.ts +154 -0
- package/utils/__tests__/svg-filter.test.ts +184 -0
- package/utils/__tests__/units.test.ts +417 -0
- package/utils/__tests__/versions.test.ts +128 -0
- package/utils/__tests__/xccdf.test.ts +391 -0
- package/utils/chart.js +36 -0
- package/utils/fleet.ts +13 -3
- package/utils/gatekeeper/__tests__/util.test.ts +174 -0
- package/utils/gc/__tests__/gc-interval.test.ts +119 -0
- package/utils/gc/__tests__/gc-root-store.test.ts +225 -0
- package/utils/gc/__tests__/gc-route-changed.test.ts +96 -0
- package/utils/gc/__tests__/gc.test.ts +487 -0
- package/utils/ingress.ts +9 -1
- package/utils/pagination-utils.ts +2 -1
- package/utils/string.js +25 -2
- package/utils/uiplugins.ts +5 -5
- package/utils/validators/__tests__/cluster-name.test.ts +110 -0
- package/utils/validators/__tests__/cron-schedule.test.ts +79 -0
- package/utils/validators/__tests__/index.test.ts +481 -0
- package/utils/validators/__tests__/kubernetes-name.test.ts +163 -0
- package/utils/validators/__tests__/misc-validators.test.ts +246 -0
- package/utils/validators/__tests__/pod-affinity.test.ts +382 -0
- package/utils/validators/__tests__/prometheusrule.test.ts +211 -0
- package/utils/validators/__tests__/role-template.test.ts +149 -0
- package/utils/validators/__tests__/service.test.ts +283 -0
- package/utils/validators/__tests__/setting.test.js +32 -0
- package/utils/validators/formRules/__tests__/index.test.ts +50 -0
- package/utils/validators/formRules/index.ts +5 -5
- package/utils/validators/machine-pool.ts +1 -1
- package/utils/validators/setting.js +18 -3
- package/utils/xccdf.ts +418 -0
- package/assets/fonts/lato/lato-v17-latin-700.woff +0 -0
- package/assets/fonts/lato/lato-v17-latin-700.woff2 +0 -0
- package/assets/fonts/lato/lato-v17-latin-regular.woff +0 -0
- package/assets/fonts/lato/lato-v17-latin-regular.woff2 +0 -0
|
@@ -4,6 +4,8 @@ import { Banner } from '@components/Banner';
|
|
|
4
4
|
import ResourceTable from '@shell/components/ResourceTable';
|
|
5
5
|
import { isHarvesterCluster } from '@shell/utils/cluster';
|
|
6
6
|
import ResourceFetch from '@shell/mixins/resource-fetch';
|
|
7
|
+
import { HARVESTER_CONTAINER } from '@shell/store/features';
|
|
8
|
+
import { checkSchemasForFindAllHash } from '@shell/utils/auth';
|
|
7
9
|
|
|
8
10
|
export default {
|
|
9
11
|
name: 'ListClusterGroup',
|
|
@@ -25,6 +27,16 @@ export default {
|
|
|
25
27
|
},
|
|
26
28
|
|
|
27
29
|
async fetch() {
|
|
30
|
+
try {
|
|
31
|
+
await checkSchemasForFindAllHash({
|
|
32
|
+
cluster: {
|
|
33
|
+
inStoreType: 'management',
|
|
34
|
+
type: FLEET.CLUSTER
|
|
35
|
+
},
|
|
36
|
+
}, this.$store);
|
|
37
|
+
} catch (e) {
|
|
38
|
+
}
|
|
39
|
+
|
|
28
40
|
await this.$fetchType(this.resource);
|
|
29
41
|
if (this.$store.getters['management/schemaFor']( FLEET.CLUSTER )) {
|
|
30
42
|
this.allFleet = await this.$store.getters['management/all'](FLEET.CLUSTER);
|
|
@@ -35,6 +47,10 @@ export default {
|
|
|
35
47
|
return { allFleet: [] };
|
|
36
48
|
},
|
|
37
49
|
|
|
50
|
+
mounted() {
|
|
51
|
+
this.areHarvesterHostsVisible = this.$store.getters['features/get'](HARVESTER_CONTAINER);
|
|
52
|
+
},
|
|
53
|
+
|
|
38
54
|
computed: {
|
|
39
55
|
harvesterClusters() {
|
|
40
56
|
const harvester = {};
|
|
@@ -50,6 +66,10 @@ export default {
|
|
|
50
66
|
tokens() {
|
|
51
67
|
const harvester = this.harvesterClusters;
|
|
52
68
|
|
|
69
|
+
if (this.areHarvesterHostsVisible) {
|
|
70
|
+
return this.rows;
|
|
71
|
+
}
|
|
72
|
+
|
|
53
73
|
return this.rows.filter((token) => {
|
|
54
74
|
const refs = token.metadata?.ownerReferences || [];
|
|
55
75
|
|
|
@@ -1,121 +1,210 @@
|
|
|
1
|
-
<script>
|
|
1
|
+
<script lang="ts">
|
|
2
2
|
import { Banner } from '@components/Banner';
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import { allHash } from '@shell/utils/promise';
|
|
6
|
-
import { CAPI, MANAGEMENT, SNAPSHOT, NORMAN } from '@shell/config/types';
|
|
3
|
+
import Masthead from '@shell/components/ResourceList/Masthead.vue';
|
|
4
|
+
import { CAPI, COUNT, MANAGEMENT } from '@shell/config/types';
|
|
7
5
|
import { MODE, _IMPORT } from '@shell/config/query-params';
|
|
8
|
-
import { filterOnlyKubernetesClusters, filterHiddenLocalCluster } from '@shell/utils/cluster';
|
|
9
6
|
import { mapFeature, HARVESTER as HARVESTER_FEATURE } from '@shell/store/features';
|
|
10
7
|
import { NAME as EXPLORER } from '@shell/config/product/explorer';
|
|
11
|
-
import ResourceFetch from '@shell/mixins/resource-fetch';
|
|
12
|
-
import { BadgeState } from '@components/BadgeState';
|
|
13
8
|
import { isAutoscalerFeatureFlagEnabled } from '@shell/utils/autoscaler-utils';
|
|
14
9
|
import { AUTOSCALER_ENABLED } from '@shell/config/table-headers';
|
|
10
|
+
import PaginatedResourceTable from '@shell/components/PaginatedResourceTable.vue';
|
|
11
|
+
import { PagTableFetchPageSecondaryResourcesOpts, PagTableFetchSecondaryResourcesOpts, PagTableFetchSecondaryResourcesReturns } from '@shell/types/components/paginatedResourceTable';
|
|
12
|
+
import { FilterArgs, PaginationArgs, PaginationFilterField, PaginationParamFilter } from '@shell/types/store/pagination.types';
|
|
13
|
+
import { ActionFindPageArgs } from '@shell/types/store/dashboard-store.types';
|
|
14
|
+
import MachineSummaryGraph from '@shell/components/formatter/MachineSummaryGraph.vue';
|
|
15
|
+
import MgmtCluster from '@shell/models/management.cattle.io.cluster';
|
|
16
|
+
import ProvCluster from '@shell/models/provisioning.cattle.io.cluster';
|
|
17
|
+
import ManagementClusterUtils from '@shell/list/utils/management.cattle.io.cluster.utils';
|
|
18
|
+
import { STEVE_AUTOSCALER_ENABLED } from '@shell/config/pagination-table-headers';
|
|
19
|
+
import { filterHiddenLocalCluster, filterOnlyKubernetesClusters } from '@shell/utils/cluster';
|
|
15
20
|
|
|
16
21
|
export default {
|
|
17
22
|
components: {
|
|
18
|
-
Banner,
|
|
23
|
+
Banner, PaginatedResourceTable, Masthead, MachineSummaryGraph
|
|
19
24
|
},
|
|
20
|
-
mixins: [ResourceFetch],
|
|
21
|
-
props: {
|
|
22
|
-
loadIndeterminate: {
|
|
23
|
-
type: Boolean,
|
|
24
|
-
default: false
|
|
25
|
-
},
|
|
26
25
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
26
|
+
data() {
|
|
27
|
+
const mgmtClusterSchema = this.$store.getters['management/schemaFor'](MANAGEMENT.CLUSTER);
|
|
28
|
+
const headers = this.$store.getters['type-map/headersFor'](mgmtClusterSchema, false);
|
|
29
|
+
const paginationHeaders = this.$store.getters['type-map/headersFor'](mgmtClusterSchema, true);
|
|
31
30
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
31
|
+
if (isAutoscalerFeatureFlagEnabled(this.$store)) {
|
|
32
|
+
headers.splice(-3, 0, AUTOSCALER_ENABLED);
|
|
33
|
+
paginationHeaders.splice(-3, 0, STEVE_AUTOSCALER_ENABLED);
|
|
35
34
|
}
|
|
36
|
-
},
|
|
37
35
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
36
|
+
return {
|
|
37
|
+
headers,
|
|
38
|
+
paginationHeaders,
|
|
39
|
+
|
|
40
|
+
clusterCount: undefined as number | undefined,
|
|
41
|
+
|
|
42
|
+
paginationContext: 'cluster-management',
|
|
43
|
+
|
|
44
|
+
mgmtClusterSchema,
|
|
45
|
+
provClusterSchema: this.$store.getters['management/schemaFor'](CAPI.RANCHER_CLUSTER),
|
|
44
46
|
};
|
|
47
|
+
},
|
|
45
48
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
}
|
|
49
|
+
// Forget the types when we leave the page
|
|
50
|
+
beforeUnmount() {
|
|
51
|
+
ManagementClusterUtils.forgetSecondaryResources({ context: this.paginationContext }, { $store: this.$store });
|
|
52
|
+
},
|
|
49
53
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
54
|
+
methods: {
|
|
55
|
+
/**
|
|
56
|
+
* SSP disabled, filter all rows via...
|
|
57
|
+
*/
|
|
58
|
+
filterRowsLocal(rows: MgmtCluster[]) {
|
|
59
|
+
const filteredRows = ManagementClusterUtils.filterRowsLocal(rows, { $store: this.$store });
|
|
53
60
|
|
|
54
|
-
|
|
55
|
-
hash.mgmtNodes = this.$fetchType(MANAGEMENT.NODE);
|
|
56
|
-
}
|
|
61
|
+
this.clusterCount = filteredRows.length;
|
|
57
62
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
}
|
|
63
|
+
return filteredRows;
|
|
64
|
+
},
|
|
61
65
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
66
|
+
/**
|
|
67
|
+
* SSP enabled, filter all rows via...
|
|
68
|
+
*/
|
|
69
|
+
filterRowsApi(pagination: PaginationArgs): PaginationArgs {
|
|
70
|
+
return ManagementClusterUtils.filterRowsApi(pagination, { $store: this.$store });
|
|
71
|
+
},
|
|
65
72
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
73
|
+
/**
|
|
74
|
+
* Fetch secondary resources on load
|
|
75
|
+
*
|
|
76
|
+
* Of type #PagTableFetchSecondaryResources
|
|
77
|
+
*/
|
|
78
|
+
fetchSecondaryResources(opts: PagTableFetchSecondaryResourcesOpts): PagTableFetchSecondaryResourcesReturns {
|
|
79
|
+
if (opts.canPaginate) {
|
|
80
|
+
return Promise.resolve();
|
|
81
|
+
}
|
|
69
82
|
|
|
70
|
-
|
|
71
|
-
// This request does not need to be blocking
|
|
72
|
-
if ( this.$store.getters['management/canList'](MANAGEMENT.RKE_TEMPLATE_REVISION) ) {
|
|
73
|
-
this.$fetchType(MANAGEMENT.RKE_TEMPLATE_REVISION);
|
|
74
|
-
}
|
|
83
|
+
const promises = ManagementClusterUtils.fetchSecondaryResources(opts, { $store: this.$store });
|
|
75
84
|
|
|
76
|
-
|
|
85
|
+
// Additional requests required to support columns in this view (e.g. machines)
|
|
77
86
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
87
|
+
if ( this.$store.getters['management/canList'](CAPI.MACHINE_DEPLOYMENT)) {
|
|
88
|
+
this.$store.dispatch(`management/findAll`, { type: CAPI.MACHINE_DEPLOYMENT });
|
|
89
|
+
}
|
|
81
90
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
91
|
+
if ( this.$store.getters['management/canList'](MANAGEMENT.NODE_POOL)) {
|
|
92
|
+
this.$store.dispatch(`management/findAll`, { type: MANAGEMENT.NODE_POOL });
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return Promise.all(promises);
|
|
96
|
+
},
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Fetch secondary resources on page change
|
|
100
|
+
*/
|
|
101
|
+
async fetchPageSecondaryResources({
|
|
102
|
+
canPaginate, force, page, pagResult
|
|
103
|
+
}: PagTableFetchPageSecondaryResourcesOpts) {
|
|
104
|
+
this.clusterCount = !canPaginate || !page?.length ? 0 : pagResult.count;
|
|
105
|
+
|
|
106
|
+
if (!canPaginate || !page?.length) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const promises = await ManagementClusterUtils.fetchPageSecondaryResources({
|
|
111
|
+
canPaginate, force, page, pagResult
|
|
112
|
+
}, { $store: this.$store });
|
|
113
|
+
|
|
114
|
+
// Additional requests required to support columns in this view (e.g. machines)
|
|
115
|
+
|
|
116
|
+
if ( this.$store.getters['management/canList'](CAPI.MACHINE_DEPLOYMENT)) {
|
|
117
|
+
const opt: ActionFindPageArgs = {
|
|
118
|
+
force,
|
|
119
|
+
pagination: new FilterArgs({
|
|
120
|
+
filters: PaginationParamFilter.createMultipleFields(page.map((r: any) => new PaginationFilterField({
|
|
121
|
+
field: 'spec.clusterName',
|
|
122
|
+
value: r.provClusterName
|
|
123
|
+
}))),
|
|
124
|
+
})
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
this.$store.dispatch(`management/findPage`, { type: CAPI.MACHINE_DEPLOYMENT, opt });
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if ( this.$store.getters['management/canList'](MANAGEMENT.NODE_POOL)) {
|
|
131
|
+
const nodePoolFilters = PaginationParamFilter.createMultipleFields(page
|
|
132
|
+
.filter((p: any) => p.id)
|
|
133
|
+
.map((r: any) => new PaginationFilterField({
|
|
134
|
+
field: 'spec.clusterName',
|
|
135
|
+
value: r.id
|
|
136
|
+
})));
|
|
137
|
+
|
|
138
|
+
promises.push(this.$store.dispatch(`management/findPage`, {
|
|
139
|
+
type: MANAGEMENT.NODE_POOL,
|
|
140
|
+
opt: {
|
|
141
|
+
force,
|
|
142
|
+
pagination: new FilterArgs({ filters: nodePoolFilters })
|
|
143
|
+
}
|
|
144
|
+
}));
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
await Promise.all(promises);
|
|
148
|
+
},
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Explorer world, listing PCIC, SSP disabled, filter all rows via...
|
|
152
|
+
*/
|
|
153
|
+
filterProvRowsLocal(rows: ProvCluster[]) {
|
|
154
|
+
if (!rows.length) {
|
|
155
|
+
// no rows to filter on, so immediately return no rows
|
|
156
|
+
return [];
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
let filteredRows = [];
|
|
90
160
|
|
|
91
|
-
computed: {
|
|
92
|
-
filteredRows() {
|
|
93
|
-
// If Harvester feature is enabled, hide Harvester Clusters
|
|
94
161
|
if (this.harvesterEnabled) {
|
|
95
|
-
|
|
162
|
+
// If Harvester feature is enabled, hide Harvester Clusters
|
|
163
|
+
filteredRows = filterHiddenLocalCluster(filterOnlyKubernetesClusters(rows, this.$store), this.$store);
|
|
164
|
+
} else {
|
|
165
|
+
// Otherwise, show Harvester clusters - these will be shown with a warning
|
|
166
|
+
filteredRows = filterOnlyKubernetesClusters(rows, this.$store);
|
|
96
167
|
}
|
|
97
168
|
|
|
98
|
-
|
|
99
|
-
|
|
169
|
+
this.clusterCount = filteredRows.length;
|
|
170
|
+
|
|
171
|
+
return filteredRows;
|
|
100
172
|
},
|
|
101
173
|
|
|
102
|
-
|
|
174
|
+
/**
|
|
175
|
+
* Explorer world, listing PCIC, SSP enabled, filter all rows via...
|
|
176
|
+
*/
|
|
177
|
+
filterProvRowsApi(pagination: PaginationArgs): PaginationArgs {
|
|
178
|
+
return this.filterRowsApi(pagination);
|
|
179
|
+
}
|
|
180
|
+
},
|
|
181
|
+
|
|
182
|
+
computed: {
|
|
183
|
+
isExplorer() {
|
|
103
184
|
const product = this.$store.getters['currentProduct'];
|
|
104
|
-
const isExplorer = product?.name === EXPLORER;
|
|
105
185
|
|
|
106
|
-
|
|
107
|
-
|
|
186
|
+
return product?.name === EXPLORER;
|
|
187
|
+
},
|
|
188
|
+
|
|
189
|
+
hiddenHarvesterCount() {
|
|
190
|
+
// Don't show Harvester banner message on the cluster management page or if Harvester is not enabled
|
|
191
|
+
if (!this.isExplorer || !this.harvesterEnabled || this.clusterCount === undefined) {
|
|
108
192
|
return 0;
|
|
109
193
|
}
|
|
110
194
|
|
|
111
|
-
|
|
195
|
+
const allClusters = this.$store.getters['management/count']({ name: CAPI.RANCHER_CLUSTER });
|
|
196
|
+
// clusterCount is total excluding local (if not counted) and harvester (if not counted)
|
|
197
|
+
// at this point though (viewing prov clusters in explorer) we must be in the local cluster, so can exclude that exclusion
|
|
198
|
+
const nonHarvesterClusters = this.clusterCount;
|
|
199
|
+
|
|
200
|
+
return allClusters - nonHarvesterClusters;
|
|
112
201
|
},
|
|
113
202
|
|
|
114
203
|
createLocation() {
|
|
115
|
-
const options = this.$store.getters[`type-map/optionsFor`](
|
|
204
|
+
const options = this.$store.getters[`type-map/optionsFor`](CAPI.RANCHER_CLUSTER)?.custom || {};
|
|
116
205
|
const params = {
|
|
117
206
|
product: this.$store.getters['currentProduct'].name,
|
|
118
|
-
resource:
|
|
207
|
+
resource: CAPI.RANCHER_CLUSTER
|
|
119
208
|
};
|
|
120
209
|
const defaultLocation = {
|
|
121
210
|
name: 'c-cluster-product-resource-create',
|
|
@@ -126,10 +215,10 @@ export default {
|
|
|
126
215
|
},
|
|
127
216
|
|
|
128
217
|
importLocation() {
|
|
129
|
-
const options = this.$store.getters[`type-map/optionsFor`](
|
|
218
|
+
const options = this.$store.getters[`type-map/optionsFor`](CAPI.RANCHER_CLUSTER)?.custom || {};
|
|
130
219
|
const params = {
|
|
131
220
|
product: this.$store.getters['currentProduct'].name,
|
|
132
|
-
resource:
|
|
221
|
+
resource: CAPI.RANCHER_CLUSTER
|
|
133
222
|
};
|
|
134
223
|
const defaultLocation = {
|
|
135
224
|
name: 'c-cluster-product-resource-create',
|
|
@@ -141,130 +230,123 @@ export default {
|
|
|
141
230
|
},
|
|
142
231
|
|
|
143
232
|
canImport() {
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
return !!schema?.collectionMethods.find((x) => x.toLowerCase() === 'post');
|
|
233
|
+
return !!this.provClusterSchema?.collectionMethods.find((x: string) => x.toLowerCase() === 'post');
|
|
147
234
|
},
|
|
148
235
|
|
|
149
236
|
harvesterEnabled: mapFeature(HARVESTER_FEATURE),
|
|
150
237
|
|
|
151
|
-
|
|
152
|
-
// Show the
|
|
153
|
-
// This will be used when there's clusters from extension based provisioners
|
|
154
|
-
// We should re-visit this for scaling reasons
|
|
155
|
-
return this.filteredRows.some((c) => c.metadata.namespace !== 'fleet-local' && c.metadata.namespace !== 'fleet-default');
|
|
156
|
-
},
|
|
238
|
+
nonStandardWorkspace() {
|
|
239
|
+
// Show the workspace grouping option if there's clusters with workspaces other than 'fleet-default' or 'fleet-local'
|
|
157
240
|
|
|
158
|
-
|
|
159
|
-
|
|
241
|
+
// Note - This _just_ looks at namespaces, which are normally 1-1 with namespaces and also cover cases where clusters aren't in namespaces
|
|
242
|
+
// The only exception is for v2prov clusters that were moved workspace after enabling `provisioningv2-fleet-workspace-back-population`
|
|
243
|
+
// If we need to fully support this we can either
|
|
244
|
+
// 1. always show grouping
|
|
245
|
+
// 2. use a summary request to determine to show it
|
|
246
|
+
// a. on visit to list and vai on (lets keep it simple) make a request to /v1/management.cattle.io.clusters?summary=spec.fleetWorkspaceName (plus whatever new parm to avoid return of `data` field)
|
|
247
|
+
// b. check for values other than fleet-local and fleet-default in the response
|
|
160
248
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
}
|
|
249
|
+
const counts = this.$store.getters['management/all'](COUNT)?.[0]?.counts || {};
|
|
250
|
+
const namespaces: { [nsName: string]: { count: number } } = counts[CAPI.RANCHER_CLUSTER]?.namespaces || counts.namespaces || {};
|
|
164
251
|
|
|
165
|
-
|
|
166
|
-
|
|
252
|
+
for (const ns in namespaces) {
|
|
253
|
+
if (ns !== 'fleet-local' && ns !== 'fleet-default' && namespaces[ns].count > 0) {
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
167
257
|
|
|
258
|
+
return false;
|
|
259
|
+
},
|
|
168
260
|
},
|
|
169
261
|
|
|
170
|
-
$loadingResources() {
|
|
171
|
-
// results are filtered so we wouldn't get the correct count on indicator...
|
|
172
|
-
return { loadIndeterminate: true };
|
|
173
|
-
}
|
|
174
|
-
|
|
175
262
|
};
|
|
176
263
|
</script>
|
|
177
264
|
|
|
178
265
|
<template>
|
|
179
266
|
<div>
|
|
180
|
-
<Banner
|
|
181
|
-
v-if="showRke1DeprecationWarning"
|
|
182
|
-
color="warning"
|
|
183
|
-
label-key="cluster.banner.rke1DeprecationMessage"
|
|
184
|
-
/>
|
|
185
|
-
|
|
186
267
|
<Banner
|
|
187
268
|
v-if="hiddenHarvesterCount"
|
|
188
269
|
color="info"
|
|
189
270
|
:label="t('cluster.harvester.clusterWarning', {count: hiddenHarvesterCount} )"
|
|
190
271
|
/>
|
|
191
272
|
|
|
192
|
-
<
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
>
|
|
201
|
-
<
|
|
202
|
-
|
|
203
|
-
|
|
273
|
+
<template v-if="isExplorer">
|
|
274
|
+
<PaginatedResourceTable
|
|
275
|
+
:schema="provClusterSchema"
|
|
276
|
+
|
|
277
|
+
:local-filter="filterProvRowsLocal"
|
|
278
|
+
:api-filter="filterProvRowsApi"
|
|
279
|
+
/>
|
|
280
|
+
</template>
|
|
281
|
+
<template v-else>
|
|
282
|
+
<Masthead
|
|
283
|
+
:schema="provClusterSchema"
|
|
284
|
+
:resource="provClusterSchema.id"
|
|
285
|
+
:create-location="createLocation"
|
|
286
|
+
component-testid="cluster-manager-list"
|
|
204
287
|
>
|
|
205
|
-
<
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
data-testid="cluster-manager-list-import"
|
|
288
|
+
<template
|
|
289
|
+
v-if="canImport"
|
|
290
|
+
#extraActions
|
|
209
291
|
>
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
<ResourceTable
|
|
215
|
-
:headers="headers"
|
|
216
|
-
:table-actions="true"
|
|
217
|
-
:rows="filteredRows"
|
|
218
|
-
:namespaced="nonStandardNamespaces"
|
|
219
|
-
:loading="loading"
|
|
220
|
-
:use-query-params-for-simple-filtering="useQueryParamsForSimpleFiltering"
|
|
221
|
-
:data-testid="'cluster-list'"
|
|
222
|
-
:force-update-live-and-delayed="forceUpdateLiveAndDelayed"
|
|
223
|
-
>
|
|
224
|
-
<!-- Why are state column and subrow overwritten here? -->
|
|
225
|
-
<!-- for rke1 clusters, where they try to use the mgmt cluster stateObj instead of prov cluster stateObj, -->
|
|
226
|
-
<!-- updates were getting lost. This isn't performant as normal columns, but the list shouldn't grow -->
|
|
227
|
-
<!-- big enough for the performance to matter -->
|
|
228
|
-
<template #cell:state="{row}">
|
|
229
|
-
<BadgeState
|
|
230
|
-
:color="row.stateBackground"
|
|
231
|
-
:label="row.stateDisplay"
|
|
232
|
-
/>
|
|
233
|
-
</template>
|
|
234
|
-
<template #cell:summary="{row}">
|
|
235
|
-
<span v-if="!row.stateParts.length">{{ row.nodes.length }}</span>
|
|
236
|
-
</template>
|
|
237
|
-
<template #col:kubernetesVersion="{row}">
|
|
238
|
-
<td class="col-name">
|
|
239
|
-
<span>
|
|
240
|
-
{{ row.kubernetesVersion }}
|
|
241
|
-
</span>
|
|
242
|
-
<div
|
|
243
|
-
v-clean-tooltip="{content: row.architecture.tooltip, placement: 'left'}"
|
|
244
|
-
class="text-muted"
|
|
292
|
+
<router-link
|
|
293
|
+
:to="importLocation"
|
|
294
|
+
class="btn role-primary mr-10"
|
|
295
|
+
data-testid="cluster-manager-list-import"
|
|
245
296
|
>
|
|
246
|
-
{{
|
|
247
|
-
</
|
|
248
|
-
</
|
|
249
|
-
</
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
297
|
+
{{ t('cluster.importAction') }}
|
|
298
|
+
</router-link>
|
|
299
|
+
</template>
|
|
300
|
+
</Masthead>
|
|
301
|
+
|
|
302
|
+
<PaginatedResourceTable
|
|
303
|
+
:schema="mgmtClusterSchema"
|
|
304
|
+
|
|
305
|
+
:headers="headers"
|
|
306
|
+
:pagination-headers="paginationHeaders"
|
|
307
|
+
:context="paginationContext"
|
|
308
|
+
|
|
309
|
+
:use-query-params-for-simple-filtering="true"
|
|
310
|
+
|
|
311
|
+
:local-filter="filterRowsLocal"
|
|
312
|
+
:api-filter="filterRowsApi"
|
|
313
|
+
|
|
314
|
+
:fetch-secondary-resources="fetchSecondaryResources"
|
|
315
|
+
:fetch-page-secondary-resources="fetchPageSecondaryResources"
|
|
316
|
+
|
|
317
|
+
:groupable="nonStandardWorkspace"
|
|
318
|
+
:namespaced="true"
|
|
319
|
+
|
|
320
|
+
:data-testid="'cluster-list'"
|
|
321
|
+
>
|
|
322
|
+
<template #cell:summary="{row}">
|
|
323
|
+
<!-- Replace the MACHINE_SUMMARY columns contents... but only if there's no stateParts -->
|
|
324
|
+
<span v-if="!row.stateParts.length">{{ row.statusInfo.nodeCount || 0 }}</span>
|
|
325
|
+
<MachineSummaryGraph
|
|
326
|
+
v-else
|
|
327
|
+
:row="row"
|
|
328
|
+
/>
|
|
329
|
+
</template>
|
|
330
|
+
<template #cell:explorer="{row}">
|
|
331
|
+
<!-- Align side nav cluster, home page name link and cluster management cluster explor buttons on canExplore -->
|
|
332
|
+
<router-link
|
|
333
|
+
v-if="row.canExplore"
|
|
334
|
+
data-testid="cluster-manager-list-explore-management"
|
|
335
|
+
class="btn btn-sm role-secondary"
|
|
336
|
+
:to="{name: 'c-cluster', params: {cluster: row.id}}"
|
|
337
|
+
>
|
|
338
|
+
{{ t('cluster.explore') }}
|
|
339
|
+
</router-link>
|
|
340
|
+
<button
|
|
341
|
+
v-else
|
|
342
|
+
data-testid="cluster-manager-list-explore"
|
|
343
|
+
:disabled="true"
|
|
344
|
+
class="btn btn-sm role-secondary"
|
|
345
|
+
>
|
|
346
|
+
{{ t('cluster.explore') }}
|
|
347
|
+
</button>
|
|
348
|
+
</template>
|
|
349
|
+
</PaginatedResourceTable>
|
|
350
|
+
</template>
|
|
269
351
|
</div>
|
|
270
352
|
</template>
|