@rancher/shell 3.0.7 → 3.0.8-rc.10
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/assets/brand/suse/banner.svg +1 -0
- package/assets/brand/suse/dark/banner.svg +1 -0
- package/assets/brand/suse/dark/login-landscape.svg +1 -0
- package/assets/brand/suse/dark/rancher-logo.svg +1 -1
- package/assets/brand/suse/favicon.png +0 -0
- package/assets/brand/suse/login-landscape.svg +1 -0
- package/assets/brand/suse/metadata.json +11 -1
- package/assets/brand/suse/rancher-logo.svg +1 -1
- package/assets/fonts/suse/suse-v2-latin-300.woff +0 -0
- package/assets/fonts/suse/suse-v2-latin-300.woff2 +0 -0
- package/assets/fonts/suse/suse-v2-latin-600.woff +0 -0
- package/assets/fonts/suse/suse-v2-latin-600.woff2 +0 -0
- package/assets/fonts/suse/suse-v2-latin-700.woff +0 -0
- package/assets/fonts/suse/suse-v2-latin-700.woff2 +0 -0
- package/assets/fonts/suse/suse-v2-latin-800.woff +0 -0
- package/assets/fonts/suse/suse-v2-latin-800.woff2 +0 -0
- package/assets/fonts/suse/suse-v2-latin-regular.woff +0 -0
- package/assets/fonts/suse/suse-v2-latin-regular.woff2 +0 -0
- package/assets/images/content/README.md +5 -0
- package/assets/images/content/cloud-native.svg +84 -0
- package/assets/images/content/dark/cloud-native.svg +21 -0
- package/assets/images/content/dark/shield.svg +59 -0
- package/assets/images/content/dark/suse.svg +10 -0
- package/assets/images/content/shield.svg +59 -0
- package/assets/images/content/suse.svg +10 -0
- package/assets/images/vendor/githubapp.svg +13 -0
- package/assets/styles/base/_typography.scss +2 -1
- package/assets/styles/fonts/_fontstack.scss +53 -1
- package/assets/styles/global/_cards.scss +0 -3
- package/assets/styles/global/_layout.scss +21 -35
- package/assets/styles/themes/_dark.scss +1 -1
- package/assets/styles/themes/_light.scss +1 -1
- package/assets/styles/themes/_modern.scss +16 -8
- package/assets/styles/themes/_suse.scss +116 -24
- package/assets/translations/en-us.yaml +185 -21
- package/assets/translations/zh-hans.yaml +0 -4
- package/components/AutoscalerCard.vue +113 -0
- package/components/AutoscalerTab.vue +94 -0
- package/components/BackLink.vue +8 -0
- package/components/BannerGraphic.vue +36 -21
- package/components/BrandImage.vue +17 -6
- package/components/ClusterIconMenu.vue +1 -1
- package/components/ClusterProviderIcon.vue +1 -1
- package/components/Cron/CronExpressionEditor.vue +1 -1
- package/components/Cron/CronExpressionEditorModal.vue +1 -1
- package/components/Drawer/Chrome.vue +2 -6
- package/components/Drawer/ResourceDetailDrawer/ConfigTab.vue +4 -9
- package/components/Drawer/ResourceDetailDrawer/YamlTab.vue +3 -8
- package/components/Drawer/ResourceDetailDrawer/composables.ts +3 -4
- package/components/Drawer/ResourceDetailDrawer/index.vue +4 -9
- package/components/Drawer/ResourceDetailDrawer/types.ts +17 -0
- package/components/Drawer/types.ts +3 -0
- package/components/DynamicContent/DynamicContentBanner.vue +102 -0
- package/components/DynamicContent/DynamicContentCloseButton.vue +42 -0
- package/components/DynamicContent/DynamicContentIcon.vue +132 -0
- package/components/DynamicContent/DynamicContentPanel.vue +112 -0
- package/components/DynamicContent/content.ts +78 -0
- package/components/EmberPage.vue +1 -1
- package/components/IconOrSvg.vue +2 -2
- package/components/Inactivity.vue +222 -106
- package/components/InstallHelmCharts.vue +2 -2
- package/components/PaginatedResourceTable.vue +2 -6
- package/components/PopoverCard.vue +192 -0
- package/components/Questions/__tests__/index.test.ts +159 -0
- package/components/Resource/Detail/CopyToClipboard.vue +4 -1
- package/components/Resource/Detail/FetchLoader/composables.ts +18 -4
- package/components/Resource/Detail/Metadata/Annotations/index.vue +2 -2
- package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/identifying-fields.test.ts +1 -1
- package/components/Resource/Detail/Metadata/IdentifyingInformation/identifying-fields.ts +4 -0
- package/components/Resource/Detail/Metadata/KeyValueRow.vue +1 -1
- package/components/Resource/Detail/Metadata/Labels/index.vue +2 -2
- package/components/Resource/Detail/Metadata/composables.ts +9 -9
- package/components/Resource/Detail/Metadata/index.vue +3 -3
- package/components/Resource/Detail/ResourcePopover/ResourcePopoverCard.vue +2 -19
- package/components/Resource/Detail/ResourcePopover/__tests__/ResourcePopoverCard.test.ts +0 -29
- package/components/Resource/Detail/ResourcePopover/__tests__/index.test.ts +132 -150
- package/components/Resource/Detail/ResourcePopover/index.vue +54 -159
- package/components/Resource/Detail/TitleBar/__tests__/index.test.ts +0 -2
- package/components/Resource/Detail/TitleBar/composables.ts +2 -1
- package/components/Resource/Detail/TitleBar/index.vue +10 -6
- package/components/Resource/Detail/composables.ts +12 -0
- package/components/ResourceDetail/Masthead/latest.vue +29 -0
- package/components/ResourceDetail/index.vue +5 -2
- package/components/ResourceList/Masthead.vue +1 -1
- package/components/SortableTable/index.vue +18 -2
- package/components/Tabbed/__tests__/index.test.ts +86 -0
- package/components/{nav/WindowManager → Window}/ContainerLogs.vue +1 -1
- package/components/{nav/WindowManager → Window}/ContainerLogsActions.vue +1 -0
- package/components/{nav/WindowManager → Window}/__tests__/ContainerLogs.test.ts +1 -1
- package/components/{nav/WindowManager → Window}/__tests__/ContainerShell.test.ts +2 -2
- package/components/__tests__/AutoscalerCard.test.ts +154 -0
- package/components/__tests__/AutoscalerTab.test.ts +125 -0
- package/components/__tests__/PopoverCard.test.ts +204 -0
- package/components/auth/SelectPrincipal.vue +24 -6
- package/components/auth/__tests__/SelectPrincipal.test.ts +119 -0
- package/components/fleet/FleetConfigMapSelector.vue +117 -0
- package/components/fleet/FleetSecretSelector.vue +127 -0
- package/components/fleet/__tests__/FleetConfigMapSelector.test.ts +125 -0
- package/components/fleet/__tests__/FleetSecretSelector.test.ts +82 -0
- package/components/form/FileImageSelector.vue +13 -4
- package/components/form/FileSelector.vue +11 -2
- package/components/form/ResourceLabeledSelect.vue +1 -0
- package/components/form/__tests__/ResourceLabeledSelect.test.ts +90 -0
- package/components/formatter/Autoscaler.vue +97 -0
- package/components/formatter/InternalExternalIP.vue +198 -24
- package/components/formatter/__tests__/Autoscaler.test.ts +156 -0
- package/components/formatter/__tests__/InternalExternalIP.test.ts +133 -0
- package/components/google/util/__tests__/formatter.test.ts +47 -0
- package/components/google/util/formatter.ts +5 -2
- package/components/nav/Group.vue +12 -3
- package/components/nav/Header.vue +37 -16
- package/components/nav/NamespaceFilter.vue +13 -1
- package/components/nav/NotificationCenter/index.vue +2 -1
- package/components/nav/TopLevelMenu.helper.ts +16 -6
- package/components/nav/TopLevelMenu.vue +4 -2
- package/components/{DraggableZone.vue → nav/WindowManager/PinArea.vue} +47 -80
- package/components/nav/WindowManager/composables/useComponentsMount.ts +70 -0
- package/components/nav/WindowManager/composables/useDimensionsHandler.ts +105 -0
- package/components/nav/WindowManager/composables/useDragHandler.ts +99 -0
- package/components/nav/WindowManager/composables/usePanelHandler.ts +72 -0
- package/components/nav/WindowManager/composables/usePanelsHandler.ts +14 -0
- package/components/nav/WindowManager/composables/useResizeHandler.ts +167 -0
- package/components/nav/WindowManager/composables/useTabsHandler.ts +51 -0
- package/components/nav/WindowManager/constants.ts +23 -0
- package/components/nav/WindowManager/index.vue +61 -575
- package/components/nav/WindowManager/panels/HorizontalPanel.vue +265 -0
- package/components/nav/WindowManager/panels/TabBodyContainer.vue +39 -0
- package/components/nav/WindowManager/panels/VerticalPanel.vue +308 -0
- package/components/templates/default.vue +4 -40
- package/components/templates/home.vue +31 -5
- package/components/templates/plain.vue +30 -4
- package/components/templates/standalone.vue +1 -1
- package/composables/useI18n.ts +10 -1
- package/composables/useInterval.ts +15 -0
- package/config/__test__/uiplugins.test.ts +309 -0
- package/config/labels-annotations.js +9 -1
- package/config/product/auth.js +1 -0
- package/config/product/explorer.js +3 -1
- package/config/product/manager.js +20 -9
- package/config/query-params.js +1 -0
- package/config/router/routes.js +10 -2
- package/config/settings.ts +10 -2
- package/config/store.js +4 -2
- package/config/table-headers.js +8 -0
- package/config/types.js +11 -0
- package/config/uiplugins.js +46 -2
- package/config/version.js +1 -1
- package/core/__test__/extension-manager-impl.test.js +236 -0
- package/core/extension-manager-impl.js +23 -6
- package/core/plugin-helpers.ts +2 -0
- package/core/types-provisioning.ts +4 -1
- package/detail/pod.vue +1 -0
- package/detail/provisioning.cattle.io.cluster.vue +13 -1
- package/dialog/AddonConfigConfirmationDialog.vue +45 -1
- package/dialog/DeveloperLoadExtensionDialog.vue +12 -3
- package/dialog/RollbackWorkloadDialog.vue +2 -5
- package/directives/ui-context.ts +103 -0
- package/edit/__tests__/fleet.cattle.io.helmop.test.ts +52 -11
- package/edit/auth/AuthProviderWarningBanners.vue +14 -1
- package/edit/auth/__tests__/oidc.test.ts +26 -0
- package/edit/auth/github-app-steps.vue +97 -0
- package/edit/auth/github-steps.vue +75 -0
- package/edit/auth/github.vue +99 -65
- package/edit/auth/oidc.vue +5 -1
- package/edit/autoscaling.horizontalpodautoscaler/index.vue +1 -0
- package/edit/cloudcredential.vue +1 -1
- package/edit/configmap.vue +1 -0
- package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -0
- package/edit/fleet.cattle.io.gitrepo.vue +0 -10
- package/edit/fleet.cattle.io.helmop.vue +51 -2
- package/edit/helm.cattle.io.projecthelmchart.vue +1 -0
- package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +1 -0
- package/edit/logging-flow/index.vue +1 -0
- package/edit/logging.banzaicloud.io.output/index.vue +1 -0
- package/edit/management.cattle.io.fleetworkspace.vue +1 -1
- package/edit/management.cattle.io.project.vue +1 -0
- package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +4 -1
- package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +2 -1
- package/edit/monitoring.coreos.com.prometheusrule/index.vue +1 -0
- package/edit/monitoring.coreos.com.receiver/index.vue +2 -1
- package/edit/monitoring.coreos.com.route.vue +1 -1
- package/edit/namespace.vue +1 -0
- package/edit/networking.istio.io.destinationrule/index.vue +1 -0
- package/edit/networking.k8s.io.ingress/index.vue +1 -0
- package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +15 -5
- package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +1 -0
- package/edit/networking.k8s.io.networkpolicy/index.vue +1 -0
- package/edit/node.vue +1 -0
- package/edit/persistentvolume/index.vue +27 -22
- package/edit/persistentvolume/plugins/awsElasticBlockStore.vue +13 -14
- package/edit/persistentvolume/plugins/azureDisk.vue +49 -48
- package/edit/persistentvolume/plugins/azureFile.vue +15 -14
- package/edit/persistentvolume/plugins/cephfs.vue +15 -14
- package/edit/persistentvolume/plugins/cinder.vue +15 -14
- package/edit/persistentvolume/plugins/csi.vue +18 -16
- package/edit/persistentvolume/plugins/fc.vue +13 -14
- package/edit/persistentvolume/plugins/flexVolume.vue +15 -14
- package/edit/persistentvolume/plugins/flocker.vue +1 -3
- package/edit/persistentvolume/plugins/gcePersistentDisk.vue +13 -14
- package/edit/persistentvolume/plugins/glusterfs.vue +15 -14
- package/edit/persistentvolume/plugins/hostPath.vue +40 -39
- package/edit/persistentvolume/plugins/iscsi.vue +13 -14
- package/edit/persistentvolume/plugins/local.vue +1 -3
- package/edit/persistentvolume/plugins/longhorn.vue +23 -22
- package/edit/persistentvolume/plugins/nfs.vue +15 -14
- package/edit/persistentvolume/plugins/photonPersistentDisk.vue +1 -14
- package/edit/persistentvolume/plugins/portworxVolume.vue +15 -14
- package/edit/persistentvolume/plugins/quobyte.vue +15 -14
- package/edit/persistentvolume/plugins/rbd.vue +15 -14
- package/edit/persistentvolume/plugins/scaleIO.vue +15 -14
- package/edit/persistentvolume/plugins/storageos.vue +15 -14
- package/edit/persistentvolume/plugins/vsphereVolume.vue +1 -3
- package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +32 -5
- package/edit/provisioning.cattle.io.cluster/__tests__/CustomCommand.test.ts +35 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/Networking.test.ts +155 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +11 -9
- package/edit/provisioning.cattle.io.cluster/index.vue +25 -15
- package/edit/provisioning.cattle.io.cluster/rke2.vue +98 -17
- package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +28 -2
- package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +107 -5
- package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +92 -4
- package/edit/secret/index.vue +1 -1
- package/edit/service.vue +9 -4
- package/edit/serviceaccount.vue +1 -0
- package/edit/storage.k8s.io.storageclass/index.vue +1 -0
- package/edit/workload/index.vue +2 -1
- package/edit/workload/mixins/workload.js +1 -1
- package/initialize/App.vue +4 -4
- package/initialize/install-directives.js +2 -0
- package/initialize/install-plugins.js +19 -2
- package/list/projectsecret.vue +1 -1
- package/list/provisioning.cattle.io.cluster.vue +15 -2
- package/machine-config/amazonec2.vue +42 -135
- package/machine-config/azure.vue +1 -1
- package/machine-config/components/EC2Networking.vue +490 -0
- package/machine-config/components/__tests__/EC2Networking.test.ts +148 -0
- package/machine-config/components/__tests__/utils/vpcSubnetMockData.js +294 -0
- package/machine-config/digitalocean.vue +11 -0
- package/machine-config/google.vue +1 -1
- package/mixins/__tests__/brand.spec.ts +2 -2
- package/mixins/__tests__/chart.test.ts +21 -0
- package/mixins/brand.js +1 -7
- package/mixins/chart.js +8 -2
- package/mixins/create-edit-view/index.js +5 -0
- package/models/__tests__/chart.test.ts +49 -12
- package/models/__tests__/compliance.cattle.io.clusterscanprofile.spec.js +30 -0
- package/models/__tests__/provisioning.cattle.io.cluster.test.ts +112 -5
- package/models/catalog.cattle.io.app.js +1 -1
- package/models/chart.js +28 -14
- package/models/cluster/node.js +13 -6
- package/models/cluster.x-k8s.io.machine.js +10 -20
- package/models/cluster.x-k8s.io.machinedeployment.js +5 -1
- package/models/compliance.cattle.io.clusterscanprofile.js +1 -1
- package/models/management.cattle.io.authconfig.js +1 -0
- package/models/management.cattle.io.cluster.js +21 -3
- package/models/management.cattle.io.kontainerdriver.js +1 -0
- package/models/provisioning.cattle.io.cluster.js +249 -33
- package/package.json +6 -5
- package/pages/auth/login.vue +43 -4
- package/pages/auth/verify.vue +1 -1
- package/pages/c/_cluster/apps/charts/AppChartCardSubHeader.vue +3 -2
- package/pages/c/_cluster/apps/charts/__tests__/chart.test.ts +135 -0
- package/pages/c/_cluster/apps/charts/chart.vue +35 -17
- package/pages/c/_cluster/apps/charts/index.vue +11 -13
- package/pages/c/_cluster/apps/charts/install.vue +1 -1
- package/pages/c/_cluster/explorer/EventsTable.vue +89 -3
- package/pages/c/_cluster/explorer/index.vue +8 -6
- package/pages/c/_cluster/explorer/tools/index.vue +3 -3
- package/pages/c/_cluster/manager/hostedprovider/index.vue +220 -0
- package/pages/c/_cluster/settings/brand.vue +1 -1
- package/pages/c/_cluster/settings/performance.vue +12 -25
- package/pages/c/_cluster/uiplugins/__tests__/index.test.ts +7 -0
- package/pages/c/_cluster/uiplugins/catalogs.vue +147 -0
- package/pages/c/_cluster/uiplugins/index.vue +126 -184
- package/pages/home.vue +327 -16
- package/pkg/dynamic-importer.lib.js +4 -0
- package/plugins/axios.js +2 -1
- package/plugins/dashboard-client-init.js +3 -0
- package/plugins/dashboard-store/actions.js +1 -1
- package/plugins/dashboard-store/getters.js +18 -1
- package/plugins/dashboard-store/resource-class.js +21 -6
- package/plugins/dynamic-content.js +13 -0
- package/plugins/i18n.js +8 -0
- package/plugins/steve/__tests__/steve-pagination-utils.test.ts +333 -0
- package/plugins/steve/steve-pagination-utils.ts +41 -22
- package/plugins/steve/subscribe.js +17 -9
- package/plugins/subscribe-events.ts +4 -2
- package/rancher-components/Form/Checkbox/Checkbox.vue +1 -1
- package/rancher-components/Pill/RcStatusBadge/RcStatusBadge.vue +6 -34
- package/rancher-components/Pill/RcStatusBadge/index.ts +0 -1
- package/rancher-components/Pill/RcStatusBadge/types.ts +1 -1
- package/rancher-components/Pill/RcStatusIndicator/RcStatusIndicator.vue +5 -28
- package/rancher-components/Pill/RcStatusIndicator/types.ts +2 -1
- package/rancher-components/Pill/types.ts +0 -1
- package/rancher-components/RcDropdown/RcDropdownItem.vue +1 -0
- package/rancher-components/RcDropdown/RcDropdownItemSelect.vue +5 -1
- package/rancher-components/RcIcon/RcIcon.test.ts +51 -0
- package/rancher-components/RcIcon/RcIcon.vue +46 -0
- package/rancher-components/RcIcon/index.ts +1 -0
- package/rancher-components/RcIcon/types.ts +160 -0
- package/rancher-components/utils/status.test.ts +67 -0
- package/rancher-components/utils/status.ts +77 -0
- package/scripts/extension/publish +1 -1
- package/scripts/typegen.sh +1 -0
- package/store/action-menu.js +8 -0
- package/store/auth.js +11 -6
- package/store/aws.js +8 -6
- package/store/catalog.js +6 -0
- package/store/features.js +2 -0
- package/store/index.js +45 -20
- package/store/notifications.ts +51 -4
- package/store/plugins.js +7 -3
- package/store/prefs.js +12 -6
- package/store/type-map.js +3 -3
- package/store/ui-context.ts +86 -0
- package/store/wm.ts +244 -0
- package/types/kube/kube-api.ts +2 -1
- package/types/notifications/index.ts +27 -3
- package/types/rancher/index.d.ts +1 -0
- package/types/resources/settings.d.ts +29 -7
- package/types/shell/index.d.ts +138 -4
- package/types/store/__tests__/pagination.types.spec.ts +137 -0
- package/types/store/pagination.types.ts +157 -9
- package/types/store/subscribe-events.types.ts +8 -1
- package/types/store/subscribe.types.ts +1 -0
- package/types/window-manager.ts +24 -0
- package/utils/__tests__/cluster.test.ts +379 -1
- package/utils/__tests__/object.test.ts +19 -0
- package/utils/__tests__/provider.test.ts +98 -0
- package/utils/__tests__/selector-typed.test.ts +263 -0
- package/utils/__tests__/version.test.ts +19 -1
- package/utils/autoscaler-utils.ts +7 -0
- package/utils/back-off.ts +3 -3
- package/utils/brand.ts +29 -0
- package/utils/chart.js +18 -0
- package/utils/cluster.js +157 -3
- package/utils/color.js +1 -1
- package/utils/dynamic-content/__tests__/announcement.test.ts +498 -0
- package/utils/dynamic-content/__tests__/config.test.ts +187 -0
- package/utils/dynamic-content/__tests__/index.test.ts +390 -0
- package/utils/dynamic-content/__tests__/info.test.ts +275 -0
- package/utils/dynamic-content/__tests__/new-release.test.ts +216 -0
- package/utils/dynamic-content/__tests__/support-notice.test.ts +262 -0
- package/utils/dynamic-content/__tests__/util.test.ts +235 -0
- package/utils/dynamic-content/announcement.ts +142 -0
- package/utils/dynamic-content/config.ts +55 -0
- package/utils/dynamic-content/example.json +40 -0
- package/utils/dynamic-content/index.ts +277 -0
- package/utils/dynamic-content/info.ts +261 -0
- package/utils/dynamic-content/new-release.ts +126 -0
- package/utils/dynamic-content/notification-handler.ts +48 -0
- package/utils/dynamic-content/support-notice.ts +169 -0
- package/utils/dynamic-content/types.d.ts +153 -0
- package/utils/dynamic-content/util.ts +122 -0
- package/utils/dynamic-importer.js +2 -2
- package/utils/favicon.js +4 -4
- package/utils/inactivity.ts +104 -0
- package/utils/object.js +20 -2
- package/utils/pagination-utils.ts +19 -4
- package/utils/pagination-wrapper.ts +12 -8
- package/utils/provider.ts +14 -0
- package/utils/release-notes.ts +1 -1
- package/utils/scroll.js +7 -0
- package/utils/selector-typed.ts +6 -2
- package/utils/settings.ts +15 -0
- package/utils/validators/machine-pool.ts +13 -3
- package/utils/version.js +15 -0
- package/assets/images/icons/document.svg +0 -3
- package/plugins/nuxt-client-init.js +0 -3
- package/store/wm.js +0 -95
- /package/components/{nav/WindowManager → Window}/ChartReadme.vue +0 -0
- /package/components/{nav/WindowManager → Window}/ContainerShell.vue +0 -0
- /package/components/{nav/WindowManager → Window}/KubectlShell.vue +0 -0
- /package/components/{nav/WindowManager → Window}/MachineSsh.vue +0 -0
- /package/components/{nav/WindowManager → Window}/Window.vue +0 -0
|
@@ -1,24 +1,28 @@
|
|
|
1
1
|
import ProvCluster from '@shell/models/provisioning.cattle.io.cluster';
|
|
2
|
-
|
|
2
|
+
jest.mock('@shell/utils/provider', () => ({
|
|
3
|
+
isHostedProvider: jest.fn().mockImplementation((context, provider) => {
|
|
4
|
+
return ['GKE', 'EKS', 'AKS'].includes(provider);
|
|
5
|
+
})
|
|
6
|
+
}));
|
|
3
7
|
describe('class ProvCluster', () => {
|
|
4
8
|
const gkeClusterWithPrivateEndpoint = {
|
|
5
9
|
clusterName: 'test',
|
|
6
10
|
provisioner: 'GKE',
|
|
7
|
-
spec: {
|
|
11
|
+
spec: { },
|
|
8
12
|
mgmt: { spec: { gkeConfig: { privateClusterConfig: { enablePrivateEndpoint: true } } } }
|
|
9
13
|
};
|
|
10
14
|
|
|
11
15
|
const eksClusterWithPrivateEndpoint = {
|
|
12
16
|
clusterName: 'test',
|
|
13
17
|
provisioner: 'EKS',
|
|
14
|
-
spec: {
|
|
18
|
+
spec: { },
|
|
15
19
|
mgmt: { spec: { eksConfig: { privateAccess: true } } }
|
|
16
20
|
};
|
|
17
21
|
|
|
18
22
|
const aksClusterWithPrivateEndpoint = {
|
|
19
23
|
clusterName: 'test',
|
|
20
24
|
provisioner: 'AKS',
|
|
21
|
-
spec: {
|
|
25
|
+
spec: { },
|
|
22
26
|
mgmt: { spec: { aksConfig: { privateCluster: true } } }
|
|
23
27
|
};
|
|
24
28
|
|
|
@@ -44,12 +48,115 @@ describe('class ProvCluster', () => {
|
|
|
44
48
|
clusterData.provisioner
|
|
45
49
|
);
|
|
46
50
|
|
|
47
|
-
expect(cluster.isRke2).toBe(
|
|
51
|
+
expect(cluster.isRke2).toBe(false);
|
|
48
52
|
expect(cluster.isHostedKubernetesProvider).toBe(expected);
|
|
49
53
|
expect(cluster.isPrivateHostedProvider).toBe(expected);
|
|
50
54
|
resetMocks();
|
|
51
55
|
});
|
|
52
56
|
});
|
|
57
|
+
describe('isImported', () => {
|
|
58
|
+
const testCases = [
|
|
59
|
+
{
|
|
60
|
+
description: 'should return false for a local cluster',
|
|
61
|
+
clusterData: { isLocal: true },
|
|
62
|
+
expected: false
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
description: 'should return true for an imported k3s cluster',
|
|
66
|
+
clusterData: {
|
|
67
|
+
isLocal: false,
|
|
68
|
+
mgmt: { status: { provider: 'k3s', driver: 'k3s' } }
|
|
69
|
+
},
|
|
70
|
+
expected: true
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
description: 'should return false for a provisioned k3s cluster',
|
|
74
|
+
clusterData: {
|
|
75
|
+
isLocal: false,
|
|
76
|
+
mgmt: { status: { provider: 'k3s', driver: 'imported' } }
|
|
77
|
+
},
|
|
78
|
+
expected: false
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
description: 'should return true for an imported rke2 cluster',
|
|
82
|
+
clusterData: {
|
|
83
|
+
isLocal: false,
|
|
84
|
+
mgmt: { status: { provider: 'rke2', driver: 'rke2' } }
|
|
85
|
+
},
|
|
86
|
+
expected: true
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
description: 'should return false for a provisioned rke2 cluster',
|
|
90
|
+
clusterData: {
|
|
91
|
+
isLocal: false,
|
|
92
|
+
mgmt: { status: { provider: 'rke2', driver: 'imported' } }
|
|
93
|
+
},
|
|
94
|
+
expected: false
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
description: 'should return true for an imported hosted cluster',
|
|
98
|
+
clusterData: {
|
|
99
|
+
isLocal: false,
|
|
100
|
+
isHostedKubernetesProvider: true,
|
|
101
|
+
providerConfig: { imported: true }
|
|
102
|
+
},
|
|
103
|
+
expected: true
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
description: 'should return false for a provisioned hosted cluster',
|
|
107
|
+
clusterData: {
|
|
108
|
+
isLocal: false,
|
|
109
|
+
isHostedKubernetesProvider: true,
|
|
110
|
+
providerConfig: { imported: false }
|
|
111
|
+
},
|
|
112
|
+
expected: false
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
description: 'should return true for a generic imported cluster',
|
|
116
|
+
clusterData: {
|
|
117
|
+
isLocal: false,
|
|
118
|
+
provisioner: 'imported'
|
|
119
|
+
},
|
|
120
|
+
expected: true
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
description: 'should return false for a generic provisioned cluster',
|
|
124
|
+
clusterData: {
|
|
125
|
+
isLocal: false,
|
|
126
|
+
provisioner: 'rke2'
|
|
127
|
+
},
|
|
128
|
+
expected: false
|
|
129
|
+
}
|
|
130
|
+
];
|
|
131
|
+
const resetMocks = () => {
|
|
132
|
+
// Clear all mock function calls:
|
|
133
|
+
jest.clearAllMocks();
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
it.each(testCases)('$description', ({ clusterData, expected }) => {
|
|
137
|
+
const cluster = new ProvCluster({});
|
|
138
|
+
|
|
139
|
+
// Mock getters
|
|
140
|
+
jest.spyOn(cluster, 'mgmt', 'get').mockReturnValue(
|
|
141
|
+
clusterData.mgmt
|
|
142
|
+
);
|
|
143
|
+
if (clusterData.isLocal !== undefined) {
|
|
144
|
+
jest.spyOn(cluster, 'isLocal', 'get').mockReturnValue(clusterData.isLocal);
|
|
145
|
+
}
|
|
146
|
+
if (clusterData.isHostedKubernetesProvider !== undefined) {
|
|
147
|
+
jest.spyOn(cluster, 'isHostedKubernetesProvider', 'get').mockReturnValue(clusterData.isHostedKubernetesProvider);
|
|
148
|
+
}
|
|
149
|
+
if (clusterData.providerConfig !== undefined) {
|
|
150
|
+
jest.spyOn(cluster, 'providerConfig', 'get').mockReturnValue(clusterData.providerConfig);
|
|
151
|
+
}
|
|
152
|
+
if (clusterData.provisioner !== undefined) {
|
|
153
|
+
jest.spyOn(cluster, 'provisioner', 'get').mockReturnValue(clusterData.provisioner);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
expect(cluster.isImported).toBe(expected);
|
|
157
|
+
resetMocks();
|
|
158
|
+
});
|
|
159
|
+
});
|
|
53
160
|
|
|
54
161
|
describe('hasError', () => {
|
|
55
162
|
const conditionsWithoutError = [
|
|
@@ -323,7 +323,7 @@ export default class CatalogApp extends SteveModel {
|
|
|
323
323
|
|
|
324
324
|
get relatedResourcesToRemove() {
|
|
325
325
|
return async() => {
|
|
326
|
-
const crd = this.spec
|
|
326
|
+
const crd = this.spec?.chart?.metadata?.annotations?.[CATALOG_ANNOTATIONS.AUTO_INSTALL]?.replace('=match', '');
|
|
327
327
|
|
|
328
328
|
return await this.$dispatch('find', {
|
|
329
329
|
type: CATALOG.APP,
|
package/models/chart.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { APP_UPGRADE_STATUS } from '@shell/store/catalog';
|
|
2
2
|
import {
|
|
3
3
|
REPO_TYPE, REPO, CHART, VERSION, _FLAGGED, HIDE_SIDE_NAV, CATEGORY, TAG, DEPRECATED as DEPRECATED_QUERY
|
|
4
4
|
} from '@shell/config/query-params';
|
|
5
5
|
import { BLANK_CLUSTER } from '@shell/store/store-types.js';
|
|
6
|
+
import { SHOW_PRE_RELEASE } from '@shell/store/prefs';
|
|
7
|
+
import { getLatestCompatibleVersion } from '@shell/utils/chart';
|
|
6
8
|
import SteveModel from '@shell/plugins/steve/steve-class';
|
|
7
9
|
import { CATALOG, ZERO_TIME } from '@shell/config/types';
|
|
8
10
|
import { CATALOG as CATALOG_ANNOTATIONS } from '@shell/config/labels-annotations';
|
|
@@ -10,17 +12,7 @@ import day from 'dayjs';
|
|
|
10
12
|
|
|
11
13
|
export default class Chart extends SteveModel {
|
|
12
14
|
queryParams(from, hideSideNav) {
|
|
13
|
-
|
|
14
|
-
const chartVersions = this.versions;
|
|
15
|
-
const currentCluster = this.$rootGetters['currentCluster'];
|
|
16
|
-
const workerOSs = currentCluster?.workerOSs;
|
|
17
|
-
const compatibleVersions = compatibleVersionsFor(this, workerOSs);
|
|
18
|
-
|
|
19
|
-
if (compatibleVersions.length) {
|
|
20
|
-
version = compatibleVersions[0].version;
|
|
21
|
-
} else {
|
|
22
|
-
version = chartVersions[0].version;
|
|
23
|
-
}
|
|
15
|
+
const version = this.latestCompatibleVersion.version;
|
|
24
16
|
|
|
25
17
|
const out = {
|
|
26
18
|
[REPO_TYPE]: this.repoType,
|
|
@@ -115,6 +107,26 @@ export default class Chart extends SteveModel {
|
|
|
115
107
|
return this.isInstalled && this.matchingInstalledApps[0].upgradeAvailable === APP_UPGRADE_STATUS.SINGLE_UPGRADE;
|
|
116
108
|
}
|
|
117
109
|
|
|
110
|
+
/**
|
|
111
|
+
* Retrieves the latest chart version that is compatible with the current cluster's OS and user's pre-release preference.
|
|
112
|
+
* It caches the result for efficiency.
|
|
113
|
+
*
|
|
114
|
+
* @returns {Object} The latest compatible chart version object.
|
|
115
|
+
*/
|
|
116
|
+
get latestCompatibleVersion() {
|
|
117
|
+
if (this._latestCompatibleVersion) {
|
|
118
|
+
return this._latestCompatibleVersion;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const currentCluster = this.$rootGetters['currentCluster'];
|
|
122
|
+
const workerOSs = currentCluster?.workerOSs;
|
|
123
|
+
const showPrerelease = this.$rootGetters['prefs/get'](SHOW_PRE_RELEASE);
|
|
124
|
+
|
|
125
|
+
this._latestCompatibleVersion = getLatestCompatibleVersion(this, workerOSs, showPrerelease);
|
|
126
|
+
|
|
127
|
+
return this._latestCompatibleVersion;
|
|
128
|
+
}
|
|
129
|
+
|
|
118
130
|
/**
|
|
119
131
|
* Builds structured metadata for display in RcItemCard.vue:
|
|
120
132
|
* - Sub-header (version and last updated)
|
|
@@ -125,7 +137,7 @@ export default class Chart extends SteveModel {
|
|
|
125
137
|
*/
|
|
126
138
|
get cardContent() {
|
|
127
139
|
if (!this._cardContent) {
|
|
128
|
-
const latestVersion = this.
|
|
140
|
+
const latestVersion = this.latestCompatibleVersion;
|
|
129
141
|
const subHeaderItems = [];
|
|
130
142
|
|
|
131
143
|
if (latestVersion) {
|
|
@@ -195,8 +207,10 @@ export default class Chart extends SteveModel {
|
|
|
195
207
|
}
|
|
196
208
|
|
|
197
209
|
if (this.isInstalled) {
|
|
210
|
+
const installedVersion = this.matchingInstalledApps[0]?.spec?.chart?.metadata?.version;
|
|
211
|
+
|
|
198
212
|
statuses.push({
|
|
199
|
-
icon: 'icon-confirmation-alt', color: 'success', tooltip: {
|
|
213
|
+
icon: 'icon-confirmation-alt', color: 'success', tooltip: { text: `${ this.t('generic.installed') } (${ installedVersion })` }
|
|
200
214
|
});
|
|
201
215
|
}
|
|
202
216
|
|
package/models/cluster/node.js
CHANGED
|
@@ -4,7 +4,6 @@ import {
|
|
|
4
4
|
CAPI, MANAGEMENT, METRIC, NORMAN, POD
|
|
5
5
|
} from '@shell/config/types';
|
|
6
6
|
import { parseSi } from '@shell/utils/units';
|
|
7
|
-
import findLast from 'lodash/findLast';
|
|
8
7
|
|
|
9
8
|
import SteveModel from '@shell/plugins/steve/steve-class';
|
|
10
9
|
import { LOCAL } from '@shell/config/query-params';
|
|
@@ -96,15 +95,23 @@ export default class ClusterNode extends SteveModel {
|
|
|
96
95
|
return this.status?.addresses || [];
|
|
97
96
|
}
|
|
98
97
|
|
|
99
|
-
get
|
|
100
|
-
return
|
|
98
|
+
get internalIps() {
|
|
99
|
+
return this.addresses.filter((address) => address.type === 'InternalIP').map((address) => address.address);
|
|
101
100
|
}
|
|
102
101
|
|
|
103
|
-
get
|
|
102
|
+
get externalIps() {
|
|
104
103
|
const annotationAddress = this.metadata.annotations[RKE.EXTERNAL_IP];
|
|
105
|
-
const
|
|
104
|
+
const statusAddresses = this.addresses.filter((address) => address.type === 'ExternalIP').map((address) => address.address);
|
|
105
|
+
|
|
106
|
+
return statusAddresses.concat(annotationAddress || []);
|
|
107
|
+
}
|
|
106
108
|
|
|
107
|
-
|
|
109
|
+
get internalIp() {
|
|
110
|
+
return this.internalIps[0];
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
get externalIp() {
|
|
114
|
+
return this.externalIps[0];
|
|
108
115
|
}
|
|
109
116
|
|
|
110
117
|
get labels() {
|
|
@@ -244,29 +244,19 @@ export default class CapiMachine extends SteveModel {
|
|
|
244
244
|
return this.status?.phase === 'Running';
|
|
245
245
|
}
|
|
246
246
|
|
|
247
|
-
get
|
|
248
|
-
|
|
249
|
-
// list of nodes in the cluster detail page of Cluster Management.
|
|
250
|
-
const internal = this.status?.addresses?.find(({ type }) => {
|
|
251
|
-
return type === ADDRESSES.INTERNAL_IP;
|
|
252
|
-
})?.address;
|
|
253
|
-
|
|
254
|
-
if (internal) {
|
|
255
|
-
return internal;
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
return this.t('generic.none');
|
|
247
|
+
get internalIps() {
|
|
248
|
+
return this.status?.addresses?.filter(({ type }) => type === ADDRESSES.INTERNAL_IP).map((addr) => addr.address) || [];
|
|
259
249
|
}
|
|
260
250
|
|
|
261
|
-
get
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
})?.address;
|
|
251
|
+
get externalIps() {
|
|
252
|
+
return this.status?.addresses?.filter(({ type }) => type === ADDRESSES.EXTERNAL_IP).map((addr) => addr.address) || [];
|
|
253
|
+
}
|
|
265
254
|
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
255
|
+
get internalIp() {
|
|
256
|
+
return this.internalIps[0];
|
|
257
|
+
}
|
|
269
258
|
|
|
270
|
-
|
|
259
|
+
get externalIp() {
|
|
260
|
+
return this.externalIps[0];
|
|
271
261
|
}
|
|
272
262
|
}
|
|
@@ -4,7 +4,7 @@ import { sortBy } from '@shell/utils/sort';
|
|
|
4
4
|
import SteveModel from '@shell/plugins/steve/steve-class';
|
|
5
5
|
import { exceptionToErrorsArray } from '@shell/utils/error';
|
|
6
6
|
import { handleConflict } from '@shell/plugins/dashboard-store/normalize';
|
|
7
|
-
import { MACHINE_ROLES } from '@shell/config/labels-annotations';
|
|
7
|
+
import { CAPI as CAPI_ANNOTATIONS, MACHINE_ROLES } from '@shell/config/labels-annotations';
|
|
8
8
|
import { notOnlyOfRole } from '@shell/models/cluster.x-k8s.io.machine';
|
|
9
9
|
import { KIND } from '../config/elemental-types';
|
|
10
10
|
import { KIND as HARVESTER_KIND } from '../config/harvester-manager-types';
|
|
@@ -173,6 +173,10 @@ export default class CapiMachineDeployment extends SteveModel {
|
|
|
173
173
|
}, 1000);
|
|
174
174
|
}
|
|
175
175
|
|
|
176
|
+
get isAutoscalerEnabled() {
|
|
177
|
+
return this.annotations?.[CAPI_ANNOTATIONS.AUTOSCALER_MACHINE_POOL_MIN_SIZE] || this.annotations?.[CAPI_ANNOTATIONS.AUTOSCALER_MACHINE_POOL_MAX_SIZE];
|
|
178
|
+
}
|
|
179
|
+
|
|
176
180
|
// prevent scaling pool to 0 if it would scale down the only etcd or control plane node
|
|
177
181
|
canScaleDownPool() {
|
|
178
182
|
if (!this.canUpdate || this.inClusterSpec?.quantity === 0 || this.infrastructureRefKind === KIND.MACHINE_INV_SELECTOR_TEMPLATES) {
|
|
@@ -15,6 +15,7 @@ import { LINUX, WINDOWS } from '@shell/store/catalog';
|
|
|
15
15
|
import { KONTAINER_TO_DRIVER } from './management.cattle.io.kontainerdriver';
|
|
16
16
|
import { PINNED_CLUSTERS } from '@shell/store/prefs';
|
|
17
17
|
import { copyTextToClipboard } from '@shell/utils/clipboard';
|
|
18
|
+
import { isHostedProvider } from '@shell/utils/provider';
|
|
18
19
|
|
|
19
20
|
const DEFAULT_BADGE_COLOR = '#707070';
|
|
20
21
|
|
|
@@ -171,9 +172,20 @@ export default class MgmtCluster extends SteveModel {
|
|
|
171
172
|
return this.isCondition('Ready');
|
|
172
173
|
}
|
|
173
174
|
|
|
175
|
+
get config() {
|
|
176
|
+
if (!this.spec?.[`${ this.provisioner }Config`]) {
|
|
177
|
+
const allKeys = Object.keys(this.spec);
|
|
178
|
+
const configKey = allKeys.find( (k) => k.endsWith('Config'));
|
|
179
|
+
|
|
180
|
+
return this.spec[configKey];
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
return this.spec?.[`${ this.provisioner }Config`];
|
|
184
|
+
}
|
|
185
|
+
|
|
174
186
|
get kubernetesVersionRaw() {
|
|
175
187
|
const fromStatus = this.status?.version?.gitVersion;
|
|
176
|
-
const fromSpec = this.
|
|
188
|
+
const fromSpec = this.config?.kubernetesVersion;
|
|
177
189
|
|
|
178
190
|
return fromStatus || fromSpec;
|
|
179
191
|
}
|
|
@@ -239,9 +251,15 @@ export default class MgmtCluster extends SteveModel {
|
|
|
239
251
|
}
|
|
240
252
|
|
|
241
253
|
get isHostedKubernetesProvider() {
|
|
242
|
-
const
|
|
254
|
+
const context = {
|
|
255
|
+
dispatch: this.$dispatch,
|
|
256
|
+
getters: this.$getters,
|
|
257
|
+
axios: this.$axios,
|
|
258
|
+
$extension: this.$plugin,
|
|
259
|
+
t: (...args) => this.t.apply(this, args),
|
|
260
|
+
};
|
|
243
261
|
|
|
244
|
-
return
|
|
262
|
+
return isHostedProvider(context, this.provisioner);
|
|
245
263
|
}
|
|
246
264
|
|
|
247
265
|
get providerLogo() {
|