@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
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
import { NAMESPACE_FILTER_NAMESPACED_YES, NAMESPACE_FILTER_NAMESPACED_NO, NAMESPACE_FILTER_ALL } from '@shell/utils/namespace-filter';
|
|
2
|
+
import { NAMESPACE } from '@shell/config/types';
|
|
3
|
+
import { ALL_NAMESPACES } from '@shell/store/prefs';
|
|
4
|
+
import { mapGetters } from 'vuex';
|
|
5
|
+
import { ResourceListComponentName } from '../components/ResourceList/resource-list.config';
|
|
6
|
+
import paginationUtils from '@shell/utils/pagination-utils';
|
|
7
|
+
import debounce from 'lodash/debounce';
|
|
8
|
+
import { PaginationParamFilter, PaginationFilterField, PaginationArgs } from '@shell/types/store/pagination.types';
|
|
9
|
+
import stevePaginationUtils from '@shell/plugins/steve/steve-pagination-utils';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Companion mixin used with `resource-fetch` for `ResourceList` to determine if the user needs to filter the list by a single namespace
|
|
13
|
+
*/
|
|
14
|
+
export default {
|
|
15
|
+
|
|
16
|
+
data() {
|
|
17
|
+
return {
|
|
18
|
+
forceUpdateLiveAndDelayed: 0,
|
|
19
|
+
/**
|
|
20
|
+
* This of type `OptPagination`
|
|
21
|
+
*/
|
|
22
|
+
pPagination: null,
|
|
23
|
+
// Avoid scenarios where namespace is updated just before other pagination changes come in
|
|
24
|
+
debouncedSetPagination: debounce(this.setPagination, 50),
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Apply these additional filters given the ns / project header selection
|
|
28
|
+
*/
|
|
29
|
+
requestFilters: {
|
|
30
|
+
filters: [],
|
|
31
|
+
projectsOrNamespaces: [],
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
},
|
|
35
|
+
|
|
36
|
+
methods: {
|
|
37
|
+
/**
|
|
38
|
+
* @param {PaginationArgs} pagination
|
|
39
|
+
*/
|
|
40
|
+
setPagination(pagination) {
|
|
41
|
+
if (pagination) {
|
|
42
|
+
this.pPagination = pagination;
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
|
|
46
|
+
paginationChanged(event) {
|
|
47
|
+
const searchFilters = event.filter.searchQuery ? event.filter.searchFields.map((field) => new PaginationFilterField({
|
|
48
|
+
field,
|
|
49
|
+
value: event.filter.searchQuery,
|
|
50
|
+
exact: false,
|
|
51
|
+
})) : [];
|
|
52
|
+
|
|
53
|
+
const pagination = new PaginationArgs({
|
|
54
|
+
page: event.page,
|
|
55
|
+
pageSize: event.perPage,
|
|
56
|
+
sort: event.sort?.map((field) => ({
|
|
57
|
+
field,
|
|
58
|
+
asc: !event.descending
|
|
59
|
+
})),
|
|
60
|
+
projectsOrNamespaces: this.requestFilters.projectsOrNamespaces,
|
|
61
|
+
filters: [
|
|
62
|
+
new PaginationParamFilter({ fields: searchFilters }),
|
|
63
|
+
...this.requestFilters.filters, // Apply the additional filters. these aren't from the user but from ns filtering
|
|
64
|
+
]
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
this.debouncedSetPagination(pagination);
|
|
68
|
+
},
|
|
69
|
+
|
|
70
|
+
namespaceFilterChanged(neu) {
|
|
71
|
+
if (!this.canPaginate || !this.schema?.attributes?.namespaced) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const {
|
|
76
|
+
projectsOrNamespaces,
|
|
77
|
+
filters
|
|
78
|
+
} = stevePaginationUtils.createParamsFromNsFilter({
|
|
79
|
+
allNamespaces: this.$store.getters[`${ this.currentProduct?.inStore }/all`](NAMESPACE),
|
|
80
|
+
selection: neu,
|
|
81
|
+
isAllNamespaces: this.isAllNamespaces,
|
|
82
|
+
isLocalCluster: this.$store.getters['currentCluster'].isLocal,
|
|
83
|
+
showDynamicRancherNamespaces: this.showDynamicRancherNamespaces,
|
|
84
|
+
productHidesSystemNamespaces: this.productHidesSystemNamespaces,
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
this.requestFilters.filters = filters;
|
|
88
|
+
this.requestFilters.projectsOrNamespaces = projectsOrNamespaces;
|
|
89
|
+
|
|
90
|
+
// Kick off a change
|
|
91
|
+
if (this.pPagination) {
|
|
92
|
+
this.debouncedSetPagination({ ...this.pPagination });
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* @param {PaginationArgs} neu
|
|
98
|
+
* @param {PaginationArgs} old
|
|
99
|
+
*/
|
|
100
|
+
paginationEqual(neu, old) {
|
|
101
|
+
if (!neu.page) {
|
|
102
|
+
// Not valid, count as not equal
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
if (paginationUtils.paginationEqual(neu, old)) {
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
|
|
114
|
+
computed: {
|
|
115
|
+
...mapGetters(['currentProduct', 'isAllNamespaces']),
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Why is this a specific getter and not not in mapGetters?
|
|
119
|
+
*
|
|
120
|
+
* Adding it to mapGetters means the kubewarden unit tests fail as they don't mock it....
|
|
121
|
+
*/
|
|
122
|
+
namespaceFilters() {
|
|
123
|
+
return this.$store.getters['namespaceFilters'];
|
|
124
|
+
},
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Does the user need to update the filter to supply valid options?
|
|
128
|
+
*/
|
|
129
|
+
paginationNsFilterRequired() {
|
|
130
|
+
return this.canPaginate && !this.__validPaginationNsFilter;
|
|
131
|
+
},
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Check if the Project/Namespace filter from the header contains a valid ns / project filter
|
|
135
|
+
*/
|
|
136
|
+
__validPaginationNsFilter() {
|
|
137
|
+
return paginationUtils.validateNsProjectFilters(this.namespaceFilters);
|
|
138
|
+
},
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* ResourceList imports resource-fetch --> this mixin
|
|
142
|
+
* When there is no custom list this is fine (ResourceList with mixins --> ResourceTable)
|
|
143
|
+
* When there is a custom list there are two instances of this mixin (ResourceList with mixins --> CustomList with mixins --> ResourceTable)
|
|
144
|
+
* - In this scenario, reduce churn by exiting earlier if mixin is from parent ResourceList and leave work for CustomList mixins
|
|
145
|
+
*/
|
|
146
|
+
isResourceList() {
|
|
147
|
+
return !!this.hasListComponent;
|
|
148
|
+
},
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Is Pagination supported and has the table supplied pagination settings from the table?
|
|
152
|
+
*/
|
|
153
|
+
pagination() {
|
|
154
|
+
if (this.isResourceList) {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return this.canPaginate ? this.pPagination : '';
|
|
159
|
+
},
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Should this list be paginated via API?
|
|
163
|
+
*/
|
|
164
|
+
canPaginate() {
|
|
165
|
+
if (this.isResourceList) {
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
return this.resource && this.$store.getters[`${ this.currentProduct?.inStore }/paginationEnabled`]?.(this.resource.id || this.resource);
|
|
170
|
+
},
|
|
171
|
+
|
|
172
|
+
paginationResult() {
|
|
173
|
+
if (this.isResourceList || !this.canPaginate) {
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
return this.havePaginated?.result;
|
|
178
|
+
},
|
|
179
|
+
|
|
180
|
+
havePaginated() {
|
|
181
|
+
if (this.isResourceList) {
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
return this.$store.getters[`${ this.currentProduct?.inStore }/havePage`](this.resource);
|
|
186
|
+
},
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Links to ns.isSystem and covers things like ns with system annotation, hardcoded list, etc
|
|
190
|
+
*/
|
|
191
|
+
productHidesSystemNamespaces() {
|
|
192
|
+
return this.currentProduct?.hideSystemResources;
|
|
193
|
+
},
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Links to ns.isObscure and covers things like `c-`, `user-`, etc (see OBSCURE_NAMESPACE_PREFIX)
|
|
197
|
+
*/
|
|
198
|
+
showDynamicRancherNamespaces() {
|
|
199
|
+
return this.$store.getters['prefs/get'](ALL_NAMESPACES);
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
|
|
203
|
+
watch: {
|
|
204
|
+
/**
|
|
205
|
+
* Monitor the rows to ensure deleting the last entry in a server-side paginated page doesn't
|
|
206
|
+
* result in an empty page
|
|
207
|
+
*/
|
|
208
|
+
rows(neu) {
|
|
209
|
+
if (!this.canPaginate || !this.pagination || this.isResourceList) {
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
if (this.pagination.page > 1 && neu.length === 0) {
|
|
214
|
+
this.setPagination({
|
|
215
|
+
...this.pagination,
|
|
216
|
+
page: this.pagination.page - 1
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
},
|
|
220
|
+
|
|
221
|
+
namespaceFilters: {
|
|
222
|
+
immediate: true,
|
|
223
|
+
async handler(neu, old) {
|
|
224
|
+
if (!this.canPaginate || !this.schema?.attributes?.namespaced) {
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
if (this.isResourceList) {
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// Transitioning from no ns filters to no ns filters should be avoided
|
|
233
|
+
const neuEmpty = !neu || neu.length === 0 || neu[0] === NAMESPACE_FILTER_ALL;
|
|
234
|
+
const oldEmpty = !old || old.length === 0 || old[0] === NAMESPACE_FILTER_ALL;
|
|
235
|
+
|
|
236
|
+
if (neuEmpty && oldEmpty) {
|
|
237
|
+
const allButHidingSystemResources = this.isAllNamespaces && (!this.showDynamicRancherNamespaces || this.productHidesSystemNamespaces);
|
|
238
|
+
|
|
239
|
+
// If we're showing all... and not hiding system or obscure ns then don't go through filter process
|
|
240
|
+
if (!allButHidingSystemResources) {
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// Transitioning to a ns filter that doesn't affect the list should be avoided
|
|
246
|
+
if (neu.length === 1) {
|
|
247
|
+
if ([NAMESPACE_FILTER_NAMESPACED_YES, NAMESPACE_FILTER_NAMESPACED_NO].includes(neu[0])) {
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
this.namespaceFilterChanged(neu);
|
|
253
|
+
}
|
|
254
|
+
},
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* When a pagination is required and the user changes page / sort / filter, kick off a new set of API requests
|
|
258
|
+
*
|
|
259
|
+
* @param {StorePaginationResult} neu
|
|
260
|
+
* @param {StorePaginationResult} old
|
|
261
|
+
*/
|
|
262
|
+
async pagination(neu, old) {
|
|
263
|
+
if (!this.canPaginate) {
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// ResourceList has two modes
|
|
268
|
+
// 1) ResourceList component handles API request to fetch resources
|
|
269
|
+
// 2) Custom list component handles API request to fetch resources
|
|
270
|
+
//
|
|
271
|
+
// This covers case 2, so ignore case 1
|
|
272
|
+
if (this.isResourceList) {
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
if (neu && this.$options.name !== ResourceListComponentName && !!this.$fetch && !this.paginationEqual(neu, old)) {
|
|
277
|
+
await this.$fetch(false);
|
|
278
|
+
// Ensure any live/delayed columns get updated
|
|
279
|
+
this.forceUpdateLiveAndDelayed = new Date().getTime();
|
|
280
|
+
}
|
|
281
|
+
},
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* If the pagination result has changed fetch secondary resources
|
|
285
|
+
*
|
|
286
|
+
* Lists should implement fetchPageSecondaryResources to fetch them
|
|
287
|
+
*
|
|
288
|
+
* @param {StorePaginationResult} neu
|
|
289
|
+
* @param {StorePaginationResult} old
|
|
290
|
+
*/
|
|
291
|
+
async paginationResult(neu, old) {
|
|
292
|
+
if (!this.fetchPageSecondaryResources || !neu ) { // || neu.timestamp === old?.timestamp
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
if (neu.timestamp === old?.timestamp) {
|
|
297
|
+
// This occurs when the user returns to the page... and pagination hasn't actually changed
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
await this.fetchPageSecondaryResources();
|
|
302
|
+
}
|
|
303
|
+
},
|
|
304
|
+
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { NAMESPACE_FILTER_NS_PREFIX, NAMESPACE_FILTER_P_PREFIX } from '@shell/utils/namespace-filter';
|
|
2
2
|
import { mapGetters } from 'vuex';
|
|
3
3
|
import { ResourceListComponentName } from '../components/ResourceList/resource-list.config';
|
|
4
|
-
import pAndNFiltering from '@shell/
|
|
4
|
+
import pAndNFiltering from '@shell/plugins/steve/projectAndNamespaceFiltering.utils';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Companion mixin used with `resource-fetch` for `ResourceList` to determine if the user needs to filter the list by a single namespace
|
package/mixins/resource-fetch.js
CHANGED
|
@@ -1,14 +1,19 @@
|
|
|
1
|
+
import Vue from 'vue';
|
|
1
2
|
import { mapGetters } from 'vuex';
|
|
2
3
|
import { COUNT, MANAGEMENT } from '@shell/config/types';
|
|
3
4
|
import { SETTING, DEFAULT_PERF_SETTING } from '@shell/config/settings';
|
|
4
5
|
import ResourceFetchNamespaced from '@shell/mixins/resource-fetch-namespaced';
|
|
6
|
+
import ResourceFetchApiPagination from '@shell/mixins/resource-fetch-api-pagination';
|
|
5
7
|
|
|
6
8
|
// Number of pages to fetch when loading incrementally
|
|
7
9
|
const PAGES = 4;
|
|
8
10
|
|
|
9
11
|
export default {
|
|
10
12
|
|
|
11
|
-
mixins: [
|
|
13
|
+
mixins: [
|
|
14
|
+
ResourceFetchNamespaced,
|
|
15
|
+
ResourceFetchApiPagination
|
|
16
|
+
],
|
|
12
17
|
|
|
13
18
|
data() {
|
|
14
19
|
// fetching the settings related to manual refresh from global settings
|
|
@@ -38,8 +43,10 @@ export default {
|
|
|
38
43
|
// incremental loading vars
|
|
39
44
|
incremental: false,
|
|
40
45
|
fetchedResourceType: [],
|
|
46
|
+
paginating: null,
|
|
41
47
|
};
|
|
42
48
|
},
|
|
49
|
+
|
|
43
50
|
beforeDestroy() {
|
|
44
51
|
// make sure this only runs once, for the initialized instance
|
|
45
52
|
if (this.init) {
|
|
@@ -64,17 +71,26 @@ export default {
|
|
|
64
71
|
}
|
|
65
72
|
},
|
|
66
73
|
loading() {
|
|
74
|
+
if (this.canPaginate) {
|
|
75
|
+
return this.paginating;
|
|
76
|
+
}
|
|
77
|
+
|
|
67
78
|
return this.rows.length ? false : this.$fetchState.pending;
|
|
68
79
|
},
|
|
69
80
|
},
|
|
81
|
+
|
|
70
82
|
watch: {
|
|
71
|
-
refreshFlag(neu) {
|
|
83
|
+
async refreshFlag(neu) {
|
|
72
84
|
// this is where the data assignment will trigger the update of the list view...
|
|
73
85
|
if (this.init && neu) {
|
|
74
|
-
this.$fetch();
|
|
86
|
+
await this.$fetch();
|
|
87
|
+
if (this.canPaginate && this.fetchPageSecondaryResources) {
|
|
88
|
+
this.fetchPageSecondaryResources(true);
|
|
89
|
+
}
|
|
75
90
|
}
|
|
76
91
|
}
|
|
77
92
|
},
|
|
93
|
+
|
|
78
94
|
methods: {
|
|
79
95
|
// this defines all the flags needed for the mechanism
|
|
80
96
|
// to work. They should be defined based on the main list view
|
|
@@ -109,6 +125,31 @@ export default {
|
|
|
109
125
|
});
|
|
110
126
|
}
|
|
111
127
|
|
|
128
|
+
const schema = this.$store.getters[`${ currStore }/schemaFor`](type);
|
|
129
|
+
|
|
130
|
+
if (this.canPaginate) {
|
|
131
|
+
if (!this.pagination) {
|
|
132
|
+
// This is the initial fetchType made when resource lists are created...
|
|
133
|
+
// when pagination is enabled we want to wait for the correct set of initial pagination settings to make the call
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
const opt = {
|
|
137
|
+
hasManualRefresh: this.hasManualRefresh,
|
|
138
|
+
pagination: { ...this.pagination },
|
|
139
|
+
force: this.paginating !== null // Fix for manual refresh (before ripped out).
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
Vue.set(this, 'paginating', true);
|
|
143
|
+
|
|
144
|
+
const that = this;
|
|
145
|
+
|
|
146
|
+
return this.$store.dispatch(`${ currStore }/findPage`, {
|
|
147
|
+
type,
|
|
148
|
+
opt
|
|
149
|
+
})
|
|
150
|
+
.finally(() => Vue.set(that, 'paginating', false));
|
|
151
|
+
}
|
|
152
|
+
|
|
112
153
|
let incremental = 0;
|
|
113
154
|
|
|
114
155
|
if (this.incremental) {
|
|
@@ -124,8 +165,6 @@ export default {
|
|
|
124
165
|
hasManualRefresh: this.hasManualRefresh
|
|
125
166
|
};
|
|
126
167
|
|
|
127
|
-
const schema = this.$store.getters[`${ currStore }/schemaFor`](type);
|
|
128
|
-
|
|
129
168
|
if (schema?.attributes?.namespaced) { // Is this specific resource namespaced (could be primary or secondary resource)?
|
|
130
169
|
opt.namespaced = this.namespaceFilter; // namespaceFilter will only be populated if applicable for primary resource
|
|
131
170
|
}
|
|
@@ -181,6 +220,8 @@ export default {
|
|
|
181
220
|
if (manualDataRefreshEnabled && resourceCount >= manualDataRefreshThreshold) {
|
|
182
221
|
watch = false;
|
|
183
222
|
isTooManyItemsToAutoUpdate = true;
|
|
223
|
+
} else if (this.canPaginate) {
|
|
224
|
+
isTooManyItemsToAutoUpdate = true;
|
|
184
225
|
}
|
|
185
226
|
|
|
186
227
|
// incremental loading check
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import NormanCluster from '@shell/models/cluster';
|
|
2
|
+
|
|
3
|
+
describe('class NormanCluster', () => {
|
|
4
|
+
const t = jest.fn(() => 'abc');
|
|
5
|
+
const ctx = { rootGetters: { 'i18n/t': t }, dispatch: jest.fn() };
|
|
6
|
+
|
|
7
|
+
it('should return empty arrays of system labels and system annotations if cluster labels and annotations are undefined', () => {
|
|
8
|
+
const cluster = new NormanCluster({}, ctx);
|
|
9
|
+
|
|
10
|
+
expect(cluster.systemLabels).toStrictEqual([]);
|
|
11
|
+
expect(cluster.systemAnnotations).toStrictEqual([]);
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
it('should list all the cluster\'s annotation keys that contain coreos.com, cattle.io, k3s.io, kubernetes.io, or k3s.io', () => {
|
|
15
|
+
const testAnnotations = ['cattle.io/test', 'coreos.com', 'test.cattle.io/something', 'kubernetes.io/test'];
|
|
16
|
+
const cluster = new NormanCluster({
|
|
17
|
+
annotations: {
|
|
18
|
+
'cattle.io/test': 'abc',
|
|
19
|
+
'coreos.com': 'abc',
|
|
20
|
+
'k3s.io/test': 'abc',
|
|
21
|
+
'test.cattle.io/something': 'abc',
|
|
22
|
+
'kubernetes.io/test': 'abc',
|
|
23
|
+
'other-label': 'abc'
|
|
24
|
+
}
|
|
25
|
+
}, ctx);
|
|
26
|
+
|
|
27
|
+
expect(testAnnotations.find((annotation) => !cluster.systemAnnotations.includes(annotation))).toBeUndefined();
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it('should list all the cluster\'s label keys that contain io.cattle.lifecycle, kubernetes.io, cattle.io, or k3s.io', () => {
|
|
31
|
+
const testLabels = ['cattle.io/test', 'test.io.cattle.lifecycle', 'test.kubernetes.io/test', 'k3s.io/test'];
|
|
32
|
+
const cluster = new NormanCluster({
|
|
33
|
+
labels: {
|
|
34
|
+
'cattle.io/test': 'abc',
|
|
35
|
+
'test.io.cattle.lifecycle': 'abc',
|
|
36
|
+
'k3s.io/test': 'abc',
|
|
37
|
+
'test.kubernetes.io/test': 'abc',
|
|
38
|
+
'other-label': 'abc'
|
|
39
|
+
}
|
|
40
|
+
}, ctx);
|
|
41
|
+
|
|
42
|
+
expect(testLabels.find((label) => !cluster.systemLabels.includes(label))).toBeUndefined();
|
|
43
|
+
});
|
|
44
|
+
});
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import FleetCluster from '@shell/models/fleet.cattle.io.cluster';
|
|
2
|
+
|
|
3
|
+
describe('class FleetCluster', () => {
|
|
4
|
+
it('should provide bundleInfo if correct data is present', () => {
|
|
5
|
+
const fleetCluster = new FleetCluster({
|
|
6
|
+
metadata: {},
|
|
7
|
+
spec: {},
|
|
8
|
+
status: { display: { readyBundles: '0/1' } },
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
expect(fleetCluster.bundleInfo.ready).toBe(0);
|
|
12
|
+
expect(fleetCluster.bundleInfo.total).toBe(1);
|
|
13
|
+
expect(Object.getOwnPropertyNames(fleetCluster.bundleInfo)).not.toContain('noValidData');
|
|
14
|
+
});
|
|
15
|
+
describe('should provide bundleInfo with error', () => {
|
|
16
|
+
it.each([
|
|
17
|
+
[''],
|
|
18
|
+
['/'],
|
|
19
|
+
['1/'],
|
|
20
|
+
['/1'],
|
|
21
|
+
['1/1/2'],
|
|
22
|
+
['a/1'],
|
|
23
|
+
['a/b'],
|
|
24
|
+
['any-string'],
|
|
25
|
+
['any-string1/string2']
|
|
26
|
+
])('with multiple scenarios of wrongful "readyBundles" data', (readyBundles) => {
|
|
27
|
+
const fleetCluster = new FleetCluster({
|
|
28
|
+
metadata: {},
|
|
29
|
+
spec: {},
|
|
30
|
+
status: { display: { readyBundles } },
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
expect(Object.getOwnPropertyNames(fleetCluster.bundleInfo)).toContain('noValidData');
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { parseType } from '@shell/models/schema';
|
|
2
|
+
|
|
3
|
+
describe('class: schema:', () => {
|
|
4
|
+
describe('parseType', () => {
|
|
5
|
+
it.each([
|
|
6
|
+
['array', undefined, ['array']],
|
|
7
|
+
['map', undefined, ['map']],
|
|
8
|
+
['io.cattle.provisioning.v1.Cluster.status', undefined, ['io.cattle.provisioning.v1.Cluster.status']],
|
|
9
|
+
|
|
10
|
+
['array[string]', undefined, ['array', 'string']],
|
|
11
|
+
['array', { subtype: 'string' }, ['array', 'string']],
|
|
12
|
+
['map[string]', undefined, ['map', 'string']],
|
|
13
|
+
['map', { subtype: 'string' }, ['map', 'string']],
|
|
14
|
+
|
|
15
|
+
['array[io.cattle.provisioning.v1.Cluster.status]', undefined, ['array', 'io.cattle.provisioning.v1.Cluster.status']],
|
|
16
|
+
['array', { subtype: 'io.cattle.provisioning.v1.Cluster.status' }, ['array', 'io.cattle.provisioning.v1.Cluster.status']],
|
|
17
|
+
['map[io.cattle.provisioning.v1.Cluster.status]', undefined, ['map', 'io.cattle.provisioning.v1.Cluster.status']],
|
|
18
|
+
['map', { subtype: 'io.cattle.provisioning.v1.Cluster.status' }, ['map', 'io.cattle.provisioning.v1.Cluster.status']],
|
|
19
|
+
|
|
20
|
+
])('string: %p and field: %p ... should equal %p', (val, field, expected) => {
|
|
21
|
+
expect(parseType(val, field)).toStrictEqual(expected);
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
});
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import SteveSchema from '@shell/models/steve-schema';
|
|
2
|
+
import { replace } from '@shell/plugins/dashboard-store/mutations';
|
|
3
|
+
|
|
4
|
+
describe('class SteveSchema', () => {
|
|
5
|
+
describe('schema diet', () => {
|
|
6
|
+
it('schema Definitions', async() => {
|
|
7
|
+
const store = 'cluster';
|
|
8
|
+
const schemaName = 'steveTest';
|
|
9
|
+
|
|
10
|
+
SteveSchema.reset(store);
|
|
11
|
+
|
|
12
|
+
const testSchema = {
|
|
13
|
+
id: schemaName,
|
|
14
|
+
metadata: { name: schemaName },
|
|
15
|
+
resourceFields: null,
|
|
16
|
+
links: { self: `/v1/schemas/${ schemaName }` }
|
|
17
|
+
};
|
|
18
|
+
const testSchemaDefinition = {
|
|
19
|
+
type: schemaName,
|
|
20
|
+
resourceFields: {
|
|
21
|
+
a: {},
|
|
22
|
+
b: {},
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
const testSecondarySchemaDefinitions = {
|
|
26
|
+
a: { type: 'a' },
|
|
27
|
+
b: { type: 'b' }
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
const schemaModel = new SteveSchema(testSchema, {
|
|
31
|
+
dispatch: jest.fn().mockImplementation((action, opts) => {
|
|
32
|
+
expect(action).toBe('request');
|
|
33
|
+
expect(opts.type).toBe('schemaDefinition');
|
|
34
|
+
expect(opts.url).toBe(`/v1/schemaDefinitions/${ schemaName }`);
|
|
35
|
+
|
|
36
|
+
return {
|
|
37
|
+
definitionType: schemaName,
|
|
38
|
+
definitions: {
|
|
39
|
+
[schemaName]: testSchemaDefinition,
|
|
40
|
+
...testSecondarySchemaDefinitions,
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
}),
|
|
44
|
+
state: { config: { namespace: store } }
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
// We have no schema definition info, however we know that schema definitions should be fetched
|
|
48
|
+
expect(schemaModel.schemaDefinition).toBeNull();
|
|
49
|
+
expect(schemaModel.schemaDefinitions).toBeNull();
|
|
50
|
+
expect(schemaModel.requiresResourceFields).toBeTruthy();
|
|
51
|
+
expect(schemaModel.hasResourceFields).toBeFalsy();
|
|
52
|
+
|
|
53
|
+
// Fetch schema definition
|
|
54
|
+
await schemaModel.fetchResourceFields();
|
|
55
|
+
|
|
56
|
+
// We have schema definition info
|
|
57
|
+
expect(schemaModel.schemaDefinition).toStrictEqual(testSchemaDefinition);
|
|
58
|
+
expect(schemaModel.schemaDefinitions).toStrictEqual(testSecondarySchemaDefinitions);
|
|
59
|
+
expect(schemaModel.requiresResourceFields).toBeTruthy();
|
|
60
|
+
expect(schemaModel.hasResourceFields).toBeTruthy();
|
|
61
|
+
|
|
62
|
+
// Uhoh, there's been an update over socket. Socket process calls the `load` mutator which then calls `replace`.
|
|
63
|
+
// This wipes out ALL properties on our poor schema model and applies everything from the one we get over socket
|
|
64
|
+
replace(schemaModel, { ...testSchema });
|
|
65
|
+
|
|
66
|
+
// All schema definition info should still work (this matches above)
|
|
67
|
+
expect(schemaModel.schemaDefinition).toStrictEqual(testSchemaDefinition);
|
|
68
|
+
expect(schemaModel.schemaDefinitions).toStrictEqual(testSecondarySchemaDefinitions);
|
|
69
|
+
expect(schemaModel.requiresResourceFields).toBeTruthy();
|
|
70
|
+
expect(schemaModel.hasResourceFields).toBeTruthy();
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
});
|
|
@@ -39,6 +39,14 @@ export default class CatalogApp extends SteveModel {
|
|
|
39
39
|
return out;
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
+
get warnDeletionMessage() {
|
|
43
|
+
if (this.upgradeAvailable === false) {
|
|
44
|
+
return this.t('catalog.delete.warning.managed', { name: this.name });
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
|
|
42
50
|
matchingChart(includeHidden) {
|
|
43
51
|
const chart = this.spec?.chart;
|
|
44
52
|
|
|
@@ -44,6 +44,14 @@ export default class ClusterRepo extends SteveModel {
|
|
|
44
44
|
return !!this.spec?.gitRepo;
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
+
get isOciType() {
|
|
48
|
+
const hasExplicitOciUrl = this.spec.url?.split(':')[0] === 'oci';
|
|
49
|
+
// insecurePlainHttp is only valid for OCI URL's and allows insecure connections to registries without enforcing TLS checks
|
|
50
|
+
const hasInsecurePlainHttp = Object.prototype.hasOwnProperty.call(this.spec, ('insecurePlainHttp'));
|
|
51
|
+
|
|
52
|
+
return hasExplicitOciUrl || hasInsecurePlainHttp;
|
|
53
|
+
}
|
|
54
|
+
|
|
47
55
|
get isRancherSource() {
|
|
48
56
|
let parsed;
|
|
49
57
|
|
|
@@ -107,7 +115,7 @@ export default class ClusterRepo extends SteveModel {
|
|
|
107
115
|
if ( this.spec.gitRepo ) {
|
|
108
116
|
return 'git';
|
|
109
117
|
} else if ( this.spec.url ) {
|
|
110
|
-
return 'http';
|
|
118
|
+
return this.isOciType ? 'oci' : 'http';
|
|
111
119
|
} else {
|
|
112
120
|
return '?';
|
|
113
121
|
}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import SteveModel from '@shell/plugins/steve/steve-class';
|
|
2
2
|
|
|
3
|
-
const
|
|
3
|
+
const CACHE_STATE = Object.freeze({
|
|
4
|
+
CACHED: 'cached',
|
|
5
|
+
DISABLED: 'disabled',
|
|
6
|
+
PENDING: 'pending',
|
|
7
|
+
});
|
|
4
8
|
|
|
5
9
|
export default class UIPlugin extends SteveModel {
|
|
6
10
|
get name() {
|
|
@@ -15,13 +19,8 @@ export default class UIPlugin extends SteveModel {
|
|
|
15
19
|
return this.spec?.plugin?.version;
|
|
16
20
|
}
|
|
17
21
|
|
|
18
|
-
get
|
|
19
|
-
return this.
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
// Has the plugin been cached?
|
|
23
|
-
get isCached() {
|
|
24
|
-
return !this.willBeCached || (this.willBeCached && this.status?.cacheState === CACHED_STATUS);
|
|
22
|
+
get isInitialized() {
|
|
23
|
+
return this.status?.cacheState !== CACHE_STATE.PENDING;
|
|
25
24
|
}
|
|
26
25
|
|
|
27
26
|
get pluginMetadata() {
|