@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,5 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
|
-
CAPI, MANAGEMENT, NAMESPACE, NORMAN, SNAPSHOT, HCI, LOCAL_CLUSTER
|
|
2
|
+
CAPI, MANAGEMENT, NAMESPACE, NORMAN, SNAPSHOT, HCI, LOCAL_CLUSTER,
|
|
3
|
+
CONFIG_MAP, AUTOSCALER_CONFIG_MAP_ID,
|
|
4
|
+
EVENT
|
|
3
5
|
} from '@shell/config/types';
|
|
4
6
|
import SteveModel from '@shell/plugins/steve/steve-class';
|
|
5
7
|
import { findBy } from '@shell/utils/array';
|
|
@@ -7,10 +9,14 @@ import { get, set } from '@shell/utils/object';
|
|
|
7
9
|
import { sortBy } from '@shell/utils/sort';
|
|
8
10
|
import { ucFirst } from '@shell/utils/string';
|
|
9
11
|
import { compare } from '@shell/utils/version';
|
|
10
|
-
import { AS, MODE, _VIEW, _YAML } from '@shell/config/query-params';
|
|
11
12
|
import { HARVESTER_NAME as HARVESTER } from '@shell/config/features';
|
|
12
13
|
import { CAPI as CAPI_ANNOTATIONS, NODE_ARCHITECTURE } from '@shell/config/labels-annotations';
|
|
13
14
|
import { KEV1 } from '@shell/models/management.cattle.io.kontainerdriver';
|
|
15
|
+
import jsyaml from 'js-yaml';
|
|
16
|
+
import { defineAsyncComponent, markRaw } from 'vue';
|
|
17
|
+
import stevePaginationUtils from '@shell/plugins/steve/steve-pagination-utils';
|
|
18
|
+
import { PaginationFilterField, PaginationParamFilter } from '@shell/types/store/pagination.types';
|
|
19
|
+
import { isHostedProvider } from '@shell/utils/provider';
|
|
14
20
|
|
|
15
21
|
const RKE1_ALLOWED_ACTIONS = [
|
|
16
22
|
'promptRemove',
|
|
@@ -21,6 +27,11 @@ const RKE1_ALLOWED_ACTIONS = [
|
|
|
21
27
|
'viewInApi'
|
|
22
28
|
];
|
|
23
29
|
|
|
30
|
+
const AUTOSCALER_STATUS = {
|
|
31
|
+
PROVISIONING: 'provisioning',
|
|
32
|
+
UNAVAILABLE: 'unavailable'
|
|
33
|
+
};
|
|
34
|
+
|
|
24
35
|
/**
|
|
25
36
|
* Class representing Cluster resource.
|
|
26
37
|
* @extends SteveModel
|
|
@@ -48,6 +59,17 @@ export default class ProvCluster extends SteveModel {
|
|
|
48
59
|
label: this.t('cluster.detail.machines'),
|
|
49
60
|
content: this.desired,
|
|
50
61
|
},
|
|
62
|
+
{
|
|
63
|
+
label: 'Autoscaler',
|
|
64
|
+
content: this.isAutoscalerEnabled,
|
|
65
|
+
valueOverride: {
|
|
66
|
+
component: markRaw(defineAsyncComponent(() => import('@shell/components/formatter/Autoscaler.vue'))),
|
|
67
|
+
props: {
|
|
68
|
+
value: true,
|
|
69
|
+
row: this
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
51
73
|
].filter((x) => !!x.content);
|
|
52
74
|
|
|
53
75
|
if (!this.machineProvider) {
|
|
@@ -148,7 +170,14 @@ export default class ProvCluster extends SteveModel {
|
|
|
148
170
|
label: this.$rootGetters['i18n/t']('nav.rotateEncryptionKeys'),
|
|
149
171
|
icon: 'icon icon-refresh',
|
|
150
172
|
enabled: canEditRKE2cluster
|
|
151
|
-
},
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
action: 'toggleAutoscalerRunner',
|
|
176
|
+
label: this.isAutoscalerPaused ? 'Resume Autoscaler' : 'Pause Autoscaler',
|
|
177
|
+
icon: `icon ${ this.isAutoscalerPaused ? 'icon-play' : 'icon-pause' }`,
|
|
178
|
+
enabled: this.canPauseResumeAutoscaler
|
|
179
|
+
},
|
|
180
|
+
{ divider: true }];
|
|
152
181
|
|
|
153
182
|
const all = actions.concat(out);
|
|
154
183
|
|
|
@@ -231,26 +260,6 @@ export default class ProvCluster extends SteveModel {
|
|
|
231
260
|
}
|
|
232
261
|
}
|
|
233
262
|
|
|
234
|
-
goToViewYaml() {
|
|
235
|
-
let location;
|
|
236
|
-
|
|
237
|
-
if ( !this.isRke2 ) {
|
|
238
|
-
location = this.mgmt?.detailLocation;
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
if ( !location ) {
|
|
242
|
-
location = this.detailLocation;
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
location.query = {
|
|
246
|
-
...location.query,
|
|
247
|
-
[MODE]: _VIEW,
|
|
248
|
-
[AS]: _YAML
|
|
249
|
-
};
|
|
250
|
-
|
|
251
|
-
this.currentRouter().push(location);
|
|
252
|
-
}
|
|
253
|
-
|
|
254
263
|
get canDelete() {
|
|
255
264
|
return super.canDelete && this.stateObj?.name !== 'removing';
|
|
256
265
|
}
|
|
@@ -264,9 +273,26 @@ export default class ProvCluster extends SteveModel {
|
|
|
264
273
|
}
|
|
265
274
|
|
|
266
275
|
get isHostedKubernetesProvider() {
|
|
267
|
-
const
|
|
276
|
+
const context = {
|
|
277
|
+
dispatch: this.$dispatch,
|
|
278
|
+
getters: this.$getters,
|
|
279
|
+
axios: this.$axios,
|
|
280
|
+
$extension: this.$plugin,
|
|
281
|
+
t: (...args) => this.t.apply(this, args),
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
return isHostedProvider(context, this.provisioner);
|
|
285
|
+
}
|
|
268
286
|
|
|
269
|
-
|
|
287
|
+
get providerConfig() {
|
|
288
|
+
if ( this.isRke2 ) {
|
|
289
|
+
return this.spec.rkeConfig;
|
|
290
|
+
}
|
|
291
|
+
if (this.mgmt && this.mgmt.config) {
|
|
292
|
+
return this.mgmt.config;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
return null;
|
|
270
296
|
}
|
|
271
297
|
|
|
272
298
|
get isPrivateHostedProvider() {
|
|
@@ -306,13 +332,7 @@ export default class ProvCluster extends SteveModel {
|
|
|
306
332
|
|
|
307
333
|
// imported KEv2
|
|
308
334
|
// we can't rely on this.provisioner to determine imported-ness for these clusters, as it will return 'aks' 'eks' 'gke' for both provisioned and imported clusters
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
const isImportedKontainer = kontainerConfigs.filter((key) => {
|
|
312
|
-
return this.mgmt?.spec?.[key]?.imported === true;
|
|
313
|
-
}).length;
|
|
314
|
-
|
|
315
|
-
if (isImportedKontainer) {
|
|
335
|
+
if (this.isHostedKubernetesProvider && !!this.providerConfig.imported) {
|
|
316
336
|
return true;
|
|
317
337
|
}
|
|
318
338
|
|
|
@@ -361,7 +381,11 @@ export default class ProvCluster extends SteveModel {
|
|
|
361
381
|
}
|
|
362
382
|
|
|
363
383
|
get mgmtClusterId() {
|
|
364
|
-
|
|
384
|
+
// when a cluster is created `this` instance isn't immediately updated with `status.clusterName`
|
|
385
|
+
// Workaround - Get fresh copy from the store
|
|
386
|
+
const pCluster = this.$rootGetters['management/byId'](CAPI.RANCHER_CLUSTER, this.id);
|
|
387
|
+
|
|
388
|
+
return this.status?.clusterName || pCluster?.status?.clusterName;
|
|
365
389
|
}
|
|
366
390
|
|
|
367
391
|
get mgmt() {
|
|
@@ -1023,4 +1047,196 @@ export default class ProvCluster extends SteveModel {
|
|
|
1023
1047
|
get fullDetailPageOverride() {
|
|
1024
1048
|
return true;
|
|
1025
1049
|
}
|
|
1050
|
+
|
|
1051
|
+
async loadAutoscalerEvents() {
|
|
1052
|
+
const autoscalerConfigMap = await this.loadAutoscalerConfigMap();
|
|
1053
|
+
const eventSchema = this.$rootGetters['management/schemaFor'](EVENT);
|
|
1054
|
+
const fields = [new PaginationFilterField({
|
|
1055
|
+
field: 'involvedObject.uid',
|
|
1056
|
+
value: autoscalerConfigMap.metadata.uid,
|
|
1057
|
+
exact: true,
|
|
1058
|
+
}),
|
|
1059
|
+
new PaginationFilterField({
|
|
1060
|
+
field: 'metadata.namespace',
|
|
1061
|
+
value: 'kube-system',
|
|
1062
|
+
exact: true,
|
|
1063
|
+
})];
|
|
1064
|
+
const pagination = {
|
|
1065
|
+
page: 1,
|
|
1066
|
+
pageSize: 200,
|
|
1067
|
+
filters: [
|
|
1068
|
+
new PaginationParamFilter({ fields })
|
|
1069
|
+
]
|
|
1070
|
+
|
|
1071
|
+
};
|
|
1072
|
+
const params = stevePaginationUtils.createParamsForPagination({ schema: eventSchema, opt: { pagination } });
|
|
1073
|
+
const url = `/k8s/clusters/${ this.mgmtClusterId }/v1/${ EVENT }?${ params }`;
|
|
1074
|
+
|
|
1075
|
+
const events = (await this.$dispatch('cluster/request', { url }, { root: true }))?.data || [];
|
|
1076
|
+
|
|
1077
|
+
return events.filter((event) => event.involvedObject.name === 'cluster-autoscaler-status');
|
|
1078
|
+
}
|
|
1079
|
+
|
|
1080
|
+
get hasAccessToAutoscalerConfigMap() {
|
|
1081
|
+
// This may change but for now this is the best proxy we have for access to the configmap without attempting to access it and getting a 404.
|
|
1082
|
+
return this.canEdit;
|
|
1083
|
+
}
|
|
1084
|
+
|
|
1085
|
+
async loadAutoscalerConfigMap() {
|
|
1086
|
+
const url = `/k8s/clusters/${ this.mgmtClusterId }/v1/${ CONFIG_MAP }/${ AUTOSCALER_CONFIG_MAP_ID }`;
|
|
1087
|
+
|
|
1088
|
+
return await this.$dispatch('cluster/request', { url }, { root: true });
|
|
1089
|
+
}
|
|
1090
|
+
|
|
1091
|
+
get canPauseResumeAutoscaler() {
|
|
1092
|
+
return this.isAutoscalerEnabled && this.canExplore && this.hasAccessToAutoscalerConfigMap;
|
|
1093
|
+
}
|
|
1094
|
+
|
|
1095
|
+
async loadAutoscalerStatus() {
|
|
1096
|
+
if (!this.canExplore) {
|
|
1097
|
+
return AUTOSCALER_STATUS.PROVISIONING;
|
|
1098
|
+
}
|
|
1099
|
+
|
|
1100
|
+
if (!this.hasAccessToAutoscalerConfigMap) {
|
|
1101
|
+
return AUTOSCALER_STATUS.UNAVAILABLE;
|
|
1102
|
+
}
|
|
1103
|
+
|
|
1104
|
+
try {
|
|
1105
|
+
const configMap = await this.loadAutoscalerConfigMap();
|
|
1106
|
+
const yaml = configMap?.data?.status || '';
|
|
1107
|
+
|
|
1108
|
+
return jsyaml.load(yaml);
|
|
1109
|
+
} catch (ex) {
|
|
1110
|
+
console.error(ex); // eslint-disable-line no-console
|
|
1111
|
+
|
|
1112
|
+
return AUTOSCALER_STATUS.UNAVAILABLE;
|
|
1113
|
+
}
|
|
1114
|
+
}
|
|
1115
|
+
|
|
1116
|
+
async loadAutoscalerDetails() {
|
|
1117
|
+
const out = [];
|
|
1118
|
+
|
|
1119
|
+
if (this.isAutoscalerPaused) {
|
|
1120
|
+
out.push({
|
|
1121
|
+
label: this.t('autoscaler.card.details.status'),
|
|
1122
|
+
value: this.t('autoscaler.card.details.paused')
|
|
1123
|
+
});
|
|
1124
|
+
|
|
1125
|
+
return out;
|
|
1126
|
+
}
|
|
1127
|
+
|
|
1128
|
+
const status = await this.loadAutoscalerStatus();
|
|
1129
|
+
|
|
1130
|
+
if (status === AUTOSCALER_STATUS.UNAVAILABLE) {
|
|
1131
|
+
out.push({
|
|
1132
|
+
label: this.t('autoscaler.card.details.status'),
|
|
1133
|
+
value: this.t('autoscaler.card.details.unavailable')
|
|
1134
|
+
});
|
|
1135
|
+
|
|
1136
|
+
return out;
|
|
1137
|
+
}
|
|
1138
|
+
|
|
1139
|
+
if (status === AUTOSCALER_STATUS.PROVISIONING) {
|
|
1140
|
+
out.push({
|
|
1141
|
+
label: this.t('autoscaler.card.details.status'),
|
|
1142
|
+
value: this.t('autoscaler.card.details.provisioning')
|
|
1143
|
+
});
|
|
1144
|
+
|
|
1145
|
+
return out;
|
|
1146
|
+
}
|
|
1147
|
+
|
|
1148
|
+
if (status.autoscalerStatus) {
|
|
1149
|
+
out.push({
|
|
1150
|
+
label: this.t('autoscaler.card.details.status'),
|
|
1151
|
+
value: status.autoscalerStatus
|
|
1152
|
+
});
|
|
1153
|
+
}
|
|
1154
|
+
|
|
1155
|
+
if (status.clusterWide?.health?.status) {
|
|
1156
|
+
const statusValue = status.clusterWide.health.status;
|
|
1157
|
+
|
|
1158
|
+
out.push({
|
|
1159
|
+
label: this.t('autoscaler.card.details.health'),
|
|
1160
|
+
value: {
|
|
1161
|
+
component: 'BadgeStateFormatter',
|
|
1162
|
+
props: {
|
|
1163
|
+
value: statusValue, arbitrary: true, row: {}
|
|
1164
|
+
},
|
|
1165
|
+
}
|
|
1166
|
+
});
|
|
1167
|
+
}
|
|
1168
|
+
|
|
1169
|
+
if (status.clusterWide?.scaleDown?.lastTransitionTime) {
|
|
1170
|
+
out.push({
|
|
1171
|
+
label: this.t('autoscaler.card.details.scaleDown'),
|
|
1172
|
+
value: {
|
|
1173
|
+
component: 'LiveDate',
|
|
1174
|
+
props: {
|
|
1175
|
+
value: status.clusterWide.scaleDown.lastTransitionTime,
|
|
1176
|
+
addSuffix: true
|
|
1177
|
+
}
|
|
1178
|
+
}
|
|
1179
|
+
});
|
|
1180
|
+
}
|
|
1181
|
+
|
|
1182
|
+
if (status.clusterWide?.scaleUp?.lastTransitionTime) {
|
|
1183
|
+
out.push({
|
|
1184
|
+
label: this.t('autoscaler.card.details.scaleUp'),
|
|
1185
|
+
value: {
|
|
1186
|
+
component: 'LiveDate',
|
|
1187
|
+
props: {
|
|
1188
|
+
value: status.clusterWide.scaleUp.lastTransitionTime,
|
|
1189
|
+
addSuffix: true
|
|
1190
|
+
}
|
|
1191
|
+
}
|
|
1192
|
+
});
|
|
1193
|
+
}
|
|
1194
|
+
|
|
1195
|
+
if (status.clusterWide?.health?.nodeCounts?.registered) {
|
|
1196
|
+
out.push({ label: this.t('autoscaler.card.details.nodes') });
|
|
1197
|
+
|
|
1198
|
+
out.push({
|
|
1199
|
+
label: this.t('autoscaler.card.details.ready'),
|
|
1200
|
+
value: status.clusterWide.health.nodeCounts.registered.ready || '0'
|
|
1201
|
+
});
|
|
1202
|
+
out.push({
|
|
1203
|
+
label: this.t('autoscaler.card.details.notStarted'),
|
|
1204
|
+
value: status.clusterWide.health.nodeCounts.registered.notStarted || '0'
|
|
1205
|
+
});
|
|
1206
|
+
out.push({
|
|
1207
|
+
label: this.t('autoscaler.card.details.inTotal'),
|
|
1208
|
+
value: status.clusterWide.health.nodeCounts.registered.total || '0'
|
|
1209
|
+
});
|
|
1210
|
+
}
|
|
1211
|
+
|
|
1212
|
+
return out;
|
|
1213
|
+
}
|
|
1214
|
+
|
|
1215
|
+
get isAutoscalerEnabled() {
|
|
1216
|
+
return !!this.spec?.rkeConfig?.machinePools?.some((pool) => {
|
|
1217
|
+
return typeof pool.autoscalingMinSize !== 'undefined' || typeof pool.autoscalingMaxSize !== 'undefined';
|
|
1218
|
+
});
|
|
1219
|
+
}
|
|
1220
|
+
|
|
1221
|
+
get isAutoscalerPaused() {
|
|
1222
|
+
return !!this.metadata?.annotations?.[CAPI_ANNOTATIONS.AUTOSCALER_CLUSTER_PAUSE];
|
|
1223
|
+
}
|
|
1224
|
+
|
|
1225
|
+
pauseAutoscaler() {
|
|
1226
|
+
this.setAnnotation(CAPI_ANNOTATIONS.AUTOSCALER_CLUSTER_PAUSE, 'true');
|
|
1227
|
+
}
|
|
1228
|
+
|
|
1229
|
+
resumeAutoscaler() {
|
|
1230
|
+
this.setAnnotation(CAPI_ANNOTATIONS.AUTOSCALER_CLUSTER_PAUSE, undefined);
|
|
1231
|
+
}
|
|
1232
|
+
|
|
1233
|
+
toggleAutoscalerRunner() {
|
|
1234
|
+
if (this.isAutoscalerPaused) {
|
|
1235
|
+
this.resumeAutoscaler();
|
|
1236
|
+
} else {
|
|
1237
|
+
this.pauseAutoscaler();
|
|
1238
|
+
}
|
|
1239
|
+
|
|
1240
|
+
return this.save();
|
|
1241
|
+
}
|
|
1026
1242
|
}
|
package/package.json
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rancher/shell",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.8-rc.10",
|
|
4
4
|
"description": "Rancher Dashboard Shell",
|
|
5
5
|
"repository": "https://github.com/rancherlabs/dashboard",
|
|
6
6
|
"license": "Apache-2.0",
|
|
7
7
|
"author": "SUSE",
|
|
8
8
|
"private": false,
|
|
9
|
+
"types": "types/shell/index.d.ts",
|
|
9
10
|
"engines": {
|
|
10
11
|
"node": ">=20.0.0"
|
|
11
12
|
},
|
|
@@ -38,7 +39,7 @@
|
|
|
38
39
|
"@babel/preset-typescript": "7.16.7",
|
|
39
40
|
"@novnc/novnc": "1.2.0",
|
|
40
41
|
"@popperjs/core": "2.11.8",
|
|
41
|
-
"@rancher/icons": "2.0.
|
|
42
|
+
"@rancher/icons": "2.0.54",
|
|
42
43
|
"@types/is-url": "1.2.30",
|
|
43
44
|
"@types/node": "20.10.8",
|
|
44
45
|
"@types/semver": "^7.5.8",
|
|
@@ -61,7 +62,7 @@
|
|
|
61
62
|
"clipboard-polyfill": "4.0.1",
|
|
62
63
|
"codemirror-editor-vue3": "2.8.0",
|
|
63
64
|
"codemirror": ">=5.64.0 <6",
|
|
64
|
-
"color": "
|
|
65
|
+
"color": "5.0.3",
|
|
65
66
|
"cookie-universal": "2.2.2",
|
|
66
67
|
"cookie": "0.7.0",
|
|
67
68
|
"core-js": "3.45.0",
|
|
@@ -105,7 +106,7 @@
|
|
|
105
106
|
"jquery": "3.5.1",
|
|
106
107
|
"js-cookie": "3.0.5",
|
|
107
108
|
"js-yaml-loader": "1.2.2",
|
|
108
|
-
"js-yaml": "4.1.
|
|
109
|
+
"js-yaml": "4.1.1",
|
|
109
110
|
"jsdiff": "1.1.1",
|
|
110
111
|
"jsonpath-plus": "10.3.0",
|
|
111
112
|
"jsrsasign": "11.0.0",
|
|
@@ -114,7 +115,7 @@
|
|
|
114
115
|
"marked": "4.0.17",
|
|
115
116
|
"node-polyfill-webpack-plugin": "3.0.0",
|
|
116
117
|
"nodemon": "2.0.22",
|
|
117
|
-
"nyc": "
|
|
118
|
+
"nyc": "17.1.0",
|
|
118
119
|
"papaparse": "5.3.0",
|
|
119
120
|
"portal-vue": "~3.0.0",
|
|
120
121
|
"sass-loader": "12.6.0",
|
package/pages/auth/login.vue
CHANGED
|
@@ -10,7 +10,7 @@ import CopyCode from '@shell/components/CopyCode';
|
|
|
10
10
|
import { Banner } from '@components/Banner';
|
|
11
11
|
import {
|
|
12
12
|
LOCAL, LOGGED_OUT, TIMED_OUT, IS_SSO, _FLAGGED,
|
|
13
|
-
IS_SLO
|
|
13
|
+
IS_SLO, IS_SESSION_IDLE
|
|
14
14
|
} from '@shell/config/query-params';
|
|
15
15
|
import { Checkbox } from '@components/Form/Checkbox';
|
|
16
16
|
import Password from '@shell/components/form/Password';
|
|
@@ -32,6 +32,7 @@ import loadPlugins from '@shell/plugins/plugin';
|
|
|
32
32
|
import Loading from '@shell/components/Loading';
|
|
33
33
|
import { HARVESTER_NAME as HARVESTER } from '@shell/config/features';
|
|
34
34
|
import TabTitle from '@shell/components/TabTitle.vue';
|
|
35
|
+
import { getBrandMeta } from '@shell/utils/brand';
|
|
35
36
|
|
|
36
37
|
export default {
|
|
37
38
|
name: 'Login',
|
|
@@ -47,6 +48,7 @@ export default {
|
|
|
47
48
|
|
|
48
49
|
timedOut: this.$route.query[TIMED_OUT] === _FLAGGED,
|
|
49
50
|
loggedOut: this.$route.query[LOGGED_OUT] === _FLAGGED,
|
|
51
|
+
isSessionIdle: this.$route.query[IS_SESSION_IDLE] === _FLAGGED,
|
|
50
52
|
isSsoLogout: this.$route.query[IS_SSO] === _FLAGGED,
|
|
51
53
|
isSlo: this.$route.query[IS_SLO] === _FLAGGED,
|
|
52
54
|
err: this.$route.query.err,
|
|
@@ -67,7 +69,9 @@ export default {
|
|
|
67
69
|
...mapGetters({ t: 'i18n/t', hasMultipleLocales: 'i18n/hasMultipleLocales' }),
|
|
68
70
|
|
|
69
71
|
loggedOutSuccessMsg() {
|
|
70
|
-
if (this.
|
|
72
|
+
if (this.isSessionIdle) {
|
|
73
|
+
return this.t('login.loggedOutSessionIdle');
|
|
74
|
+
} else if (this.isSlo) {
|
|
71
75
|
return this.t('login.loggedOutFromSlo');
|
|
72
76
|
} else if (this.isSsoLogout) {
|
|
73
77
|
return this.t('login.loggedOutFromSso');
|
|
@@ -131,6 +135,25 @@ export default {
|
|
|
131
135
|
hasLoginMessage() {
|
|
132
136
|
return this.errorToDisplay || this.loggedOut || this.timedOut;
|
|
133
137
|
},
|
|
138
|
+
|
|
139
|
+
customizations() {
|
|
140
|
+
const brandMeta = getBrandMeta(this.$store.getters['management/brand']);
|
|
141
|
+
const login = brandMeta?.login || {};
|
|
142
|
+
|
|
143
|
+
return {
|
|
144
|
+
welcomeLabelKey: 'login.welcome',
|
|
145
|
+
logoClass: 'login-logo',
|
|
146
|
+
...login,
|
|
147
|
+
};
|
|
148
|
+
},
|
|
149
|
+
|
|
150
|
+
bannerClass() {
|
|
151
|
+
return this.customizations.bannerClass;
|
|
152
|
+
},
|
|
153
|
+
|
|
154
|
+
brandLogo() {
|
|
155
|
+
return this.customizations.logo;
|
|
156
|
+
}
|
|
134
157
|
},
|
|
135
158
|
|
|
136
159
|
async fetch() {
|
|
@@ -332,11 +355,20 @@ export default {
|
|
|
332
355
|
</TabTitle>
|
|
333
356
|
<div class="row gutless mb-20">
|
|
334
357
|
<div class="col span-6 p-20">
|
|
335
|
-
<p
|
|
358
|
+
<p
|
|
359
|
+
v-if="!brandLogo"
|
|
360
|
+
class="text-center"
|
|
361
|
+
>
|
|
336
362
|
{{ t('login.howdy') }}
|
|
337
363
|
</p>
|
|
364
|
+
<BrandImage
|
|
365
|
+
v-else
|
|
366
|
+
:class="{[customizations.logoClass]: !!customizations.logoClass}"
|
|
367
|
+
:file-name="brandLogo"
|
|
368
|
+
:alt="t('login.landscapeAlt')"
|
|
369
|
+
/>
|
|
338
370
|
<h1 class="text-center login-welcome">
|
|
339
|
-
{{ t(
|
|
371
|
+
{{ t(customizations.welcomeLabelKey, {vendor}) }}
|
|
340
372
|
</h1>
|
|
341
373
|
<div
|
|
342
374
|
class="login-messages"
|
|
@@ -521,6 +553,7 @@ export default {
|
|
|
521
553
|
</div>
|
|
522
554
|
</div>
|
|
523
555
|
<BrandImage
|
|
556
|
+
:class="bannerClass"
|
|
524
557
|
class="col span-6 landscape"
|
|
525
558
|
data-testid="login-landscape__img"
|
|
526
559
|
file-name="login-landscape.svg"
|
|
@@ -549,6 +582,12 @@ export default {
|
|
|
549
582
|
margin: 0
|
|
550
583
|
}
|
|
551
584
|
|
|
585
|
+
.login-logo {
|
|
586
|
+
align-self: center;
|
|
587
|
+
max-width: 260px;
|
|
588
|
+
margin-bottom: 20px;
|
|
589
|
+
}
|
|
590
|
+
|
|
552
591
|
.login-messages {
|
|
553
592
|
display: flex;
|
|
554
593
|
justify-content: center;
|
package/pages/auth/verify.vue
CHANGED
|
@@ -10,7 +10,7 @@ import { AUTH_BROADCAST_CHANNEL_NAME } from '@shell/utils/auth';
|
|
|
10
10
|
|
|
11
11
|
const samlProviders = ['ping', 'adfs', 'keycloak', 'okta', 'shibboleth'];
|
|
12
12
|
|
|
13
|
-
const oauthProviders = ['github', 'googleoauth', 'azuread'];
|
|
13
|
+
const oauthProviders = ['github', 'githubapp', 'googleoauth', 'azuread'];
|
|
14
14
|
|
|
15
15
|
function reply(err, code) {
|
|
16
16
|
try {
|
|
@@ -19,7 +19,7 @@ defineProps<{
|
|
|
19
19
|
v-for="(subHeaderItem, i) in items"
|
|
20
20
|
:key="i"
|
|
21
21
|
class="app-chart-card-sub-header-item"
|
|
22
|
-
data-testid="app-chart-card-
|
|
22
|
+
data-testid="app-chart-card-sub-header-item"
|
|
23
23
|
>
|
|
24
24
|
<i
|
|
25
25
|
v-clean-tooltip="t(subHeaderItem.iconTooltip.key)"
|
|
@@ -35,7 +35,8 @@ defineProps<{
|
|
|
35
35
|
<style scoped lang="scss">
|
|
36
36
|
.app-chart-card-sub-header {
|
|
37
37
|
display: flex;
|
|
38
|
-
|
|
38
|
+
flex-wrap: wrap;
|
|
39
|
+
gap: var(--gap) var(--gap-md);
|
|
39
40
|
color: var(--link-text-secondary);
|
|
40
41
|
margin-bottom: 8px;
|
|
41
42
|
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import Chart from '@shell/pages/c/_cluster/apps/charts/chart.vue';
|
|
2
|
+
|
|
3
|
+
jest.mock('clipboard-polyfill', () => ({ writeText: () => {} }));
|
|
4
|
+
|
|
5
|
+
describe('page: Chart Detail', () => {
|
|
6
|
+
describe('computed: maintainers', () => {
|
|
7
|
+
it('should return an empty array if no maintainers are provided', () => {
|
|
8
|
+
const thisContext = {
|
|
9
|
+
version: {},
|
|
10
|
+
versionInfo: null,
|
|
11
|
+
};
|
|
12
|
+
const result = (Chart.computed!.maintainers as () => any[]).call(thisContext);
|
|
13
|
+
|
|
14
|
+
expect(result).toStrictEqual([]);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it('should return an empty array for empty maintainers arrays', () => {
|
|
18
|
+
const thisContext = {
|
|
19
|
+
version: { maintainers: [] },
|
|
20
|
+
versionInfo: { chart: { maintainers: [] } },
|
|
21
|
+
};
|
|
22
|
+
const result = (Chart.computed!.maintainers as () => any[]).call(thisContext);
|
|
23
|
+
|
|
24
|
+
expect(result).toStrictEqual([]);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('should prioritize maintainers from "version"', () => {
|
|
28
|
+
const thisContext = {
|
|
29
|
+
version: {
|
|
30
|
+
maintainers: [
|
|
31
|
+
{ name: 'Version Maintainer', email: 'version@test.com' }
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
versionInfo: {
|
|
35
|
+
chart: {
|
|
36
|
+
maintainers: [
|
|
37
|
+
{ name: 'VersionInfo Maintainer', email: 'versioninfo@test.com' }
|
|
38
|
+
]
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
const result = (Chart.computed!.maintainers as () => any[]).call(thisContext);
|
|
43
|
+
|
|
44
|
+
expect(result).toHaveLength(1);
|
|
45
|
+
expect(result[0].name).toBe('Version Maintainer');
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('should fall back to maintainers from "versionInfo"', () => {
|
|
49
|
+
const thisContext = {
|
|
50
|
+
version: {},
|
|
51
|
+
versionInfo: {
|
|
52
|
+
chart: {
|
|
53
|
+
maintainers: [
|
|
54
|
+
{ name: 'VersionInfo Maintainer', email: 'versioninfo@test.com' }
|
|
55
|
+
]
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
const result = (Chart.computed!.maintainers as () => any[]).call(thisContext);
|
|
60
|
+
|
|
61
|
+
expect(result).toHaveLength(1);
|
|
62
|
+
expect(result[0].name).toBe('VersionInfo Maintainer');
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('should correctly map all maintainer fields', () => {
|
|
66
|
+
const thisContext = {
|
|
67
|
+
version: {
|
|
68
|
+
maintainers: [
|
|
69
|
+
{
|
|
70
|
+
name: 'Full Maintainer', email: 'full@test.com', url: 'http://full.com'
|
|
71
|
+
}
|
|
72
|
+
]
|
|
73
|
+
},
|
|
74
|
+
versionInfo: null,
|
|
75
|
+
};
|
|
76
|
+
const result = (Chart.computed!.maintainers as () => any[]).call(thisContext);
|
|
77
|
+
const expected = {
|
|
78
|
+
id: 'Full Maintainer-0',
|
|
79
|
+
name: 'Full Maintainer',
|
|
80
|
+
href: 'http://full.com',
|
|
81
|
+
label: 'Full Maintainer'
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
expect(result[0]).toStrictEqual(expected);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it('should handle maintainers with missing optional fields', () => {
|
|
88
|
+
const thisContext = {
|
|
89
|
+
version: {
|
|
90
|
+
maintainers: [
|
|
91
|
+
{ name: 'No Email Maintainer', url: 'http://noemail.com' },
|
|
92
|
+
{ name: 'No URL Maintainer', email: 'nourl@test.com' },
|
|
93
|
+
{ name: 'Name Only Maintainer' },
|
|
94
|
+
{ url: 'http://noname.com' },
|
|
95
|
+
{ email: 'noname@test.com' }
|
|
96
|
+
]
|
|
97
|
+
},
|
|
98
|
+
versionInfo: null,
|
|
99
|
+
};
|
|
100
|
+
const result = (Chart.computed!.maintainers as () => any[]).call(thisContext);
|
|
101
|
+
|
|
102
|
+
expect(result).toHaveLength(5);
|
|
103
|
+
expect(result[0]).toStrictEqual({
|
|
104
|
+
id: 'No Email Maintainer-0',
|
|
105
|
+
name: 'No Email Maintainer',
|
|
106
|
+
href: 'http://noemail.com',
|
|
107
|
+
label: 'No Email Maintainer'
|
|
108
|
+
});
|
|
109
|
+
expect(result[1]).toStrictEqual({
|
|
110
|
+
id: 'No URL Maintainer-1',
|
|
111
|
+
name: 'No URL Maintainer',
|
|
112
|
+
href: 'mailto:nourl@test.com',
|
|
113
|
+
label: 'No URL Maintainer'
|
|
114
|
+
});
|
|
115
|
+
expect(result[2]).toStrictEqual({
|
|
116
|
+
id: 'Name Only Maintainer-2',
|
|
117
|
+
name: 'Name Only Maintainer',
|
|
118
|
+
href: null,
|
|
119
|
+
label: 'Name Only Maintainer'
|
|
120
|
+
});
|
|
121
|
+
expect(result[3]).toStrictEqual({
|
|
122
|
+
id: 'undefined-3',
|
|
123
|
+
name: undefined,
|
|
124
|
+
href: 'http://noname.com',
|
|
125
|
+
label: 'http://noname.com'
|
|
126
|
+
});
|
|
127
|
+
expect(result[4]).toStrictEqual({
|
|
128
|
+
id: 'undefined-4',
|
|
129
|
+
name: undefined,
|
|
130
|
+
href: 'mailto:noname@test.com',
|
|
131
|
+
label: 'noname@test.com'
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
});
|