@rancher/shell 3.0.12-rc.2 → 3.0.12-rc.4
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/styles/global/_layout.scss +4 -0
- package/assets/translations/en-us.yaml +165 -45
- package/assets/translations/zh-hans.yaml +1 -7
- package/chart/monitoring/ClusterSelector.vue +0 -21
- package/chart/monitoring/index.vue +10 -1
- package/chart/monitoring/prometheus/index.vue +6 -3
- package/components/ActionDropdownShell.vue +2 -1
- package/components/CruResource.vue +161 -14
- package/components/CruResourceFooter.vue +9 -5
- package/components/ExplorerMembers.vue +8 -4
- package/components/ExplorerProjectsNamespaces.vue +11 -7
- package/components/GrowlManager.vue +4 -0
- package/components/InstallHelmCharts.vue +2 -2
- package/components/LandingPagePreference.vue +14 -5
- package/components/MgmtNodeList.vue +184 -0
- package/components/Resource/Detail/Card/StateCard/__tests__/composables.test.ts +90 -1
- package/components/Resource/Detail/Card/StateCard/composables.ts +57 -87
- package/components/Resource/Detail/Card/StatusCard/__tests__/StatusCard.test.ts +61 -0
- package/components/Resource/Detail/Card/StatusCard/index.vue +61 -15
- package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +17 -1
- package/components/Resource/Detail/Metadata/KeyValue.vue +5 -2
- package/components/Resource/Detail/Metadata/KeyValueRow.vue +2 -6
- 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/ResourceDetail/index.vue +1 -1
- package/components/ResourceList/Masthead.vue +19 -9
- package/components/ResourceList/index.vue +82 -1
- package/components/RichTranslation.vue +5 -2
- package/components/SelectIconGrid.vue +0 -10
- package/components/Setting.vue +1 -0
- 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/SubtleLink.vue +31 -6
- package/components/Tabbed/Tab.vue +29 -3
- package/components/Tabbed/index.vue +25 -3
- package/components/TableOfContents/TableOfContents.vue +109 -0
- package/components/TableOfContents/composables.ts +258 -0
- package/components/Window/ContainerShell.vue +21 -11
- package/components/Window/__tests__/ContainerShell.test.ts +107 -37
- package/components/Wizard.vue +23 -17
- package/components/fleet/AppCoChartGrid.vue +401 -0
- package/components/fleet/AppCoEmptyState.vue +127 -0
- package/components/fleet/AppCoPageHeader.vue +119 -0
- package/components/fleet/AppCoVersionSelect.vue +70 -0
- package/components/fleet/FleetBundles.vue +100 -12
- package/components/fleet/FleetClusterTargets/ClusterSelectionFields.vue +217 -0
- package/components/fleet/FleetClusterTargets/TargetsList.vue +123 -35
- package/components/fleet/FleetClusterTargets/index.vue +226 -161
- package/components/fleet/FleetIntro.vue +7 -3
- package/components/fleet/FleetNoWorkspaces.vue +7 -3
- package/components/fleet/FleetSecretSelector.vue +5 -3
- package/components/fleet/FleetValuesFrom.vue +8 -2
- package/components/fleet/GitRepoTargetTab.vue +0 -2
- package/components/fleet/HelmOpAdvancedTab.vue +19 -53
- package/components/fleet/HelmOpAppCoConfigTab.vue +593 -0
- package/components/fleet/HelmOpAppCoResourcesSection.vue +162 -0
- package/components/fleet/HelmOpResourcesSection.vue +82 -0
- package/components/fleet/HelmOpTargetOptionsSection.vue +89 -0
- package/components/fleet/HelmOpTargetTab.vue +64 -60
- package/components/fleet/HelmOpValuesTab.vue +129 -105
- package/components/fleet/__tests__/AppCoEmptyState.test.ts +71 -0
- package/components/fleet/__tests__/AppCoVersionSelect.test.ts +36 -0
- package/components/fleet/__tests__/ClusterSelectionFields.test.ts +62 -0
- package/components/fleet/__tests__/FleetClusterTargets.test.ts +402 -115
- package/components/fleet/__tests__/FleetClusters.test.ts +12 -12
- package/components/fleet/__tests__/FleetSecretSelector.test.ts +16 -0
- package/components/fleet/__tests__/FleetValuesFrom.test.ts +44 -0
- package/components/fleet/__tests__/HelmOpAppCoConfigTab.test.ts +59 -0
- package/components/fleet/__tests__/HelmOpAppCoResourcesSection.test.ts +62 -0
- package/components/fleet/__tests__/HelmOpResourcesSection.test.ts +43 -0
- package/components/fleet/__tests__/HelmOpTargetOptionsSection.test.ts +34 -0
- package/components/fleet/__tests__/HelmOpValuesTab.test.ts +39 -0
- package/components/fleet/__tests__/__snapshots__/AppCoEmptyState.test.ts.snap +97 -0
- package/components/fleet/__tests__/__snapshots__/AppCoVersionSelect.test.ts.snap +30 -0
- package/components/fleet/__tests__/__snapshots__/ClusterSelectionFields.test.ts.snap +209 -0
- package/components/fleet/__tests__/__snapshots__/HelmOpTargetOptionsSection.test.ts.snap +140 -0
- package/components/fleet/dashboard/Empty.vue +8 -4
- package/components/fleet/dashboard/ResourceCard.vue +28 -0
- package/components/fleet/dashboard/ResourceDetails.vue +28 -0
- package/components/fleet/dashboard/__tests__/ResourceCard.test.ts +87 -0
- package/components/form/ArrayList.vue +61 -4
- package/components/form/KeyValue.vue +23 -2
- package/components/form/LabeledSelect.vue +59 -4
- package/components/form/Labels.vue +22 -3
- package/components/form/NameNsDescription.vue +24 -5
- package/components/form/ResourceTabs/index.vue +1 -0
- package/components/form/Security.vue +6 -2
- package/components/form/WorkloadPorts.vue +2 -7
- package/components/form/__tests__/NameNsDescription.test.ts +75 -0
- 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/InternalExternalIP.vue +10 -4
- package/components/formatter/MachineSummaryGraph.vue +1 -1
- package/components/formatter/PodsUsage.vue +2 -2
- package/components/formatter/ServiceTargets.vue +26 -7
- package/components/formatter/__tests__/Autoscaler.test.ts +19 -22
- package/components/formatter/__tests__/FleetSummaryGraph.test.ts +216 -0
- package/components/formatter/__tests__/InternalExternalIP.test.ts +132 -0
- package/components/formatter/__tests__/PodsUsage.test.ts +6 -10
- package/components/formatter/__tests__/ServiceTargets.test.ts +412 -0
- package/components/nav/Header.vue +4 -0
- package/components/nav/NamespaceFilter.vue +2 -2
- package/components/nav/TopLevelMenu.helper.ts +15 -3
- package/components/nav/TopLevelMenu.vue +22 -6
- package/components/nav/__tests__/Header.test.ts +15 -0
- package/components/nav/__tests__/TopLevelMenu.test.ts +263 -21
- package/components/templates/default.vue +9 -4
- package/components/templates/home.vue +23 -0
- package/components/templates/plain.vue +23 -0
- package/components/templates/standalone.vue +17 -0
- package/composables/useFormValidation.ts +93 -0
- package/composables/useHelmOpResources.test.ts +56 -0
- package/composables/useHelmOpResources.ts +32 -0
- package/composables/useStateColor.test.ts +325 -0
- package/composables/useStateColor.ts +128 -0
- package/composables/useVeeValidateField.test.ts +159 -0
- package/composables/useVeeValidateField.ts +67 -0
- package/config/home-links.js +1 -1
- package/config/labels-annotations.js +1 -0
- package/config/pagination-table-headers.js +18 -1
- package/config/product/explorer.js +17 -4
- package/config/product/manager.js +84 -21
- package/config/router/index.js +16 -0
- package/config/router/navigation-guards/__tests__/authentication.test.ts +130 -0
- package/config/router/navigation-guards/authentication.js +10 -4
- package/config/router/routes.js +26 -6
- package/config/settings.ts +0 -2
- package/config/table-headers.js +23 -5
- package/config/types.js +11 -1
- package/core/__tests__/plugin-products.test.ts +904 -20
- package/core/plugin-products-base.ts +110 -10
- package/core/plugin-products.ts +4 -0
- package/core/plugin-types.ts +194 -31
- package/core/plugin.ts +18 -7
- package/core/productDebugger.js +9 -4
- package/core/types-provisioning.ts +77 -31
- package/core/types.ts +72 -22
- package/detail/__tests__/pod.test.ts +41 -0
- package/detail/__tests__/provisioning.cattle.io.cluster.test.ts +114 -0
- package/detail/__tests__/workload.test.ts +3 -152
- package/detail/catalog.cattle.io.clusterrepo.vue +1 -1
- package/detail/harvesterhci.io.management.cluster.vue +6 -2
- package/detail/pod.vue +1 -1
- package/detail/provisioning.cattle.io.cluster.vue +34 -14
- package/detail/workload/index.vue +12 -55
- package/edit/__tests__/catalog.cattle.io.clusterrepo.test.ts +248 -0
- package/edit/__tests__/fleet.cattle.io.helmop.test.ts +105 -0
- package/edit/auditlog.cattle.io.auditpolicy/__tests__/__snapshots__/General.test.ts.snap +6 -0
- package/edit/auditlog.cattle.io.auditpolicy/__tests__/__snapshots__/index.test.ts.snap +1 -0
- package/edit/auth/__tests__/azuread.test.ts +247 -39
- package/edit/auth/__tests__/github.test.ts +234 -0
- package/edit/auth/__tests__/oidc.test.ts +26 -6
- package/edit/auth/__tests__/saml.test.ts +196 -0
- package/edit/auth/azuread.vue +197 -56
- package/edit/auth/github.vue +72 -13
- package/edit/auth/ldap/__tests__/index.test.ts +206 -0
- package/edit/auth/ldap/config.vue +8 -0
- package/edit/auth/ldap/index.vue +75 -1
- package/edit/auth/oidc.vue +119 -73
- package/edit/auth/saml.vue +76 -12
- package/edit/catalog.cattle.io.clusterrepo.vue +140 -32
- package/edit/fleet.cattle.io.helmop.vue +491 -136
- package/edit/management.cattle.io.user.vue +5 -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 +92 -14
- package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +22 -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/group.principal.vue +5 -4
- package/list/harvesterhci.io.management.cluster.vue +8 -9
- package/list/management.cattle.io.user.vue +12 -9
- package/list/provisioning.cattle.io.cluster.vue +268 -180
- package/list/utils/management.cattle.io.cluster.utils.ts +128 -0
- package/mixins/__tests__/auth-config.test.ts +90 -0
- package/mixins/__tests__/chart.test.ts +206 -0
- package/mixins/__tests__/resource-fetch-api-pagination.test.ts +48 -0
- package/mixins/auth-config.js +7 -0
- package/mixins/brand.js +2 -1
- package/mixins/chart.js +22 -9
- package/mixins/child-hook.js +12 -6
- package/mixins/create-edit-view/impl.js +5 -3
- package/mixins/resource-fetch-api-pagination.js +62 -6
- package/models/__tests__/catalog.cattle.io.clusterrepo.test.ts +57 -0
- package/models/__tests__/compliance.cattle.io.clusterscan.test.ts +144 -0
- package/models/__tests__/ext.cattle.io.kubeconfig.test.ts +67 -67
- package/models/__tests__/fleet-application.test.ts +175 -0
- package/models/__tests__/fleet.cattle.io.bundle.test.ts +169 -0
- package/models/__tests__/fleet.cattle.io.helmop.test.ts +84 -0
- package/models/__tests__/management.cattle.io.cluster.test.ts +1 -1
- package/models/__tests__/management.cattle.io.node.ts +28 -5
- package/models/__tests__/management.cattle.io.nodepool.ts +5 -4
- package/models/__tests__/namespace.test.ts +36 -0
- package/models/__tests__/provisioning.cattle.io.cluster.test.ts +81 -11
- package/models/__tests__/workload.test.ts +401 -26
- package/models/base-cluster.x-k8s.io.js +26 -0
- package/models/catalog.cattle.io.clusterrepo.js +28 -4
- 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 +165 -2
- package/models/ext.cattle.io.kubeconfig.ts +4 -7
- package/models/fleet-application.js +7 -1
- package/models/fleet.cattle.io.helmop.js +20 -1
- package/models/management.cattle.io.cluster.js +434 -41
- package/models/management.cattle.io.node.js +50 -7
- package/models/management.cattle.io.nodepool.js +1 -1
- package/models/namespace.js +1 -1
- package/models/networking.k8s.io.ingress.js +12 -4
- package/models/pod.js +33 -1
- package/models/provisioning.cattle.io.cluster.js +51 -334
- package/models/rke.cattle.io.etcdsnapshot.js +1 -2
- package/models/workload.js +108 -13
- package/models/workload.service.js +5 -0
- package/package.json +22 -39
- package/pages/__tests__/readme.test.ts +49 -0
- package/pages/about.vue +5 -6
- package/pages/auth/login.vue +0 -35
- package/pages/auth/setup.vue +13 -3
- package/pages/c/_cluster/apps/charts/AppChartCardFooter.vue +2 -2
- package/pages/c/_cluster/apps/charts/AppChartCardSubHeader.vue +10 -1
- package/pages/c/_cluster/apps/charts/__tests__/chart.test.ts +76 -0
- package/pages/c/_cluster/apps/charts/__tests__/index.test.ts +93 -0
- package/pages/c/_cluster/apps/charts/chart.vue +62 -9
- package/pages/c/_cluster/apps/charts/index.vue +48 -10
- package/pages/c/_cluster/apps/charts/install.vue +122 -113
- package/pages/c/_cluster/auth/roles/index.vue +5 -4
- package/pages/c/_cluster/explorer/__tests__/index.test.ts +23 -25
- package/pages/c/_cluster/explorer/index.vue +5 -49
- package/pages/c/_cluster/explorer/workload-dashboard/ByNamespaceSection.vue +31 -0
- package/pages/c/_cluster/explorer/workload-dashboard/ByStateSection.vue +138 -0
- package/pages/c/_cluster/explorer/workload-dashboard/ByTypeSection.vue +30 -0
- package/pages/c/_cluster/explorer/workload-dashboard/WorkloadCard.vue +155 -0
- package/pages/c/_cluster/explorer/workload-dashboard/WorkloadNamespaceCard.vue +142 -0
- package/pages/c/_cluster/explorer/workload-dashboard/WorkloadTypeCard.vue +159 -0
- package/pages/c/_cluster/explorer/workload-dashboard/__tests__/composable.test.ts +561 -0
- package/pages/c/_cluster/explorer/workload-dashboard/composable.ts +440 -0
- package/pages/c/_cluster/explorer/workload-dashboard/index.vue +187 -0
- package/pages/c/_cluster/explorer/workload-dashboard/types.ts +80 -0
- package/pages/c/_cluster/fleet/application/create.vue +187 -136
- package/pages/c/_cluster/fleet/application/index.vue +5 -3
- package/pages/c/_cluster/fleet/application/suse-app-collection/ChartDetailBody.vue +338 -0
- package/pages/c/_cluster/fleet/application/suse-app-collection/ChartDetailHeader.vue +121 -0
- package/pages/c/_cluster/fleet/application/suse-app-collection/chart.vue +369 -0
- package/pages/c/_cluster/fleet/application/suse-app-collection/charts.vue +248 -0
- package/pages/c/_cluster/fleet/application/suse-app-collection/credentials.vue +310 -0
- package/pages/c/_cluster/fleet/index.vue +2 -2
- 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 +815 -2
- package/pages/c/_cluster/uiplugins/index.vue +218 -197
- package/pages/diagnostic.vue +13 -17
- package/pages/fail-whale.vue +30 -7
- package/pages/home.vue +93 -306
- package/pages/readme.vue +88 -0
- package/plugins/clean-html.d.ts +9 -0
- package/plugins/dashboard-store/__tests__/resource-class.test.ts +181 -0
- package/plugins/dashboard-store/actions.js +40 -18
- package/plugins/dashboard-store/resource-class.js +67 -9
- package/plugins/steve/__tests__/actions.test.ts +212 -0
- package/plugins/steve/__tests__/subscribe.spec.ts +6 -3
- package/plugins/steve/actions.js +96 -0
- package/plugins/steve/steve-pagination-utils.ts +12 -4
- package/plugins/steve/subscribe.js +35 -5
- package/rancher-components/Accordion/Accordion.vue +53 -9
- package/rancher-components/Form/Checkbox/Checkbox.vue +14 -0
- package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +10 -4
- package/rancher-components/Form/LabeledInput/LabeledInput.vue +7 -52
- package/rancher-components/Form/Radio/RadioButton.vue +17 -1
- package/rancher-components/Form/Radio/RadioGroup.vue +10 -0
- package/rancher-components/Pill/RcTag/RcTag.vue +3 -2
- package/rancher-components/RcButton/RcButton.test.ts +140 -1
- package/rancher-components/RcButton/RcButton.vue +126 -17
- package/rancher-components/RcButton/types.ts +3 -0
- package/rancher-components/RcDropdown/RcDropdownTrigger.vue +10 -8
- package/rancher-components/RcItemCard/RcItemCard.test.ts +18 -0
- package/rancher-components/RcItemCard/RcItemCard.vue +2 -2
- package/rancher-components/RcSection/RcSection.vue +28 -3
- package/scripts/extension/helm/package/Dockerfile +1 -1
- package/scripts/test-plugins-build.sh +2 -1
- package/store/__tests__/catalog.test.ts +115 -1
- package/store/__tests__/notifications.test.ts +434 -0
- 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 +84 -3
- package/store/digitalocean.js +20 -38
- package/store/index.js +2 -0
- package/store/linode.js +25 -40
- package/store/plugins.js +7 -4
- package/store/pnap.js +1 -0
- package/store/type-map.js +111 -29
- package/tsconfig.paths.json +8 -8
- package/types/components/buttonGroup.ts +5 -0
- 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 +206 -72
- 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__/auth.test.ts +273 -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__/computed.test.ts +193 -0
- package/utils/__tests__/cspAdaptor.test.ts +163 -0
- package/utils/__tests__/dom.test.ts +81 -0
- package/utils/__tests__/duration.test.ts +176 -0
- package/utils/__tests__/dynamic-importer.test.ts +102 -0
- package/utils/__tests__/fleet-appco.test.ts +312 -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__/monitoring.test.ts +130 -0
- package/utils/__tests__/namespace-filter.test.ts +109 -0
- package/utils/__tests__/object.test.ts +22 -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__/platform.test.ts +91 -0
- package/utils/__tests__/poller-sequential.test.ts +177 -0
- package/utils/__tests__/poller.test.ts +170 -0
- package/utils/__tests__/position.test.ts +237 -0
- package/utils/__tests__/promise.test.ts +346 -0
- package/utils/__tests__/provider.test.ts +51 -1
- package/utils/__tests__/queue.test.ts +232 -0
- package/utils/__tests__/release-notes.test.ts +221 -0
- package/utils/__tests__/router.test.js +254 -1
- package/utils/__tests__/select.test.ts +208 -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__/time.test.ts +265 -1
- package/utils/__tests__/title.test.ts +47 -0
- package/utils/__tests__/units.test.ts +417 -0
- package/utils/__tests__/versions.test.ts +128 -0
- package/utils/__tests__/width.test.ts +53 -0
- package/utils/__tests__/window.test.ts +158 -0
- package/utils/__tests__/xccdf.test.ts +511 -0
- package/utils/chart.js +36 -0
- package/utils/crypto/__tests__/browserHashUtils.test.ts +98 -0
- package/utils/crypto/__tests__/index.test.ts +144 -0
- package/utils/duration.ts +104 -0
- package/utils/dynamic-content/__tests__/notification-handler.test.ts +196 -0
- package/utils/dynamic-content/info.ts +2 -1
- package/utils/error.js +13 -0
- package/utils/fleet-appco.ts +323 -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/object.js +22 -2
- package/utils/pagination-utils.ts +2 -1
- package/utils/provider.ts +12 -0
- 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__/container-images.test.ts +104 -0
- package/utils/validators/__tests__/cron-schedule.test.ts +79 -0
- package/utils/validators/__tests__/flow-output.test.ts +91 -0
- package/utils/validators/__tests__/index.test.ts +481 -0
- package/utils/validators/__tests__/kubernetes-name.test.ts +163 -0
- package/utils/validators/__tests__/logging-outputs.test.ts +58 -0
- package/utils/validators/__tests__/misc-validators.test.ts +246 -0
- package/utils/validators/__tests__/monitoring-route.test.ts +119 -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 +415 -0
- package/vue.config.js +1 -1
- 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
- package/pages/support/index.vue +0 -264
- package/utils/duration.js +0 -43
|
@@ -41,7 +41,11 @@ export type ClusterDetailTabs = {
|
|
|
41
41
|
/**
|
|
42
42
|
* Kube conditions of the provisioning.cattle.io.cluster instance
|
|
43
43
|
*/
|
|
44
|
-
conditions: boolean
|
|
44
|
+
conditions: boolean,
|
|
45
|
+
/**
|
|
46
|
+
* RKE2 autoscaler
|
|
47
|
+
*/
|
|
48
|
+
autoscaler: boolean
|
|
45
49
|
};
|
|
46
50
|
|
|
47
51
|
/**
|
|
@@ -86,6 +90,48 @@ export interface ClusterProvisionerContext {
|
|
|
86
90
|
isView: boolean
|
|
87
91
|
}
|
|
88
92
|
|
|
93
|
+
/**
|
|
94
|
+
* Existing tabs to show or hide in the cluster's detail view
|
|
95
|
+
*/
|
|
96
|
+
export interface ClusterProvisionerDetailTabs {
|
|
97
|
+
/**
|
|
98
|
+
* CAPI machine pool tab
|
|
99
|
+
*/
|
|
100
|
+
machines: boolean,
|
|
101
|
+
/**
|
|
102
|
+
* Mgmt node pool tab
|
|
103
|
+
*/
|
|
104
|
+
nodes?: boolean,
|
|
105
|
+
/**
|
|
106
|
+
* RKE2 provisioning logs
|
|
107
|
+
*/
|
|
108
|
+
logs: boolean,
|
|
109
|
+
/**
|
|
110
|
+
* RKE2 registration commands
|
|
111
|
+
*/
|
|
112
|
+
registration: boolean,
|
|
113
|
+
/**
|
|
114
|
+
* RKE2 snapshots
|
|
115
|
+
*/
|
|
116
|
+
snapshots: boolean,
|
|
117
|
+
/**
|
|
118
|
+
* Kube resources related to the instance of provisioning.cattle.io.cluster
|
|
119
|
+
*/
|
|
120
|
+
related: boolean,
|
|
121
|
+
/**
|
|
122
|
+
* Kube events associated with the instance of provisioning.cattle.io.cluster
|
|
123
|
+
*/
|
|
124
|
+
events: boolean,
|
|
125
|
+
/**
|
|
126
|
+
* Kube conditions of the provisioning.cattle.io.cluster instance
|
|
127
|
+
*/
|
|
128
|
+
conditions: boolean,
|
|
129
|
+
/**
|
|
130
|
+
* RKE2 autoscaler
|
|
131
|
+
*/
|
|
132
|
+
autoscaler?: boolean,
|
|
133
|
+
}
|
|
134
|
+
|
|
89
135
|
/**
|
|
90
136
|
* Interface that a custom Cluster Provisioner should implement
|
|
91
137
|
*
|
|
@@ -180,36 +226,7 @@ export interface IClusterProvisioner {
|
|
|
180
226
|
*
|
|
181
227
|
* `plugin.addTab(TabLocation.RESOURCE_DETAIL... ` can be used to add additional tabs to the same view
|
|
182
228
|
*/
|
|
183
|
-
detailTabs:
|
|
184
|
-
/**
|
|
185
|
-
* RKE2 machine pool tabs
|
|
186
|
-
*/
|
|
187
|
-
machines: boolean,
|
|
188
|
-
/**
|
|
189
|
-
* RKE2 provisioning logs
|
|
190
|
-
*/
|
|
191
|
-
logs: boolean,
|
|
192
|
-
/**
|
|
193
|
-
* RKE2 registration commands
|
|
194
|
-
*/
|
|
195
|
-
registration: boolean,
|
|
196
|
-
/**
|
|
197
|
-
* RKE2 snapshots
|
|
198
|
-
*/
|
|
199
|
-
snapshots: boolean,
|
|
200
|
-
/**
|
|
201
|
-
* Kube resources related to the instance of provisioning.cattle.io.cluster
|
|
202
|
-
*/
|
|
203
|
-
related: boolean,
|
|
204
|
-
/**
|
|
205
|
-
* Kube events associated with the instance of provisioning.cattle.io.cluster
|
|
206
|
-
*/
|
|
207
|
-
events: boolean,
|
|
208
|
-
/**
|
|
209
|
-
* Kube conditions of the provisioning.cattle.io.cluster instance
|
|
210
|
-
*/
|
|
211
|
-
conditions: boolean
|
|
212
|
-
};
|
|
229
|
+
detailTabs: ClusterProvisionerDetailTabs;
|
|
213
230
|
|
|
214
231
|
/* --------------------------------------------------------------------------------------
|
|
215
232
|
* Getters / Functions for Managing Machine Configs
|
|
@@ -225,6 +242,16 @@ export interface IClusterProvisioner {
|
|
|
225
242
|
*/
|
|
226
243
|
machineConfigSchema?: { [key: string]: any };
|
|
227
244
|
|
|
245
|
+
/**
|
|
246
|
+
* Schema for infrastructure cluster object. For example infrastructure.cluster.x-k8s.io.awscluster
|
|
247
|
+
*
|
|
248
|
+
* The `id` should be in the format of `infrastructure.cluster.x-k8s.io.${ provider id }cluster`
|
|
249
|
+
*
|
|
250
|
+
* The `attributes: { kind: <value> }` should match the last part of the id
|
|
251
|
+
* The `attributes: { group: <value> }` should match the remaining parts of the id
|
|
252
|
+
*/
|
|
253
|
+
infrastructureClusterSchema?: { [key: string]: any };
|
|
254
|
+
|
|
228
255
|
/**
|
|
229
256
|
* Override the default method to create a machine config object that will be inserted into a new machine pool
|
|
230
257
|
*
|
|
@@ -257,6 +284,16 @@ export interface IClusterProvisioner {
|
|
|
257
284
|
*/
|
|
258
285
|
saveMachinePoolConfigs?(pools: any[], cluster: any): Promise<any>
|
|
259
286
|
|
|
287
|
+
/**
|
|
288
|
+
* Optional custom UI section for infrastructure-cluster-specific configuration.
|
|
289
|
+
*/
|
|
290
|
+
extensionInfrastructureSection?: any
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* Indicates the provisioner manages upstream CAPI infrastructure resources directly.
|
|
294
|
+
*/
|
|
295
|
+
isUpstreamCAPIProvider?: boolean
|
|
296
|
+
|
|
260
297
|
/* --------------------------------------------------------------------------------------
|
|
261
298
|
* Optionally override parts of the cluster save process with
|
|
262
299
|
* - hooks that run before or after the cluster resource is saved
|
|
@@ -276,6 +313,15 @@ export interface IClusterProvisioner {
|
|
|
276
313
|
*/
|
|
277
314
|
registerSaveHooks?(registerBeforeHook: RegisterClusterSaveHook, registerAfterHook: RegisterClusterSaveHook, cluster: any): void;
|
|
278
315
|
|
|
316
|
+
/**
|
|
317
|
+
* Register hooks that run during `initSpecs` while initializing the cluster form.
|
|
318
|
+
*
|
|
319
|
+
* @param registerInitHook
|
|
320
|
+
* Call `registerInitHook` with a function. The function will be executed during form initialization.
|
|
321
|
+
* @param cluster The cluster (`provisioning.cattle.io.cluster`)
|
|
322
|
+
*/
|
|
323
|
+
registerInitHooks?(registerInitHook: RegisterClusterSaveHook, cluster: any): void;
|
|
324
|
+
|
|
279
325
|
/**
|
|
280
326
|
* Optionally override the save of the cluster resource itself
|
|
281
327
|
*
|
package/core/types.ts
CHANGED
|
@@ -4,8 +4,9 @@ import type { ExtensionManager } from '@shell/types/extension-manager';
|
|
|
4
4
|
import { PaginationSettingsStores } from '@shell/types/resources/settings';
|
|
5
5
|
import type {
|
|
6
6
|
ProductMetadata, ProductSinglePage,
|
|
7
|
-
StandardProductName, RouteRecordRawWithParams,
|
|
8
|
-
|
|
7
|
+
StandardProductName, RouteRecordRawWithParams, ProductChild,
|
|
8
|
+
ProductChildGroup,
|
|
9
|
+
ProductChildPage
|
|
9
10
|
} from './plugin-types';
|
|
10
11
|
|
|
11
12
|
// Cluster Provisioning types
|
|
@@ -290,6 +291,11 @@ export interface ProductOptions {
|
|
|
290
291
|
*/
|
|
291
292
|
to?: PluginRouteRecordRaw;
|
|
292
293
|
|
|
294
|
+
/**
|
|
295
|
+
* Whether the product can be removed by users (default: false — products are built-in/not removable unless explicitly set to true)
|
|
296
|
+
*/
|
|
297
|
+
removable?: boolean;
|
|
298
|
+
|
|
293
299
|
/**
|
|
294
300
|
* Alternative to the icon property. Uses require
|
|
295
301
|
*/
|
|
@@ -300,6 +306,11 @@ export interface ProductOptions {
|
|
|
300
306
|
*/
|
|
301
307
|
name?: string;
|
|
302
308
|
|
|
309
|
+
/**
|
|
310
|
+
* controls whether a workspace switcher dropdown appears in the header (instead of the namespace filter) if set to true
|
|
311
|
+
*/
|
|
312
|
+
showWorkspaceSwitcher?: boolean;
|
|
313
|
+
|
|
303
314
|
/**
|
|
304
315
|
*
|
|
305
316
|
*/
|
|
@@ -316,8 +327,6 @@ export interface ProductOptions {
|
|
|
316
327
|
* Leaving these here for completeness but I don't think these should be advertised as useable to plugin creators.
|
|
317
328
|
*/
|
|
318
329
|
// ifHaveVerb: string | RegExp;
|
|
319
|
-
// removable: string;
|
|
320
|
-
// showWorkspaceSwitcher: boolean;
|
|
321
330
|
// supportRoute: string;
|
|
322
331
|
// typeStoreMap: string;
|
|
323
332
|
}
|
|
@@ -552,7 +561,7 @@ export interface DSLReturnType {
|
|
|
552
561
|
* @param headers {@link HeaderOptions[]}
|
|
553
562
|
* @returns {@link void}
|
|
554
563
|
*/
|
|
555
|
-
headers: (type: string, headers
|
|
564
|
+
headers: (type: string, headers?: HeaderOptions[], paginationHeaders?: PaginationHeaderOptions[]) => void;
|
|
556
565
|
|
|
557
566
|
/**
|
|
558
567
|
* Create and register a new product
|
|
@@ -562,12 +571,30 @@ export interface DSLReturnType {
|
|
|
562
571
|
product: (options: ProductOptions) => void;
|
|
563
572
|
|
|
564
573
|
/**
|
|
565
|
-
|
|
566
|
-
*
|
|
567
|
-
*
|
|
574
|
+
/**
|
|
575
|
+
* Remap group display names in the side-menu navigation.
|
|
576
|
+
*
|
|
577
|
+
* Each entry matches a group's internal ID (via string or regex) and replaces its display label
|
|
578
|
+
* with a new name. This only changes how the group is labelled in the UI — it does not move
|
|
579
|
+
* resources between groups.
|
|
580
|
+
*
|
|
581
|
+
* @param match String, string for a regex or a regex object to match against group names
|
|
582
|
+
* @param replace Replacement string or function for the display name
|
|
583
|
+
* @param weight Priority for applying this mapping (higher numbers applied first, default 5)
|
|
584
|
+
* @param continueOnMatch If true, continue matching other rules after this one matches
|
|
585
|
+
* @returns {@link void}
|
|
586
|
+
*/
|
|
587
|
+
mapGroup: (match: string | RegExp, replace: string | Function, weight?: number, continueOnMatch?: boolean) => void;
|
|
588
|
+
|
|
589
|
+
/**
|
|
590
|
+
* Remap a type ID to a display name
|
|
591
|
+
* @param match String, string for a regex or a regex object to match against type IDs
|
|
592
|
+
* @param replace Replacement string or function for the display name
|
|
593
|
+
* @param weight Priority for applying this mapping (higher numbers applied first, default 5)
|
|
594
|
+
* @param continueOnMatch If true, continue matching other rules after this one matches
|
|
568
595
|
* @returns {@link void}
|
|
569
596
|
*/
|
|
570
|
-
|
|
597
|
+
mapType: (match: string | RegExp, replace: string | Function, weight?: number, continueOnMatch?: boolean) => void;
|
|
571
598
|
|
|
572
599
|
/**
|
|
573
600
|
* Create and configure a myriad of options for a type
|
|
@@ -595,18 +622,36 @@ export interface DSLReturnType {
|
|
|
595
622
|
weightType: (input: string, weight: number, forBasic: boolean) => void;
|
|
596
623
|
|
|
597
624
|
/**
|
|
598
|
-
*
|
|
625
|
+
* Never show the specified type in the navigation
|
|
626
|
+
* @param regexOrString String, string for a regex or a regex object to match against type names
|
|
627
|
+
* @returns {@link void}
|
|
599
628
|
*/
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
629
|
+
ignoreType: (regexOrString: string | RegExp) => void;
|
|
630
|
+
|
|
631
|
+
/**
|
|
632
|
+
* Never show the specified group or any types in it
|
|
633
|
+
* @param regexOrString String, string for a regex or a regex object to match against group names
|
|
634
|
+
* @param fn Conditional function that accepts getters and returns true if the group should be ignored
|
|
635
|
+
* @returns {@link void}
|
|
636
|
+
*/
|
|
637
|
+
ignoreGroup: (regexOrString: string | RegExp, fn?: (getters: any) => boolean) => void;
|
|
638
|
+
|
|
639
|
+
/**
|
|
640
|
+
* Move a resource type into a different navigation group
|
|
641
|
+
* @param match String or regex to match against resource type names
|
|
642
|
+
* @param group Target group name to move the matched types into
|
|
643
|
+
* @param weight Ordering weight for the mapping (default: 5)
|
|
644
|
+
* @returns {@link void}
|
|
645
|
+
*/
|
|
646
|
+
moveType: (match: string | RegExp, group: string, weight?: number) => void;
|
|
647
|
+
|
|
648
|
+
/**
|
|
649
|
+
* Control visibility of bulk actions (e.g. delete) in the list view toolbar for a specific resource type
|
|
650
|
+
* @param type The resource type to configure
|
|
651
|
+
* @param hide Whether to hide bulk actions. Set to `true` to hide them
|
|
652
|
+
* @returns {@link void}
|
|
653
|
+
*/
|
|
654
|
+
hideBulkActions: (type: string, hide: boolean) => void;
|
|
610
655
|
|
|
611
656
|
labelGroup: (group: string, label: string | undefined, labelKey?: string) => void;
|
|
612
657
|
|
|
@@ -657,14 +702,19 @@ export interface IExtension {
|
|
|
657
702
|
* @internal - DO NOT USE - Internal API only
|
|
658
703
|
*/
|
|
659
704
|
_registerTopLevelProduct(): void;
|
|
705
|
+
/**
|
|
706
|
+
*
|
|
707
|
+
* @internal - DO NOT USE - Internal API only
|
|
708
|
+
*/
|
|
709
|
+
_setStartRouteWithProduct(value: boolean): void;
|
|
660
710
|
|
|
661
711
|
/**
|
|
662
712
|
* Add a product to the sidebar, with children and a side menu for navigation for internal pages
|
|
663
713
|
* @param name
|
|
664
714
|
* @param config
|
|
665
715
|
*/
|
|
666
|
-
addProduct(product: ProductMetadata, config: ProductChildGroup[]): void;
|
|
667
716
|
addProduct(product: ProductMetadata, config: ProductChildPage[]): void;
|
|
717
|
+
addProduct(product: ProductMetadata, config: ProductChildGroup[]): void;
|
|
668
718
|
addProduct(product: ProductMetadata, config: ProductChild[]): void;
|
|
669
719
|
|
|
670
720
|
/**
|
|
@@ -694,8 +744,8 @@ export interface IExtension {
|
|
|
694
744
|
* @param product Product to be extended
|
|
695
745
|
* @param config Product extension configuration
|
|
696
746
|
*/
|
|
697
|
-
extendProduct(product: StandardProductName | string, config: ProductChildGroup[]): void;
|
|
698
747
|
extendProduct(product: StandardProductName | string, config: ProductChildPage[]): void;
|
|
748
|
+
extendProduct(product: StandardProductName | string, config: ProductChildGroup[]): void;
|
|
699
749
|
extendProduct(product: StandardProductName | string, config: ProductChild[]): void;
|
|
700
750
|
|
|
701
751
|
/**
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import podDetail from '@shell/detail/pod.vue';
|
|
2
|
+
|
|
3
|
+
const { containers } = podDetail.computed;
|
|
4
|
+
|
|
5
|
+
describe('view: pod', () => {
|
|
6
|
+
it('should not use 2x icon sizing in init container column', () => {
|
|
7
|
+
const initContainer = { name: 'init', image: 'init:latest' };
|
|
8
|
+
const appContainer = { name: 'app', image: 'app:latest' };
|
|
9
|
+
|
|
10
|
+
const rows = containers.call({
|
|
11
|
+
allContainers: [appContainer, initContainer],
|
|
12
|
+
allStatuses: [{
|
|
13
|
+
name: 'app',
|
|
14
|
+
ready: true,
|
|
15
|
+
state: {},
|
|
16
|
+
lastState: {}
|
|
17
|
+
}, {
|
|
18
|
+
name: 'init',
|
|
19
|
+
ready: false,
|
|
20
|
+
state: {},
|
|
21
|
+
lastState: {}
|
|
22
|
+
}],
|
|
23
|
+
dateTimeFormat: () => '',
|
|
24
|
+
t: () => '',
|
|
25
|
+
value: {
|
|
26
|
+
containerActions: [],
|
|
27
|
+
containerIsInit: (container: { name: string }) => container.name === 'init',
|
|
28
|
+
containerStateColor: () => 'text-success',
|
|
29
|
+
containerStateDisplay: () => 'running',
|
|
30
|
+
openLogs: jest.fn(),
|
|
31
|
+
openShell: jest.fn(),
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
const initRow = rows.find((row: { name: string }) => row.name === 'init');
|
|
36
|
+
const appRow = rows.find((row: { name: string }) => row.name === 'app');
|
|
37
|
+
|
|
38
|
+
expect(initRow.initIcon).toBe('icon-checkmark text-success ml-5');
|
|
39
|
+
expect(appRow.initIcon).toBe('icon-minus text-muted ml-5');
|
|
40
|
+
});
|
|
41
|
+
});
|
|
@@ -127,4 +127,118 @@ describe('view: provisioning.cattle.io.cluster', () => {
|
|
|
127
127
|
expect(wrapper.vm.showRegistration).toStrictEqual(false);
|
|
128
128
|
});
|
|
129
129
|
});
|
|
130
|
+
|
|
131
|
+
describe('fakeMachines', () => {
|
|
132
|
+
const clusterName = 'my-cluster';
|
|
133
|
+
const poolName = 'pool1';
|
|
134
|
+
const namespace = 'fleet-default';
|
|
135
|
+
const poolFullName = `${ clusterName }-${ poolName }`;
|
|
136
|
+
|
|
137
|
+
const wrongTemplate = { metadata: { name: `${ poolFullName }-aaaa1111`, namespace } };
|
|
138
|
+
const correctTemplate = { metadata: { name: `${ poolFullName }-bbbb2222`, namespace } };
|
|
139
|
+
|
|
140
|
+
const baseValue = {
|
|
141
|
+
name: clusterName,
|
|
142
|
+
nameDisplay: clusterName,
|
|
143
|
+
namespace,
|
|
144
|
+
machines: [],
|
|
145
|
+
spec: {
|
|
146
|
+
rkeConfig: {
|
|
147
|
+
machinePools: [
|
|
148
|
+
{
|
|
149
|
+
name: poolName,
|
|
150
|
+
machineConfigRef: { name: `nc-${ poolFullName }-xyz`, kind: 'Amazonec2Config' },
|
|
151
|
+
},
|
|
152
|
+
],
|
|
153
|
+
},
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
it('uses MachineDeployment infrastructureRef to select the correct template for an empty pool', async() => {
|
|
158
|
+
const machineDeployment = {
|
|
159
|
+
metadata: { name: poolFullName, namespace },
|
|
160
|
+
spec: { template: { spec: { infrastructureRef: { name: correctTemplate.metadata.name } } } },
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
const wrapper = shallowMount(ProvisioningCattleIoCluster, {
|
|
164
|
+
props: { value: baseValue },
|
|
165
|
+
global: { mocks },
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
await wrapper.setData({
|
|
169
|
+
allMachineDeployments: [machineDeployment],
|
|
170
|
+
machineTemplates: [wrongTemplate, correctTemplate],
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
const [fakeMachine] = wrapper.vm.fakeMachines;
|
|
174
|
+
|
|
175
|
+
expect(fakeMachine.pool._template).toStrictEqual(correctTemplate);
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
it('returns the first prefix-matching template when no MachineDeployment exists for the pool', async() => {
|
|
179
|
+
const wrapper = shallowMount(ProvisioningCattleIoCluster, {
|
|
180
|
+
props: { value: baseValue },
|
|
181
|
+
global: { mocks },
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
await wrapper.setData({
|
|
185
|
+
allMachineDeployments: [],
|
|
186
|
+
machineTemplates: [wrongTemplate, correctTemplate],
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
const [fakeMachine] = wrapper.vm.fakeMachines;
|
|
190
|
+
|
|
191
|
+
expect(fakeMachine.pool._template).toStrictEqual(wrongTemplate);
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
it('returns undefined template when MachineDeployment infrastructureRef does not match any template', async() => {
|
|
195
|
+
const machineDeployment = {
|
|
196
|
+
metadata: { name: poolFullName, namespace },
|
|
197
|
+
spec: { template: { spec: { infrastructureRef: { name: `${ poolFullName }-nonexistent` } } } },
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
const wrapper = shallowMount(ProvisioningCattleIoCluster, {
|
|
201
|
+
props: { value: baseValue },
|
|
202
|
+
global: { mocks },
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
await wrapper.setData({
|
|
206
|
+
allMachineDeployments: [machineDeployment],
|
|
207
|
+
machineTemplates: [wrongTemplate, correctTemplate],
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
const [fakeMachine] = wrapper.vm.fakeMachines;
|
|
211
|
+
|
|
212
|
+
expect(fakeMachine.pool._template).toBeUndefined();
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
it('does not include a pool in fakeMachines when it has active machines', async() => {
|
|
216
|
+
const valueWithMachines = {
|
|
217
|
+
...baseValue,
|
|
218
|
+
machines: [
|
|
219
|
+
{
|
|
220
|
+
metadata: {
|
|
221
|
+
labels: {
|
|
222
|
+
'cluster.x-k8s.io/cluster-name': clusterName,
|
|
223
|
+
'rke.cattle.io/rke-machine-pool-name': poolName,
|
|
224
|
+
},
|
|
225
|
+
},
|
|
226
|
+
spec: { infrastructureRef: { apiGroup: 'rke-machine.cattle.io', name: `${ poolFullName }-bbbb2222` } },
|
|
227
|
+
},
|
|
228
|
+
],
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
const wrapper = shallowMount(ProvisioningCattleIoCluster, {
|
|
232
|
+
props: { value: valueWithMachines },
|
|
233
|
+
global: { mocks },
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
await wrapper.setData({
|
|
237
|
+
allMachineDeployments: [],
|
|
238
|
+
machineTemplates: [wrongTemplate, correctTemplate],
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
expect(wrapper.vm.fakeMachines).toHaveLength(0);
|
|
242
|
+
});
|
|
243
|
+
});
|
|
130
244
|
});
|
|
@@ -1,156 +1,7 @@
|
|
|
1
1
|
import Workload from '@shell/detail/workload/index.vue';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
it('should do nothing if ingress schema is not present', () => {
|
|
7
|
-
const mockThis = {
|
|
8
|
-
ingressSchema: undefined,
|
|
9
|
-
matchingIngresses: [],
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
findMatchingIngresses.call(mockThis);
|
|
13
|
-
expect(mockThis.matchingIngresses).toStrictEqual([]);
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
it('should not find any ingresses if there are none', () => {
|
|
17
|
-
const mockThis = {
|
|
18
|
-
ingressSchema: true,
|
|
19
|
-
allIngresses: [],
|
|
20
|
-
matchingIngresses: [],
|
|
21
|
-
value: { metadata: { namespace: 'test' }, relatedServices: [] }
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
findMatchingIngresses.call(mockThis);
|
|
25
|
-
expect(mockThis.matchingIngresses).toStrictEqual([]);
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
it('should find matching ingresses', () => {
|
|
29
|
-
const mockThis = {
|
|
30
|
-
ingressSchema: true,
|
|
31
|
-
allIngresses: [
|
|
32
|
-
{ // matching
|
|
33
|
-
metadata: { namespace: 'test' },
|
|
34
|
-
spec: { rules: [{ http: { paths: [{ backend: { service: { name: 'service1' } } }] } }] }
|
|
35
|
-
}
|
|
36
|
-
],
|
|
37
|
-
matchingIngresses: [],
|
|
38
|
-
value: { metadata: { namespace: 'test' }, relatedServices: [{ metadata: { name: 'service1' } }] }
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
findMatchingIngresses.call(mockThis);
|
|
42
|
-
expect(mockThis.matchingIngresses).toHaveLength(1);
|
|
43
|
-
expect(mockThis.matchingIngresses[0]).toStrictEqual(mockThis.allIngresses[0]);
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
it('should not match ingresses from other namespaces', () => {
|
|
47
|
-
const mockThis = {
|
|
48
|
-
ingressSchema: true,
|
|
49
|
-
allIngresses: [
|
|
50
|
-
{ // not matching
|
|
51
|
-
metadata: { namespace: 'other' },
|
|
52
|
-
spec: { rules: [{ http: { paths: [{ backend: { service: { name: 'service1' } } }] } }] }
|
|
53
|
-
}
|
|
54
|
-
],
|
|
55
|
-
matchingIngresses: [],
|
|
56
|
-
value: { metadata: { namespace: 'test' }, relatedServices: [{ metadata: { name: 'service1' } }] }
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
findMatchingIngresses.call(mockThis);
|
|
60
|
-
expect(mockThis.matchingIngresses).toHaveLength(0);
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
it('should not match ingresses pointing to other services', () => {
|
|
64
|
-
const mockThis = {
|
|
65
|
-
ingressSchema: true,
|
|
66
|
-
allIngresses: [
|
|
67
|
-
{ // not matching
|
|
68
|
-
metadata: { namespace: 'test' },
|
|
69
|
-
spec: { rules: [{ http: { paths: [{ backend: { service: { name: 'service2' } } }] } }] }
|
|
70
|
-
}
|
|
71
|
-
],
|
|
72
|
-
matchingIngresses: [],
|
|
73
|
-
value: { metadata: { namespace: 'test' }, relatedServices: [{ metadata: { name: 'service1' } }] }
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
findMatchingIngresses.call(mockThis);
|
|
77
|
-
expect(mockThis.matchingIngresses).toHaveLength(0);
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
it('should handle ingresses with no rules', () => {
|
|
81
|
-
const mockThis = {
|
|
82
|
-
ingressSchema: true,
|
|
83
|
-
allIngresses: [
|
|
84
|
-
{
|
|
85
|
-
metadata: { namespace: 'test' },
|
|
86
|
-
spec: { }
|
|
87
|
-
}
|
|
88
|
-
],
|
|
89
|
-
matchingIngresses: [],
|
|
90
|
-
value: { metadata: { namespace: 'test' }, relatedServices: [{ metadata: { name: 'service1' } }] }
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
findMatchingIngresses.call(mockThis);
|
|
94
|
-
expect(mockThis.matchingIngresses).toHaveLength(0);
|
|
95
|
-
});
|
|
96
|
-
|
|
97
|
-
it('should handle ingress rules with no paths', () => {
|
|
98
|
-
const mockThis = {
|
|
99
|
-
ingressSchema: true,
|
|
100
|
-
allIngresses: [
|
|
101
|
-
{
|
|
102
|
-
metadata: { namespace: 'test' },
|
|
103
|
-
spec: { rules: [{ http: {} }] }
|
|
104
|
-
}
|
|
105
|
-
],
|
|
106
|
-
matchingIngresses: [],
|
|
107
|
-
value: { metadata: { namespace: 'test' }, relatedServices: [{ metadata: { name: 'service1' } }] }
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
findMatchingIngresses.call(mockThis);
|
|
111
|
-
expect(mockThis.matchingIngresses).toHaveLength(0);
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
it('should handle ingress paths with no backend service', () => {
|
|
115
|
-
const mockThis = {
|
|
116
|
-
ingressSchema: true,
|
|
117
|
-
allIngresses: [
|
|
118
|
-
{
|
|
119
|
-
metadata: { namespace: 'test' },
|
|
120
|
-
spec: { rules: [{ http: { paths: [{ backend: {} }] } }] }
|
|
121
|
-
}
|
|
122
|
-
],
|
|
123
|
-
matchingIngresses: [],
|
|
124
|
-
value: { metadata: { namespace: 'test' }, relatedServices: [{ metadata: { name: 'service1' } }] }
|
|
125
|
-
};
|
|
126
|
-
|
|
127
|
-
findMatchingIngresses.call(mockThis);
|
|
128
|
-
expect(mockThis.matchingIngresses).toHaveLength(0);
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
it('should find one of many ingresses', () => {
|
|
132
|
-
const mockThis = {
|
|
133
|
-
ingressSchema: true,
|
|
134
|
-
allIngresses: [
|
|
135
|
-
{ // not matching
|
|
136
|
-
metadata: { namespace: 'other' },
|
|
137
|
-
spec: { rules: [{ http: { paths: [{ backend: { service: { name: 'service1' } } }] } }] }
|
|
138
|
-
},
|
|
139
|
-
{ // matching
|
|
140
|
-
metadata: { namespace: 'test' },
|
|
141
|
-
spec: { rules: [{ http: { paths: [{ backend: { service: { name: 'service1' } } }] } }] }
|
|
142
|
-
},
|
|
143
|
-
{ // not matching
|
|
144
|
-
metadata: { namespace: 'test' },
|
|
145
|
-
spec: { rules: [{ http: { paths: [{ backend: { service: { name: 'service2' } } }] } }] }
|
|
146
|
-
}
|
|
147
|
-
],
|
|
148
|
-
matchingIngresses: [],
|
|
149
|
-
value: { metadata: { namespace: 'test' }, relatedServices: [{ metadata: { name: 'service1' } }] }
|
|
150
|
-
};
|
|
151
|
-
|
|
152
|
-
findMatchingIngresses.call(mockThis);
|
|
153
|
-
expect(mockThis.matchingIngresses).toHaveLength(1);
|
|
154
|
-
expect(mockThis.matchingIngresses[0]).toStrictEqual(mockThis.allIngresses[1]);
|
|
3
|
+
describe('workload detail page', () => {
|
|
4
|
+
it('should not have findMatchingIngresses method (logic moved to workload model)', () => {
|
|
5
|
+
expect(Workload.methods?.findMatchingIngresses).toBeUndefined();
|
|
155
6
|
});
|
|
156
7
|
});
|
|
@@ -5,6 +5,12 @@ import CopyCode from '@shell/components/CopyCode';
|
|
|
5
5
|
import Tab from '@shell/components/Tabbed/Tab';
|
|
6
6
|
import { allHash } from '@shell/utils/promise';
|
|
7
7
|
|
|
8
|
+
// Couple of things wrong here
|
|
9
|
+
// 1. It should be in pkg/harvester-manager extension
|
|
10
|
+
// 2. It's not used when the harvester-ui extension is loaded
|
|
11
|
+
// - extension has it's own detail/harvesterhci.io.management.cluster.vue which supersedes this
|
|
12
|
+
// - unless harvester standalone uses it, it should not exist in the harvester-ui extension
|
|
13
|
+
|
|
8
14
|
export default {
|
|
9
15
|
emits: ['input'],
|
|
10
16
|
|
|
@@ -31,8 +37,6 @@ export default {
|
|
|
31
37
|
|
|
32
38
|
const res = await allHash(hash);
|
|
33
39
|
|
|
34
|
-
this.allNodes = res.allNodes || [];
|
|
35
|
-
this.allNodePools = res.allNodePools || [];
|
|
36
40
|
this.clusterToken = res.clusterToken;
|
|
37
41
|
},
|
|
38
42
|
|
package/detail/pod.vue
CHANGED
|
@@ -106,7 +106,7 @@ export default {
|
|
|
106
106
|
availableActions: this.value.containerActions,
|
|
107
107
|
stateObj: status, // Required if there's a description
|
|
108
108
|
stateDescription: descriptions.join(' | '), // Required to display the description
|
|
109
|
-
initIcon: this.value.containerIsInit(container) ? 'icon-checkmark
|
|
109
|
+
initIcon: this.value.containerIsInit(container) ? 'icon-checkmark text-success ml-5' : 'icon-minus text-muted ml-5',
|
|
110
110
|
|
|
111
111
|
// Call openShell here so that opening the shell
|
|
112
112
|
// at the container level still has 'this' in scope.
|