@rancher/shell 1.2.3 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/data/aws-regions.json +9 -0
- package/assets/images/vendor/openid.svg +18 -0
- package/assets/styles/app.scss +1 -2
- package/assets/styles/fonts/_icons.scss +3 -3
- package/assets/styles/global/_columns.scss +1 -1
- package/assets/styles/global/_labeled-input.scss +1 -0
- package/assets/styles/global/_layout.scss +99 -0
- package/assets/styles/themes/_csp.scss +2 -2
- package/assets/styles/themes/_dark.scss +8 -2
- package/assets/styles/themes/_light.scss +2 -1
- package/assets/styles/themes/_suse.scss +1 -1
- package/assets/styles/vendor/vue-select.scss +5 -0
- package/assets/translations/en-us.yaml +315 -64
- package/assets/translations/zh-hans.yaml +7 -31
- package/babel.config.js +8 -2
- package/chart/__tests__/S3.test.ts +9 -2
- package/chart/gatekeeper.vue +2 -11
- package/chart/istio.vue +1 -10
- package/chart/logging/index.vue +2 -11
- package/chart/monitoring/alerting/index.vue +7 -21
- package/chart/monitoring/grafana/index.vue +61 -2
- package/chart/monitoring/index.vue +52 -26
- package/chart/monitoring/prometheus/index.vue +39 -45
- package/chart/rancher-backup/S3.vue +11 -9
- package/chart/rancher-backup/index.vue +18 -15
- package/cloud-credential/__tests__/harvester.test.ts +18 -0
- package/cloud-credential/azure.vue +4 -17
- package/cloud-credential/generic.vue +18 -9
- package/cloud-credential/harvester.vue +11 -3
- package/components/AlertTable.vue +17 -7
- package/components/AppModal.vue +167 -0
- package/components/AssignTo.vue +7 -4
- package/components/AsyncButton.vue +27 -5
- package/components/BackLink.vue +4 -4
- package/components/BannerGraphic.vue +1 -0
- package/components/BrandImage.vue +47 -1
- package/components/Carousel.vue +15 -8
- package/components/Certificates.vue +161 -0
- package/components/ClusterBadge.vue +12 -3
- package/components/ClusterIconMenu.vue +55 -12
- package/components/ClusterProviderIcon.vue +14 -3
- package/components/CodeMirror.vue +111 -17
- package/components/CommunityLinks.vue +12 -8
- package/components/CopyCode.vue +6 -2
- package/components/CopyToClipboard.vue +2 -1
- package/components/CopyToClipboardText.vue +14 -9
- package/components/CreateDriver.vue +81 -0
- package/components/CruResource.vue +52 -27
- package/components/DetailTop.vue +2 -2
- package/components/Dialog.vue +6 -5
- package/components/DisableAuthProviderModal.vue +14 -8
- package/components/DraggableZone.vue +2 -2
- package/components/EtcdInfoBanner.vue +5 -5
- package/components/ExplorerMembers.vue +3 -3
- package/components/ExplorerProjectsNamespaces.vue +31 -7
- package/components/FixedBanner.vue +48 -36
- package/components/GlobalRoleBindings.vue +26 -0
- package/components/GrafanaDashboard.vue +6 -4
- package/components/IconOrSvg.vue +1 -1
- package/components/Import.vue +10 -6
- package/components/Inactivity.vue +1 -5
- package/components/KeyValueView.vue +14 -10
- package/components/Markdown.vue +16 -12
- package/components/MessageLink.vue +2 -2
- package/components/ModalWithCard.vue +5 -8
- package/components/MoveModal.vue +35 -33
- package/components/PodSecurityAdmission.vue +3 -3
- package/components/PromptChangePassword.vue +33 -33
- package/components/PromptModal.vue +11 -21
- package/components/PromptRemove.vue +12 -17
- package/components/PromptRestore.vue +18 -16
- package/components/Questions/__tests__/Boolean.test.ts +9 -19
- package/components/Questions/__tests__/Float.test.ts +9 -19
- package/components/Questions/__tests__/Int.test.ts +9 -19
- package/components/Questions/__tests__/String.test.ts +9 -19
- package/components/Questions/__tests__/Yaml.test.ts +9 -20
- package/components/Questions/__tests__/utils/questions-defaults.ts +20 -0
- package/components/Questions/index.vue +19 -3
- package/components/ResourceCancelModal.vue +34 -29
- package/components/ResourceDetail/Masthead.vue +48 -16
- package/components/ResourceDetail/index.vue +6 -4
- package/components/ResourceList/Masthead.vue +10 -9
- package/components/ResourceList/index.vue +65 -14
- package/components/ResourceTable.vue +87 -21
- package/components/ResourceYaml.vue +35 -5
- package/components/SelectIconGrid.vue +3 -3
- package/components/SideNav.vue +50 -94
- package/components/SingleClusterInfo.vue +4 -4
- package/components/SortableTable/THead.vue +33 -21
- package/components/SortableTable/filtering.js +9 -1
- package/components/SortableTable/grouping.js +8 -1
- package/components/SortableTable/index.vue +143 -44
- package/components/SortableTable/paging.js +36 -7
- package/components/SortableTable/selection.js +2 -1
- package/components/SortableTable/sorting.js +24 -7
- package/components/StatusTable.vue +5 -1
- package/components/Tabbed/index.vue +18 -1
- package/components/TableDataUserIcon.vue +47 -0
- package/components/TypeDescription.vue +1 -0
- package/components/Wizard.vue +1 -0
- package/components/YamlEditor.vue +1 -0
- package/components/__tests__/AppModal.test.ts +98 -0
- package/components/__tests__/AsyncButton.test.ts +1 -3
- package/components/__tests__/BackLink.test.ts +1 -1
- package/components/__tests__/ButtonGroup.test.ts +3 -6
- package/components/__tests__/Carousel.test.ts +43 -0
- package/components/__tests__/Certificates.test.ts +29 -0
- package/components/__tests__/CodeMirror.test.ts +87 -0
- package/components/__tests__/CopyCode.test.ts +5 -4
- package/components/__tests__/CruResource.test.ts +10 -9
- package/components/__tests__/EtcdInfoBanner.test.ts +37 -0
- package/components/__tests__/FixedBanner.test.ts +5 -20
- package/components/__tests__/NamespaceFilter.test.ts +9 -18
- package/components/__tests__/TabTitle.test.ts +129 -0
- package/components/auth/AzureWarning.vue +2 -2
- package/components/auth/RoleDetailEdit.vue +10 -0
- package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
- package/components/auth/login/oidc.vue +7 -1
- package/components/fleet/FleetBundles.vue +5 -11
- package/components/fleet/FleetClusters.vue +9 -9
- package/components/fleet/FleetIntro.vue +11 -17
- package/components/fleet/FleetNoWorkspaces.vue +2 -2
- package/components/fleet/FleetRepos.vue +63 -27
- package/components/fleet/FleetResources.vue +6 -1
- package/components/fleet/FleetStatus.vue +3 -3
- package/components/fleet/FleetSummary.vue +35 -30
- package/components/fleet/ForceDirectedTreeChart/index.vue +9 -3
- package/components/fleet/__tests__/FleetSummary.test.ts +316 -0
- package/components/form/ArrayList.vue +22 -18
- package/components/form/ArrayListSelect.vue +5 -0
- package/components/form/BannerSettings.vue +3 -0
- package/components/form/ClusterAppearance.vue +132 -0
- package/components/form/ColorInput.vue +1 -0
- package/components/form/Error.vue +3 -3
- package/components/form/FileSelector.vue +1 -0
- package/components/form/Footer.vue +2 -2
- package/components/form/GitPicker.vue +83 -38
- package/components/form/KeyValue.vue +70 -48
- package/components/form/LabeledSelect.vue +145 -41
- package/components/form/Labels.vue +3 -1
- package/components/form/NameNsDescription.vue +26 -9
- package/components/form/Password.vue +3 -1
- package/components/form/ResourceLabeledSelect.vue +187 -0
- package/components/form/ResourceTabs/index.vue +31 -15
- package/components/form/SecretSelector.vue +93 -18
- package/components/form/SelectOrCreateAuthSecret.vue +132 -59
- package/components/form/SimpleSecretSelector.vue +88 -28
- package/components/form/Taints.vue +13 -7
- package/components/form/__tests__/BannerSettings.test.ts +53 -0
- package/components/form/__tests__/KeyValue.test.ts +120 -11
- package/components/form/__tests__/LabeledSelect.test.ts +0 -18
- package/components/form/__tests__/{NameNsDescription.ts → NameNsDescription.test.ts} +25 -15
- package/components/form/__tests__/Taints.test.ts +70 -0
- package/components/form/labeled-select-utils/labeled-select-pagination.ts +151 -0
- package/components/form/labeled-select-utils/labeled-select.utils.ts +122 -0
- package/components/formatter/AppSummaryGraph.vue +2 -2
- package/components/formatter/Checked.vue +11 -3
- package/components/formatter/CloudCredPublicData.vue +30 -0
- package/components/formatter/ClusterLink.vue +2 -2
- package/components/formatter/ClusterProvider.vue +1 -18
- package/components/formatter/FleetClusterSummaryGraph.vue +27 -0
- package/components/formatter/FleetSummaryGraph.vue +25 -12
- package/components/formatter/ImagePercentageBar.vue +0 -4
- package/components/formatter/IngressTarget.vue +18 -7
- package/components/formatter/Link.vue +2 -2
- package/components/formatter/LinkDetail.vue +2 -2
- package/components/formatter/LinkDetailImage.vue +2 -2
- package/components/formatter/LinkName.vue +2 -2
- package/components/formatter/LiveDuration.vue +1 -1
- package/components/formatter/PercentageBar.vue +1 -1
- package/components/formatter/PrincipalGroupBindings.vue +2 -2
- package/components/formatter/SecretType.vue +2 -2
- package/components/formatter/VirtualServiceGateways.vue +2 -2
- package/components/formatter/WorkloadDetailEndpoints.vue +12 -22
- package/components/formatter/__tests__/Checked.test.ts +19 -0
- package/components/formatter/__tests__/LinkDetail.test.ts +5 -5
- package/components/formatter/__tests__/WorkloadDetailEndpoints.test.ts +81 -0
- package/components/nav/Group.vue +9 -7
- package/components/nav/Header.vue +85 -46
- package/components/nav/Jump.vue +19 -9
- package/components/nav/NamespaceFilter.vue +8 -1
- package/components/nav/TopLevelMenu.vue +392 -136
- package/components/nav/Type.vue +71 -106
- package/components/nav/WindowManager/ContainerLogs.vue +120 -19
- package/components/nav/WindowManager/ContainerShell.vue +6 -1
- package/components/nav/WindowManager/__tests__/ContainerLogs.test.ts +186 -0
- package/components/nav/WindowManager/index.vue +11 -10
- package/components/nav/__tests__/TopLevelMenu.test.ts +400 -6
- package/components/nav/__tests__/Type.test.ts +322 -97
- package/components/nuxt/nuxt-child.js +9 -78
- package/components/nuxt/nuxt-error.vue +1 -1
- package/components/nuxt/nuxt-link.client.js +13 -95
- package/{layouts → components/templates}/blank.vue +1 -1
- package/{layouts → components/templates}/default.vue +11 -101
- package/{layouts → components/templates}/error.vue +13 -26
- package/{layouts → components/templates}/home.vue +4 -1
- package/{layouts → components/templates}/plain.vue +4 -1
- package/{layouts → components/templates}/standalone.vue +1 -5
- package/{layouts → components/templates}/unauthenticated.vue +2 -3
- package/composables/useCompactInput.test.ts +36 -0
- package/composables/useCompactInput.ts +20 -0
- package/composables/useLabeledFormElement.test.ts +135 -0
- package/composables/useLabeledFormElement.ts +138 -0
- package/config/harvester-manager-types.js +2 -0
- package/config/home-links.js +2 -1
- package/config/labels-annotations.js +2 -1
- package/config/middleware.js +0 -6
- package/config/pagination-table-headers.js +57 -0
- package/config/pod-security-admission.ts +1 -1
- package/config/private-label.js +21 -1
- package/config/product/auth.js +1 -0
- package/config/product/explorer.js +166 -45
- package/config/product/fleet.js +6 -1
- package/config/product/legacy.js +2 -11
- package/config/product/manager.js +51 -25
- package/config/query-params.js +2 -0
- package/config/roles.ts +23 -0
- package/config/router/index.js +23 -0
- package/config/router/navigation-guards/attempt-first-login.js +73 -0
- package/config/router/navigation-guards/authentication.js +63 -0
- package/config/router/navigation-guards/i18n.js +13 -0
- package/config/router/navigation-guards/index.js +16 -0
- package/config/router/navigation-guards/load-initial-settings.js +15 -0
- package/config/router/routes.js +487 -0
- package/config/settings.ts +31 -2
- package/config/store.js +8 -4
- package/config/system-namespaces.js +3 -0
- package/config/table-headers.js +66 -1
- package/config/types.js +35 -20
- package/config/uiplugins.js +10 -5
- package/core/plugin-helpers.js +4 -6
- package/core/plugin-routes.ts +56 -114
- package/core/plugin.ts +18 -11
- package/core/plugins-loader.js +7 -9
- package/core/plugins.js +289 -285
- package/core/types-provisioning.ts +7 -0
- package/creators/app/app.package.json +2 -1
- package/creators/app/files/.eslintignore +0 -2
- package/creators/app/files/.gitlab-ci.yml +14 -0
- package/creators/app/files/.vscode/settings.json +0 -1
- package/creators/app/init +19 -0
- package/creators/pkg/files/.github/workflows/build-extension-catalog.yml +2 -6
- package/creators/pkg/files/.github/workflows/build-extension-charts.yml +2 -6
- package/creators/pkg/init +32 -0
- package/detail/__tests__/provisioning.cattle.io.cluster.test.ts +119 -0
- package/detail/__tests__/service.test.ts +62 -0
- package/detail/catalog.cattle.io.app.vue +1 -1
- package/detail/cis.cattle.io.clusterscan.vue +14 -3
- package/detail/fleet.cattle.io.bundle.vue +1 -1
- package/detail/fleet.cattle.io.cluster.vue +11 -1
- package/detail/fleet.cattle.io.gitrepo.vue +15 -9
- package/detail/namespace.vue +2 -2
- package/detail/networking.k8s.io.ingress.vue +52 -19
- package/detail/node.vue +22 -3
- package/detail/provisioning.cattle.io.cluster.vue +31 -13
- package/detail/service.vue +1 -1
- package/detail/workload/index.vue +1 -0
- package/dialog/AddCustomBadgeDialog.vue +318 -161
- package/dialog/DeactivateDriverDialog.vue +137 -0
- package/dialog/RollbackWorkloadDialog.vue +2 -2
- package/dialog/RotateCertificatesDialog.vue +0 -21
- package/dialog/ScaleMachineDownDialog.vue +34 -17
- package/directives/clean-html.js +15 -0
- package/directives/clean-tooltip.js +32 -0
- package/directives/focus.js +41 -0
- package/directives/int-number.js +21 -0
- package/directives/positive-int-number.js +19 -0
- package/directives/trim-whitespace.js +19 -0
- package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +3 -2
- package/edit/__tests__/kontainerDriver.test.ts +107 -0
- package/edit/__tests__/management.cattle.io.clusterroletemplatebinding.test.ts +12 -1
- package/edit/__tests__/management.cattle.io.setting.test.ts +2 -1
- package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +2 -3
- package/edit/__tests__/nodeDriver.test.ts +107 -0
- package/edit/__tests__/service.test.ts +85 -0
- package/edit/__tests__/ui.cattle.io.navlink.test.ts +3 -1
- package/edit/auth/AuthProviderWarningBanners.vue +34 -0
- package/edit/auth/__tests__/AuthProviderWarningBanners.test.ts +19 -0
- package/edit/auth/__tests__/azuread.test.ts +241 -0
- package/edit/auth/__tests__/oidc.test.ts +137 -0
- package/edit/auth/azuread.vue +133 -31
- package/edit/auth/github.vue +5 -17
- package/edit/auth/googleoauth.vue +6 -23
- package/edit/auth/ldap/index.vue +5 -17
- package/edit/auth/oidc.vue +143 -42
- package/edit/auth/saml.vue +5 -14
- package/edit/catalog.cattle.io.clusterrepo.vue +177 -9
- package/edit/cis.cattle.io.clusterscan.vue +5 -2
- package/edit/cis.cattle.io.clusterscanbenchmark.vue +41 -9
- package/edit/cloudcredential.vue +28 -4
- package/edit/configmap.vue +10 -4
- package/edit/fleet.cattle.io.gitrepo.vue +3 -1
- package/edit/helm.cattle.io.projecthelmchart.vue +29 -19
- package/edit/kontainerDriver.vue +65 -0
- package/edit/logging-flow/Match.vue +10 -9
- package/edit/logging-flow/index.vue +4 -19
- package/edit/logging.banzaicloud.io.output/__tests__/logging.banzaicloud.io.output.test.ts +232 -2
- package/edit/logging.banzaicloud.io.output/index.vue +43 -26
- package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +3 -3
- package/edit/management.cattle.io.project.vue +3 -53
- package/edit/management.cattle.io.setting.vue +52 -2
- package/edit/management.cattle.io.user.vue +2 -1
- package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +10 -7
- package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +21 -16
- package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +1 -1
- package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +2 -2
- package/edit/monitoring.coreos.com.alertmanagerconfig/types/slack.vue +1 -1
- package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +15 -3
- package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +4 -1
- package/edit/monitoring.coreos.com.prometheusrule/RecordingRule.vue +2 -0
- package/edit/monitoring.coreos.com.prometheusrule/index.vue +2 -0
- package/edit/networking.k8s.io.ingress/Rules.vue +8 -3
- package/edit/networking.k8s.io.ingress/index.vue +64 -8
- package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +1 -0
- package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +6 -2
- package/edit/networking.k8s.io.networkpolicy/__tests__/{PolicyRuleTarget.spec.ts → PolicyRuleTarget.test.ts} +46 -7
- package/edit/networking.k8s.io.networkpolicy/__tests__/utils/{selectors.ts → selectors.test.ts} +1 -1
- package/edit/networking.k8s.io.networkpolicy/index.vue +2 -0
- package/edit/nodeDriver.vue +65 -0
- package/edit/persistentvolume/index.vue +2 -2
- package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +33 -16
- package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +276 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +473 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/{CustomCommand.tests.ts → CustomCommand.test.ts} +3 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +228 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/DrainOptions.test.ts +1 -1
- package/edit/provisioning.cattle.io.cluster/__tests__/index.test.ts +73 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +77 -13
- package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +391 -0
- package/edit/provisioning.cattle.io.cluster/import.vue +4 -4
- package/edit/provisioning.cattle.io.cluster/index.vue +126 -51
- package/edit/provisioning.cattle.io.cluster/rke2.vue +325 -791
- package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +137 -0
- package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +217 -0
- package/edit/provisioning.cattle.io.cluster/{Basics.vue → tabs/Basics.vue} +123 -129
- package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +132 -0
- package/edit/provisioning.cattle.io.cluster/{MachinePool.vue → tabs/MachinePool.vue} +1 -0
- package/edit/provisioning.cattle.io.cluster/{S3Config.vue → tabs/etcd/S3Config.vue} +1 -0
- package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +135 -0
- package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +190 -0
- package/edit/provisioning.cattle.io.cluster/{RegistryConfigs.vue → tabs/registries/RegistryConfigs.vue} +3 -0
- package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +148 -0
- package/edit/provisioning.cattle.io.cluster/tabs/upgrade/index.vue +76 -0
- package/edit/resources.cattle.io.backup.vue +139 -124
- package/edit/resources.cattle.io.restore.vue +146 -126
- package/edit/service.vue +13 -0
- package/edit/serviceaccount.vue +46 -4
- package/edit/token.vue +3 -1
- package/edit/workload/Upgrading.vue +3 -2
- package/edit/workload/__tests__/Job.test.ts +1 -3
- package/edit/workload/__tests__/Upgrading.test.ts +2 -2
- package/edit/workload/index.vue +2 -1
- package/edit/workload/mixins/workload.js +35 -2
- package/edit/workload/storage/emptyDir.vue +2 -2
- package/initialize/App.vue +75 -0
- package/initialize/app-extended.js +128 -0
- package/initialize/entry-helpers.js +546 -0
- package/initialize/entry.js +32 -0
- package/initialize/install-components.js +23 -0
- package/initialize/install-directives.js +59 -0
- package/initialize/install-plugins.js +123 -0
- package/list/__tests__/workload.test.ts +1 -1
- package/list/catalog.cattle.io.app.vue +1 -0
- package/list/cis.cattle.io.clusterscan.vue +16 -10
- package/list/group.principal.vue +2 -2
- package/list/management.cattle.io.feature.vue +16 -16
- package/list/management.cattle.io.setting.vue +1 -0
- package/list/management.cattle.io.user.vue +13 -4
- package/list/networking.k8s.io.ingress.vue +36 -0
- package/list/node.vue +212 -73
- package/list/provisioning.cattle.io.cluster.vue +17 -4
- package/list/ui.cattle.io.navlink.vue +2 -2
- package/list/workload.vue +22 -0
- package/machine-config/__tests__/vmwarevsphere-pool-config-merge.test.ts +30 -0
- package/machine-config/__tests__/vmwarevsphere.test.ts +1 -3
- package/machine-config/amazonec2.vue +1 -1
- package/machine-config/azure.vue +2 -1
- package/machine-config/generic.vue +11 -15
- package/machine-config/vmwarevsphere-pool-config-merge.ts +25 -0
- package/machine-config/vmwarevsphere.vue +31 -27
- package/middleware/authenticated.js +23 -399
- package/mixins/__tests__/chart.test.ts +48 -6
- package/mixins/__tests__/create-edit-view.test.ts +2 -3
- package/mixins/auth-config.js +5 -9
- package/mixins/brand.js +102 -96
- package/mixins/chart.js +27 -13
- package/mixins/create-edit-view/index.js +2 -2
- package/mixins/fetch.client.js +42 -48
- package/mixins/labeled-form-element.ts +27 -2
- package/mixins/page-actions.js +7 -5
- package/mixins/resource-fetch-api-pagination.js +304 -0
- package/mixins/resource-fetch-namespaced.js +1 -1
- package/mixins/resource-fetch.js +46 -5
- package/models/__tests__/cluster.test.ts +44 -0
- package/models/__tests__/fleet.cattle.io.cluster.test.ts +36 -0
- package/models/__tests__/management.cattle.io.cluster.test.ts +23 -0
- package/models/__tests__/management.cattle.io.node.ts +85 -0
- package/models/__tests__/management.cattle.io.nodepool.ts +83 -0
- package/models/__tests__/namespace.test.ts +49 -9
- package/models/__tests__/provisioning.cattle.io.cluster.test.ts +241 -0
- package/models/__tests__/schema.tests.ts +24 -0
- package/models/__tests__/secret.test.ts +37 -0
- package/models/__tests__/steve-schema.test.ts +73 -0
- package/models/__tests__/storage.k8s.io.storageclass.test.ts +22 -0
- package/models/__tests__/workload.test.ts +91 -0
- package/models/catalog.cattle.io.app.js +8 -0
- package/models/catalog.cattle.io.clusterrepo.js +9 -1
- package/models/catalog.cattle.io.uiplugin.js +7 -8
- package/models/cis.cattle.io.clusterscan.js +29 -8
- package/models/cloudcredential.js +9 -1
- package/models/cluster/node.js +8 -4
- package/models/cluster/schema.js +6 -0
- package/models/cluster.js +33 -0
- package/models/cluster.x-k8s.io.machine.js +1 -1
- package/models/cluster.x-k8s.io.machinedeployment.js +14 -0
- package/models/driver.js +63 -0
- package/models/fleet.cattle.io.cluster.js +27 -11
- package/models/fleet.cattle.io.gitrepo.js +66 -13
- package/models/helm.cattle.io.projecthelmchart.js +1 -1
- package/models/kontainerdriver.js +85 -0
- package/models/management/schema.js +6 -0
- package/models/management.cattle.io.authconfig.js +3 -2
- package/models/management.cattle.io.cluster.js +16 -7
- package/models/management.cattle.io.globalrole.js +2 -0
- package/models/management.cattle.io.kontainerdriver.js +1 -0
- package/models/management.cattle.io.node.js +18 -14
- package/models/management.cattle.io.nodepool.js +17 -0
- package/models/management.cattle.io.project.js +0 -36
- package/models/management.cattle.io.setting.js +11 -7
- package/models/management.cattle.io.user.js +2 -2
- package/models/monitoring.coreos.com.receiver.js +3 -1
- package/models/monitoring.coreos.com.route.js +1 -1
- package/models/namespace.js +1 -1
- package/models/networking.k8s.io.ingress.js +2 -1
- package/models/nodedriver.js +85 -0
- package/models/pod.js +20 -0
- package/models/provisioning.cattle.io.cluster.js +125 -10
- package/models/schema.js +28 -7
- package/models/secret.js +126 -18
- package/models/service.js +2 -0
- package/models/steve-schema.ts +254 -0
- package/models/storage.k8s.io.storageclass.js +1 -1
- package/models/workload.js +17 -0
- package/models/workload.service.js +18 -0
- package/package.json +18 -14
- package/pages/about.vue +12 -6
- package/pages/account/create-key.vue +0 -1
- package/pages/account/index.vue +7 -3
- package/pages/auth/login.vue +106 -103
- package/pages/auth/logout.vue +2 -4
- package/pages/auth/setup.vue +92 -66
- package/pages/auth/verify.vue +30 -24
- package/pages/c/_cluster/apps/charts/__tests__/install.helper.test.ts +2 -17
- package/pages/c/_cluster/apps/charts/chart.vue +54 -9
- package/pages/c/_cluster/apps/charts/index.vue +99 -69
- package/pages/c/_cluster/apps/charts/install.helpers.js +2 -13
- package/pages/c/_cluster/apps/charts/install.vue +12 -11
- package/pages/c/_cluster/auth/config/_id.vue +0 -6
- package/pages/c/_cluster/auth/config/index.vue +15 -9
- package/pages/c/_cluster/auth/roles/index.vue +8 -10
- package/pages/c/_cluster/ecm/index.vue +0 -2
- package/pages/c/_cluster/explorer/ConfigBadge.vue +13 -8
- package/pages/c/_cluster/explorer/EventsTable.vue +18 -0
- package/pages/c/_cluster/explorer/__tests__/index.test.ts +181 -0
- package/pages/c/_cluster/explorer/index.vue +253 -91
- package/pages/c/_cluster/explorer/tools/__tests__/index.test.ts +69 -0
- package/pages/c/_cluster/explorer/tools/index.vue +10 -6
- package/pages/c/_cluster/fleet/index.vue +89 -94
- package/pages/c/_cluster/longhorn/__tests__/longhorn.index.test.ts +89 -0
- package/pages/c/_cluster/longhorn/index.vue +52 -17
- package/pages/c/_cluster/manager/cloudCredential/index.vue +18 -25
- package/pages/c/_cluster/manager/drivers/kontainerDriver/_id.vue +12 -0
- package/pages/c/_cluster/manager/drivers/kontainerDriver/create.vue +15 -0
- package/pages/c/_cluster/manager/drivers/kontainerDriver/index.vue +91 -0
- package/pages/c/_cluster/manager/drivers/nodeDriver/_id.vue +12 -0
- package/pages/c/_cluster/manager/drivers/nodeDriver/create.vue +15 -0
- package/pages/c/_cluster/manager/drivers/nodeDriver/index.vue +60 -0
- package/pages/c/_cluster/manager/jwt.authentication/index.vue +235 -0
- package/pages/c/_cluster/manager/pages/_page.vue +4 -5
- package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +4 -0
- package/pages/c/_cluster/monitoring/route-receiver/index.vue +2 -2
- package/pages/c/_cluster/neuvector/index.vue +1 -0
- package/pages/c/_cluster/settings/DefaultLinksEditor.vue +1 -0
- package/pages/c/_cluster/settings/banners.vue +86 -10
- package/pages/c/_cluster/settings/brand.vue +261 -38
- package/pages/c/_cluster/settings/index.vue +4 -6
- package/pages/c/_cluster/settings/links.vue +3 -2
- package/pages/c/_cluster/settings/performance.vue +71 -3
- package/pages/c/_cluster/uiplugins/AddExtensionRepos.vue +5 -2
- package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +12 -8
- package/pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue +9 -6
- package/pages/c/_cluster/uiplugins/CatalogList/index.vue +10 -46
- package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +11 -5
- package/pages/c/_cluster/uiplugins/InstallDialog.vue +55 -19
- package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +36 -301
- package/pages/c/_cluster/uiplugins/UninstallDialog.vue +14 -6
- package/pages/c/_cluster/uiplugins/__tests__/SetupUIPlugins.test.ts +52 -106
- package/pages/c/_cluster/uiplugins/index.vue +38 -54
- package/pages/diagnostic.vue +2 -2
- package/pages/fail-whale.vue +103 -42
- package/pages/home.vue +81 -24
- package/pages/prefs.vue +8 -4
- package/pages/support/index.vue +14 -10
- package/pkg/auto-import.js +1 -1
- package/plugins/axios.js +0 -36
- package/plugins/back-button.js +3 -5
- package/plugins/clean-html-directive.js +5 -30
- package/plugins/clean-html.js +53 -0
- package/plugins/clean-tooltip-directive.js +6 -31
- package/plugins/codemirror-loader.js +1 -1
- package/plugins/codemirror.js +41 -9
- package/plugins/dashboard-store/__tests__/mutations.test.ts +389 -0
- package/plugins/dashboard-store/__tests__/resource-class.test.ts +49 -0
- package/plugins/dashboard-store/__tests__/utils/store-mocks.ts +7 -0
- package/plugins/dashboard-store/actions.js +132 -25
- package/plugins/dashboard-store/classify.js +1 -18
- package/plugins/dashboard-store/getters.js +154 -44
- package/plugins/dashboard-store/index.js +0 -111
- package/plugins/dashboard-store/mutations.js +150 -52
- package/plugins/dashboard-store/resource-class.js +77 -127
- package/plugins/directives.js +6 -39
- package/plugins/ember-cookie.js +13 -0
- package/plugins/global-formatters.js +26 -5
- package/plugins/i18n.js +89 -55
- package/plugins/int-number.js +6 -20
- package/plugins/plugin.js +3 -3
- package/plugins/positive-int-number.js +6 -17
- package/plugins/steve/__tests__/{getters.spec.ts → getters.test.ts} +81 -10
- package/plugins/steve/__tests__/mutations.test.ts +49 -0
- package/plugins/steve/__tests__/resource-utils.test.ts +159 -0
- package/plugins/steve/__tests__/steve-class.test.ts +59 -0
- package/plugins/steve/__tests__/subscribe.spec.ts +4 -1
- package/plugins/steve/__tests__/utils/mutation.test.helpers.ts +105 -0
- package/plugins/steve/__tests__/utils/steve-mocks.ts +31 -0
- package/plugins/steve/accept-or-reject-socket-message.ts +103 -0
- package/plugins/steve/actions.js +3 -38
- package/plugins/steve/getters.js +164 -61
- package/plugins/steve/hybrid-class.js +5 -1
- package/plugins/steve/mutations.js +24 -3
- package/plugins/steve/norman-class.js +142 -2
- package/{utils → plugins/steve}/projectAndNamespaceFiltering.utils.ts +28 -10
- package/plugins/steve/resource-utils.ts +38 -0
- package/plugins/steve/schema.d.ts +22 -0
- package/plugins/steve/steve-class.js +22 -0
- package/plugins/steve/steve-pagination-utils.ts +368 -0
- package/plugins/steve/subscribe.js +17 -76
- package/plugins/trim-whitespace.js +6 -34
- package/plugins/vue-js-modal.js +1 -1
- package/promptRemove/pod.vue +15 -7
- package/public/index.html +1 -0
- package/rancher-components/Accordion/Accordion.test.ts +45 -0
- package/rancher-components/Accordion/Accordion.vue +86 -0
- package/rancher-components/Accordion/index.ts +1 -0
- package/rancher-components/BadgeState/BadgeState.vue +3 -3
- package/rancher-components/Banner/Banner.test.ts +1 -5
- package/rancher-components/Banner/Banner.vue +2 -2
- package/rancher-components/Card/Card.vue +4 -4
- package/rancher-components/Form/Checkbox/Checkbox.vue +4 -3
- package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +18 -1
- package/rancher-components/Form/LabeledInput/LabeledInput.vue +57 -24
- package/rancher-components/Form/Radio/RadioButton.test.ts +1 -3
- package/rancher-components/Form/Radio/RadioButton.vue +13 -7
- package/rancher-components/Form/Radio/RadioGroup.vue +4 -3
- package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +6 -4
- package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
- package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
- package/rancher-components/StringList/StringList.test.ts +270 -0
- package/rancher-components/StringList/StringList.vue +65 -26
- package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +69 -0
- package/scripts/clean +1 -1
- package/scripts/extension/bundle +19 -7
- package/scripts/extension/helm/charts/ui-plugin-server/templates/_helpers.tpl +11 -0
- package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -0
- package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
- package/scripts/extension/helm/package/Dockerfile +1 -1
- package/scripts/extension/helm/scripts/package +11 -3
- package/scripts/extension/helm/scripts/patch +27 -0
- package/scripts/extension/parse-tag-name +4 -4
- package/scripts/extension/publish +25 -14
- package/scripts/publish-shell.sh +11 -1
- package/scripts/serve-pkgs +0 -2
- package/scripts/test-plugins-build.sh +87 -11
- package/scripts/vue-migrate.js +683 -0
- package/server/har-file.js +183 -0
- package/store/__tests__/catalog.test.ts +224 -0
- package/store/__tests__/type-map.test.ts +1122 -0
- package/store/auth.js +23 -4
- package/store/aws.js +53 -6
- package/store/catalog.js +22 -6
- package/store/cru-resource.ts +26 -0
- package/store/customisation.js +35 -0
- package/store/features.js +7 -4
- package/store/i18n.js +11 -0
- package/store/index.js +140 -49
- package/store/plugins.js +8 -4
- package/store/prefs.js +33 -38
- package/store/type-map.js +288 -213
- package/store/type-map.utils.ts +226 -0
- package/tsconfig.json +34 -9
- package/tsconfig.paths.json +21 -0
- package/types/components/labeledSelect.ts +50 -0
- package/types/resources/settings.d.ts +32 -0
- package/types/{userPreferences.d.ts → resources/userPreferences.d.ts} +0 -1
- package/types/shell/index.d.ts +1045 -770
- package/types/store/dashboard-store.types.ts +42 -0
- package/types/store/pagination.types.ts +457 -0
- package/types/store/type-map.ts +30 -0
- package/types/store/vuex.d.ts +9 -0
- package/types/vue-shim.d.ts +51 -0
- package/utils/__tests__/cluster.test.ts +20 -18
- package/utils/__tests__/create-yaml.test.ts +359 -2
- package/utils/__tests__/kontainer.test.ts +180 -0
- package/utils/__tests__/pod-security-admission.test.ts +1 -1
- package/utils/alertmanagerconfig.js +19 -0
- package/utils/array.ts +40 -1
- package/utils/async.ts +2 -0
- package/utils/auth.js +152 -4
- package/utils/axios.js +2 -21
- package/utils/azure.js +24 -0
- package/utils/banners.js +103 -0
- package/utils/clipboard.js +5 -0
- package/utils/cluster.js +1 -1
- package/utils/config.js +4 -0
- package/utils/create-yaml.js +59 -28
- package/utils/custom-validators.js +0 -2
- package/utils/error.js +41 -1
- package/utils/formatter.js +5 -3
- package/utils/git.ts +1 -1
- package/utils/install-redirect.js +1 -1
- package/utils/kontainer.ts +190 -0
- package/utils/object.js +24 -0
- package/utils/pagination-utils.ts +154 -0
- package/utils/pod-security-admission.ts +1 -1
- package/utils/router.js +86 -0
- package/utils/settings.ts +46 -0
- package/utils/time.js +2 -1
- package/utils/unit-tests/ChildRenderingRouterLinkStub.ts +36 -0
- package/utils/url.ts +1 -1
- package/utils/validators/formRules/__tests__/index.test.ts +70 -4
- package/utils/validators/formRules/index.ts +15 -9
- package/utils/validators/index.js +1 -0
- package/utils/validators/setting.js +6 -10
- package/utils/version.js +2 -1
- package/vue.config.js +377 -401
- package/.DS_Store +0 -0
- package/assets/images/providers/aks-black.svg +0 -28
- package/assets/images/providers/aks.svg +0 -31
- package/assets/styles/vendor/vue-js-modal.scss +0 -16
- package/components/ChartPsp.vue +0 -76
- package/components/EventsTable.vue +0 -67
- package/components/TabbedLinks/index.vue +0 -94
- package/components/__tests__/ChartPsp.test.ts +0 -75
- package/components/formatter/__tests__/ClusterProvider.test.ts +0 -28
- package/components/nuxt/nuxt-link.server.js +0 -16
- package/components/nuxt/nuxt.js +0 -101
- package/config/router.js +0 -408
- package/edit/provisioning.cattle.io.cluster/__tests__/Basics.tests.ts +0 -237
- package/initialize/App.js +0 -198
- package/initialize/client.js +0 -875
- package/initialize/index.js +0 -364
- package/initialize/layouts.ts +0 -26
- package/middleware/i18n.js +0 -10
- package/middleware/unauthenticated.js +0 -22
- package/mixins/fetch.server.js +0 -73
- package/pages/c/_cluster/apps/index.vue +0 -17
- package/pages/c/_cluster/auth/index.vue +0 -19
- package/pages/c/_cluster/index.vue +0 -17
- package/pages/c/_cluster/legacy/index.vue +0 -22
- package/pages/c/_cluster/manager/index.vue +0 -22
- package/pages/c/_cluster/mcapps/index.vue +0 -21
- package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +0 -232
- package/pages/c/index.vue +0 -9
- package/pages/rio/mesh.vue +0 -508
- package/plugins/dashboard-store/__tests__/mutations.spec.ts +0 -406
- package/plugins/dashboard-store/rehydrate-all.js +0 -44
- package/plugins/portal-vue.js +0 -4
- package/plugins/portal.js +0 -4
- package/plugins/resize.js +0 -5
- package/plugins/shortkey.js +0 -4
- package/plugins/tooltip.js +0 -4
- package/plugins/transitions.js +0 -4
- package/plugins/v-select.js +0 -4
- package/plugins/vue-clipboard2.js +0 -4
- package/tsconfig.default.json +0 -46
- package/utils/group.js +0 -70
- package/utils/nuxt.js +0 -659
- package/utils/router.scrollBehavior.js +0 -80
- /package/components/__tests__/{Collapse.spec.ts → Collapse.test.ts} +0 -0
- /package/edit/provisioning.cattle.io.cluster/{AgentConfiguration.vue → tabs/AgentConfiguration.vue} +0 -0
- /package/edit/provisioning.cattle.io.cluster/{MemberRoles.vue → tabs/MemberRoles.vue} +0 -0
- /package/edit/provisioning.cattle.io.cluster/{ACE.vue → tabs/networking/ACE.vue} +0 -0
- /package/edit/provisioning.cattle.io.cluster/{RegistryMirrors.vue → tabs/registries/RegistryMirrors.vue} +0 -0
- /package/edit/provisioning.cattle.io.cluster/{DrainOptions.vue → tabs/upgrade/DrainOptions.vue} +0 -0
- /package/models/__tests__/{node.ts → node.test.ts} +0 -0
- /package/plugins/dashboard-store/__tests__/{actions.spec.ts → actions.test.ts} +0 -0
- /package/plugins/dashboard-store/__tests__/{getters.spec.ts → getters.test.ts} +0 -0
- /package/plugins/steve/__tests__/{header-warnings.spec.ts → header-warnings.test.ts} +0 -0
- /package/rancher-components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
- /package/types/{pod-security-admission.ts → resources/pod-security-admission.ts} +0 -0
package/utils/auth.js
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import { Popup, popupWindowOptions } from '@shell/utils/window';
|
|
2
2
|
import { parse as parseUrl, addParam } from '@shell/utils/url';
|
|
3
|
-
import {
|
|
4
|
-
|
|
3
|
+
import {
|
|
4
|
+
BACK_TO, SPA, _EDIT, _FLAGGED, TIMED_OUT
|
|
5
|
+
} from '@shell/config/query-params';
|
|
6
|
+
import { MANAGEMENT, NORMAN } from '@shell/config/types';
|
|
5
7
|
import { allHash } from '@shell/utils/promise';
|
|
8
|
+
import { getProductFromRoute, getResourceFromRoute } from '@shell/utils/router';
|
|
9
|
+
import { NAME as EXPLORER } from '@shell/config/product/explorer';
|
|
10
|
+
import { findBy } from '@shell/utils/array';
|
|
6
11
|
|
|
7
12
|
export function openAuthPopup(url, provider) {
|
|
8
13
|
const popup = new Popup(() => {
|
|
@@ -64,10 +69,10 @@ export function returnTo(opt, vm) {
|
|
|
64
69
|
export const authProvidersInfo = async(store) => {
|
|
65
70
|
const rows = await store.dispatch(`management/findAll`, { type: MANAGEMENT.AUTH_CONFIG });
|
|
66
71
|
const nonLocal = rows.filter((x) => x.name !== 'local');
|
|
67
|
-
// Generic OIDC is returned via API but not supported (and will be removed or fixed in future)
|
|
68
|
-
const supportedNonLocal = nonLocal.filter((x) => x.id !== 'oidc');
|
|
69
72
|
const enabled = nonLocal.filter((x) => x.enabled === true );
|
|
70
73
|
|
|
74
|
+
const supportedNonLocal = nonLocal.filter((x) => x.id !== 'oidc');
|
|
75
|
+
|
|
71
76
|
const enabledLocation = enabled.length === 1 ? {
|
|
72
77
|
name: 'c-cluster-auth-config-id',
|
|
73
78
|
params: { id: enabled[0].id },
|
|
@@ -161,3 +166,146 @@ export const canViewResource = (store, resource) => {
|
|
|
161
166
|
|
|
162
167
|
return !!validResource;
|
|
163
168
|
};
|
|
169
|
+
|
|
170
|
+
// ************************************************************
|
|
171
|
+
//
|
|
172
|
+
// BELOW ARE METHODS THAT ARE A PART OF THE AUTHENTICATED MIDDLEWARE REMOVAL. THIS IS A TEMPORARY HOME FOR THESE UTILS AND SHOULD BE REWRITTEN, MOVED OR DELETED.
|
|
173
|
+
//
|
|
174
|
+
// TODO: Remove and refactor everything below for more clarity and better organization. https://github.com/rancher/dashboard/issues/11111
|
|
175
|
+
//
|
|
176
|
+
// ************************************************************
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Attempt to set the product in our datastore if the route matches a known product. Otherwise show an error page instead.
|
|
180
|
+
*/
|
|
181
|
+
export function setProduct(store, to) {
|
|
182
|
+
let product = getProductFromRoute(to);
|
|
183
|
+
|
|
184
|
+
// since all products are hardcoded as routes (ex: c-local-explorer), if we match the wildcard route it means that the product does not exist
|
|
185
|
+
if ((product && (!to.matched.length || (to.matched.length && to.matched[0].path === '/c/:cluster/:product'))) ||
|
|
186
|
+
// if the product grabbed from the route is not registered, then we don't have it!
|
|
187
|
+
(product && !store.getters['type-map/isProductRegistered'](product))) {
|
|
188
|
+
const error = new Error(store.getters['i18n/t']('nav.failWhale.productNotFound', { productNotFound: product }, true));
|
|
189
|
+
|
|
190
|
+
store.dispatch('loadingError', error);
|
|
191
|
+
|
|
192
|
+
throw new Error('loadingError', new Error(store.getters['i18n/t']('nav.failWhale.productNotFound', { productNotFound: product }, true)));
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if ( !product ) {
|
|
196
|
+
product = EXPLORER;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
const oldProduct = store.getters['productId'];
|
|
200
|
+
const oldStore = store.getters['currentProduct']?.inStore;
|
|
201
|
+
|
|
202
|
+
if ( product !== oldProduct ) {
|
|
203
|
+
store.commit('setProduct', product);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
const neuStore = store.getters['currentProduct']?.inStore;
|
|
207
|
+
|
|
208
|
+
if ( neuStore !== oldStore ) {
|
|
209
|
+
// If the product store changes, clear the catalog.
|
|
210
|
+
// There might be management catalog items in it vs cluster.
|
|
211
|
+
store.commit('catalog/reset');
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Check that the resource is valid, if not redirect to fail whale
|
|
217
|
+
*
|
|
218
|
+
* This requires that
|
|
219
|
+
* - product is set
|
|
220
|
+
* - product's store is set and setup (so we can check schema's within it)
|
|
221
|
+
* - product's store has the schemaFor getter (extension stores might not have it)
|
|
222
|
+
* - there's a resource associated with route (meta or param)
|
|
223
|
+
*/
|
|
224
|
+
export function validateResource(store, to) {
|
|
225
|
+
const product = store.getters['currentProduct'];
|
|
226
|
+
const resource = getResourceFromRoute(to);
|
|
227
|
+
|
|
228
|
+
// In order to check a resource is valid we need these
|
|
229
|
+
if (!product || !resource) {
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
if (canViewResource(store, resource)) {
|
|
234
|
+
return false;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// Unknown resource, redirect to fail whale
|
|
238
|
+
|
|
239
|
+
const error = new Error(store.getters['i18n/t']('nav.failWhale.resourceNotFound', { resource }, true));
|
|
240
|
+
|
|
241
|
+
store.dispatch('loadingError', error);
|
|
242
|
+
|
|
243
|
+
throw error;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Attempt to load the current user's principal
|
|
248
|
+
*/
|
|
249
|
+
export async function findMe(store) {
|
|
250
|
+
// First thing we do in loadManagement is fetch principals anyway.... so don't ?me=true here
|
|
251
|
+
const principals = await store.dispatch('rancher/findAll', {
|
|
252
|
+
type: NORMAN.PRINCIPAL,
|
|
253
|
+
opt: {
|
|
254
|
+
url: '/v3/principals',
|
|
255
|
+
redirectUnauthorized: false,
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
const me = findBy(principals, 'me', true);
|
|
260
|
+
|
|
261
|
+
return me;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Attempt to login with default credentials. Note: I think that this may actually be outdated since we don't use these default credentials anymore on setup.
|
|
266
|
+
*/
|
|
267
|
+
export async function tryInitialSetup(store, password = 'admin') {
|
|
268
|
+
try {
|
|
269
|
+
const res = await store.dispatch('auth/login', {
|
|
270
|
+
provider: 'local',
|
|
271
|
+
body: {
|
|
272
|
+
username: 'admin',
|
|
273
|
+
password
|
|
274
|
+
},
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
return res._status === 200;
|
|
278
|
+
} catch (e) {
|
|
279
|
+
console.error('Error trying initial setup', e); // eslint-disable-line no-console
|
|
280
|
+
|
|
281
|
+
return false;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Record in our state management that we're indeed logged in
|
|
287
|
+
*/
|
|
288
|
+
export function isLoggedIn(store, me) {
|
|
289
|
+
store.commit('auth/hasAuth', true);
|
|
290
|
+
store.commit('auth/loggedInAs', me.id);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Record in our state management that we're not logged in and then redirect to the login page
|
|
295
|
+
*/
|
|
296
|
+
export function notLoggedIn(store, redirect, route) {
|
|
297
|
+
store.commit('auth/hasAuth', true);
|
|
298
|
+
|
|
299
|
+
if ( route.name === 'index' ) {
|
|
300
|
+
return redirect('/auth/login');
|
|
301
|
+
} else {
|
|
302
|
+
return redirect(`/auth/login?${ TIMED_OUT }`);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* Record in our state management that we don't have any auth providers
|
|
308
|
+
*/
|
|
309
|
+
export function noAuth(store) {
|
|
310
|
+
store.commit('auth/hasAuth', false);
|
|
311
|
+
}
|
package/utils/axios.js
CHANGED
|
@@ -75,10 +75,6 @@ const createAxiosInstance = (axiosOptions) => {
|
|
|
75
75
|
};
|
|
76
76
|
|
|
77
77
|
const setupProgress = (axios) => {
|
|
78
|
-
if (process.server) {
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
78
|
// A noop loading inteterface for when $nuxt is not yet ready
|
|
83
79
|
const noopLoading = {
|
|
84
80
|
finish: () => { },
|
|
@@ -88,9 +84,9 @@ const setupProgress = (axios) => {
|
|
|
88
84
|
};
|
|
89
85
|
|
|
90
86
|
const $loading = () => {
|
|
91
|
-
const $
|
|
87
|
+
const $globalApp = window.$globalApp;
|
|
92
88
|
|
|
93
|
-
return ($
|
|
89
|
+
return ($globalApp && $globalApp.$loading && $globalApp.$loading.set) ? $globalApp.$loading : noopLoading;
|
|
94
90
|
};
|
|
95
91
|
|
|
96
92
|
let currentRequests = 0;
|
|
@@ -167,21 +163,6 @@ export default (ctx, inject) => {
|
|
|
167
163
|
headers
|
|
168
164
|
};
|
|
169
165
|
|
|
170
|
-
// Proxy SSR request headers headers
|
|
171
|
-
if (process.server && ctx.req && ctx.req.headers) {
|
|
172
|
-
const reqHeaders = { ...ctx.req.headers };
|
|
173
|
-
|
|
174
|
-
for (const h of ['accept', 'host', 'cf-ray', 'cf-connecting-ip', 'content-length', 'content-md5', 'content-type']) {
|
|
175
|
-
delete reqHeaders[h];
|
|
176
|
-
}
|
|
177
|
-
axiosOptions.headers.common = { ...reqHeaders, ...axiosOptions.headers.common };
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
if (process.server) {
|
|
181
|
-
// Don't accept brotli encoding because Node can't parse it
|
|
182
|
-
axiosOptions.headers.common['accept-encoding'] = 'gzip, deflate';
|
|
183
|
-
}
|
|
184
|
-
|
|
185
166
|
const axios = createAxiosInstance(axiosOptions);
|
|
186
167
|
|
|
187
168
|
// Inject axios to the context as $axios
|
package/utils/azure.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
const AZURE_ERROR_MSG_REGEX = /^.*Message=\"(.*)\"$/;
|
|
2
|
+
const AZURE_ERROR_JSON_REGEX = /^.*Response body: ({.*})/;
|
|
3
|
+
|
|
4
|
+
export const parseAzureError = (err) => {
|
|
5
|
+
// Try and parse the response from Azure a couple of ways
|
|
6
|
+
const msgMatch = err.match(AZURE_ERROR_MSG_REGEX);
|
|
7
|
+
|
|
8
|
+
if (msgMatch?.length === 2) {
|
|
9
|
+
return msgMatch[1];
|
|
10
|
+
} else {
|
|
11
|
+
const jsonMatch = err.match(AZURE_ERROR_JSON_REGEX);
|
|
12
|
+
|
|
13
|
+
if (jsonMatch?.length === 2) {
|
|
14
|
+
try {
|
|
15
|
+
const errorObj = JSON.parse(jsonMatch[1]);
|
|
16
|
+
|
|
17
|
+
return errorObj.error_description;
|
|
18
|
+
} catch (e) {}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Can't parse error
|
|
23
|
+
return false;
|
|
24
|
+
};
|
package/utils/banners.js
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
*
|
|
3
|
+
* Helper utilities for the fixed banners that can be configured to show on pages
|
|
4
|
+
*
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { MANAGEMENT } from '@shell/config/types';
|
|
8
|
+
import { SETTING } from '@shell/config/settings';
|
|
9
|
+
|
|
10
|
+
const BANNER_HEADER = 'bannerHeader';
|
|
11
|
+
const BANNER_FOOTER = 'bannerFooter';
|
|
12
|
+
const BANNER_LOGIN = 'bannerConsent';
|
|
13
|
+
|
|
14
|
+
const INDIVIDUAL_BANNERS = {
|
|
15
|
+
'ui-banner-header': BANNER_HEADER,
|
|
16
|
+
'ui-banner-footer': BANNER_FOOTER,
|
|
17
|
+
'ui-banner-login-consent': BANNER_LOGIN,
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const BANNER_SHOW_KEY_MAP = {
|
|
21
|
+
[BANNER_HEADER]: 'showHeader',
|
|
22
|
+
[BANNER_FOOTER]: 'showFooter',
|
|
23
|
+
[BANNER_LOGIN]: 'showConsent',
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Get the individual banner settings
|
|
28
|
+
*/
|
|
29
|
+
export function getIndividualBanners(store) {
|
|
30
|
+
const banners = {};
|
|
31
|
+
|
|
32
|
+
// Go through all settings looking for the individual settings
|
|
33
|
+
const allSettings = store.getters['management/all'](MANAGEMENT.SETTING);
|
|
34
|
+
|
|
35
|
+
allSettings.forEach((setting) => {
|
|
36
|
+
if (setting.value && !!INDIVIDUAL_BANNERS[setting.id]) {
|
|
37
|
+
const settingId = INDIVIDUAL_BANNERS[setting.id];
|
|
38
|
+
|
|
39
|
+
banners[settingId] = setting;
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
return banners;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Overlay settings from the individual banner settings onto the single banner setting
|
|
48
|
+
*/
|
|
49
|
+
export function overlayIndividualBanners(parsedBanner, banners) {
|
|
50
|
+
Object.keys(banners).forEach((id) => {
|
|
51
|
+
try {
|
|
52
|
+
const parsedIndividualBanner = JSON.parse(banners[id].value);
|
|
53
|
+
const shownID = BANNER_SHOW_KEY_MAP[id];
|
|
54
|
+
|
|
55
|
+
parsedBanner[id] = parsedIndividualBanner;
|
|
56
|
+
parsedBanner[shownID] = 'true'; // If there is an individual banner setting, then banner is shown
|
|
57
|
+
} catch {}
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Converts a pixel value to an em value based on the default font size.
|
|
63
|
+
* @param {number} elementFontSize - The font size of the element in pixels.
|
|
64
|
+
* @param {number} [defaultFontSize=14] - The default font size in pixels.
|
|
65
|
+
* @returns {string} The converted value in em units.
|
|
66
|
+
*/
|
|
67
|
+
function pxToEm(elementFontSize, defaultFontSize = 14) {
|
|
68
|
+
const lineHeightInPx = 2 * parseInt(elementFontSize);
|
|
69
|
+
const lineHeightInEm = lineHeightInPx / defaultFontSize;
|
|
70
|
+
|
|
71
|
+
return `${ lineHeightInEm }em`;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Get banner font sizes - used to add margins when header and footer banners are present
|
|
76
|
+
**/
|
|
77
|
+
export function getGlobalBannerFontSizes(store) {
|
|
78
|
+
const settings = store.getters['management/all'](MANAGEMENT.SETTING);
|
|
79
|
+
const bannerSettings = settings?.find((s) => s.id === SETTING.BANNERS);
|
|
80
|
+
const individualBannerSettings = getIndividualBanners(store);
|
|
81
|
+
|
|
82
|
+
if (bannerSettings) {
|
|
83
|
+
const parsed = JSON.parse(bannerSettings.value);
|
|
84
|
+
|
|
85
|
+
overlayIndividualBanners(parsed, individualBannerSettings);
|
|
86
|
+
|
|
87
|
+
const {
|
|
88
|
+
showFooter, showHeader, bannerFooter, bannerHeader, banner
|
|
89
|
+
} = parsed;
|
|
90
|
+
|
|
91
|
+
// add defaults to accommodate older JSON structures for banner definitions without breaking the UI
|
|
92
|
+
// https://github.com/rancher/dashboard/issues/10140
|
|
93
|
+
const bannerHeaderFontSize = bannerHeader?.fontSize || banner?.fontSize || '14px';
|
|
94
|
+
const bannerFooterFontSize = bannerFooter?.fontSize || banner?.fontSize || '14px';
|
|
95
|
+
|
|
96
|
+
return {
|
|
97
|
+
headerFont: showHeader === 'true' ? pxToEm(bannerHeaderFontSize) : '0px',
|
|
98
|
+
footerFont: showFooter === 'true' ? pxToEm(bannerFooterFontSize) : '0px'
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return undefined;
|
|
103
|
+
}
|
package/utils/cluster.js
CHANGED
|
@@ -85,7 +85,7 @@ export function abbreviateClusterName(input) {
|
|
|
85
85
|
break;
|
|
86
86
|
}
|
|
87
87
|
default:
|
|
88
|
-
result = segments.slice(0,
|
|
88
|
+
result = segments.slice(0, 2).map((segment) => segment[0]).join('') + segments.slice(-1)[0].slice(-1);
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
return result;
|
package/utils/config.js
ADDED
package/utils/create-yaml.js
CHANGED
|
@@ -2,6 +2,7 @@ import { indent as _indent } from '@shell/utils/string';
|
|
|
2
2
|
import { addObject, findBy, removeObject, removeObjects } from '@shell/utils/array';
|
|
3
3
|
import jsyaml from 'js-yaml';
|
|
4
4
|
import { cleanUp, isEmpty } from '@shell/utils/object';
|
|
5
|
+
import { parseType } from '@shell/models/schema';
|
|
5
6
|
|
|
6
7
|
export const SIMPLE_TYPES = [
|
|
7
8
|
'string',
|
|
@@ -32,7 +33,6 @@ const ALWAYS_ADD = [
|
|
|
32
33
|
];
|
|
33
34
|
|
|
34
35
|
export const NEVER_ADD = [
|
|
35
|
-
'metadata.clusterName',
|
|
36
36
|
'metadata.clusterName',
|
|
37
37
|
'metadata.creationTimestamp',
|
|
38
38
|
'metadata.deletionGracePeriodSeconds',
|
|
@@ -46,11 +46,16 @@ export const NEVER_ADD = [
|
|
|
46
46
|
'metadata.resourceVersion',
|
|
47
47
|
'metadata.relationships',
|
|
48
48
|
'metadata.selfLink',
|
|
49
|
+
'metadata.state',
|
|
49
50
|
'metadata.uid',
|
|
50
51
|
// CRD -> Schema describes the schema used for validation, pruning, and defaulting of this version of the custom resource. If we allow processing we fall into inf loop on openAPIV3Schema.allOf which contains a cyclical ref of allOf props.
|
|
51
52
|
'spec.versions.schema',
|
|
52
53
|
'status',
|
|
53
54
|
'stringData',
|
|
55
|
+
'links',
|
|
56
|
+
'_name',
|
|
57
|
+
'_labels',
|
|
58
|
+
'_annotations',
|
|
54
59
|
];
|
|
55
60
|
|
|
56
61
|
export const ACTIVELY_REMOVE = [
|
|
@@ -83,26 +88,47 @@ export function createYaml(
|
|
|
83
88
|
depth = 0,
|
|
84
89
|
path = '',
|
|
85
90
|
rootType = null,
|
|
86
|
-
dataOptions = {}
|
|
91
|
+
dataOptions = {},
|
|
87
92
|
) {
|
|
88
|
-
|
|
93
|
+
data = data || {};
|
|
89
94
|
|
|
90
|
-
|
|
91
|
-
rootType = type;
|
|
92
|
-
}
|
|
95
|
+
let schema, rootSchema, schemaDefinitions, schemaResourceFields;
|
|
93
96
|
|
|
94
|
-
if (
|
|
95
|
-
|
|
96
|
-
|
|
97
|
+
if (depth === 0) {
|
|
98
|
+
// `type` is a schema id
|
|
99
|
+
schema = findBy(schemas, 'id', type);
|
|
97
100
|
|
|
98
|
-
|
|
101
|
+
if ( !schema ) { // schema is only needed at the root level.
|
|
102
|
+
return `Error loading schema for ${ type }`;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
rootSchema = schema;
|
|
106
|
+
|
|
107
|
+
schemaDefinitions = rootSchema.schemaDefinitions;
|
|
108
|
+
schemaResourceFields = rootSchema.resourceFields;
|
|
99
109
|
|
|
100
|
-
if ( depth === 0 ) {
|
|
101
110
|
const attr = schema.attributes || {};
|
|
102
111
|
|
|
103
112
|
// Default to data.apiVersion/kind to accommodate spoofed types that aggregate multiple types
|
|
104
113
|
data.apiVersion = (attr.group ? `${ attr.group }/${ attr.version }` : attr.version) || data.apiVersion;
|
|
105
114
|
data.kind = attr.kind || data.kind;
|
|
115
|
+
} else {
|
|
116
|
+
rootSchema = findBy(schemas, 'id', rootType);
|
|
117
|
+
|
|
118
|
+
if (rootSchema.requiresResourceFields) { // See `requiresResourceFields` definition
|
|
119
|
+
schemaDefinitions = rootSchema.schemaDefinitions;
|
|
120
|
+
schemaResourceFields = schemaDefinitions[type]?.resourceFields;
|
|
121
|
+
} else {
|
|
122
|
+
schema = findBy(schemas, 'id', type);
|
|
123
|
+
if ( !schema ) { // schema is only needed at the root level.
|
|
124
|
+
return `Error loading schema for ${ type }`;
|
|
125
|
+
}
|
|
126
|
+
schemaResourceFields = schema.resourceFields;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if ( !rootType ) {
|
|
131
|
+
rootType = type;
|
|
106
132
|
}
|
|
107
133
|
|
|
108
134
|
const regularFields = [];
|
|
@@ -127,14 +153,14 @@ export function createYaml(
|
|
|
127
153
|
const key = parts[parts.length - 1];
|
|
128
154
|
const prefix = parts.slice(0, -1).join('.');
|
|
129
155
|
|
|
130
|
-
if ( prefix === path &&
|
|
156
|
+
if ( prefix === path && schemaResourceFields && schemaResourceFields[key] ) {
|
|
131
157
|
addObject(regularFields, key);
|
|
132
158
|
}
|
|
133
159
|
}
|
|
134
160
|
}
|
|
135
161
|
|
|
136
162
|
// Include all fields in schema's resourceFields as comments
|
|
137
|
-
const commentFields = Object.keys(
|
|
163
|
+
const commentFields = Object.keys(schemaResourceFields || {});
|
|
138
164
|
|
|
139
165
|
commentFields.forEach((key) => {
|
|
140
166
|
if ( typeof data[key] !== 'undefined' || (depth === 0 && key === '_type') ) {
|
|
@@ -166,7 +192,7 @@ export function createYaml(
|
|
|
166
192
|
const key = parts[parts.length - 1];
|
|
167
193
|
const prefix = parts.slice(0, -1).join('.');
|
|
168
194
|
|
|
169
|
-
if ( prefix === path &&
|
|
195
|
+
if ( prefix === path && schemaResourceFields && schemaResourceFields[key] ) {
|
|
170
196
|
removeObject(commentFields, key);
|
|
171
197
|
}
|
|
172
198
|
}
|
|
@@ -178,8 +204,6 @@ export function createYaml(
|
|
|
178
204
|
const comments = commentFields.map((k) => {
|
|
179
205
|
// Don't add a namespace comment for types that aren't namespaced.
|
|
180
206
|
if ( path === 'metadata' && k === 'namespace' ) {
|
|
181
|
-
const rootSchema = findBy(schemas, 'id', rootType);
|
|
182
|
-
|
|
183
207
|
if ( rootSchema && !rootSchema.attributes?.namespaced ) {
|
|
184
208
|
return null;
|
|
185
209
|
}
|
|
@@ -198,7 +222,7 @@ export function createYaml(
|
|
|
198
222
|
// ---------------
|
|
199
223
|
|
|
200
224
|
function stringifyField(key) {
|
|
201
|
-
const field =
|
|
225
|
+
const field = schemaResourceFields?.[key];
|
|
202
226
|
let out = `${ key }:`;
|
|
203
227
|
|
|
204
228
|
// '_type' in steve maps to kubernetes 'type' field; show 'type' field in yaml
|
|
@@ -229,8 +253,8 @@ export function createYaml(
|
|
|
229
253
|
}
|
|
230
254
|
|
|
231
255
|
const type = typeMunge(field.type);
|
|
232
|
-
const mapOf = typeRef('map', type);
|
|
233
|
-
const arrayOf = typeRef('array', type);
|
|
256
|
+
const mapOf = typeRef('map', type, field);
|
|
257
|
+
const arrayOf = typeRef('array', type, field);
|
|
234
258
|
const referenceTo = typeRef('reference', type);
|
|
235
259
|
|
|
236
260
|
// type == map[mapOf]
|
|
@@ -250,7 +274,7 @@ export function createYaml(
|
|
|
250
274
|
if ( SIMPLE_TYPES.includes(mapOf) ) {
|
|
251
275
|
out += `# key: ${ mapOf }`;
|
|
252
276
|
} else {
|
|
253
|
-
// If not a simple type ie some sort of object/array,
|
|
277
|
+
// If not a simple type ie some sort of object/array, recursively build out commented fields (note data = null here) per the type's (mapOf's) schema
|
|
254
278
|
const chunk = createYaml(schemas, mapOf, null, processAlwaysAdd, depth + 1, (path ? `${ path }.${ key }` : key), rootType, dataOptions);
|
|
255
279
|
let indented = indent(chunk);
|
|
256
280
|
|
|
@@ -275,7 +299,7 @@ export function createYaml(
|
|
|
275
299
|
out += `\n${ indent(parsedData.trim()) }`;
|
|
276
300
|
}
|
|
277
301
|
} catch (e) {
|
|
278
|
-
console.error(`Error:
|
|
302
|
+
console.error(`Error: Unable to parse array data for yaml of type: ${ type }`, e); // eslint-disable-line no-console
|
|
279
303
|
}
|
|
280
304
|
}
|
|
281
305
|
|
|
@@ -331,7 +355,7 @@ export function createYaml(
|
|
|
331
355
|
}
|
|
332
356
|
}
|
|
333
357
|
|
|
334
|
-
const subDef = findBy(schemas, 'id', type);
|
|
358
|
+
const subDef = schemaDefinitions?.[type] || findBy(schemas, 'id', type);
|
|
335
359
|
|
|
336
360
|
if ( subDef) {
|
|
337
361
|
let chunk;
|
|
@@ -407,12 +431,19 @@ function getBlockIndentation(blockHeader) {
|
|
|
407
431
|
return indentation?.[0] || '';
|
|
408
432
|
}
|
|
409
433
|
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
434
|
+
/**
|
|
435
|
+
* Check for a specific type and if valid return it's sub type or self
|
|
436
|
+
* @param {string} type required type
|
|
437
|
+
* @param {string} str actual type
|
|
438
|
+
* @param {ResourceField} field resourceField entry to the actual type
|
|
439
|
+
*
|
|
440
|
+
* @returns the sub type, or if not found the type
|
|
441
|
+
*/
|
|
442
|
+
export function typeRef(type, str, field = null) {
|
|
443
|
+
const [foundType, foundSubType] = parseType(str, field);
|
|
413
444
|
|
|
414
|
-
if (
|
|
415
|
-
return typeMunge(
|
|
445
|
+
if (type === foundType) {
|
|
446
|
+
return typeMunge(foundSubType || foundType);
|
|
416
447
|
}
|
|
417
448
|
}
|
|
418
449
|
|
|
@@ -456,7 +487,7 @@ export function saferDump(obj) {
|
|
|
456
487
|
*
|
|
457
488
|
* @returns the result of jsyaml.dump with the addition of multiline indicators
|
|
458
489
|
*/
|
|
459
|
-
export function dumpBlock(data, options = {}) {
|
|
490
|
+
export function dumpBlock(data, options = { lineWidth: -1 }) {
|
|
460
491
|
const parsed = jsyaml.dump(data, options);
|
|
461
492
|
|
|
462
493
|
let out = parsed;
|
|
@@ -8,7 +8,6 @@ import { cronSchedule } from '@shell/utils/validators/cron-schedule';
|
|
|
8
8
|
import { podAffinity } from '@shell/utils/validators/pod-affinity';
|
|
9
9
|
import { roleTemplateRules } from '@shell/utils/validators/role-template';
|
|
10
10
|
import { clusterName } from '@shell/utils/validators/cluster-name';
|
|
11
|
-
import { isHttps } from '@shell/utils/validators/setting';
|
|
12
11
|
|
|
13
12
|
/**
|
|
14
13
|
* Custom validation functions beyond normal scalr types
|
|
@@ -30,5 +29,4 @@ export default {
|
|
|
30
29
|
cronSchedule,
|
|
31
30
|
podAffinity,
|
|
32
31
|
roleTemplateRules,
|
|
33
|
-
isHttps,
|
|
34
32
|
};
|
package/utils/error.js
CHANGED
|
@@ -1,9 +1,24 @@
|
|
|
1
1
|
import { isArray } from '@shell/utils/array';
|
|
2
2
|
|
|
3
3
|
export class ClusterNotFoundError extends Error {
|
|
4
|
+
static name = 'ClusterNotFoundError'
|
|
5
|
+
|
|
4
6
|
constructor(message) {
|
|
5
7
|
super(message);
|
|
6
|
-
this.name =
|
|
8
|
+
this.name = ClusterNotFoundError.name;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* An error occurred and the user should be redirected to a certain location (where this is handled)
|
|
14
|
+
*/
|
|
15
|
+
export class RedirectToError extends Error {
|
|
16
|
+
static name = 'RedirectToError'
|
|
17
|
+
|
|
18
|
+
constructor(message, url) {
|
|
19
|
+
super(message);
|
|
20
|
+
this.url = url;
|
|
21
|
+
this.name = RedirectToError.name;
|
|
7
22
|
}
|
|
8
23
|
}
|
|
9
24
|
|
|
@@ -89,3 +104,28 @@ export function exceptionToErrorsArray(err) {
|
|
|
89
104
|
return [err];
|
|
90
105
|
}
|
|
91
106
|
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Imported from path-to-regexp
|
|
110
|
+
* @param {*} err
|
|
111
|
+
* @returns
|
|
112
|
+
*/
|
|
113
|
+
export const normalizeError = (err) => {
|
|
114
|
+
let message;
|
|
115
|
+
|
|
116
|
+
if (!(err.message || typeof err === 'string')) {
|
|
117
|
+
try {
|
|
118
|
+
message = JSON.stringify(err, null, 2);
|
|
119
|
+
} catch (e) {
|
|
120
|
+
message = `[${ err.constructor.name }]`;
|
|
121
|
+
}
|
|
122
|
+
} else {
|
|
123
|
+
message = err.message || err;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return {
|
|
127
|
+
...err,
|
|
128
|
+
message,
|
|
129
|
+
statusCode: (err.statusCode || err.status || (err.response && err.response.status) || 500)
|
|
130
|
+
};
|
|
131
|
+
};
|
package/utils/formatter.js
CHANGED
|
@@ -2,10 +2,12 @@
|
|
|
2
2
|
import { SECRET_TYPES } from '@shell/config/secret';
|
|
3
3
|
|
|
4
4
|
export function formatEncryptionSecretNames(secrets, chartNamespace) {
|
|
5
|
-
return secrets
|
|
6
|
-
(secret) => (secret.data || {})['encryption-provider-config.yaml'] &&
|
|
5
|
+
return secrets
|
|
6
|
+
.filter((secret) => (secret.data || {})['encryption-provider-config.yaml'] &&
|
|
7
7
|
secret.metadata.namespace === chartNamespace &&
|
|
8
8
|
!secret.metadata?.state?.error &&
|
|
9
9
|
secret._type === SECRET_TYPES.OPAQUE
|
|
10
|
-
|
|
10
|
+
)
|
|
11
|
+
.map((secret) => secret.metadata.name)
|
|
12
|
+
.sort();
|
|
11
13
|
}
|
package/utils/git.ts
CHANGED
|
@@ -26,7 +26,7 @@ export default function(product, chartName, defaultResourceOrRoute, install = tr
|
|
|
26
26
|
} else if (install) {
|
|
27
27
|
// The product is not installed, redirect to the details chart
|
|
28
28
|
|
|
29
|
-
await store.dispatch('catalog/load'
|
|
29
|
+
await store.dispatch('catalog/load');
|
|
30
30
|
|
|
31
31
|
const chart = store.getters['catalog/chart']({ chartName });
|
|
32
32
|
|