@rancher/shell 0.5.3 → 2.0.0
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 +2 -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 +296 -58
- package/assets/translations/zh-hans.yaml +5 -27
- package/babel.config.js +1 -1
- package/chart/__tests__/S3.test.ts +9 -2
- package/chart/monitoring/grafana/index.vue +6 -2
- package/chart/monitoring/prometheus/index.vue +2 -2
- package/chart/rancher-backup/S3.vue +11 -9
- package/chart/rancher-backup/index.vue +15 -5
- package/cloud-credential/__tests__/harvester.test.ts +18 -0
- package/cloud-credential/generic.vue +18 -9
- package/cloud-credential/harvester.vue +11 -3
- package/components/AppModal.vue +167 -0
- package/components/AssignTo.vue +7 -4
- package/components/AsyncButton.vue +18 -5
- package/components/BackLink.vue +4 -4
- package/components/BannerGraphic.vue +1 -0
- package/components/BrandImage.vue +47 -1
- package/components/Carousel.vue +14 -8
- package/components/Certificates.vue +8 -11
- package/components/ClusterBadge.vue +12 -3
- package/components/ClusterIconMenu.vue +44 -16
- package/components/ClusterProviderIcon.vue +14 -3
- package/components/CodeMirror.vue +73 -38
- package/components/CommunityLinks.vue +12 -8
- package/components/CreateDriver.vue +81 -0
- package/components/CruResource.vue +51 -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/ExplorerMembers.vue +3 -3
- package/components/ExplorerProjectsNamespaces.vue +6 -6
- package/components/FixedBanner.vue +47 -36
- package/components/GlobalRoleBindings.vue +26 -0
- package/components/Import.vue +10 -6
- package/components/Inactivity.vue +1 -5
- package/components/KeyValueView.vue +14 -10
- 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 +11 -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 +18 -2
- package/components/ResourceCancelModal.vue +34 -29
- package/components/ResourceDetail/Masthead.vue +23 -7
- package/components/ResourceDetail/index.vue +5 -0
- package/components/ResourceList/Masthead.vue +28 -10
- package/components/ResourceList/index.vue +65 -14
- package/components/ResourceTable.vue +73 -19
- package/components/ResourceYaml.vue +1 -0
- package/components/SelectIconGrid.vue +3 -3
- package/components/SideNav.vue +15 -37
- package/components/SingleClusterInfo.vue +4 -4
- package/components/SortableTable/THead.vue +26 -12
- package/components/SortableTable/filtering.js +9 -1
- package/components/SortableTable/grouping.js +8 -1
- package/components/SortableTable/index.vue +142 -42
- package/components/SortableTable/paging.js +36 -7
- package/components/SortableTable/selection.js +2 -1
- package/components/SortableTable/sorting.js +24 -7
- package/components/TabTitle.vue +84 -0
- package/components/Tabbed/index.vue +6 -1
- package/components/TableDataUserIcon.vue +47 -0
- package/components/TypeDescription.vue +1 -0
- package/components/Wizard.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.spec.ts → CodeMirror.test.ts} +5 -17
- 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/FleetClusters.vue +9 -9
- package/components/fleet/FleetIntro.vue +11 -17
- package/components/fleet/FleetNoWorkspaces.vue +2 -2
- package/components/fleet/FleetRepos.vue +1 -0
- package/components/fleet/ForceDirectedTreeChart/index.vue +9 -3
- package/components/form/ArrayList.vue +30 -19
- package/components/form/ArrayListSelect.vue +9 -4
- package/components/form/ClusterAppearance.vue +132 -0
- package/components/form/ColorInput.vue +1 -0
- package/components/form/Error.vue +3 -3
- package/components/form/Footer.vue +2 -2
- package/components/form/GitPicker.vue +83 -38
- package/components/form/KeyValue.vue +67 -48
- package/components/form/LabeledSelect.vue +143 -43
- package/components/form/Labels.vue +3 -1
- package/components/form/NameNsDescription.vue +26 -9
- 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/Select.vue +1 -1
- package/components/form/SelectOrCreateAuthSecret.vue +135 -62
- package/components/form/SimpleSecretSelector.vue +88 -28
- package/components/form/__tests__/BannerSettings.test.ts +53 -0
- package/components/form/__tests__/KeyValue.test.ts +121 -12
- package/components/form/__tests__/LabeledSelect.test.ts +0 -18
- package/components/form/__tests__/NameNsDescription.test.ts +25 -15
- 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/CloudCredPublicData.vue +30 -0
- package/components/formatter/ClusterLink.vue +2 -2
- package/components/formatter/FleetSummaryGraph.vue +2 -1
- 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/LiveDate.vue +16 -0
- package/components/formatter/PrincipalGroupBindings.vue +2 -2
- package/components/formatter/SecretType.vue +2 -2
- package/components/formatter/VirtualServiceGateways.vue +2 -2
- package/components/formatter/__tests__/LinkDetail.test.ts +5 -5
- package/components/nav/Group.vue +7 -5
- package/components/nav/Header.vue +82 -43
- package/components/nav/NamespaceFilter.vue +8 -1
- package/components/nav/TopLevelMenu.vue +336 -125
- package/components/nav/Type.vue +58 -102
- package/components/nav/__tests__/TopLevelMenu.test.ts +370 -9
- package/components/nav/__tests__/Type.test.ts +321 -126
- package/components/nuxt/nuxt-child.js +0 -5
- package/components/nuxt/nuxt-error.vue +1 -1
- package/components/nuxt/nuxt-link.client.js +13 -95
- package/components/templates/default.vue +3 -3
- package/components/templates/error.vue +6 -10
- package/components/templates/standalone.vue +0 -4
- package/components/templates/unauthenticated.vue +1 -2
- package/components/user.retention/user-retention-header.vue +34 -0
- package/composables/useCompactInput.test.ts +36 -0
- package/composables/useCompactInput.ts +2 -2
- package/composables/useI18n.ts +26 -0
- package/composables/useLabeledFormElement.test.ts +135 -0
- package/composables/useStore.ts +16 -0
- package/config/home-links.js +32 -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 +1 -3
- package/config/product/auth.js +1 -0
- package/config/product/explorer.js +167 -46
- package/config/product/legacy.js +3 -95
- package/config/product/manager.js +44 -11
- package/config/query-params.js +1 -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/index.js +15 -0
- package/config/router/navigation-guards/load-initial-settings.js +15 -0
- package/config/router/routes.js +487 -0
- package/config/settings.ts +38 -2
- package/config/store.js +7 -3
- package/config/table-headers.js +46 -1
- package/config/types.js +36 -16
- package/config/uiplugins.js +10 -5
- package/core/plugin-helpers.js +1 -1
- package/core/plugin.ts +2 -1
- package/core/plugins.js +289 -282
- package/creators/app/files/.eslintignore +0 -2
- package/creators/app/files/.vscode/settings.json +0 -1
- 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__/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.gitrepo.vue +15 -9
- package/detail/namespace.vue +2 -2
- package/detail/networking.k8s.io.ingress.vue +52 -19
- package/detail/node.vue +20 -43
- package/detail/pod.vue +1 -68
- package/detail/provisioning.cattle.io.cluster.vue +2 -1
- package/detail/service.vue +1 -1
- package/detail/workload/index.vue +2 -15
- package/dialog/AddCustomBadgeDialog.vue +318 -161
- package/dialog/DeactivateDriverDialog.vue +118 -0
- package/dialog/RollbackWorkloadDialog.vue +2 -2
- package/dialog/RotateCertificatesDialog.vue +0 -21
- 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 +1 -5
- 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 +5 -18
- 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 +175 -20
- package/edit/cis.cattle.io.clusterscan.vue +5 -2
- package/edit/cis.cattle.io.clusterscanbenchmark.vue +41 -9
- package/edit/cloudcredential.vue +26 -4
- package/edit/configmap.vue +10 -4
- package/edit/fleet.cattle.io.gitrepo.vue +7 -4
- 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 +2 -1
- package/edit/management.cattle.io.setting.vue +20 -0
- 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/pagerduty.vue +1 -0
- package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +3 -0
- package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +2 -0
- 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} +45 -6
- package/edit/networking.k8s.io.networkpolicy/__tests__/utils/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 +18 -9
- package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +165 -1
- package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +1 -1
- package/edit/provisioning.cattle.io.cluster/__tests__/CustomCommand.test.ts +0 -3
- package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +228 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +70 -12
- package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +5 -0
- package/edit/provisioning.cattle.io.cluster/import.vue +2 -2
- package/edit/provisioning.cattle.io.cluster/index.vue +21 -15
- package/edit/provisioning.cattle.io.cluster/rke2.vue +185 -114
- package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +67 -7
- package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +19 -6
- package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +132 -0
- package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +7 -0
- package/edit/provisioning.cattle.io.cluster/tabs/etcd/S3Config.vue +1 -0
- package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +1 -0
- package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +3 -0
- package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +1 -0
- package/edit/resources.cattle.io.backup.vue +139 -124
- package/edit/resources.cattle.io.restore.vue +146 -126
- package/edit/service.vue +1 -0
- package/edit/serviceaccount.vue +46 -4
- package/edit/workload/__tests__/Job.test.ts +1 -3
- package/edit/workload/__tests__/Upgrading.test.ts +2 -2
- package/edit/workload/mixins/workload.js +34 -1
- 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 +549 -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/cis.cattle.io.clusterscan.vue +16 -10
- package/list/group.principal.vue +2 -2
- package/list/management.cattle.io.feature.vue +11 -7
- package/list/management.cattle.io.user.vue +36 -3
- package/list/networking.k8s.io.ingress.vue +36 -0
- package/list/node.vue +211 -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 +162 -59
- package/machine-config/amazonec2.vue +1 -1
- package/machine-config/azure.vue +38 -21
- package/machine-config/generic.vue +11 -15
- package/machine-config/vmwarevsphere-pool-config-merge.ts +25 -0
- package/machine-config/vmwarevsphere.vue +20 -11
- package/middleware/authenticated.js +9 -361
- package/mixins/__tests__/chart.test.ts +48 -6
- package/mixins/__tests__/create-edit-view.test.ts +2 -3
- package/mixins/auth-config.js +3 -2
- package/mixins/brand.js +75 -57
- 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 +21 -1
- 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__/schema.tests.ts +24 -0
- package/models/__tests__/steve-schema.test.ts +73 -0
- package/models/__tests__/workload.test.ts +1 -1
- 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 +4 -0
- package/models/cluster/schema.js +6 -0
- package/models/cluster.js +33 -0
- package/models/driver.js +62 -0
- package/models/fleet.cattle.io.cluster.js +23 -11
- package/models/fleet.cattle.io.gitrepo.js +10 -0
- package/models/helm.cattle.io.projecthelmchart.js +1 -1
- package/models/kontainerdriver.js +68 -0
- package/models/management/schema.js +6 -0
- package/models/management.cattle.io.authconfig.js +3 -2
- package/models/management.cattle.io.cluster.js +5 -4
- package/models/management.cattle.io.globalrole.js +2 -0
- package/models/management.cattle.io.user.js +67 -2
- package/models/monitoring.coreos.com.receiver.js +3 -1
- package/models/monitoring.coreos.com.route.js +1 -1
- package/models/networking.k8s.io.ingress.js +2 -1
- package/models/nodedriver.js +68 -0
- package/models/provisioning.cattle.io.cluster.js +34 -1
- package/models/schema.js +28 -7
- package/models/service.js +2 -0
- package/models/steve-schema.ts +254 -0
- package/models/workload.js +1 -0
- package/package.json +6 -5
- package/pages/about.vue +12 -5
- package/pages/account/index.vue +7 -2
- package/pages/auth/login.vue +106 -102
- package/pages/auth/logout.vue +2 -2
- package/pages/auth/setup.vue +57 -64
- package/pages/auth/verify.vue +17 -17
- package/pages/c/_cluster/apps/charts/chart.vue +54 -9
- package/pages/c/_cluster/apps/charts/index.vue +37 -13
- package/pages/c/_cluster/apps/charts/install.vue +4 -4
- 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/auth/user.retention/index.vue +384 -0
- 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 +231 -72
- package/pages/c/_cluster/explorer/tools/__tests__/index.test.ts +69 -0
- package/pages/c/_cluster/explorer/tools/index.vue +12 -176
- package/pages/c/_cluster/fleet/index.vue +88 -93
- 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 +94 -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 +63 -0
- package/pages/c/_cluster/manager/jwt.authentication/index.vue +235 -0
- package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +4 -0
- package/pages/c/_cluster/monitoring/index.vue +1 -17
- 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 -8
- package/pages/c/_cluster/settings/brand.vue +258 -36
- package/pages/c/_cluster/settings/index.vue +4 -4
- package/pages/c/_cluster/settings/links.vue +5 -3
- package/pages/c/_cluster/settings/performance.vue +71 -2
- package/pages/c/_cluster/uiplugins/AddExtensionRepos.vue +5 -2
- package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +10 -7
- package/pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue +9 -6
- package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +11 -5
- package/pages/c/_cluster/uiplugins/InstallDialog.vue +53 -18
- 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 -52
- package/pages/diagnostic.vue +1 -0
- package/pages/fail-whale.vue +103 -41
- package/pages/home.vue +81 -24
- package/pages/prefs.vue +8 -3
- package/pages/support/index.vue +12 -2
- package/plugins/clean-html-directive.js +5 -12
- package/plugins/clean-tooltip-directive.js +6 -31
- package/plugins/codemirror.js +0 -9
- package/plugins/dashboard-store/__tests__/mutations.test.ts +296 -313
- package/plugins/dashboard-store/actions.js +140 -32
- package/plugins/dashboard-store/getters.js +86 -39
- package/plugins/dashboard-store/index.js +0 -99
- package/plugins/dashboard-store/mutations.js +150 -48
- package/plugins/dashboard-store/resource-class.js +14 -109
- package/plugins/directives.js +6 -39
- package/plugins/ember-cookie.js +13 -0
- package/plugins/global-formatters.js +26 -5
- package/plugins/i18n.js +90 -56
- 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} +124 -31
- package/plugins/steve/__tests__/mutations.test.ts +49 -0
- package/plugins/steve/__tests__/subscribe.spec.ts +109 -0
- package/plugins/steve/__tests__/utils/mutation.test.helpers.ts +105 -0
- package/plugins/steve/accept-or-reject-socket-message.ts +103 -0
- package/plugins/steve/actions.js +0 -1
- package/plugins/steve/getters.js +183 -63
- package/plugins/steve/hybrid-class.js +5 -1
- package/plugins/steve/mutations.js +29 -5
- package/plugins/steve/norman-class.js +123 -2
- package/{utils → plugins/steve}/projectAndNamespaceFiltering.utils.ts +28 -10
- package/plugins/steve/schema.d.ts +22 -0
- package/plugins/steve/steve-pagination-utils.ts +368 -0
- package/plugins/steve/subscribe.js +37 -75
- package/plugins/trim-whitespace.js +6 -34
- package/plugins/vue-js-modal.js +1 -1
- package/public/index.html +1 -0
- package/rancher-components/Accordion/Accordion.vue +3 -2
- 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 +1 -1
- package/rancher-components/Form/LabeledInput/LabeledInput.vue +66 -30
- 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 +7 -5
- package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
- package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
- package/rancher-components/StringList/StringList.vue +8 -8
- package/rancher-components/components/Accordion/Accordion.vue +3 -2
- package/rancher-components/components/BadgeState/BadgeState.vue +3 -3
- package/rancher-components/components/Banner/Banner.test.ts +1 -5
- package/rancher-components/components/Banner/Banner.vue +2 -2
- package/rancher-components/components/Card/Card.vue +4 -4
- package/rancher-components/components/Form/Checkbox/Checkbox.vue +4 -3
- package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +1 -1
- package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +66 -30
- package/rancher-components/components/Form/Radio/RadioButton.test.ts +1 -3
- package/rancher-components/components/Form/Radio/RadioButton.vue +13 -7
- package/rancher-components/components/Form/Radio/RadioGroup.vue +4 -3
- package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +7 -5
- package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
- package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +9 -4
- package/rancher-components/components/StringList/StringList.vue +8 -8
- package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +27 -8
- package/scripts/clean +1 -1
- 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/patch +27 -0
- package/scripts/extension/publish +6 -6
- package/scripts/serve-pkgs +0 -2
- package/scripts/test-plugins-build.sh +6 -6
- package/scripts/vue-migrate.js +683 -0
- package/store/__tests__/catalog.test.ts +224 -0
- package/store/auth.js +23 -4
- package/store/aws.js +53 -6
- package/store/catalog.js +21 -5
- package/store/cru-resource.ts +26 -0
- package/store/customisation.js +35 -0
- package/store/features.js +6 -4
- package/store/index.js +132 -39
- package/store/plugins.js +8 -4
- package/store/type-map.js +143 -143
- package/store/type-map.utils.ts +226 -0
- package/tsconfig.json +0 -1
- package/tsconfig.paths.json +4 -1
- 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 +996 -782
- 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 +92 -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 -2
- package/utils/banners.js +103 -0
- package/utils/cluster.js +1 -1
- package/utils/config.js +4 -0
- package/utils/create-yaml.js +54 -27
- package/utils/error.js +25 -0
- package/utils/formatter.js +5 -3
- package/utils/git.ts +1 -1
- package/utils/install-redirect.js +1 -1
- package/utils/kontainer.ts +186 -0
- package/utils/monitoring.js +2 -37
- 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/socket.js +1 -0
- package/utils/time.js +1 -0
- package/utils/title.ts +3 -0
- package/utils/unit-tests/ChildRenderingRouterLinkStub.ts +36 -0
- package/utils/validators/formRules/__tests__/index.test.ts +21 -0
- package/utils/validators/formRules/index.ts +3 -0
- package/utils/validators/index.js +1 -0
- package/vue.config.js +376 -421
- package/assets/styles/vendor/vue-js-modal.scss +0 -16
- package/chart/monitoring/steps/uninstall-v1.vue +0 -135
- package/components/EventsTable.vue +0 -67
- package/components/TabbedLinks/index.vue +0 -94
- package/components/nuxt/nuxt-link.server.js +0 -16
- package/components/nuxt/nuxt.js +0 -101
- package/config/router.js +0 -425
- package/initialize/App.js +0 -152
- package/initialize/client.js +0 -734
- package/initialize/index.js +0 -287
- package/middleware/i18n.js +0 -10
- package/middleware/unauthenticated.js +0 -22
- package/mixins/v1-workload-metrics.js +0 -43
- package/pages/c/_cluster/apps/index.vue +0 -15
- package/pages/c/_cluster/auth/index.vue +0 -17
- package/pages/c/_cluster/index.vue +0 -15
- 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/plugins/dashboard-store/rehydrate-all.js +0 -44
- package/plugins/index.js +0 -11
- 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/v-select.js +0 -4
- package/utils/group.js +0 -70
- package/utils/nuxt.js +0 -638
- package/utils/router.scrollBehavior.js +0 -78
- /package/components/__tests__/{Collapse.spec.ts → Collapse.test.ts} +0 -0
- /package/models/__tests__/{node.ts → node.test.ts} +0 -0
- /package/plugins/steve/__tests__/{header-warnings.spec.ts → header-warnings.test.ts} +0 -0
- /package/plugins/steve/__tests__/{steve-class.spec.ts → steve-class.test.ts} +0 -0
- /package/rancher-components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
- /package/rancher-components/components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
- /package/types/{pod-security-admission.ts → resources/pod-security-admission.ts} +0 -0
|
@@ -7,6 +7,34 @@ import { sortBy } from '@shell/utils/sort';
|
|
|
7
7
|
import day from 'dayjs';
|
|
8
8
|
import SteveModel from '@shell/plugins/steve/steve-class';
|
|
9
9
|
|
|
10
|
+
// This could be removed and just replaced with schema.fetchResourceFields()... but there's some getters that use hasSpecsScheduledScanConfig before it runs
|
|
11
|
+
/**
|
|
12
|
+
* For the given schema, determine if the schema of it's associated scan's type has scheduledScanConfig
|
|
13
|
+
*
|
|
14
|
+
* This is resourceFields based, so we need to fetch schema definition
|
|
15
|
+
*/
|
|
16
|
+
export const fetchSpecsScheduledScanConfig = async(schema) => {
|
|
17
|
+
await schema.fetchResourceFields();
|
|
18
|
+
|
|
19
|
+
return hasSpecsScheduledScanConfig(schema);
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* For the given schema, determine if the schema of it's associated scan's type has scheduledScanConfig
|
|
24
|
+
*
|
|
25
|
+
* Assumes schemaDefinitions have been fetched (see async fetchSpecsScheduledScanConfig above)
|
|
26
|
+
*/
|
|
27
|
+
export const hasSpecsScheduledScanConfig = (schema) => {
|
|
28
|
+
const specSchemaId = get(schema, 'resourceFields.spec.type');
|
|
29
|
+
const specSchema = schema.schemaDefinitions?.[specSchemaId];
|
|
30
|
+
|
|
31
|
+
if (!specSchema) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return !!get(specSchema, 'resourceFields.scheduledScanConfig');
|
|
36
|
+
};
|
|
37
|
+
|
|
10
38
|
export default class ClusterScan extends SteveModel {
|
|
11
39
|
get _availableActions() {
|
|
12
40
|
let out = super._availableActions;
|
|
@@ -64,14 +92,7 @@ export default class ClusterScan extends SteveModel {
|
|
|
64
92
|
}
|
|
65
93
|
|
|
66
94
|
canBeScheduled() {
|
|
67
|
-
|
|
68
|
-
const specSchema = this.$getters['schemaFor'](get(schema, 'resourceFields.spec.type') || '');
|
|
69
|
-
|
|
70
|
-
if (!specSchema) {
|
|
71
|
-
return false;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
return !!get(specSchema, 'resourceFields.scheduledScanConfig');
|
|
95
|
+
return hasSpecsScheduledScanConfig(this.$getters['schemaFor'](this.type));
|
|
75
96
|
}
|
|
76
97
|
|
|
77
98
|
get isScheduled() {
|
|
@@ -32,8 +32,16 @@ export default class CloudCredential extends NormanModel {
|
|
|
32
32
|
};
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
+
get secretName() {
|
|
36
|
+
return this.id.replace(':', '/');
|
|
37
|
+
}
|
|
38
|
+
|
|
35
39
|
get secret() {
|
|
36
|
-
return this.$rootGetters['management/byId'](SECRET, this.
|
|
40
|
+
return this.$rootGetters['management/byId'](SECRET, this.secretName);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
async getSecret() {
|
|
44
|
+
await this.$dispatch('management/find', { type: SECRET, id: this.secretName }, { root: true });
|
|
37
45
|
}
|
|
38
46
|
|
|
39
47
|
get configKey() {
|
package/models/cluster/node.js
CHANGED
|
@@ -450,6 +450,10 @@ export default class ClusterNode extends SteveModel {
|
|
|
450
450
|
get provider() {
|
|
451
451
|
return this.$rootGetters['currentCluster'].provisioner.toLowerCase();
|
|
452
452
|
}
|
|
453
|
+
|
|
454
|
+
get displayTaintsAndLabels() {
|
|
455
|
+
return !!this.spec.taints?.length || !!this.customLabelCount;
|
|
456
|
+
}
|
|
453
457
|
}
|
|
454
458
|
|
|
455
459
|
function calculatePercentage(allocatable, capacity) {
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import NormanModel from '@shell/plugins/steve/norman-class';
|
|
2
|
+
|
|
3
|
+
export const LABEL_CONTAINS_PROTECTED = [
|
|
4
|
+
'io.cattle.lifecycle',
|
|
5
|
+
'kubernetes.io',
|
|
6
|
+
'cattle.io',
|
|
7
|
+
'k3s.io',
|
|
8
|
+
];
|
|
9
|
+
|
|
10
|
+
export const ANNOTATIONS_CONTAINS_PROTECTED = [
|
|
11
|
+
'coreos.com',
|
|
12
|
+
'cattle.io',
|
|
13
|
+
'k3s.io',
|
|
14
|
+
'kubernetes.io',
|
|
15
|
+
'k3s.io',
|
|
16
|
+
];
|
|
17
|
+
export default class NormanCluster extends NormanModel {
|
|
18
|
+
get systemLabels() {
|
|
19
|
+
return Object.keys(this.labels || {}).filter((key) => LABEL_CONTAINS_PROTECTED.find((label) => key.includes(label)));
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
get systemAnnotations() {
|
|
23
|
+
return Object.keys(this.annotations || {}).filter((key) => ANNOTATIONS_CONTAINS_PROTECTED.find((annotation) => key.includes(annotation)));
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
get hasSystemLabels() {
|
|
27
|
+
return !!(this.systemLabels || []).length;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
get hasSystemAnnotations() {
|
|
31
|
+
return !!(this.systemAnnotations || []).length;
|
|
32
|
+
}
|
|
33
|
+
}
|
package/models/driver.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { DESCRIPTION } from '@shell/config/labels-annotations';
|
|
2
|
+
import NormanModel from '@shell/plugins/steve/norman-class';
|
|
3
|
+
import { KONTAINER_TO_DRIVER } from './management.cattle.io.kontainerdriver';
|
|
4
|
+
|
|
5
|
+
export default class Driver extends NormanModel {
|
|
6
|
+
get canViewYaml() {
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
get driverName() {
|
|
11
|
+
if (!this.builtIn) {
|
|
12
|
+
// if the driver is not built in, there's a good change its a custom one
|
|
13
|
+
// custom drivers have a random id, so shouldn't be used as the type
|
|
14
|
+
// instead use the status.displayName. this will map to the name extracted from the binary
|
|
15
|
+
const driverName = this.status?.displayName?.toLowerCase();
|
|
16
|
+
|
|
17
|
+
if (driverName) {
|
|
18
|
+
// some drivers are built in but don't have the builtIn flag. ensure we pass these through K_TO_D
|
|
19
|
+
return KONTAINER_TO_DRIVER[driverName] || driverName;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return KONTAINER_TO_DRIVER[this.id] || this.id;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
get nameDisplay() {
|
|
27
|
+
const path = `cluster.provider.${ this.driverName }`;
|
|
28
|
+
const label = this.driverName || this.name || this.id;
|
|
29
|
+
|
|
30
|
+
return this.$rootGetters['i18n/withFallback'](path, label);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
get description() {
|
|
34
|
+
if (!!this.builtIn || !!this.builtin) {
|
|
35
|
+
return this.$rootGetters['i18n/withFallback']('tableHeaders.builtIn');
|
|
36
|
+
} else {
|
|
37
|
+
return this.url;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Set description based on the type of model available with private fallback
|
|
43
|
+
*/
|
|
44
|
+
set description(value) {
|
|
45
|
+
if (this.annotations) {
|
|
46
|
+
this.annotations[DESCRIPTION] = value;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
this._description = value;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
cleanForSave(data, forNew) {
|
|
53
|
+
const val = super.cleanForSave(data, forNew);
|
|
54
|
+
|
|
55
|
+
if (forNew) {
|
|
56
|
+
val.active = true;
|
|
57
|
+
}
|
|
58
|
+
delete val.metadata;
|
|
59
|
+
|
|
60
|
+
return val;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -119,17 +119,6 @@ export default class FleetCluster extends SteveModel {
|
|
|
119
119
|
return this.metadata?.state?.name || 'unknown';
|
|
120
120
|
}
|
|
121
121
|
|
|
122
|
-
get nodeInfo() {
|
|
123
|
-
const ready = this.status?.agent?.readyNodes || 0;
|
|
124
|
-
const unready = this.status?.agent?.nonReadyNodes || 0;
|
|
125
|
-
|
|
126
|
-
return {
|
|
127
|
-
ready,
|
|
128
|
-
unready,
|
|
129
|
-
total: ready + unready,
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
|
|
133
122
|
get repoInfo() {
|
|
134
123
|
const ready = this.status?.readyGitRepos || 0;
|
|
135
124
|
const total = this.status?.desiredReadyGitRepos || 0;
|
|
@@ -141,6 +130,29 @@ export default class FleetCluster extends SteveModel {
|
|
|
141
130
|
};
|
|
142
131
|
}
|
|
143
132
|
|
|
133
|
+
get bundleInfo() {
|
|
134
|
+
const bundlesData = {
|
|
135
|
+
ready: 0,
|
|
136
|
+
total: 0
|
|
137
|
+
};
|
|
138
|
+
const readyBundles = this.status?.display?.readyBundles;
|
|
139
|
+
|
|
140
|
+
if (readyBundles && readyBundles.includes('/')) {
|
|
141
|
+
const dataArr = readyBundles.split('/');
|
|
142
|
+
|
|
143
|
+
if (dataArr.length === 2 && parseInt(dataArr[0]) >= 0 && parseInt(dataArr[1]) >= 0) {
|
|
144
|
+
bundlesData.ready = parseInt(dataArr[0]);
|
|
145
|
+
bundlesData.total = parseInt(dataArr[1]);
|
|
146
|
+
|
|
147
|
+
return bundlesData;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
bundlesData.noValidData = true;
|
|
152
|
+
|
|
153
|
+
return bundlesData;
|
|
154
|
+
}
|
|
155
|
+
|
|
144
156
|
get mgmt() {
|
|
145
157
|
const mgmt = this.$getters['byId'](MANAGEMENT.CLUSTER, this.metadata?.labels?.[FLEET_LABELS.CLUSTER_NAME]);
|
|
146
158
|
|
|
@@ -105,6 +105,8 @@ export default class GitRepo extends SteveModel {
|
|
|
105
105
|
const groups = workspace?.clusterGroups || [];
|
|
106
106
|
|
|
107
107
|
if (workspace?.id === 'fleet-local') {
|
|
108
|
+
// should we be getting the clusters from workspace.clusters instead of having to rely on the groups,
|
|
109
|
+
// which takes an additional request to be done on the Fleet dashboard screen?
|
|
108
110
|
const local = findBy(groups, 'id', 'fleet-local/default');
|
|
109
111
|
|
|
110
112
|
if (local) {
|
|
@@ -314,6 +316,14 @@ export default class GitRepo extends SteveModel {
|
|
|
314
316
|
return 0;
|
|
315
317
|
}
|
|
316
318
|
|
|
319
|
+
get targetClustersReady() {
|
|
320
|
+
if (this.targetClusters && this.targetClusters.length) {
|
|
321
|
+
return this.targetClusters.filter((cluster) => cluster.state === 'active');
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
return 0;
|
|
325
|
+
}
|
|
326
|
+
|
|
317
327
|
get bundleDeployments() {
|
|
318
328
|
const bds = this.$getters['all'](FLEET.BUNDLE_DEPLOYMENT);
|
|
319
329
|
|
|
@@ -22,7 +22,7 @@ export default class ProjectHelmChart extends SteveModel {
|
|
|
22
22
|
const clusterId = this.$rootGetters['currentCluster']?.id;
|
|
23
23
|
const project = this.$rootGetters['management/byId'](MANAGEMENT.PROJECT, `${ clusterId }/${ this.projectId }`);
|
|
24
24
|
|
|
25
|
-
return project
|
|
25
|
+
return project?.spec.displayName;
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
get namespaces() {
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import Driver from '@shell/models/driver';
|
|
2
|
+
|
|
3
|
+
export default class KontainerDriver extends Driver {
|
|
4
|
+
get doneRoute() {
|
|
5
|
+
return 'c-cluster-manager-driver-kontainerdriver';
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
get _availableActions() {
|
|
9
|
+
const out = [
|
|
10
|
+
{
|
|
11
|
+
action: 'activate',
|
|
12
|
+
label: 'Activate',
|
|
13
|
+
icon: 'icon icon-play',
|
|
14
|
+
bulkable: true,
|
|
15
|
+
enabled: !!this.links.update && !this.active
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
action: 'deactivate',
|
|
19
|
+
label: 'Deactivate',
|
|
20
|
+
icon: 'icon icon-pause',
|
|
21
|
+
bulkable: true,
|
|
22
|
+
enabled: !!this.links.update && !!this.active,
|
|
23
|
+
weight: -1
|
|
24
|
+
},
|
|
25
|
+
{ divider: true },
|
|
26
|
+
{
|
|
27
|
+
action: 'viewInApi',
|
|
28
|
+
enabled: true,
|
|
29
|
+
icon: 'icon icon-external-link',
|
|
30
|
+
label: this.t('action.viewInApi'),
|
|
31
|
+
},
|
|
32
|
+
{ divider: true },
|
|
33
|
+
{
|
|
34
|
+
action: 'goToEdit',
|
|
35
|
+
label: this.t('action.edit'),
|
|
36
|
+
icon: 'icon icon-edit',
|
|
37
|
+
bulkable: false,
|
|
38
|
+
enabled: !!this.links.update && !this.builtin,
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
action: 'promptRemove',
|
|
42
|
+
altAction: 'remove',
|
|
43
|
+
bulkAction: 'promptRemove',
|
|
44
|
+
label: this.t('action.remove'),
|
|
45
|
+
bulkable: true,
|
|
46
|
+
icon: 'icon icon-delete',
|
|
47
|
+
enabled: !!this.links.remove,
|
|
48
|
+
weight: -10,
|
|
49
|
+
}
|
|
50
|
+
];
|
|
51
|
+
|
|
52
|
+
return out;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
deactivate() {
|
|
56
|
+
this.$dispatch('promptModal', {
|
|
57
|
+
componentProps: { url: `v3/kontainerDrivers/${ escape(this.id) }?action=deactivate`, name: this.nameDisplay },
|
|
58
|
+
component: 'DeactivateDriverDialog'
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
activate() {
|
|
63
|
+
return this.$dispatch('rancher/request', {
|
|
64
|
+
url: `v3/kontainerDrivers/${ escape(this.id) }?action=activate`,
|
|
65
|
+
method: 'post',
|
|
66
|
+
}, { root: true });
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -14,10 +14,11 @@ export const configType = {
|
|
|
14
14
|
googleoauth: 'oauth',
|
|
15
15
|
local: '',
|
|
16
16
|
github: 'oauth',
|
|
17
|
-
keycloakoidc: 'oidc'
|
|
17
|
+
keycloakoidc: 'oidc',
|
|
18
|
+
oidc: 'oidc',
|
|
18
19
|
};
|
|
19
20
|
|
|
20
|
-
const imageOverrides = { keycloakoidc: 'keycloak' };
|
|
21
|
+
const imageOverrides = { keycloakoidc: 'keycloak', oidc: 'openid' };
|
|
21
22
|
|
|
22
23
|
export default class AuthConfig extends SteveModel {
|
|
23
24
|
get _availableActions() {
|
|
@@ -299,9 +299,10 @@ export default class MgmtCluster extends HybridModel {
|
|
|
299
299
|
|
|
300
300
|
// Custom badge to show for the Cluster (if the appropriate annotations are set)
|
|
301
301
|
get badge() {
|
|
302
|
-
const
|
|
302
|
+
const icon = this.metadata?.annotations?.[CLUSTER_BADGE.ICON_TEXT];
|
|
303
|
+
const comment = this.metadata?.annotations?.[CLUSTER_BADGE.TEXT];
|
|
303
304
|
|
|
304
|
-
if (!
|
|
305
|
+
if (!icon && !comment) {
|
|
305
306
|
return undefined;
|
|
306
307
|
}
|
|
307
308
|
|
|
@@ -309,10 +310,10 @@ export default class MgmtCluster extends HybridModel {
|
|
|
309
310
|
const iconText = this.metadata?.annotations[CLUSTER_BADGE.ICON_TEXT] || '';
|
|
310
311
|
|
|
311
312
|
return {
|
|
312
|
-
text,
|
|
313
|
+
text: comment || undefined,
|
|
313
314
|
color,
|
|
314
315
|
textColor: textColor(parseColor(color)),
|
|
315
|
-
iconText: iconText.substr(0,
|
|
316
|
+
iconText: iconText.substr(0, 3)
|
|
316
317
|
};
|
|
317
318
|
}
|
|
318
319
|
|
|
@@ -37,6 +37,7 @@ export default class GlobalRole extends SteveDescriptionModel {
|
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
get nameDisplay() {
|
|
40
|
+
// i18n-uses rbac.globalRoles.role.*.label
|
|
40
41
|
const path = `rbac.globalRoles.role.${ this.id }.label`;
|
|
41
42
|
const label = this.displayName || this.metadata?.name || this.id;
|
|
42
43
|
|
|
@@ -46,6 +47,7 @@ export default class GlobalRole extends SteveDescriptionModel {
|
|
|
46
47
|
get descriptionDisplay() {
|
|
47
48
|
return this.description ||
|
|
48
49
|
this.metadata?.annotations?.[DESCRIPTION] ||
|
|
50
|
+
// i18n-uses rbac.globalRoles.role.*.description
|
|
49
51
|
this.$rootGetters['i18n/withFallback'](`rbac.globalRoles.role.${ this.id }.description`, this.t(`rbac.globalRoles.unknownRole.description`));
|
|
50
52
|
}
|
|
51
53
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { NORMAN } from '@shell/config/types';
|
|
2
2
|
import HybridModel, { cleanHybridResources } from '@shell/plugins/steve/hybrid-class';
|
|
3
|
+
import day from 'dayjs';
|
|
3
4
|
|
|
4
5
|
export default class User extends HybridModel {
|
|
5
6
|
// Preserve description
|
|
@@ -99,6 +100,38 @@ export default class User extends HybridModel {
|
|
|
99
100
|
return this.$rootGetters['i18n/withFallback'](`model.authConfig.provider."${ this.provider }"`, null, this.provider);
|
|
100
101
|
}
|
|
101
102
|
|
|
103
|
+
/**
|
|
104
|
+
* Gets the last-login label in milliseconds
|
|
105
|
+
* @returns {number}
|
|
106
|
+
*/
|
|
107
|
+
get userLastLogin() {
|
|
108
|
+
return this.metadata?.labels?.['cattle.io/last-login'] * 1000;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Gets the disabled-after label in milliseconds
|
|
113
|
+
* @returns {number}
|
|
114
|
+
*/
|
|
115
|
+
get userDisabledIn() {
|
|
116
|
+
return this.metadata?.labels?.['cattle.io/disable-after'] * 1000;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Provides a display value for the userDisabledIn date based on the user
|
|
121
|
+
* state.
|
|
122
|
+
*/
|
|
123
|
+
get userDisabledInDisplay() {
|
|
124
|
+
return this.state === 'inactive' ? null : this.userDisabledIn;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Gets the delete-after label in milliseconds
|
|
129
|
+
* @returns {number}
|
|
130
|
+
*/
|
|
131
|
+
get userDeletedIn() {
|
|
132
|
+
return this.metadata?.labels?.['cattle.io/delete-after'] * 1000;
|
|
133
|
+
}
|
|
134
|
+
|
|
102
135
|
get state() {
|
|
103
136
|
if ( this.enabled === false ) {
|
|
104
137
|
return 'inactive';
|
|
@@ -107,6 +140,19 @@ export default class User extends HybridModel {
|
|
|
107
140
|
return this.metadata?.state?.name || 'unknown';
|
|
108
141
|
}
|
|
109
142
|
|
|
143
|
+
get stateDisplay() {
|
|
144
|
+
switch (this.state) {
|
|
145
|
+
case 'inactive':
|
|
146
|
+
return this.t('user.state.inactive');
|
|
147
|
+
case 'active':
|
|
148
|
+
return this.t('user.state.active');
|
|
149
|
+
case 'unknown':
|
|
150
|
+
return this.t('user.state.unknown');
|
|
151
|
+
default:
|
|
152
|
+
return this.state;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
110
156
|
get description() {
|
|
111
157
|
return this._description;
|
|
112
158
|
}
|
|
@@ -177,7 +223,7 @@ export default class User extends HybridModel {
|
|
|
177
223
|
return [
|
|
178
224
|
{
|
|
179
225
|
action: 'activate',
|
|
180
|
-
label: this.t('action.
|
|
226
|
+
label: this.t('action.enable'),
|
|
181
227
|
icon: 'icon icon-play',
|
|
182
228
|
bulkable: true,
|
|
183
229
|
bulkAction: 'activateBulk',
|
|
@@ -186,7 +232,7 @@ export default class User extends HybridModel {
|
|
|
186
232
|
},
|
|
187
233
|
{
|
|
188
234
|
action: 'deactivate',
|
|
189
|
-
label: this.t('action.
|
|
235
|
+
label: this.t('action.disable'),
|
|
190
236
|
icon: 'icon icon-pause',
|
|
191
237
|
bulkable: true,
|
|
192
238
|
bulkAction: 'deactivateBulk',
|
|
@@ -211,6 +257,25 @@ export default class User extends HybridModel {
|
|
|
211
257
|
formatter: 'CopyToClipboard',
|
|
212
258
|
content: this.username
|
|
213
259
|
},
|
|
260
|
+
{ separator: true },
|
|
261
|
+
{
|
|
262
|
+
label: this.t('tableHeaders.userLastLogin'),
|
|
263
|
+
formatter: 'LiveDate',
|
|
264
|
+
formatterOpts: { addSuffix: true, suffix: `${ this.t('suffix.ago') } (${ day(this.userLastLogin) })` },
|
|
265
|
+
content: this.userLastLogin,
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
label: this.t('tableHeaders.userDisabledIn'),
|
|
269
|
+
formatter: 'LiveDate',
|
|
270
|
+
formatterOpts: { isCountdown: true },
|
|
271
|
+
content: this.userDisabledInDisplay,
|
|
272
|
+
},
|
|
273
|
+
{
|
|
274
|
+
label: this.t('tableHeaders.userDeletedIn'),
|
|
275
|
+
formatter: 'LiveDate',
|
|
276
|
+
formatterOpts: { isCountdown: true },
|
|
277
|
+
content: this.userDeletedIn,
|
|
278
|
+
},
|
|
214
279
|
...this._details
|
|
215
280
|
];
|
|
216
281
|
}
|
|
@@ -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);
|
|
@@ -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,68 @@
|
|
|
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: 'Activate',
|
|
13
|
+
icon: 'icon icon-play',
|
|
14
|
+
bulkable: true,
|
|
15
|
+
enabled: !!this.actions.activate && this.state === 'inactive',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
action: 'deactivate',
|
|
19
|
+
label: 'Deactivate',
|
|
20
|
+
icon: 'icon icon-pause',
|
|
21
|
+
bulkable: true,
|
|
22
|
+
enabled: !!this.actions.deactivate && this.state === 'active',
|
|
23
|
+
weight: -1,
|
|
24
|
+
},
|
|
25
|
+
{ divider: true },
|
|
26
|
+
{
|
|
27
|
+
action: 'viewInApi',
|
|
28
|
+
enabled: true,
|
|
29
|
+
icon: 'icon icon-external-link',
|
|
30
|
+
label: this.t('action.viewInApi'),
|
|
31
|
+
},
|
|
32
|
+
{ divider: true },
|
|
33
|
+
{
|
|
34
|
+
action: 'goToEdit',
|
|
35
|
+
label: this.t('action.edit'),
|
|
36
|
+
icon: 'icon icon-edit',
|
|
37
|
+
bulkable: false,
|
|
38
|
+
enabled: !!this.links.update && !this.builtin,
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
action: 'promptRemove',
|
|
42
|
+
altAction: 'remove',
|
|
43
|
+
bulkAction: 'promptRemove',
|
|
44
|
+
label: this.t('action.remove'),
|
|
45
|
+
bulkable: true,
|
|
46
|
+
icon: 'icon icon-delete',
|
|
47
|
+
enabled: !!this.links.update && !this.active,
|
|
48
|
+
weight: -10,
|
|
49
|
+
}
|
|
50
|
+
];
|
|
51
|
+
|
|
52
|
+
return out;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
deactivate() {
|
|
56
|
+
this.$dispatch('promptModal', {
|
|
57
|
+
componentProps: { url: `v3/nodeDrivers/${ escape(this.id) }?action=deactivate`, name: this.nameDisplay },
|
|
58
|
+
component: 'DeactivateDriverDialog'
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
activate() {
|
|
63
|
+
return this.$dispatch('rancher/request', {
|
|
64
|
+
url: `v3/nodeDrivers/${ escape(this.id) }?action=activate`,
|
|
65
|
+
method: 'post',
|
|
66
|
+
}, { root: true });
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -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.
|
|
@@ -403,6 +404,38 @@ export default class ProvCluster extends SteveModel {
|
|
|
403
404
|
return this.mgmt?.providerLogo;
|
|
404
405
|
}
|
|
405
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
|
+
|
|
406
439
|
get kubernetesVersion() {
|
|
407
440
|
const unknown = this.$rootGetters['i18n/t']('generic.unknown');
|
|
408
441
|
|