@rancher/shell 3.0.12-rc.2 → 3.0.12-rc.4
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/apis/impl/apis.ts +6 -0
- package/apis/index.ts +26 -0
- package/apis/intf/resources-api/cluster-api.ts +18 -0
- package/apis/intf/resources-api/mgmt-api.ts +15 -0
- package/apis/intf/resources-api/resource-base.ts +107 -0
- package/apis/intf/resources-api/resource-constants.ts +147 -0
- package/apis/intf/resources-api/resources-api.ts +143 -0
- package/apis/intf/resources.ts +49 -0
- package/apis/intf/{modal.ts → shell-api/modal.ts} +21 -26
- package/apis/intf/shell-api/proxy.ts +216 -0
- package/apis/intf/{slide-in.ts → shell-api/slide-in.ts} +4 -3
- package/apis/intf/{system.ts → shell-api/system.ts} +4 -1
- package/apis/intf/shell.ts +12 -6
- package/apis/resources/__tests__/resources-api-class.test.ts +550 -0
- package/apis/resources/index.ts +22 -0
- package/apis/resources/resources-api-class.ts +187 -0
- package/apis/shell/__tests__/proxy.test.ts +369 -0
- package/apis/shell/index.ts +8 -1
- package/apis/shell/modal.ts +4 -1
- package/apis/shell/notifications.ts +9 -6
- package/apis/shell/proxy.ts +256 -0
- package/apis/shell/slide-in.ts +4 -1
- package/apis/vue-shim.d.ts +2 -1
- package/assets/data/aws-regions.json +4 -0
- package/assets/fonts/lato/LatoLatin-Black.woff +0 -0
- package/assets/fonts/lato/LatoLatin-Black.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-BlackItalic.woff +0 -0
- package/assets/fonts/lato/LatoLatin-BlackItalic.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-Bold.woff +0 -0
- package/assets/fonts/lato/LatoLatin-Bold.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-BoldItalic.woff +0 -0
- package/assets/fonts/lato/LatoLatin-BoldItalic.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-Heavy.woff +0 -0
- package/assets/fonts/lato/LatoLatin-Heavy.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-HeavyItalic.woff +0 -0
- package/assets/fonts/lato/LatoLatin-HeavyItalic.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-Italic.woff +0 -0
- package/assets/fonts/lato/LatoLatin-Italic.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-Light.woff +0 -0
- package/assets/fonts/lato/LatoLatin-Light.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-LightItalic.woff +0 -0
- package/assets/fonts/lato/LatoLatin-LightItalic.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-Medium.woff +0 -0
- package/assets/fonts/lato/LatoLatin-Medium.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-MediumItalic.woff +0 -0
- package/assets/fonts/lato/LatoLatin-MediumItalic.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-Regular.woff +0 -0
- package/assets/fonts/lato/LatoLatin-Regular.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-Semibold.woff +0 -0
- package/assets/fonts/lato/LatoLatin-Semibold.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-SemiboldItalic.woff +0 -0
- package/assets/fonts/lato/LatoLatin-SemiboldItalic.woff2 +0 -0
- package/assets/styles/base/_variables.scss +2 -0
- package/assets/styles/fonts/_fontstack.scss +132 -8
- package/assets/styles/global/_layout.scss +4 -0
- package/assets/translations/en-us.yaml +165 -45
- package/assets/translations/zh-hans.yaml +1 -7
- package/chart/monitoring/ClusterSelector.vue +0 -21
- package/chart/monitoring/index.vue +10 -1
- package/chart/monitoring/prometheus/index.vue +6 -3
- package/components/ActionDropdownShell.vue +2 -1
- package/components/CruResource.vue +161 -14
- package/components/CruResourceFooter.vue +9 -5
- package/components/ExplorerMembers.vue +8 -4
- package/components/ExplorerProjectsNamespaces.vue +11 -7
- package/components/GrowlManager.vue +4 -0
- package/components/InstallHelmCharts.vue +2 -2
- package/components/LandingPagePreference.vue +14 -5
- package/components/MgmtNodeList.vue +184 -0
- package/components/Resource/Detail/Card/StateCard/__tests__/composables.test.ts +90 -1
- package/components/Resource/Detail/Card/StateCard/composables.ts +57 -87
- package/components/Resource/Detail/Card/StatusCard/__tests__/StatusCard.test.ts +61 -0
- package/components/Resource/Detail/Card/StatusCard/index.vue +61 -15
- package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +17 -1
- package/components/Resource/Detail/Metadata/KeyValue.vue +5 -2
- package/components/Resource/Detail/Metadata/KeyValueRow.vue +2 -6
- package/components/Resource/Detail/Metadata/index.vue +6 -0
- package/components/Resource/Detail/ResourcePopover/index.vue +12 -1
- package/components/Resource/Detail/SpacedRow.vue +3 -1
- package/components/Resource/Detail/TitleBar/index.vue +10 -11
- package/components/ResourceDetail/index.vue +1 -1
- package/components/ResourceList/Masthead.vue +19 -9
- package/components/ResourceList/index.vue +82 -1
- package/components/RichTranslation.vue +5 -2
- package/components/SelectIconGrid.vue +0 -10
- package/components/Setting.vue +1 -0
- package/components/SingleClusterInfo.vue +1 -0
- package/components/SortableTable/__tests__/sorting.test.ts +126 -0
- package/components/SortableTable/index.vue +6 -9
- package/components/SortableTable/selection.js +23 -5
- package/components/SortableTable/sorting.js +6 -3
- package/components/SubtleLink.vue +31 -6
- package/components/Tabbed/Tab.vue +29 -3
- package/components/Tabbed/index.vue +25 -3
- package/components/TableOfContents/TableOfContents.vue +109 -0
- package/components/TableOfContents/composables.ts +258 -0
- package/components/Window/ContainerShell.vue +21 -11
- package/components/Window/__tests__/ContainerShell.test.ts +107 -37
- package/components/Wizard.vue +23 -17
- package/components/fleet/AppCoChartGrid.vue +401 -0
- package/components/fleet/AppCoEmptyState.vue +127 -0
- package/components/fleet/AppCoPageHeader.vue +119 -0
- package/components/fleet/AppCoVersionSelect.vue +70 -0
- package/components/fleet/FleetBundles.vue +100 -12
- package/components/fleet/FleetClusterTargets/ClusterSelectionFields.vue +217 -0
- package/components/fleet/FleetClusterTargets/TargetsList.vue +123 -35
- package/components/fleet/FleetClusterTargets/index.vue +226 -161
- package/components/fleet/FleetIntro.vue +7 -3
- package/components/fleet/FleetNoWorkspaces.vue +7 -3
- package/components/fleet/FleetSecretSelector.vue +5 -3
- package/components/fleet/FleetValuesFrom.vue +8 -2
- package/components/fleet/GitRepoTargetTab.vue +0 -2
- package/components/fleet/HelmOpAdvancedTab.vue +19 -53
- package/components/fleet/HelmOpAppCoConfigTab.vue +593 -0
- package/components/fleet/HelmOpAppCoResourcesSection.vue +162 -0
- package/components/fleet/HelmOpResourcesSection.vue +82 -0
- package/components/fleet/HelmOpTargetOptionsSection.vue +89 -0
- package/components/fleet/HelmOpTargetTab.vue +64 -60
- package/components/fleet/HelmOpValuesTab.vue +129 -105
- package/components/fleet/__tests__/AppCoEmptyState.test.ts +71 -0
- package/components/fleet/__tests__/AppCoVersionSelect.test.ts +36 -0
- package/components/fleet/__tests__/ClusterSelectionFields.test.ts +62 -0
- package/components/fleet/__tests__/FleetClusterTargets.test.ts +402 -115
- package/components/fleet/__tests__/FleetClusters.test.ts +12 -12
- package/components/fleet/__tests__/FleetSecretSelector.test.ts +16 -0
- package/components/fleet/__tests__/FleetValuesFrom.test.ts +44 -0
- package/components/fleet/__tests__/HelmOpAppCoConfigTab.test.ts +59 -0
- package/components/fleet/__tests__/HelmOpAppCoResourcesSection.test.ts +62 -0
- package/components/fleet/__tests__/HelmOpResourcesSection.test.ts +43 -0
- package/components/fleet/__tests__/HelmOpTargetOptionsSection.test.ts +34 -0
- package/components/fleet/__tests__/HelmOpValuesTab.test.ts +39 -0
- package/components/fleet/__tests__/__snapshots__/AppCoEmptyState.test.ts.snap +97 -0
- package/components/fleet/__tests__/__snapshots__/AppCoVersionSelect.test.ts.snap +30 -0
- package/components/fleet/__tests__/__snapshots__/ClusterSelectionFields.test.ts.snap +209 -0
- package/components/fleet/__tests__/__snapshots__/HelmOpTargetOptionsSection.test.ts.snap +140 -0
- package/components/fleet/dashboard/Empty.vue +8 -4
- package/components/fleet/dashboard/ResourceCard.vue +28 -0
- package/components/fleet/dashboard/ResourceDetails.vue +28 -0
- package/components/fleet/dashboard/__tests__/ResourceCard.test.ts +87 -0
- package/components/form/ArrayList.vue +61 -4
- package/components/form/KeyValue.vue +23 -2
- package/components/form/LabeledSelect.vue +59 -4
- package/components/form/Labels.vue +22 -3
- package/components/form/NameNsDescription.vue +24 -5
- package/components/form/ResourceTabs/index.vue +1 -0
- package/components/form/Security.vue +6 -2
- package/components/form/WorkloadPorts.vue +2 -7
- package/components/form/__tests__/NameNsDescription.test.ts +75 -0
- package/components/form/__tests__/Security.test.ts +76 -0
- package/components/formatter/Autoscaler.vue +4 -4
- package/components/formatter/ClusterKubeVersion.vue +27 -0
- package/components/formatter/ClusterLink.vue +1 -7
- package/components/formatter/ClusterProvider.vue +6 -10
- package/components/formatter/FleetSummaryGraph.vue +0 -3
- package/components/formatter/InternalExternalIP.vue +10 -4
- package/components/formatter/MachineSummaryGraph.vue +1 -1
- package/components/formatter/PodsUsage.vue +2 -2
- package/components/formatter/ServiceTargets.vue +26 -7
- package/components/formatter/__tests__/Autoscaler.test.ts +19 -22
- package/components/formatter/__tests__/FleetSummaryGraph.test.ts +216 -0
- package/components/formatter/__tests__/InternalExternalIP.test.ts +132 -0
- package/components/formatter/__tests__/PodsUsage.test.ts +6 -10
- package/components/formatter/__tests__/ServiceTargets.test.ts +412 -0
- package/components/nav/Header.vue +4 -0
- package/components/nav/NamespaceFilter.vue +2 -2
- package/components/nav/TopLevelMenu.helper.ts +15 -3
- package/components/nav/TopLevelMenu.vue +22 -6
- package/components/nav/__tests__/Header.test.ts +15 -0
- package/components/nav/__tests__/TopLevelMenu.test.ts +263 -21
- package/components/templates/default.vue +9 -4
- package/components/templates/home.vue +23 -0
- package/components/templates/plain.vue +23 -0
- package/components/templates/standalone.vue +17 -0
- package/composables/useFormValidation.ts +93 -0
- package/composables/useHelmOpResources.test.ts +56 -0
- package/composables/useHelmOpResources.ts +32 -0
- package/composables/useStateColor.test.ts +325 -0
- package/composables/useStateColor.ts +128 -0
- package/composables/useVeeValidateField.test.ts +159 -0
- package/composables/useVeeValidateField.ts +67 -0
- package/config/home-links.js +1 -1
- package/config/labels-annotations.js +1 -0
- package/config/pagination-table-headers.js +18 -1
- package/config/product/explorer.js +17 -4
- package/config/product/manager.js +84 -21
- package/config/router/index.js +16 -0
- package/config/router/navigation-guards/__tests__/authentication.test.ts +130 -0
- package/config/router/navigation-guards/authentication.js +10 -4
- package/config/router/routes.js +26 -6
- package/config/settings.ts +0 -2
- package/config/table-headers.js +23 -5
- package/config/types.js +11 -1
- package/core/__tests__/plugin-products.test.ts +904 -20
- package/core/plugin-products-base.ts +110 -10
- package/core/plugin-products.ts +4 -0
- package/core/plugin-types.ts +194 -31
- package/core/plugin.ts +18 -7
- package/core/productDebugger.js +9 -4
- package/core/types-provisioning.ts +77 -31
- package/core/types.ts +72 -22
- package/detail/__tests__/pod.test.ts +41 -0
- package/detail/__tests__/provisioning.cattle.io.cluster.test.ts +114 -0
- package/detail/__tests__/workload.test.ts +3 -152
- package/detail/catalog.cattle.io.clusterrepo.vue +1 -1
- package/detail/harvesterhci.io.management.cluster.vue +6 -2
- package/detail/pod.vue +1 -1
- package/detail/provisioning.cattle.io.cluster.vue +34 -14
- package/detail/workload/index.vue +12 -55
- package/edit/__tests__/catalog.cattle.io.clusterrepo.test.ts +248 -0
- package/edit/__tests__/fleet.cattle.io.helmop.test.ts +105 -0
- package/edit/auditlog.cattle.io.auditpolicy/__tests__/__snapshots__/General.test.ts.snap +6 -0
- package/edit/auditlog.cattle.io.auditpolicy/__tests__/__snapshots__/index.test.ts.snap +1 -0
- package/edit/auth/__tests__/azuread.test.ts +247 -39
- package/edit/auth/__tests__/github.test.ts +234 -0
- package/edit/auth/__tests__/oidc.test.ts +26 -6
- package/edit/auth/__tests__/saml.test.ts +196 -0
- package/edit/auth/azuread.vue +197 -56
- package/edit/auth/github.vue +72 -13
- package/edit/auth/ldap/__tests__/index.test.ts +206 -0
- package/edit/auth/ldap/config.vue +8 -0
- package/edit/auth/ldap/index.vue +75 -1
- package/edit/auth/oidc.vue +119 -73
- package/edit/auth/saml.vue +76 -12
- package/edit/catalog.cattle.io.clusterrepo.vue +140 -32
- package/edit/fleet.cattle.io.helmop.vue +491 -136
- package/edit/management.cattle.io.user.vue +5 -2
- package/edit/networking.k8s.io.ingress/DefaultBackend.vue +13 -4
- package/edit/networking.k8s.io.ingress/RulePath.vue +8 -4
- package/edit/networking.k8s.io.ingress/index.vue +75 -20
- package/edit/provisioning.cattle.io.cluster/__tests__/MachinePool.test.ts +104 -0
- package/edit/provisioning.cattle.io.cluster/index.vue +11 -7
- package/edit/provisioning.cattle.io.cluster/rke2.vue +92 -14
- package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +22 -0
- package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +37 -4
- package/edit/provisioning.cattle.io.cluster/tabs/registries/__tests__/RegistryConfigs.test.ts +132 -7
- package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +2 -1
- package/edit/secret/__tests__/ssh.test.ts +5 -6
- package/edit/secret/basic.vue +31 -0
- package/edit/secret/index.vue +68 -17
- package/edit/secret/registry.vue +38 -0
- package/edit/secret/ssh.vue +29 -0
- package/edit/secret/tls.vue +30 -0
- package/edit/service.vue +4 -4
- package/edit/workload/Upgrading.vue +3 -3
- package/edit/workload/__tests__/Upgrading.test.ts +6 -9
- package/edit/workload/mixins/workload.js +2 -1
- package/list/fleet.cattle.io.bundle.vue +7 -104
- package/list/fleet.cattle.io.clusterregistrationtoken.vue +20 -0
- package/list/group.principal.vue +5 -4
- package/list/harvesterhci.io.management.cluster.vue +8 -9
- package/list/management.cattle.io.user.vue +12 -9
- package/list/provisioning.cattle.io.cluster.vue +268 -180
- package/list/utils/management.cattle.io.cluster.utils.ts +128 -0
- package/mixins/__tests__/auth-config.test.ts +90 -0
- package/mixins/__tests__/chart.test.ts +206 -0
- package/mixins/__tests__/resource-fetch-api-pagination.test.ts +48 -0
- package/mixins/auth-config.js +7 -0
- package/mixins/brand.js +2 -1
- package/mixins/chart.js +22 -9
- package/mixins/child-hook.js +12 -6
- package/mixins/create-edit-view/impl.js +5 -3
- package/mixins/resource-fetch-api-pagination.js +62 -6
- package/models/__tests__/catalog.cattle.io.clusterrepo.test.ts +57 -0
- package/models/__tests__/compliance.cattle.io.clusterscan.test.ts +144 -0
- package/models/__tests__/ext.cattle.io.kubeconfig.test.ts +67 -67
- package/models/__tests__/fleet-application.test.ts +175 -0
- package/models/__tests__/fleet.cattle.io.bundle.test.ts +169 -0
- package/models/__tests__/fleet.cattle.io.helmop.test.ts +84 -0
- package/models/__tests__/management.cattle.io.cluster.test.ts +1 -1
- package/models/__tests__/management.cattle.io.node.ts +28 -5
- package/models/__tests__/management.cattle.io.nodepool.ts +5 -4
- package/models/__tests__/namespace.test.ts +36 -0
- package/models/__tests__/provisioning.cattle.io.cluster.test.ts +81 -11
- package/models/__tests__/workload.test.ts +401 -26
- package/models/base-cluster.x-k8s.io.js +26 -0
- package/models/catalog.cattle.io.clusterrepo.js +28 -4
- package/models/cluster.js +1 -1
- package/models/cluster.x-k8s.io.machine.js +4 -22
- package/models/cluster.x-k8s.io.machinedeployment.js +2 -20
- package/models/cluster.x-k8s.io.machineset.js +2 -20
- package/models/compliance.cattle.io.clusterscan.js +165 -2
- package/models/ext.cattle.io.kubeconfig.ts +4 -7
- package/models/fleet-application.js +7 -1
- package/models/fleet.cattle.io.helmop.js +20 -1
- package/models/management.cattle.io.cluster.js +434 -41
- package/models/management.cattle.io.node.js +50 -7
- package/models/management.cattle.io.nodepool.js +1 -1
- package/models/namespace.js +1 -1
- package/models/networking.k8s.io.ingress.js +12 -4
- package/models/pod.js +33 -1
- package/models/provisioning.cattle.io.cluster.js +51 -334
- package/models/rke.cattle.io.etcdsnapshot.js +1 -2
- package/models/workload.js +108 -13
- package/models/workload.service.js +5 -0
- package/package.json +22 -39
- package/pages/__tests__/readme.test.ts +49 -0
- package/pages/about.vue +5 -6
- package/pages/auth/login.vue +0 -35
- package/pages/auth/setup.vue +13 -3
- package/pages/c/_cluster/apps/charts/AppChartCardFooter.vue +2 -2
- package/pages/c/_cluster/apps/charts/AppChartCardSubHeader.vue +10 -1
- package/pages/c/_cluster/apps/charts/__tests__/chart.test.ts +76 -0
- package/pages/c/_cluster/apps/charts/__tests__/index.test.ts +93 -0
- package/pages/c/_cluster/apps/charts/chart.vue +62 -9
- package/pages/c/_cluster/apps/charts/index.vue +48 -10
- package/pages/c/_cluster/apps/charts/install.vue +122 -113
- package/pages/c/_cluster/auth/roles/index.vue +5 -4
- package/pages/c/_cluster/explorer/__tests__/index.test.ts +23 -25
- package/pages/c/_cluster/explorer/index.vue +5 -49
- package/pages/c/_cluster/explorer/workload-dashboard/ByNamespaceSection.vue +31 -0
- package/pages/c/_cluster/explorer/workload-dashboard/ByStateSection.vue +138 -0
- package/pages/c/_cluster/explorer/workload-dashboard/ByTypeSection.vue +30 -0
- package/pages/c/_cluster/explorer/workload-dashboard/WorkloadCard.vue +155 -0
- package/pages/c/_cluster/explorer/workload-dashboard/WorkloadNamespaceCard.vue +142 -0
- package/pages/c/_cluster/explorer/workload-dashboard/WorkloadTypeCard.vue +159 -0
- package/pages/c/_cluster/explorer/workload-dashboard/__tests__/composable.test.ts +561 -0
- package/pages/c/_cluster/explorer/workload-dashboard/composable.ts +440 -0
- package/pages/c/_cluster/explorer/workload-dashboard/index.vue +187 -0
- package/pages/c/_cluster/explorer/workload-dashboard/types.ts +80 -0
- package/pages/c/_cluster/fleet/application/create.vue +187 -136
- package/pages/c/_cluster/fleet/application/index.vue +5 -3
- package/pages/c/_cluster/fleet/application/suse-app-collection/ChartDetailBody.vue +338 -0
- package/pages/c/_cluster/fleet/application/suse-app-collection/ChartDetailHeader.vue +121 -0
- package/pages/c/_cluster/fleet/application/suse-app-collection/chart.vue +369 -0
- package/pages/c/_cluster/fleet/application/suse-app-collection/charts.vue +248 -0
- package/pages/c/_cluster/fleet/application/suse-app-collection/credentials.vue +310 -0
- package/pages/c/_cluster/fleet/index.vue +2 -2
- package/pages/c/_cluster/istio/__tests__/istio.index.test.ts +194 -0
- package/pages/c/_cluster/istio/index.vue +21 -6
- package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +1 -0
- package/pages/c/_cluster/uiplugins/__tests__/index.test.ts +815 -2
- package/pages/c/_cluster/uiplugins/index.vue +218 -197
- package/pages/diagnostic.vue +13 -17
- package/pages/fail-whale.vue +30 -7
- package/pages/home.vue +93 -306
- package/pages/readme.vue +88 -0
- package/plugins/clean-html.d.ts +9 -0
- package/plugins/dashboard-store/__tests__/resource-class.test.ts +181 -0
- package/plugins/dashboard-store/actions.js +40 -18
- package/plugins/dashboard-store/resource-class.js +67 -9
- package/plugins/steve/__tests__/actions.test.ts +212 -0
- package/plugins/steve/__tests__/subscribe.spec.ts +6 -3
- package/plugins/steve/actions.js +96 -0
- package/plugins/steve/steve-pagination-utils.ts +12 -4
- package/plugins/steve/subscribe.js +35 -5
- package/rancher-components/Accordion/Accordion.vue +53 -9
- package/rancher-components/Form/Checkbox/Checkbox.vue +14 -0
- package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +10 -4
- package/rancher-components/Form/LabeledInput/LabeledInput.vue +7 -52
- package/rancher-components/Form/Radio/RadioButton.vue +17 -1
- package/rancher-components/Form/Radio/RadioGroup.vue +10 -0
- package/rancher-components/Pill/RcTag/RcTag.vue +3 -2
- package/rancher-components/RcButton/RcButton.test.ts +140 -1
- package/rancher-components/RcButton/RcButton.vue +126 -17
- package/rancher-components/RcButton/types.ts +3 -0
- package/rancher-components/RcDropdown/RcDropdownTrigger.vue +10 -8
- package/rancher-components/RcItemCard/RcItemCard.test.ts +18 -0
- package/rancher-components/RcItemCard/RcItemCard.vue +2 -2
- package/rancher-components/RcSection/RcSection.vue +28 -3
- package/scripts/extension/helm/package/Dockerfile +1 -1
- package/scripts/test-plugins-build.sh +2 -1
- package/store/__tests__/catalog.test.ts +115 -1
- package/store/__tests__/notifications.test.ts +434 -0
- package/store/__tests__/type-map.test.ts +556 -1
- package/store/action-menu.js +8 -3
- package/store/auth.js +1 -1
- package/store/aws.js +27 -16
- package/store/catalog.js +84 -3
- package/store/digitalocean.js +20 -38
- package/store/index.js +2 -0
- package/store/linode.js +25 -40
- package/store/plugins.js +7 -4
- package/store/pnap.js +1 -0
- package/store/type-map.js +111 -29
- package/tsconfig.paths.json +8 -8
- package/types/components/buttonGroup.ts +5 -0
- package/types/kube/kube-api.ts +14 -1
- package/types/rancher/steve.api.ts +12 -12
- package/types/resources/settings.d.ts +2 -1
- package/types/shell/index.d.ts +206 -72
- package/types/store/dashboard-store.types.ts +108 -11
- package/types/store/pagination.types.ts +6 -3
- package/utils/__tests__/alertmanagerconfig.test.ts +117 -0
- package/utils/__tests__/async.test.ts +87 -0
- package/utils/__tests__/auth.test.ts +273 -0
- package/utils/__tests__/aws.test.ts +140 -0
- package/utils/__tests__/banners.test.ts +176 -0
- package/utils/__tests__/chart.test.ts +64 -1
- package/utils/__tests__/color.test.ts +226 -0
- package/utils/__tests__/computed.test.ts +193 -0
- package/utils/__tests__/cspAdaptor.test.ts +163 -0
- package/utils/__tests__/dom.test.ts +81 -0
- package/utils/__tests__/duration.test.ts +176 -0
- package/utils/__tests__/dynamic-importer.test.ts +102 -0
- package/utils/__tests__/fleet-appco.test.ts +312 -0
- package/utils/__tests__/fleet.test.ts +340 -0
- package/utils/__tests__/ingress.test.ts +553 -0
- package/utils/__tests__/kube.test.ts +68 -0
- package/utils/__tests__/monitoring.test.ts +130 -0
- package/utils/__tests__/namespace-filter.test.ts +109 -0
- package/utils/__tests__/object.test.ts +22 -0
- package/utils/__tests__/pagination-utils.test.ts +361 -0
- package/utils/__tests__/parse-externalid.test.ts +137 -0
- package/utils/__tests__/perf-setting.utils.test.ts +98 -0
- package/utils/__tests__/platform.test.ts +91 -0
- package/utils/__tests__/poller-sequential.test.ts +177 -0
- package/utils/__tests__/poller.test.ts +170 -0
- package/utils/__tests__/position.test.ts +237 -0
- package/utils/__tests__/promise.test.ts +346 -0
- package/utils/__tests__/provider.test.ts +51 -1
- package/utils/__tests__/queue.test.ts +232 -0
- package/utils/__tests__/release-notes.test.ts +221 -0
- package/utils/__tests__/router.test.js +254 -1
- package/utils/__tests__/select.test.ts +208 -0
- package/utils/__tests__/settings.test.ts +140 -0
- package/utils/__tests__/sort-utils.test.ts +301 -0
- package/utils/__tests__/string-utils.test.ts +798 -0
- package/utils/__tests__/string.test.ts +23 -1
- package/utils/__tests__/style.test.ts +154 -0
- package/utils/__tests__/svg-filter.test.ts +184 -0
- package/utils/__tests__/time.test.ts +265 -1
- package/utils/__tests__/title.test.ts +47 -0
- package/utils/__tests__/units.test.ts +417 -0
- package/utils/__tests__/versions.test.ts +128 -0
- package/utils/__tests__/width.test.ts +53 -0
- package/utils/__tests__/window.test.ts +158 -0
- package/utils/__tests__/xccdf.test.ts +511 -0
- package/utils/chart.js +36 -0
- package/utils/crypto/__tests__/browserHashUtils.test.ts +98 -0
- package/utils/crypto/__tests__/index.test.ts +144 -0
- package/utils/duration.ts +104 -0
- package/utils/dynamic-content/__tests__/notification-handler.test.ts +196 -0
- package/utils/dynamic-content/info.ts +2 -1
- package/utils/error.js +13 -0
- package/utils/fleet-appco.ts +323 -0
- package/utils/fleet.ts +13 -3
- package/utils/gatekeeper/__tests__/util.test.ts +174 -0
- package/utils/gc/__tests__/gc-interval.test.ts +119 -0
- package/utils/gc/__tests__/gc-root-store.test.ts +225 -0
- package/utils/gc/__tests__/gc-route-changed.test.ts +96 -0
- package/utils/gc/__tests__/gc.test.ts +487 -0
- package/utils/ingress.ts +9 -1
- package/utils/object.js +22 -2
- package/utils/pagination-utils.ts +2 -1
- package/utils/provider.ts +12 -0
- package/utils/string.js +25 -2
- package/utils/uiplugins.ts +5 -5
- package/utils/validators/__tests__/cluster-name.test.ts +110 -0
- package/utils/validators/__tests__/container-images.test.ts +104 -0
- package/utils/validators/__tests__/cron-schedule.test.ts +79 -0
- package/utils/validators/__tests__/flow-output.test.ts +91 -0
- package/utils/validators/__tests__/index.test.ts +481 -0
- package/utils/validators/__tests__/kubernetes-name.test.ts +163 -0
- package/utils/validators/__tests__/logging-outputs.test.ts +58 -0
- package/utils/validators/__tests__/misc-validators.test.ts +246 -0
- package/utils/validators/__tests__/monitoring-route.test.ts +119 -0
- package/utils/validators/__tests__/pod-affinity.test.ts +382 -0
- package/utils/validators/__tests__/prometheusrule.test.ts +211 -0
- package/utils/validators/__tests__/role-template.test.ts +149 -0
- package/utils/validators/__tests__/service.test.ts +283 -0
- package/utils/validators/__tests__/setting.test.js +32 -0
- package/utils/validators/formRules/__tests__/index.test.ts +50 -0
- package/utils/validators/formRules/index.ts +5 -5
- package/utils/validators/machine-pool.ts +1 -1
- package/utils/validators/setting.js +18 -3
- package/utils/xccdf.ts +415 -0
- package/vue.config.js +1 -1
- package/assets/fonts/lato/lato-v17-latin-700.woff +0 -0
- package/assets/fonts/lato/lato-v17-latin-700.woff2 +0 -0
- package/assets/fonts/lato/lato-v17-latin-regular.woff +0 -0
- package/assets/fonts/lato/lato-v17-latin-regular.woff2 +0 -0
- package/pages/support/index.vue +0 -264
- package/utils/duration.js +0 -43
package/store/aws.js
CHANGED
|
@@ -12,9 +12,10 @@ export const state = () => {
|
|
|
12
12
|
};
|
|
13
13
|
|
|
14
14
|
class Handler {
|
|
15
|
-
constructor(cloudCredentialId, options) {
|
|
15
|
+
constructor(cloudCredentialId, options, proxyApi) {
|
|
16
16
|
this.cloudCredentialId = (cloudCredentialId || '');
|
|
17
17
|
this.fetchHandler = new FetchHttpHandler(options);
|
|
18
|
+
this.proxyApi = proxyApi;
|
|
18
19
|
}
|
|
19
20
|
|
|
20
21
|
async handle(httpRequest, options = {}) {
|
|
@@ -24,24 +25,34 @@ class Handler {
|
|
|
24
25
|
|
|
25
26
|
httpRequest.headers['x-api-headers-restrict'] = 'Content-Length';
|
|
26
27
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
// Build proxy options: use awsv4 credential signing when a cloud credential
|
|
29
|
+
// is available, otherwise forward the SDK-generated Authorization header
|
|
30
|
+
// directly via x-api-auth-header.
|
|
31
|
+
const upstreamUrl = new URL(`https://${ httpRequest.hostname }${ httpRequest.path }`);
|
|
32
|
+
const proxyOptions = this.cloudCredentialId ? {
|
|
33
|
+
url: upstreamUrl,
|
|
34
|
+
authentication: {
|
|
35
|
+
id: this.cloudCredentialId,
|
|
36
|
+
authSigner: 'awsv4',
|
|
37
|
+
},
|
|
38
|
+
} : {
|
|
39
|
+
url: upstreamUrl,
|
|
40
|
+
headers: httpRequest?.headers['authorization'] ? { 'x-api-auth-header': httpRequest.headers['authorization'] } : {},
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
const { url: proxyPath, headers: proxyHeaders } = this.proxyApi.prepareRequest(proxyOptions);
|
|
32
44
|
|
|
45
|
+
// Merge proxy auth headers; remove the upstream Authorization and the
|
|
46
|
+
// Accept header added by prepareRequest (AWS SDK manages its own Accept).
|
|
47
|
+
Object.assign(httpRequest.headers, proxyHeaders);
|
|
33
48
|
delete httpRequest.headers['authorization'];
|
|
49
|
+
delete httpRequest.headers['Accept'];
|
|
34
50
|
|
|
35
51
|
const originalContentType = httpRequest.headers['content-type'] ?? '';
|
|
36
52
|
|
|
37
53
|
httpRequest.headers['content-type'] = originalContentType ? `rancher:${ originalContentType }` : 'rancher:';
|
|
38
54
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
if (!httpRequest.path.startsWith(endpoint)) {
|
|
42
|
-
httpRequest.path = endpoint + httpRequest.hostname + httpRequest.path;
|
|
43
|
-
}
|
|
44
|
-
|
|
55
|
+
httpRequest.path = proxyPath;
|
|
45
56
|
httpRequest.protocol = window.location.protocol;
|
|
46
57
|
httpRequest.hostname = window.location.hostname;
|
|
47
58
|
httpRequest.port = window.location.port;
|
|
@@ -114,7 +125,7 @@ export const actions = {
|
|
|
114
125
|
const client = new lib.EC2({
|
|
115
126
|
region,
|
|
116
127
|
credentialDefaultProvider: credentialDefaultProvider(accessKey, secretKey),
|
|
117
|
-
requestHandler: new Handler(cloudCredentialId),
|
|
128
|
+
requestHandler: new Handler(cloudCredentialId, undefined, this.$shell.proxy),
|
|
118
129
|
useDualstackEndpoint: true,
|
|
119
130
|
});
|
|
120
131
|
|
|
@@ -129,7 +140,7 @@ export const actions = {
|
|
|
129
140
|
const client = new lib.EKS({
|
|
130
141
|
region,
|
|
131
142
|
credentialDefaultProvider: credentialDefaultProvider(accessKey, secretKey),
|
|
132
|
-
requestHandler: new Handler(cloudCredentialId),
|
|
143
|
+
requestHandler: new Handler(cloudCredentialId, undefined, this.$shell.proxy),
|
|
133
144
|
useDualstackEndpoint: true,
|
|
134
145
|
});
|
|
135
146
|
|
|
@@ -144,7 +155,7 @@ export const actions = {
|
|
|
144
155
|
const client = new lib.KMS({
|
|
145
156
|
region,
|
|
146
157
|
credentialDefaultProvider: credentialDefaultProvider(accessKey, secretKey),
|
|
147
|
-
requestHandler: new Handler(cloudCredentialId),
|
|
158
|
+
requestHandler: new Handler(cloudCredentialId, undefined, this.$shell.proxy),
|
|
148
159
|
useDualstackEndpoint: true,
|
|
149
160
|
});
|
|
150
161
|
|
|
@@ -159,7 +170,7 @@ export const actions = {
|
|
|
159
170
|
const client = new lib.IAM({
|
|
160
171
|
region,
|
|
161
172
|
credentialDefaultProvider: credentialDefaultProvider(accessKey, secretKey),
|
|
162
|
-
requestHandler: new Handler(cloudCredentialId),
|
|
173
|
+
requestHandler: new Handler(cloudCredentialId, undefined, this.$shell.proxy),
|
|
163
174
|
useDualstackEndpoint: true,
|
|
164
175
|
});
|
|
165
176
|
|
package/store/catalog.js
CHANGED
|
@@ -302,6 +302,16 @@ export const mutations = {
|
|
|
302
302
|
state.namespacedRepos = namespaced;
|
|
303
303
|
},
|
|
304
304
|
|
|
305
|
+
addClusterRepo(state, repo) {
|
|
306
|
+
if (!state.clusterRepos) {
|
|
307
|
+
state.clusterRepos = [];
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
if (!state.clusterRepos.find((r) => r.metadata?.name === repo.metadata?.name)) {
|
|
311
|
+
state.clusterRepos.push(repo);
|
|
312
|
+
}
|
|
313
|
+
},
|
|
314
|
+
|
|
305
315
|
setCharts(state, { charts, errors = [], loaded = [] }) {
|
|
306
316
|
state.charts = charts;
|
|
307
317
|
state.errors = errors;
|
|
@@ -445,6 +455,53 @@ export const actions = {
|
|
|
445
455
|
}
|
|
446
456
|
},
|
|
447
457
|
|
|
458
|
+
async loadRepo(ctx, { repoName }) {
|
|
459
|
+
const {
|
|
460
|
+
state, getters, rootGetters, commit, dispatch
|
|
461
|
+
} = ctx;
|
|
462
|
+
|
|
463
|
+
const inStore = rootGetters['currentCluster'] ? rootGetters['currentProduct'].inStore : 'management';
|
|
464
|
+
|
|
465
|
+
let repo = rootGetters[`${ inStore }/byId`](CATALOG.CLUSTER_REPO, repoName);
|
|
466
|
+
|
|
467
|
+
if (!repo) {
|
|
468
|
+
try {
|
|
469
|
+
repo = await dispatch(`${ inStore }/find`, { type: CATALOG.CLUSTER_REPO, id: repoName }, { root: true });
|
|
470
|
+
} catch (e) {
|
|
471
|
+
return;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
if (!repo) {
|
|
476
|
+
return;
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
commit('addClusterRepo', repo);
|
|
480
|
+
|
|
481
|
+
if (getters.isLoaded(repo)) {
|
|
482
|
+
return;
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
try {
|
|
486
|
+
const index = await repo.followLink('index');
|
|
487
|
+
const charts = { ...state.charts };
|
|
488
|
+
|
|
489
|
+
for (const k in index?.entries) {
|
|
490
|
+
for (const entry of index.entries[k]) {
|
|
491
|
+
addChart(ctx, charts, entry, repo);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
commit('setCharts', {
|
|
496
|
+
charts,
|
|
497
|
+
errors: state.errors,
|
|
498
|
+
loaded: [repo],
|
|
499
|
+
});
|
|
500
|
+
} catch (e) {
|
|
501
|
+
console.error(`Failed to load repo ${ repoName }:`, e); // eslint-disable-line no-console
|
|
502
|
+
}
|
|
503
|
+
},
|
|
504
|
+
|
|
448
505
|
/**
|
|
449
506
|
* Globally refreshes all loaded repositories by triggering their refresh actions concurrently,
|
|
450
507
|
* bypassing individual catalog loads, and then performs a single, global catalog/load.
|
|
@@ -559,7 +616,10 @@ function addChart(ctx, map, chart, repo) {
|
|
|
559
616
|
|
|
560
617
|
const primeOnly = chart.annotations?.[CATALOG_ANNOTATIONS.PRIME_ONLY] === 'true';
|
|
561
618
|
const experimental = !!chart.annotations?.[CATALOG_ANNOTATIONS.EXPERIMENTAL];
|
|
562
|
-
|
|
619
|
+
|
|
620
|
+
const isRancherRepoFlag = isRancherRepo(repo, chart);
|
|
621
|
+
const permittedSystems = getPermittedOSs(chart.annotations, isRancherRepoFlag);
|
|
622
|
+
const windowsIncompatible = permittedSystems.length > 0 && !permittedSystems.includes('windows');
|
|
563
623
|
const deploysOnWindows = (chart.annotations?.[CATALOG_ANNOTATIONS.DEPLOYED_OS] || '').includes('windows');
|
|
564
624
|
const tags = [];
|
|
565
625
|
|
|
@@ -608,6 +668,7 @@ function addChart(ctx, map, chart, repo) {
|
|
|
608
668
|
provides: [],
|
|
609
669
|
windowsIncompatible,
|
|
610
670
|
deploysOnWindows,
|
|
671
|
+
isRancherRepo: isRancherRepoFlag,
|
|
611
672
|
tags
|
|
612
673
|
});
|
|
613
674
|
|
|
@@ -692,13 +753,13 @@ export function compatibleVersionsFor(chart, os, includePrerelease = true) {
|
|
|
692
753
|
}
|
|
693
754
|
|
|
694
755
|
return versions.filter((ver) => {
|
|
695
|
-
const osPermitted = (ver?.annotations?.
|
|
756
|
+
const osPermitted = getPermittedOSs(ver?.annotations, chart?.isRancherRepo);
|
|
696
757
|
|
|
697
758
|
if ( !includePrerelease && isPrerelease(ver.version) ) {
|
|
698
759
|
return false;
|
|
699
760
|
}
|
|
700
761
|
|
|
701
|
-
if ( !os || difference(os, osPermitted).length === 0) {
|
|
762
|
+
if ( !os || osPermitted.length === 0 || difference(os, osPermitted).length === 0) {
|
|
702
763
|
return true;
|
|
703
764
|
}
|
|
704
765
|
|
|
@@ -787,3 +848,23 @@ export function filterAndArrangeCharts(charts, {
|
|
|
787
848
|
|
|
788
849
|
return sortBy(out, ['certifiedSort', 'repoName', 'chartNameDisplay']);
|
|
789
850
|
}
|
|
851
|
+
|
|
852
|
+
/**
|
|
853
|
+
* Detects if a repository is a Rancher repository.
|
|
854
|
+
*/
|
|
855
|
+
export function isRancherRepo(repo, chart) {
|
|
856
|
+
return !!(chart?.isRancherRepo || repo?.isRancherSource);
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
/**
|
|
860
|
+
* Returns an array of permitted operating systems for a given chart or version.
|
|
861
|
+
* If the chart explicitly defines permitted OSs via annotation, those are returned.
|
|
862
|
+
* Otherwise, if the chart is from a Rancher repository, it defaults to Linux.
|
|
863
|
+
* External charts with no annotations have no OS restrictions (returns empty array).
|
|
864
|
+
*/
|
|
865
|
+
export function getPermittedOSs(annotations, isRancher) {
|
|
866
|
+
const permittedOs = annotations?.[CATALOG_ANNOTATIONS.PERMITTED_OS];
|
|
867
|
+
const fallbackOs = isRancher ? LINUX : '';
|
|
868
|
+
|
|
869
|
+
return (permittedOs || fallbackOs).split(',').filter(Boolean);
|
|
870
|
+
}
|
package/store/digitalocean.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { sortBy } from '@shell/utils/sort';
|
|
2
|
-
import {
|
|
2
|
+
import { createDepaginator } from '@shell/apis/shell/proxy';
|
|
3
3
|
|
|
4
4
|
const ENDPOINT = 'api.digitalocean.com/v2';
|
|
5
5
|
|
|
@@ -149,50 +149,32 @@ export const actions = {
|
|
|
149
149
|
return out;
|
|
150
150
|
},
|
|
151
151
|
|
|
152
|
-
async request(
|
|
153
|
-
token, credentialId, command, opt
|
|
152
|
+
async request(_, {
|
|
153
|
+
token, credentialId, command, opt
|
|
154
154
|
}) {
|
|
155
155
|
opt = opt || {};
|
|
156
156
|
|
|
157
|
-
|
|
157
|
+
const url = new URL(opt.url || `https://${ ENDPOINT }/${ command }`);
|
|
158
158
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
url = addParams(url, opt.params || {});
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
const headers = { Accept: 'application/json' };
|
|
168
|
-
|
|
169
|
-
if ( credentialId ) {
|
|
170
|
-
headers['x-api-cattleauth-header'] = `Bearer credID=${ credentialId } passwordField=accessToken`;
|
|
171
|
-
} else if ( token ) {
|
|
172
|
-
headers['x-api-auth-header'] = `Bearer ${ token }`;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
const res = await dispatch('management/request', {
|
|
176
|
-
url,
|
|
177
|
-
headers,
|
|
178
|
-
redirectUnauthorized: false,
|
|
179
|
-
}, { root: true });
|
|
180
|
-
|
|
181
|
-
if ( out ) {
|
|
182
|
-
out[command] = out[command].concat(res[command]);
|
|
183
|
-
} else {
|
|
184
|
-
out = res;
|
|
159
|
+
url.searchParams.set('per_page', `${ opt.per_page || 1000 }`);
|
|
160
|
+
if (opt.params) {
|
|
161
|
+
for (const [key, value] of Object.entries(opt.params)) {
|
|
162
|
+
url.searchParams.set(key, value);
|
|
163
|
+
}
|
|
185
164
|
}
|
|
186
165
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
166
|
+
const authentication = credentialId ? {
|
|
167
|
+
id: credentialId,
|
|
168
|
+
authSigner: 'bearer',
|
|
169
|
+
passwordField: 'accessToken',
|
|
170
|
+
} : { token };
|
|
190
171
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
});
|
|
194
|
-
}
|
|
172
|
+
const proxy = this.$shell?.proxy;
|
|
173
|
+
const requestOptions = { url, authentication };
|
|
195
174
|
|
|
196
|
-
return
|
|
175
|
+
return proxy.request({
|
|
176
|
+
...requestOptions,
|
|
177
|
+
postProcess: createDepaginator(proxy, requestOptions, { mergeKey: command }),
|
|
178
|
+
});
|
|
197
179
|
},
|
|
198
180
|
};
|
package/store/index.js
CHANGED
|
@@ -1041,6 +1041,8 @@ export const actions = {
|
|
|
1041
1041
|
// This is a workaround for a timing issue where the mgmt cluster schema may not be available
|
|
1042
1042
|
// Try and wait until the schema exists before proceeding
|
|
1043
1043
|
await dispatch('management/waitForSchema', { type: MANAGEMENT.CLUSTER });
|
|
1044
|
+
// Similarly to above, we somehow get here without everything in management land being ready. FF needed to determine pagination state
|
|
1045
|
+
await dispatch('management/waitForHaveAll', { type: MANAGEMENT.FEATURE });
|
|
1044
1046
|
|
|
1045
1047
|
// If SSP is on we won't have requested all clusters
|
|
1046
1048
|
if (!paginateClusters({ rootGetters, state })) {
|
package/store/linode.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { sortBy } from '@shell/utils/sort';
|
|
2
|
-
import {
|
|
2
|
+
import { createDepaginator } from '@shell/apis/shell/proxy';
|
|
3
3
|
|
|
4
4
|
const ENDPOINT = 'api.linode.com/v4';
|
|
5
5
|
|
|
@@ -93,50 +93,35 @@ export const actions = {
|
|
|
93
93
|
return out;
|
|
94
94
|
},
|
|
95
95
|
|
|
96
|
-
async request(
|
|
97
|
-
token, credentialId, command, opt
|
|
96
|
+
async request(_, {
|
|
97
|
+
token, credentialId, command, opt
|
|
98
98
|
}) {
|
|
99
99
|
opt = opt || {};
|
|
100
100
|
|
|
101
|
-
|
|
101
|
+
const url = new URL(opt.url || `https://${ ENDPOINT }/${ command }`);
|
|
102
102
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
url = addParams(url, opt.params || {});
|
|
103
|
+
url.searchParams.set('per_page', `${ opt.per_page || 1000 }`);
|
|
104
|
+
if (opt.params) {
|
|
105
|
+
for (const [key, value] of Object.entries(opt.params)) {
|
|
106
|
+
url.searchParams.set(key, value);
|
|
107
|
+
}
|
|
109
108
|
}
|
|
110
109
|
|
|
111
|
-
const
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
} else {
|
|
128
|
-
out = res;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// De-pagination
|
|
132
|
-
if ( res?.links?.pages?.next ) {
|
|
133
|
-
opt.url = res.links.pages.next;
|
|
134
|
-
|
|
135
|
-
return dispatch('request', {
|
|
136
|
-
token, credentialId, command, opt, out
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
return out;
|
|
110
|
+
const authentication = credentialId ? {
|
|
111
|
+
id: credentialId,
|
|
112
|
+
authSigner: 'bearer',
|
|
113
|
+
passwordField: 'token',
|
|
114
|
+
} : { token };
|
|
115
|
+
|
|
116
|
+
const proxy = this.$shell.proxy;
|
|
117
|
+
const requestOptions = { url, authentication };
|
|
118
|
+
|
|
119
|
+
return proxy.request({
|
|
120
|
+
...requestOptions,
|
|
121
|
+
postProcess: createDepaginator(proxy, requestOptions, {
|
|
122
|
+
nextUrlPath: 'links.pages.next',
|
|
123
|
+
mergeKey: command,
|
|
124
|
+
}),
|
|
125
|
+
});
|
|
141
126
|
}
|
|
142
127
|
};
|
package/store/plugins.js
CHANGED
|
@@ -172,14 +172,14 @@ export const getters = {
|
|
|
172
172
|
return async(name) => {
|
|
173
173
|
const schema = getters.schemaForDriver(name);
|
|
174
174
|
|
|
175
|
-
await schema.fetchResourceFields();
|
|
176
|
-
|
|
177
175
|
if ( !schema ) {
|
|
178
176
|
// eslint-disable-next-line no-console
|
|
179
177
|
console.error(`Machine Driver Config schema not found for ${ name }`);
|
|
180
178
|
|
|
181
179
|
return [];
|
|
182
180
|
}
|
|
181
|
+
await schema.fetchResourceFields();
|
|
182
|
+
|
|
183
183
|
// This is used in places where `createPopulated` has been called, which has called fetchResourceFields to populate resourceFields
|
|
184
184
|
const out = Object.keys(schema?.resourceFields || {});
|
|
185
185
|
|
|
@@ -191,13 +191,16 @@ export const getters = {
|
|
|
191
191
|
|
|
192
192
|
fieldsForDriver(state, getters) {
|
|
193
193
|
return async(name) => {
|
|
194
|
+
const out = {};
|
|
194
195
|
const schema = getters.schemaForDriver(name);
|
|
195
196
|
|
|
197
|
+
if ( !schema ) {
|
|
198
|
+
return out;
|
|
199
|
+
}
|
|
200
|
+
|
|
196
201
|
await schema.fetchResourceFields();
|
|
197
202
|
const names = await getters.fieldNamesForDriver(name);
|
|
198
203
|
|
|
199
|
-
const out = {};
|
|
200
|
-
|
|
201
204
|
for ( const n of names ) {
|
|
202
205
|
out[n] = schema.resourceFields[n];
|
|
203
206
|
}
|
package/store/pnap.js
CHANGED
package/store/type-map.js
CHANGED
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
// importList(type) Returns a promise that resolves to the list component for type
|
|
21
21
|
// importDetail(type[,subType]) Returns a promise that resolves to the detail component for type
|
|
22
22
|
// importEdit(type[,subType]) Returns a promise that resolves to the edit component for type
|
|
23
|
-
// optionsFor(schemaOrType)
|
|
23
|
+
// optionsFor(schemaOrType, pagination(bool), product(string)) Return the configured options for a type (from configureType) - additional product param can be passed if "optionsFor" needed isn't the current product
|
|
24
24
|
//
|
|
25
25
|
// 3) Changing specialization info about a type
|
|
26
26
|
// For all:
|
|
@@ -107,6 +107,7 @@
|
|
|
107
107
|
// notFilterNamespace: undefined -- Define namespaces that do not need to be filtered
|
|
108
108
|
// localOnly: False -- Hide this type from the nav/search bar on downstream clusters
|
|
109
109
|
// custom: any - Custom options for a given type
|
|
110
|
+
// product: string - If set, this type's options will only apply when that product is active
|
|
110
111
|
// }
|
|
111
112
|
// )
|
|
112
113
|
// ignoreGroup(group): Never show group or any types in it
|
|
@@ -269,20 +270,25 @@ export function DSL(store, product, module = 'type-map') {
|
|
|
269
270
|
store.commit(`${ module }/groupBy`, { type, field });
|
|
270
271
|
},
|
|
271
272
|
|
|
272
|
-
headers(type, headers, paginationHeaders = []) {
|
|
273
|
-
headers.
|
|
273
|
+
headers(type, headers = [], paginationHeaders = []) {
|
|
274
|
+
if (headers.length) {
|
|
275
|
+
headers.forEach((header) => {
|
|
274
276
|
// If on the client, then use the value getter if there is one
|
|
275
|
-
|
|
277
|
+
if (header.getValue) {
|
|
276
278
|
// we need to store the .value prop for the advanced filtering
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
279
|
+
header.valueProp = header.value;
|
|
280
|
+
header.value = header.getValue;
|
|
281
|
+
}
|
|
280
282
|
|
|
281
|
-
|
|
282
|
-
|
|
283
|
+
delete header.getValue;
|
|
284
|
+
});
|
|
283
285
|
|
|
284
|
-
|
|
285
|
-
|
|
286
|
+
store.commit(`${ module }/headers`, { type, headers });
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
if (paginationHeaders.length) {
|
|
290
|
+
store.commit(`${ module }/paginationHeaders`, { type, paginationHeaders });
|
|
291
|
+
}
|
|
286
292
|
},
|
|
287
293
|
|
|
288
294
|
hideBulkActions(type, field) {
|
|
@@ -290,7 +296,9 @@ export function DSL(store, product, module = 'type-map') {
|
|
|
290
296
|
},
|
|
291
297
|
|
|
292
298
|
configureType(match, options) {
|
|
293
|
-
store.commit(`${ module }/configureType`, {
|
|
299
|
+
store.commit(`${ module }/configureType`, {
|
|
300
|
+
...options, match, product
|
|
301
|
+
});
|
|
294
302
|
},
|
|
295
303
|
|
|
296
304
|
componentForType(match, replace) {
|
|
@@ -371,6 +379,18 @@ export function DSL(store, product, module = 'type-map') {
|
|
|
371
379
|
};
|
|
372
380
|
}
|
|
373
381
|
|
|
382
|
+
const LEGACY_COMPATIBILITY_BUCKET = 'legacyCompatibilityProdRegistration';
|
|
383
|
+
|
|
384
|
+
function validateProductName(product) {
|
|
385
|
+
if (!product || typeof product !== 'string' || product.trim() === '') {
|
|
386
|
+
throw new Error(`Product name must be a non-empty string, got: ${ JSON.stringify(product) }`);
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
if (product === LEGACY_COMPATIBILITY_BUCKET) {
|
|
390
|
+
throw new Error(`Product name cannot be "${ LEGACY_COMPATIBILITY_BUCKET }" as it is reserved for backward compatibility`);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
|
|
374
394
|
let called = false;
|
|
375
395
|
|
|
376
396
|
export async function applyProducts(store, $extension) {
|
|
@@ -412,7 +432,7 @@ export const state = function() {
|
|
|
412
432
|
typeMappings: [],
|
|
413
433
|
typeMoveMappings: [],
|
|
414
434
|
typeToComponentMappings: [],
|
|
415
|
-
typeOptions:
|
|
435
|
+
typeOptions: {},
|
|
416
436
|
groupBy: {},
|
|
417
437
|
headers: {},
|
|
418
438
|
paginationHeaders: {},
|
|
@@ -549,15 +569,37 @@ export const getters = {
|
|
|
549
569
|
subTypes: [],
|
|
550
570
|
};
|
|
551
571
|
|
|
552
|
-
return (schemaOrType, pagination) => {
|
|
572
|
+
return (schemaOrType, pagination, product) => {
|
|
553
573
|
// Note - This can run a LOT so needs to be performant
|
|
554
574
|
|
|
555
575
|
if (!schemaOrType) {
|
|
556
576
|
return {};
|
|
557
577
|
}
|
|
558
578
|
|
|
579
|
+
if (product) {
|
|
580
|
+
validateProductName(product);
|
|
581
|
+
}
|
|
582
|
+
|
|
559
583
|
const type = (typeof schemaOrType === 'object' ? schemaOrType.id : schemaOrType);
|
|
560
|
-
const
|
|
584
|
+
const productToUse = product || rootGetters['productId'];
|
|
585
|
+
|
|
586
|
+
// Handle both array (pre-2.15) and object (2.15+) state.typeOptions formats for backwards compatibility
|
|
587
|
+
let productTypeOptions = [];
|
|
588
|
+
|
|
589
|
+
if (Array.isArray(state.typeOptions)) {
|
|
590
|
+
// Legacy format: filter the flat array for entries matching the product or entries without a product field
|
|
591
|
+
productTypeOptions = state.typeOptions.filter((entry) => entry.product === productToUse || !entry.product
|
|
592
|
+
);
|
|
593
|
+
} else {
|
|
594
|
+
// New format: direct object lookup by product, with fallback to legacy compatibility bucket for unscoped entries
|
|
595
|
+
// (e.g., extensions compiled with pre-2.15 shell that don't send product parameter)
|
|
596
|
+
productTypeOptions = [
|
|
597
|
+
...(state.typeOptions[productToUse] || []),
|
|
598
|
+
...(state.typeOptions[LEGACY_COMPATIBILITY_BUCKET] || [])
|
|
599
|
+
];
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
const found = productTypeOptions.find((entry) => {
|
|
561
603
|
const re = stringToRegex(entry.match);
|
|
562
604
|
|
|
563
605
|
return re.test(type);
|
|
@@ -944,7 +986,7 @@ export const getters = {
|
|
|
944
986
|
});
|
|
945
987
|
|
|
946
988
|
const attrs = schema.attributes || {};
|
|
947
|
-
const typeOptions = getters['optionsFor'](schema);
|
|
989
|
+
const typeOptions = getters['optionsFor'](schema, undefined, product);
|
|
948
990
|
|
|
949
991
|
schemaModes[TYPE_MODES.BASIC] = schemaModes[TYPE_MODES.BASIC] && getters.groupForBasicType(product, schema.id);
|
|
950
992
|
|
|
@@ -1522,6 +1564,10 @@ export const mutations = {
|
|
|
1522
1564
|
delete state.virtualTypes[product];
|
|
1523
1565
|
}
|
|
1524
1566
|
|
|
1567
|
+
if (state.typeOptions[product]) {
|
|
1568
|
+
delete state.typeOptions[product];
|
|
1569
|
+
}
|
|
1570
|
+
|
|
1525
1571
|
if (state.basicTypes[product]) {
|
|
1526
1572
|
// Remove table header configuration
|
|
1527
1573
|
Object.keys(state.basicTypes[product]).forEach((type) => {
|
|
@@ -1784,20 +1830,54 @@ export const mutations = {
|
|
|
1784
1830
|
},
|
|
1785
1831
|
|
|
1786
1832
|
configureType(state, options) {
|
|
1787
|
-
const
|
|
1833
|
+
const { product, ...typeOptions } = options;
|
|
1834
|
+
const match = regexToString(ensureRegex(typeOptions.match));
|
|
1835
|
+
|
|
1836
|
+
// Handle both old (array) and new (object) state.typeOptions formats for backwards compatibility
|
|
1837
|
+
// Old format (pre-2.15): state.typeOptions = []
|
|
1838
|
+
// New format (2.15+): state.typeOptions = { productName: [...] }
|
|
1839
|
+
if (Array.isArray(state.typeOptions)) {
|
|
1840
|
+
// Legacy path: old format for extensions compiled with pre-2.15 shell
|
|
1841
|
+
// In 2.14, product parameter is not validated/enforced
|
|
1842
|
+
const idx = state.typeOptions.findIndex((obj) => obj.match === match);
|
|
1843
|
+
let obj = { ...options, match };
|
|
1844
|
+
|
|
1845
|
+
if ( idx >= 0 ) {
|
|
1846
|
+
// Merge the custom data object - multiple configures will update existing rather than overwrite
|
|
1847
|
+
obj.custom = Object.assign(state.typeOptions[idx].custom || {}, obj.custom || {});
|
|
1848
|
+
obj = Object.assign(state.typeOptions[idx], obj);
|
|
1849
|
+
state.typeOptions.splice(idx, 1, obj);
|
|
1850
|
+
} else {
|
|
1851
|
+
state.typeOptions.push(obj);
|
|
1852
|
+
}
|
|
1853
|
+
} else {
|
|
1854
|
+
// New path: object format with product scoping (2.15+)
|
|
1855
|
+
// Product is required in new format
|
|
1856
|
+
if (!product) {
|
|
1857
|
+
throw new Error(`configureType: product parameter is required in Rancher 2.15+, not provided for type "${ match }"`);
|
|
1858
|
+
}
|
|
1788
1859
|
|
|
1789
|
-
|
|
1790
|
-
let obj = { ...options, match };
|
|
1860
|
+
validateProductName(product);
|
|
1791
1861
|
|
|
1792
|
-
|
|
1793
|
-
|
|
1794
|
-
|
|
1795
|
-
|
|
1796
|
-
|
|
1797
|
-
|
|
1798
|
-
const
|
|
1862
|
+
// Initialize product's typeOptions array if needed
|
|
1863
|
+
if (!state.typeOptions[product]) {
|
|
1864
|
+
state.typeOptions[product] = [];
|
|
1865
|
+
}
|
|
1866
|
+
|
|
1867
|
+
const productTypeOptions = state.typeOptions[product];
|
|
1868
|
+
const idx = productTypeOptions.findIndex((obj) => obj.match === match);
|
|
1869
|
+
let obj = { ...typeOptions, match };
|
|
1799
1870
|
|
|
1800
|
-
|
|
1871
|
+
if ( idx >= 0 ) {
|
|
1872
|
+
// Merge the custom data object - multiple configures will update existing rather than overwrite
|
|
1873
|
+
obj.custom = Object.assign(productTypeOptions[idx].custom || {}, obj.custom || {});
|
|
1874
|
+
obj = Object.assign(productTypeOptions[idx], obj);
|
|
1875
|
+
productTypeOptions.splice(idx, 1, obj);
|
|
1876
|
+
} else {
|
|
1877
|
+
const obj = Object.assign({}, typeOptions, { match });
|
|
1878
|
+
|
|
1879
|
+
productTypeOptions.push(obj);
|
|
1880
|
+
}
|
|
1801
1881
|
}
|
|
1802
1882
|
},
|
|
1803
1883
|
|
|
@@ -1836,8 +1916,10 @@ export const actions = {
|
|
|
1836
1916
|
dispatch('prefs/set', { key: EXPANDED_GROUPS, value: groups }, { root: true });
|
|
1837
1917
|
},
|
|
1838
1918
|
|
|
1839
|
-
configureType({ commit }, options) {
|
|
1840
|
-
|
|
1919
|
+
configureType({ commit, rootGetters }, options) {
|
|
1920
|
+
const product = options.product || rootGetters['productId'];
|
|
1921
|
+
|
|
1922
|
+
commit('configureType', { ...options, product });
|
|
1841
1923
|
}
|
|
1842
1924
|
};
|
|
1843
1925
|
|