@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
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { CAPI, MANAGEMENT, NORMAN } from '@shell/config/types';
|
|
2
2
|
import { sortBy } from '@shell/utils/sort';
|
|
3
3
|
import HybridModel from '@shell/plugins/steve/hybrid-class';
|
|
4
|
+
import { notOnlyOfRole } from '@shell/models/cluster.x-k8s.io.machine';
|
|
4
5
|
|
|
5
6
|
export default class MgmtNodePool extends HybridModel {
|
|
6
7
|
get nodeTemplate() {
|
|
@@ -161,6 +162,22 @@ export default class MgmtNodePool extends HybridModel {
|
|
|
161
162
|
return this.norman?.hasLink('update');
|
|
162
163
|
}
|
|
163
164
|
|
|
165
|
+
get isControlPlane() {
|
|
166
|
+
return this.spec?.controlPlane === true;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
get isEtcd() {
|
|
170
|
+
return this.spec?.etcd === true;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
canScaleDownPool() {
|
|
174
|
+
if (!this.isEtcd && !this.isControlPlane) {
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
return notOnlyOfRole(this, this?.provisioningCluster?.nodes);
|
|
179
|
+
}
|
|
180
|
+
|
|
164
181
|
remove() {
|
|
165
182
|
return this.norman?.remove();
|
|
166
183
|
}
|
|
@@ -99,42 +99,6 @@ export default class Project extends HybridModel {
|
|
|
99
99
|
// and the PUT request should have a query param _replace=true.
|
|
100
100
|
const newValue = await norman.save({ replace: forceReplaceOnReq });
|
|
101
101
|
|
|
102
|
-
let retryCount = 0;
|
|
103
|
-
|
|
104
|
-
const finishProjectCreation = async() => {
|
|
105
|
-
try {
|
|
106
|
-
await newValue.doAction('setpodsecuritypolicytemplate', { podSecurityPolicyTemplateId: this.spec.podSecurityPolicyTemplateId || null });
|
|
107
|
-
} catch (err) {
|
|
108
|
-
if ( err.status === 409 || err.status === 403 ) {
|
|
109
|
-
// The backend updates each new project soon after it is created,
|
|
110
|
-
// so there is a chance of a 409 resource conflict or forbidden error. If that happens,
|
|
111
|
-
// retry the action.
|
|
112
|
-
|
|
113
|
-
// The 403 permission error can happen due to the user requesting
|
|
114
|
-
// the project before the project is fully created and the project
|
|
115
|
-
// permissions are assigned to the user so we allow some
|
|
116
|
-
// time for that process to complete.
|
|
117
|
-
|
|
118
|
-
if (retryCount < 3) {
|
|
119
|
-
retryCount++;
|
|
120
|
-
await setTimeout(() => {
|
|
121
|
-
// Delay for three seconds to avoid another failure due to latency.
|
|
122
|
-
finishProjectCreation();
|
|
123
|
-
}, '3000');
|
|
124
|
-
} else {
|
|
125
|
-
throw err;
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
};
|
|
130
|
-
|
|
131
|
-
// Only update PSP template if the value changed
|
|
132
|
-
const newPSPTemplateID = this.spec.podSecurityPolicyTemplateId || null;
|
|
133
|
-
|
|
134
|
-
if (norman.podSecurityPolicyTemplateId !== newPSPTemplateID) {
|
|
135
|
-
await finishProjectCreation();
|
|
136
|
-
}
|
|
137
|
-
|
|
138
102
|
return newValue;
|
|
139
103
|
}
|
|
140
104
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ALLOWED_SETTINGS } from '@shell/config/settings';
|
|
2
2
|
import HybridModel from '@shell/plugins/steve/hybrid-class';
|
|
3
|
+
import { isServerUrl } from '@shell/utils/validators/setting';
|
|
3
4
|
|
|
4
5
|
export default class Setting extends HybridModel {
|
|
5
6
|
get fromEnv() {
|
|
@@ -31,12 +32,15 @@ export default class Setting extends HybridModel {
|
|
|
31
32
|
}
|
|
32
33
|
|
|
33
34
|
get customValidationRules() {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
35
|
+
const out = [];
|
|
36
|
+
|
|
37
|
+
if (isServerUrl(this.metadata.name)) {
|
|
38
|
+
out.push({
|
|
39
|
+
path: 'value',
|
|
40
|
+
validators: ['required', 'https', 'url', 'trailingForwardSlash']
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return out;
|
|
41
45
|
}
|
|
42
46
|
}
|
|
@@ -223,7 +223,7 @@ export default class User extends HybridModel {
|
|
|
223
223
|
return [
|
|
224
224
|
{
|
|
225
225
|
action: 'activate',
|
|
226
|
-
label: this.t('action.
|
|
226
|
+
label: this.t('action.enable'),
|
|
227
227
|
icon: 'icon icon-play',
|
|
228
228
|
bulkable: true,
|
|
229
229
|
bulkAction: 'activateBulk',
|
|
@@ -232,7 +232,7 @@ export default class User extends HybridModel {
|
|
|
232
232
|
},
|
|
233
233
|
{
|
|
234
234
|
action: 'deactivate',
|
|
235
|
-
label: this.t('action.
|
|
235
|
+
label: this.t('action.disable'),
|
|
236
236
|
icon: 'icon icon-pause',
|
|
237
237
|
bulkable: true,
|
|
238
238
|
bulkAction: 'deactivateBulk',
|
|
@@ -4,6 +4,8 @@ import { MONITORING } from '@shell/config/types';
|
|
|
4
4
|
import jsyaml from 'js-yaml';
|
|
5
5
|
import SteveModel from '@shell/plugins/steve/steve-class';
|
|
6
6
|
|
|
7
|
+
// i18n-uses monitoringReceiver.slack.*, monitoringReceiver.email.*, monitoringReceiver.pagerduty.*
|
|
8
|
+
// i18n-uses monitoringReceiver.opsgenie.*, monitoringReceiver.webhook.*, monitoringReceiver.custom.*
|
|
7
9
|
export const RECEIVERS_TYPES = [
|
|
8
10
|
{
|
|
9
11
|
name: 'slack',
|
|
@@ -66,7 +68,7 @@ export default class Receiver extends SteveModel {
|
|
|
66
68
|
}
|
|
67
69
|
|
|
68
70
|
async save() {
|
|
69
|
-
const errors =
|
|
71
|
+
const errors = this.validationErrors(this);
|
|
70
72
|
|
|
71
73
|
if (!isEmpty(errors)) {
|
|
72
74
|
return Promise.reject(errors);
|
package/models/namespace.js
CHANGED
|
@@ -44,7 +44,8 @@ export default class Ingress extends SteveModel {
|
|
|
44
44
|
const isTargetsWorkload = serviceName.startsWith('ingress-');
|
|
45
45
|
const id = `${ this.namespace }/${ serviceName }`;
|
|
46
46
|
|
|
47
|
-
if (
|
|
47
|
+
if (isTargetsWorkload) {
|
|
48
|
+
// Need to expose workloadId's and fetch specific ones in IngressTarget?
|
|
48
49
|
const workload = workloads.find((w) => w.id === (id));
|
|
49
50
|
|
|
50
51
|
return workload?.detailLocation || '';
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import Driver from '@shell/models/driver';
|
|
2
|
+
|
|
3
|
+
export default class NodeDriver extends Driver {
|
|
4
|
+
get doneRoute() {
|
|
5
|
+
return 'c-cluster-manager-driver-nodedriver';
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
get _availableActions() {
|
|
9
|
+
const out = [
|
|
10
|
+
{
|
|
11
|
+
action: 'activate',
|
|
12
|
+
label: this.t('action.activate'),
|
|
13
|
+
icon: 'icon icon-play',
|
|
14
|
+
bulkable: true,
|
|
15
|
+
bulkAction: 'activateBulk',
|
|
16
|
+
enabled: !!this.actions.activate && this.state === 'inactive',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
action: 'deactivate',
|
|
20
|
+
label: this.t('action.deactivate'),
|
|
21
|
+
icon: 'icon icon-pause',
|
|
22
|
+
bulkable: true,
|
|
23
|
+
bulkAction: 'deactivateBulk',
|
|
24
|
+
enabled: !!this.actions.deactivate && this.state === 'active',
|
|
25
|
+
weight: -1,
|
|
26
|
+
},
|
|
27
|
+
{ divider: true },
|
|
28
|
+
{
|
|
29
|
+
action: 'viewInApi',
|
|
30
|
+
enabled: true,
|
|
31
|
+
icon: 'icon icon-external-link',
|
|
32
|
+
label: this.t('action.viewInApi'),
|
|
33
|
+
},
|
|
34
|
+
{ divider: true },
|
|
35
|
+
{
|
|
36
|
+
action: 'goToEdit',
|
|
37
|
+
label: this.t('action.edit'),
|
|
38
|
+
icon: 'icon icon-edit',
|
|
39
|
+
bulkable: false,
|
|
40
|
+
enabled: !!this.links.update && !this.builtin,
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
action: 'promptRemove',
|
|
44
|
+
altAction: 'remove',
|
|
45
|
+
bulkAction: 'promptRemove',
|
|
46
|
+
label: this.t('action.remove'),
|
|
47
|
+
bulkable: true,
|
|
48
|
+
icon: 'icon icon-delete',
|
|
49
|
+
enabled: !!this.links.update && !this.active,
|
|
50
|
+
weight: -10,
|
|
51
|
+
}
|
|
52
|
+
];
|
|
53
|
+
|
|
54
|
+
return out;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
deactivate(resources = [this]) {
|
|
58
|
+
this.$dispatch('promptModal', {
|
|
59
|
+
componentProps: { drivers: resources, driverType: 'nodeDrivers' },
|
|
60
|
+
component: 'DeactivateDriverDialog'
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
deactivateBulk(resources) {
|
|
65
|
+
this.$dispatch('promptModal', {
|
|
66
|
+
componentProps: { drivers: resources, driverType: 'nodeDrivers' },
|
|
67
|
+
component: 'DeactivateDriverDialog'
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
activate() {
|
|
72
|
+
return this.$dispatch('rancher/request', {
|
|
73
|
+
url: `v3/nodeDrivers/${ escape(this.id) }?action=activate`,
|
|
74
|
+
method: 'post',
|
|
75
|
+
}, { root: true });
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
async activateBulk(resources) {
|
|
79
|
+
await Promise.all(resources.map((resource) => this.$dispatch('rancher/request', {
|
|
80
|
+
url: `v3/nodeDrivers/${ escape(resource.id) }?action=activate`,
|
|
81
|
+
method: 'post',
|
|
82
|
+
}, { root: true }
|
|
83
|
+
)));
|
|
84
|
+
}
|
|
85
|
+
}
|
package/models/pod.js
CHANGED
|
@@ -3,6 +3,7 @@ import { colorForState, stateDisplay } from '@shell/plugins/dashboard-store/reso
|
|
|
3
3
|
import { NODE, WORKLOAD_TYPES } from '@shell/config/types';
|
|
4
4
|
import { escapeHtml, shortenedImage } from '@shell/utils/string';
|
|
5
5
|
import WorkloadService from '@shell/models/workload.service';
|
|
6
|
+
import { deleteProperty } from '@shell/utils/object';
|
|
6
7
|
|
|
7
8
|
export const WORKLOAD_PRIORITY = {
|
|
8
9
|
[WORKLOAD_TYPES.DEPLOYMENT]: 1,
|
|
@@ -256,4 +257,23 @@ export default class Pod extends WorkloadService {
|
|
|
256
257
|
return Promise.reject(e);
|
|
257
258
|
});
|
|
258
259
|
}
|
|
260
|
+
|
|
261
|
+
cleanForSave(data) {
|
|
262
|
+
const val = super.cleanForSave(data);
|
|
263
|
+
|
|
264
|
+
// remove fields from containers
|
|
265
|
+
val.spec?.containers?.forEach((container) => {
|
|
266
|
+
this.cleanContainerForSave(container);
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
// remove fields from initContainers
|
|
270
|
+
val.spec?.initContainers?.forEach((container) => {
|
|
271
|
+
this.cleanContainerForSave(container);
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
// This is probably added by generic workload components that shouldn't be added to pods
|
|
275
|
+
deleteProperty(val, 'spec.selector');
|
|
276
|
+
|
|
277
|
+
return val;
|
|
278
|
+
}
|
|
259
279
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import {
|
|
2
|
-
CAPI, MANAGEMENT, NORMAN, SNAPSHOT, HCI
|
|
2
|
+
CAPI, MANAGEMENT, NAMESPACE, NORMAN, SNAPSHOT, HCI, LOCAL_CLUSTER
|
|
3
3
|
} from '@shell/config/types';
|
|
4
4
|
import SteveModel from '@shell/plugins/steve/steve-class';
|
|
5
5
|
import { findBy } from '@shell/utils/array';
|
|
@@ -9,7 +9,8 @@ import { ucFirst } from '@shell/utils/string';
|
|
|
9
9
|
import { compare } from '@shell/utils/version';
|
|
10
10
|
import { AS, MODE, _VIEW, _YAML } from '@shell/config/query-params';
|
|
11
11
|
import { HARVESTER_NAME as HARVESTER } from '@shell/config/features';
|
|
12
|
-
import { CAPI as CAPI_ANNOTATIONS } from '@shell/config/labels-annotations';
|
|
12
|
+
import { CAPI as CAPI_ANNOTATIONS, NODE_ARCHITECTURE } from '@shell/config/labels-annotations';
|
|
13
|
+
import capitalize from 'lodash/capitalize';
|
|
13
14
|
|
|
14
15
|
/**
|
|
15
16
|
* Class representing Cluster resource.
|
|
@@ -180,6 +181,16 @@ export default class ProvCluster extends SteveModel {
|
|
|
180
181
|
return out;
|
|
181
182
|
}
|
|
182
183
|
|
|
184
|
+
async findNormanCluster() {
|
|
185
|
+
const name = this.status?.clusterName;
|
|
186
|
+
|
|
187
|
+
if ( !name ) {
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
return await this.$dispatch('rancher/find', { type: NORMAN.CLUSTER, id: name }, { root: true });
|
|
192
|
+
}
|
|
193
|
+
|
|
183
194
|
explore() {
|
|
184
195
|
const location = {
|
|
185
196
|
name: 'c-cluster',
|
|
@@ -239,10 +250,39 @@ export default class ProvCluster extends SteveModel {
|
|
|
239
250
|
return providers.includes(this.provisioner);
|
|
240
251
|
}
|
|
241
252
|
|
|
253
|
+
get isPrivateHostedProvider() {
|
|
254
|
+
if (this.isHostedKubernetesProvider && this.mgmt && this.provisioner) {
|
|
255
|
+
switch (this.provisioner.toLowerCase()) {
|
|
256
|
+
case 'gke':
|
|
257
|
+
return this.mgmt.spec?.gkeConfig?.privateClusterConfig?.enablePrivateEndpoint;
|
|
258
|
+
case 'eks':
|
|
259
|
+
return this.mgmt.spec?.eksConfig?.privateAccess;
|
|
260
|
+
case 'aks':
|
|
261
|
+
return this.mgmt.spec?.aksConfig?.privateCluster;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
return false;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
get isLocal() {
|
|
269
|
+
return this.mgmt?.isLocal;
|
|
270
|
+
}
|
|
271
|
+
|
|
242
272
|
get isImported() {
|
|
243
273
|
// As of Rancher v2.6.7, this returns false for imported K3s clusters,
|
|
244
274
|
// in which this.provisioner is `k3s`.
|
|
245
|
-
|
|
275
|
+
|
|
276
|
+
const isImportedProvisioner = this.provisioner === 'imported';
|
|
277
|
+
const isImportedSpecialCases = this.mgmt?.providerForEmberParam === 'import' ||
|
|
278
|
+
// when imported cluster is GKE
|
|
279
|
+
!!this.mgmt?.spec?.gkeConfig?.imported ||
|
|
280
|
+
// or AKS
|
|
281
|
+
!!this.mgmt?.spec?.aksConfig?.imported ||
|
|
282
|
+
// or EKS
|
|
283
|
+
!!this.mgmt?.spec?.eksConfig?.imported;
|
|
284
|
+
|
|
285
|
+
return !this.isLocal && (isImportedProvisioner || (!this.isRke2 && !this.mgmt?.machineProvider && isImportedSpecialCases));
|
|
246
286
|
}
|
|
247
287
|
|
|
248
288
|
get isCustom() {
|
|
@@ -262,8 +302,6 @@ export default class ProvCluster extends SteveModel {
|
|
|
262
302
|
}
|
|
263
303
|
|
|
264
304
|
get isImportedK3s() {
|
|
265
|
-
// As of Rancher v2.6.7, this returns false for imported K3s clusters,
|
|
266
|
-
// in which this.provisioner is `k3s`.
|
|
267
305
|
return this.isImported && this.isK3s;
|
|
268
306
|
}
|
|
269
307
|
|
|
@@ -272,7 +310,7 @@ export default class ProvCluster extends SteveModel {
|
|
|
272
310
|
}
|
|
273
311
|
|
|
274
312
|
get isK3s() {
|
|
275
|
-
return this.mgmt?.status?.provider === 'k3s';
|
|
313
|
+
return this.mgmt?.status ? this.mgmt?.status.provider === 'k3s' : (this.spec?.kubernetesVersion || '').includes('k3s') ;
|
|
276
314
|
}
|
|
277
315
|
|
|
278
316
|
get isRke2() {
|
|
@@ -280,7 +318,7 @@ export default class ProvCluster extends SteveModel {
|
|
|
280
318
|
}
|
|
281
319
|
|
|
282
320
|
get isRke1() {
|
|
283
|
-
return !!this.mgmt?.spec?.rancherKubernetesEngineConfig;
|
|
321
|
+
return !!this.mgmt?.spec?.rancherKubernetesEngineConfig || this.labels['provider.cattle.io'] === 'rke';
|
|
284
322
|
}
|
|
285
323
|
|
|
286
324
|
get isHarvester() {
|
|
@@ -366,6 +404,38 @@ export default class ProvCluster extends SteveModel {
|
|
|
366
404
|
return this.mgmt?.providerLogo;
|
|
367
405
|
}
|
|
368
406
|
|
|
407
|
+
get nodesArchitecture() {
|
|
408
|
+
const obj = {};
|
|
409
|
+
|
|
410
|
+
this.nodes?.forEach((node) => {
|
|
411
|
+
if (!node.metadata?.state?.transitioning) {
|
|
412
|
+
const architecture = node.status?.nodeLabels?.[NODE_ARCHITECTURE];
|
|
413
|
+
|
|
414
|
+
const key = architecture ? capitalize(architecture) : this.t('cluster.architecture.label.unknown');
|
|
415
|
+
|
|
416
|
+
obj[key] = (obj[key] || 0) + 1;
|
|
417
|
+
}
|
|
418
|
+
});
|
|
419
|
+
|
|
420
|
+
return obj;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
get architecture() {
|
|
424
|
+
const keys = Object.keys(this.nodesArchitecture);
|
|
425
|
+
|
|
426
|
+
switch (keys.length) {
|
|
427
|
+
case 0:
|
|
428
|
+
return { label: this.t('generic.provisioning') };
|
|
429
|
+
case 1:
|
|
430
|
+
return { label: keys[0] };
|
|
431
|
+
default:
|
|
432
|
+
return {
|
|
433
|
+
label: this.t('cluster.architecture.label.mixed'),
|
|
434
|
+
tooltip: keys.reduce((acc, k) => `${ acc }${ k }: ${ this.nodesArchitecture[k] }<br>`, '')
|
|
435
|
+
};
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
|
|
369
439
|
get kubernetesVersion() {
|
|
370
440
|
const unknown = this.$rootGetters['i18n/t']('generic.unknown');
|
|
371
441
|
|
|
@@ -815,11 +885,11 @@ export default class ProvCluster extends SteveModel {
|
|
|
815
885
|
get agentConfig() {
|
|
816
886
|
// The one we want is the first one with no selector.
|
|
817
887
|
// If there are multiple with no selector, that will fall under the unsupported message below.
|
|
818
|
-
return this.spec.rkeConfig.machineSelectorConfig.find((x) => !x.machineLabelSelector)
|
|
888
|
+
return this.spec.rkeConfig.machineSelectorConfig.find((x) => !x.machineLabelSelector)?.config;
|
|
819
889
|
}
|
|
820
890
|
|
|
821
891
|
get cloudProvider() {
|
|
822
|
-
return this.agentConfig['cloud-provider-name'];
|
|
892
|
+
return this.agentConfig?.['cloud-provider-name'];
|
|
823
893
|
}
|
|
824
894
|
|
|
825
895
|
get canClone() {
|
|
@@ -869,6 +939,51 @@ export default class ProvCluster extends SteveModel {
|
|
|
869
939
|
}
|
|
870
940
|
|
|
871
941
|
get hasError() {
|
|
872
|
-
|
|
942
|
+
// Before we were just checking for this.status?.conditions?.some((condition) => condition.error === true)
|
|
943
|
+
// but this is wrong as an error might exist but it might not be meaningful in the context of readiness of a cluster
|
|
944
|
+
// which is what this 'hasError' is used for.
|
|
945
|
+
// We now check if there's a ready condition after an error, which helps dictate the readiness of a cluster
|
|
946
|
+
// Based on the findings in https://github.com/rancher/dashboard/issues/10043
|
|
947
|
+
if (this.status?.conditions && this.status?.conditions.length) {
|
|
948
|
+
// if there are errors, we compare with how recent the "Ready" condition is compared to that error, otherwise we just move on
|
|
949
|
+
if (this.status?.conditions.some((c) => c.error === true)) {
|
|
950
|
+
// there's no ready condition and has an error, mark it
|
|
951
|
+
if (!this.status?.conditions.some((c) => c.type === 'Ready')) {
|
|
952
|
+
return true;
|
|
953
|
+
}
|
|
954
|
+
|
|
955
|
+
const filteredConditions = this.status?.conditions.filter((c) => c.error === true || c.type === 'Ready');
|
|
956
|
+
const mostRecentCondition = filteredConditions.reduce((a, b) => ((a.lastUpdateTime > b.lastUpdateTime) ? a : b));
|
|
957
|
+
|
|
958
|
+
return mostRecentCondition.error;
|
|
959
|
+
}
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
return false;
|
|
963
|
+
}
|
|
964
|
+
|
|
965
|
+
get namespaceLocation() {
|
|
966
|
+
const localCluster = this.$rootGetters['management/byId'](MANAGEMENT.CLUSTER, LOCAL_CLUSTER);
|
|
967
|
+
|
|
968
|
+
if (localCluster) {
|
|
969
|
+
return {
|
|
970
|
+
name: 'c-cluster-product-resource-id',
|
|
971
|
+
params: {
|
|
972
|
+
cluster: localCluster.id,
|
|
973
|
+
product: this.$rootGetters['productId'],
|
|
974
|
+
resource: NAMESPACE,
|
|
975
|
+
id: this.namespace
|
|
976
|
+
}
|
|
977
|
+
};
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
return null;
|
|
981
|
+
}
|
|
982
|
+
|
|
983
|
+
// JSON Paths that should be folded in the YAML editor by default
|
|
984
|
+
get yamlFolding() {
|
|
985
|
+
return [
|
|
986
|
+
'spec.rkeConfig.machinePools.dynamicSchemaSpec',
|
|
987
|
+
];
|
|
873
988
|
}
|
|
874
989
|
}
|
package/models/schema.js
CHANGED
|
@@ -1,17 +1,38 @@
|
|
|
1
1
|
import Resource from '@shell/plugins/dashboard-store/resource-class';
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* For types see schema.d.ts
|
|
5
|
+
*/
|
|
3
6
|
export default class Schema extends Resource {
|
|
4
7
|
get groupName() {
|
|
5
8
|
return this.attributes.namespaced ? 'ns' : 'cluster';
|
|
6
9
|
}
|
|
7
10
|
}
|
|
8
11
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
/**
|
|
13
|
+
* Handles
|
|
14
|
+
* - no subtype { type: 'io.cattle.provisioning.v1.Cluster.status' }
|
|
15
|
+
* - traditional map/array's with sub type in type e.g `{ type: array[io.cattle.provisioning.v1.Cluster.status] }`
|
|
16
|
+
* - new schema definitions map/array's with sub type property e.g. `{ type: 'array', subtype: 'io.cattle.provisioning.v1.Cluster.status' }`
|
|
17
|
+
*/
|
|
18
|
+
const mapArrayTypeRegex = /([^[\s]*)(\[(.*)\])?/;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* For the given resourceField find the root type and, if a collection of types, it's subtype
|
|
22
|
+
*
|
|
23
|
+
* @param {String} str type, may contain sub type
|
|
24
|
+
* @param {ResourceField} field resourceField entry, may contain sub type
|
|
25
|
+
* @returns [type, subtype]
|
|
26
|
+
*/
|
|
27
|
+
export function parseType(str, field) {
|
|
28
|
+
const regexRes = mapArrayTypeRegex.exec(str);
|
|
29
|
+
|
|
30
|
+
const subtype = regexRes[3] || field?.subtype;
|
|
31
|
+
const res = [regexRes[1]];
|
|
32
|
+
|
|
33
|
+
if (subtype) {
|
|
34
|
+
res.push(subtype);
|
|
16
35
|
}
|
|
36
|
+
|
|
37
|
+
return res;
|
|
17
38
|
}
|