@rancher/shell 0.3.13 → 0.3.15
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/images/providers/nutanix.svg +1 -0
- package/assets/translations/en-us.yaml +89 -2
- package/chart/gatekeeper.vue +2 -2
- package/chart/monitoring/alerting/index.vue +3 -3
- package/chart/monitoring/index.vue +2 -2
- package/chart/monitoring/prometheus/index.vue +1 -1
- package/chart/rancher-backup/index.vue +2 -2
- package/cloud-credential/harvester.vue +2 -2
- package/components/AssignTo.vue +1 -1
- package/components/AwsComplianceBanner.vue +1 -1
- package/components/BackLink.vue +7 -0
- package/components/BrandImage.vue +3 -3
- package/components/ClusterProviderIcon.vue +1 -1
- package/components/CommunityLinks.vue +2 -2
- package/components/ConsumptionGauge.vue +17 -2
- package/components/CruResource.vue +2 -1
- package/components/DashboardMetrics.vue +8 -0
- package/components/DetailTop.vue +1 -1
- package/components/ExplorerMembers.vue +8 -8
- package/components/ExplorerProjectsNamespaces.vue +9 -9
- package/components/FixedBanner.vue +1 -1
- package/components/GlobalRoleBindings.vue +11 -11
- package/components/GrafanaDashboard.vue +7 -1
- package/components/GrowlManager.vue +1 -1
- package/components/HarvesterServiceAddOnConfig.vue +117 -2
- package/components/IconOrSvg.vue +10 -3
- package/components/LandingPagePreference.vue +2 -2
- package/components/MoveModal.vue +1 -1
- package/components/PodSecurityAdmission.vue +3 -3
- package/components/ProgressBarMulti.vue +2 -2
- package/components/PromptRemove.vue +52 -28
- package/components/PromptRestore.vue +3 -3
- package/components/Questions/index.vue +5 -5
- package/components/RelatedWorkloadsTable.vue +1 -1
- package/components/ResourceList/Masthead.vue +1 -1
- package/components/ResourceTable.vue +3 -3
- package/components/ResourceYaml.vue +1 -1
- package/components/RoleBindings.vue +2 -2
- package/components/SingleClusterInfo.vue +1 -1
- package/components/SortableTable/actions.js +3 -3
- package/components/SortableTable/advanced-filtering.js +7 -7
- package/components/SortableTable/filtering.js +1 -1
- package/components/SortableTable/index.vue +9 -9
- package/components/SortableTable/selection.js +5 -5
- package/components/SortableTable/sorting.js +5 -5
- package/components/Tabbed/index.vue +7 -7
- package/components/TableSparkLine.vue +1 -1
- package/components/Wizard.vue +11 -23
- package/components/__tests__/Collapse.spec.ts +1 -1
- package/components/__tests__/CruResource.test.ts +74 -0
- package/components/__tests__/SimpleBox.spec.ts +1 -1
- package/components/auth/RoleDetailEdit.vue +7 -3
- package/components/auth/SelectPrincipal.vue +3 -3
- package/components/fleet/FleetResources.vue +1 -1
- package/components/fleet/FleetStatus.vue +4 -4
- package/components/fleet/FleetSummary.vue +1 -1
- package/components/fleet/ForceDirectedTreeChart/chartIcons.js +1 -1
- package/components/fleet/ForceDirectedTreeChart/index.vue +1 -1
- package/components/form/ArrayList.vue +11 -3
- package/components/form/ArrayListSelect.vue +2 -2
- package/components/form/FileSelector.vue +6 -0
- package/components/form/GitPicker.vue +528 -0
- package/components/form/KeyValue.vue +82 -41
- package/components/form/LabeledSelect.vue +2 -2
- package/components/form/MatchExpressions.vue +2 -2
- package/components/form/Members/ClusterMembershipEditor.vue +1 -2
- package/components/form/Members/ClusterPermissionsEditor.vue +6 -5
- package/components/form/Members/MembershipEditor.vue +4 -4
- package/components/form/Members/ProjectMembershipEditor.vue +1 -2
- package/components/form/NameNsDescription.vue +13 -6
- package/components/form/Networking.vue +2 -2
- package/components/form/NodeScheduling.vue +1 -1
- package/components/form/PodAffinity.vue +1 -1
- package/components/form/ProjectMemberEditor.vue +4 -4
- package/components/form/ResourceQuota/Namespace.vue +2 -2
- package/components/form/ResourceQuota/NamespaceRow.vue +2 -2
- package/components/form/ResourceQuota/Project.vue +1 -1
- package/components/form/ResourceQuota/shared.js +2 -2
- package/components/form/ResourceSelector.vue +1 -1
- package/components/form/ResourceTabs/index.vue +1 -1
- package/components/form/RuleSelector.vue +1 -1
- package/components/form/SecretSelector.vue +4 -4
- package/components/form/Select.vue +2 -2
- package/components/form/SelectOrCreateAuthSecret.vue +3 -3
- package/components/form/ServiceNameSelect.vue +1 -1
- package/components/form/ServicePorts.vue +1 -1
- package/components/form/ShellInput.vue +1 -1
- package/components/form/SimpleSecretSelector.vue +4 -4
- package/components/form/Taints.vue +1 -1
- package/components/form/ValueFromResource.vue +3 -3
- package/components/form/WorkloadPorts.vue +8 -7
- package/components/form/__tests__/Error.test.ts +1 -1
- package/components/form/__tests__/KeyValue.test.ts +21 -0
- package/components/formatter/ClusterLink.vue +1 -1
- package/components/formatter/ClusterProvider.vue +13 -2
- package/components/formatter/Endpoints.vue +1 -1
- package/components/formatter/FleetSummaryGraph.vue +2 -2
- package/components/formatter/IngressTarget.vue +2 -2
- package/components/formatter/PodImages.vue +1 -1
- package/components/formatter/PrincipalGroupBindings.vue +1 -1
- package/components/formatter/ReceiverIcons.vue +3 -3
- package/components/formatter/ServiceType.vue +1 -1
- package/components/formatter/WorkloadDetailEndpoints.vue +1 -1
- package/components/formatter/WorkloadHealthScale.vue +1 -1
- package/components/formatter/__tests__/LiveDate.test.ts +1 -1
- package/components/graph/Bar.vue +1 -1
- package/components/graph/LinePlot.vue +3 -3
- package/components/nav/Group.vue +2 -2
- package/components/nav/Header.vue +5 -5
- package/components/nav/NamespaceFilter.vue +14 -14
- package/components/nav/TopLevelMenu.vue +76 -11
- package/components/nav/WindowManager/ContainerLogs.vue +2 -2
- package/components/nav/WindowManager/ContainerShell.vue +1 -1
- package/components/nav/WorkspaceSwitcher.vue +1 -1
- package/config/home-links.js +4 -4
- package/config/labels-annotations.js +8 -8
- package/config/pod-security-admission.ts +1 -1
- package/config/product/auth.js +4 -4
- package/config/product/explorer.js +14 -0
- package/config/router.js +5 -0
- package/config/store.js +2 -0
- package/config/table-headers.js +13 -13
- package/config/uiplugins.js +8 -1
- package/core/plugin-routes.ts +3 -2
- package/core/plugin.ts +3 -3
- package/core/plugins.js +7 -7
- package/creators/app/files/.gitignore +0 -3
- package/creators/pkg/files/index.ts +1 -1
- package/detail/cis.cattle.io.clusterscan.vue +3 -3
- package/detail/fleet.cattle.io.bundle.vue +1 -1
- package/detail/helm.cattle.io.projecthelmchart.vue +16 -29
- package/detail/management.cattle.io.user.vue +12 -12
- package/detail/namespace.vue +4 -4
- package/detail/networking.k8s.io.ingress.vue +3 -3
- package/detail/node.vue +2 -2
- package/detail/provisioning.cattle.io.cluster.vue +9 -10
- package/detail/service.vue +1 -1
- package/detail/workload/index.vue +3 -3
- package/dialog/AddProjectMemberDialog.vue +2 -2
- package/dialog/DrainNode.vue +1 -1
- package/dialog/GenericPrompt.vue +9 -5
- package/dialog/RotateEncryptionKeyDialog.vue +2 -2
- package/dialog/ScaleMachineDownDialog.vue +2 -2
- package/edit/auth/azuread.vue +3 -3
- package/edit/autoscaling.horizontalpodautoscaler/index.vue +5 -5
- package/edit/cis.cattle.io.clusterscan.vue +5 -5
- package/edit/cloudcredential.vue +4 -4
- package/edit/constraints.gatekeeper.sh.constraint/NamespaceList.vue +1 -1
- package/edit/constraints.gatekeeper.sh.constraint/index.vue +4 -4
- package/edit/fleet.cattle.io.gitrepo.vue +6 -6
- package/edit/helm.cattle.io.projecthelmchart.vue +3 -3
- package/edit/logging-flow/index.vue +4 -4
- package/edit/logging.banzaicloud.io.output/index.vue +3 -3
- package/edit/logging.banzaicloud.io.output/providers/elasticsearch.vue +1 -1
- package/edit/logging.banzaicloud.io.output/providers/forward.vue +1 -1
- package/edit/logging.banzaicloud.io.output/providers/logz.vue +1 -1
- package/edit/logging.banzaicloud.io.output/providers/opensearch.vue +1 -1
- package/edit/logging.banzaicloud.io.output/providers/redis.vue +1 -1
- package/edit/logging.banzaicloud.io.output/providers/splunkHec.vue +1 -1
- package/edit/management.cattle.io.clusterroletemplatebinding.vue +1 -1
- package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +1 -1
- package/edit/management.cattle.io.project.vue +3 -3
- package/edit/management.cattle.io.projectroletemplatebinding.vue +2 -2
- package/edit/management.cattle.io.setting.vue +1 -1
- package/edit/management.cattle.io.user.vue +2 -2
- package/edit/monitoring.coreos.com.alertmanagerconfig/auth.vue +2 -2
- package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +1 -1
- package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +1 -1
- package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +3 -3
- package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +5 -5
- package/edit/monitoring.coreos.com.prometheusrule/duration.js +1 -1
- package/edit/monitoring.coreos.com.receiver/auth.vue +2 -2
- package/edit/monitoring.coreos.com.receiver/tls.vue +3 -4
- package/edit/monitoring.coreos.com.receiver/types/__tests__/email.test.ts +53 -0
- package/edit/monitoring.coreos.com.receiver/types/email.vue +2 -0
- package/edit/monitoring.coreos.com.receiver/types/opsgenie.vue +3 -3
- package/edit/monitoring.coreos.com.receiver/types/webhook.add.vue +1 -1
- package/edit/monitoring.coreos.com.route.vue +2 -2
- package/edit/namespace.vue +21 -13
- package/edit/networking.k8s.io.ingress/Certificate.vue +2 -2
- package/edit/networking.k8s.io.ingress/DefaultBackend.vue +2 -2
- package/edit/networking.k8s.io.ingress/RulePath.vue +2 -2
- package/edit/networking.k8s.io.ingress/Rules.vue +2 -2
- package/edit/networking.k8s.io.ingress/index.vue +4 -4
- package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +3 -3
- package/edit/networking.k8s.io.networkpolicy/index.vue +1 -1
- package/edit/persistentvolume/index.vue +4 -4
- package/edit/persistentvolumeclaim.vue +3 -3
- package/edit/provisioning.cattle.io.cluster/RegistryMirrors.vue +1 -1
- package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +2 -2
- package/edit/provisioning.cattle.io.cluster/import.vue +2 -2
- package/edit/provisioning.cattle.io.cluster/index.vue +7 -7
- package/edit/provisioning.cattle.io.cluster/rke2.vue +28 -29
- package/edit/resources.cattle.io.backup.vue +2 -2
- package/edit/resources.cattle.io.restore.vue +3 -3
- package/edit/secret/generic.vue +1 -1
- package/edit/secret/index.vue +3 -3
- package/edit/service.vue +3 -21
- package/edit/serviceaccount.vue +2 -2
- package/edit/storage.k8s.io.storageclass/index.vue +4 -4
- package/edit/storage.k8s.io.storageclass/provisioners/driver.harvesterhci.io.vue +1 -1
- package/edit/token.vue +5 -5
- package/edit/workload/index.vue +1 -1
- package/edit/workload/mixins/workload.js +8 -8
- package/edit/workload/storage/ContainerMountPaths.vue +9 -9
- package/edit/workload/storage/Mount.vue +2 -2
- package/edit/workload/storage/csi/index.vue +1 -1
- package/edit/workload/storage/ephemeralVolume/index.vue +1 -1
- package/edit/workload/storage/index.vue +6 -6
- package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +2 -2
- package/initialize/client.js +8 -8
- package/initialize/index.js +1 -4
- package/layouts/default.vue +38 -11
- package/list/catalog.cattle.io.clusterrepo.vue +9 -1
- package/list/cis.cattle.io.clusterscan.vue +1 -1
- package/list/fleet.cattle.io.cluster.vue +2 -2
- package/list/group.principal.vue +1 -1
- package/list/helm.cattle.io.projecthelmchart.vue +2 -2
- package/list/management.cattle.io.cluster.vue +1 -1
- package/list/management.cattle.io.feature.vue +1 -1
- package/list/management.cattle.io.user.vue +2 -2
- package/list/node.vue +5 -5
- package/list/provisioning.cattle.io.cluster.vue +4 -5
- package/machine-config/amazonec2.vue +2 -2
- package/machine-config/digitalocean.vue +4 -4
- package/machine-config/linode.vue +4 -4
- package/machine-config/vmwarevsphere.vue +12 -12
- package/middleware/authenticated.js +7 -6
- package/mixins/brand.js +1 -1
- package/mixins/chart.js +6 -6
- package/mixins/fetch.client.js +2 -2
- package/mixins/form-validation.js +7 -7
- package/mixins/resource-fetch-namespaced.js +1 -1
- package/mixins/resource-fetch.js +2 -2
- package/models/apps.statefulset.js +2 -2
- package/models/batch.cronjob.js +1 -1
- package/models/catalog.cattle.io.app.js +4 -4
- package/models/cis.cattle.io.clusterscan.js +1 -1
- package/models/cis.cattle.io.clusterscanbenchmark.js +1 -1
- package/models/cis.cattle.io.clusterscanreport.js +1 -1
- package/models/cloudcredential.js +1 -1
- package/models/cluster/node.js +5 -5
- package/models/cluster.x-k8s.io.machinedeployment.js +2 -2
- package/models/fleet.cattle.io.gitrepo.js +3 -3
- package/models/group.principal.js +4 -4
- package/models/helm.cattle.io.projecthelmchart.js +2 -2
- package/models/logging.banzaicloud.io.clusterflow.js +2 -2
- package/models/logging.banzaicloud.io.flow.js +5 -5
- package/models/logging.banzaicloud.io.output.js +2 -2
- package/models/management.cattle.io.cluster.js +10 -14
- package/models/management.cattle.io.globalrole.js +4 -4
- package/models/management.cattle.io.node.js +2 -2
- package/models/management.cattle.io.nodepool.js +3 -3
- package/models/management.cattle.io.nodetemplate.js +4 -4
- package/models/management.cattle.io.project.js +2 -2
- package/models/management.cattle.io.roletemplate.js +1 -1
- package/models/management.cattle.io.setting.js +1 -1
- package/models/management.cattle.io.user.js +5 -5
- package/models/monitoring.coreos.com.receiver.js +9 -9
- package/models/namespace.js +1 -1
- package/models/networking.k8s.io.ingress.js +5 -5
- package/models/persistentvolume.js +3 -3
- package/models/pod.js +3 -3
- package/models/provisioning.cattle.io.cluster.js +39 -27
- package/models/rbac.authorization.k8s.io.clusterrole.js +2 -2
- package/models/rbac.authorization.k8s.io.role.js +3 -3
- package/models/secret.js +1 -1
- package/models/service.js +2 -2
- package/models/storage.k8s.io.storageclass.js +2 -2
- package/models/token.js +1 -1
- package/models/workload.js +6 -6
- package/models/workload.service.js +5 -21
- package/package.json +2 -1
- package/pages/about.vue +9 -9
- package/pages/account/index.vue +2 -2
- package/pages/auth/login.vue +15 -12
- package/pages/auth/verify.vue +6 -0
- package/pages/c/_cluster/apps/charts/index.vue +4 -4
- package/pages/c/_cluster/apps/charts/install.vue +28 -20
- package/pages/c/_cluster/auth/roles/index.vue +9 -9
- package/pages/c/_cluster/explorer/index.vue +41 -16
- package/pages/c/_cluster/explorer/tools/index.vue +8 -8
- package/pages/c/_cluster/fleet/GitRepoGraphConfig.js +1 -1
- package/pages/c/_cluster/fleet/index.vue +11 -11
- package/pages/c/_cluster/monitoring/index.vue +1 -1
- package/pages/c/_cluster/settings/links.vue +3 -3
- package/pages/c/_cluster/settings/performance.vue +1 -1
- package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +6 -6
- package/pages/c/_cluster/uiplugins/CatalogList/index.vue +3 -3
- package/pages/c/_cluster/uiplugins/InstallDialog.vue +3 -3
- package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +1 -1
- package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +3 -3
- package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +6 -6
- package/pages/c/_cluster/uiplugins/UninstallDialog.vue +4 -4
- package/pages/c/_cluster/uiplugins/index.vue +22 -19
- package/pages/diagnostic.vue +6 -6
- package/pages/home.vue +3 -3
- package/pages/prefs.vue +2 -2
- package/pages/rio/mesh.vue +3 -3
- package/pages/support/index.vue +10 -1
- package/pkg/auto-import.js +1 -1
- package/pkg/tsconfig.json +1 -0
- package/pkg/vue.config.js +1 -1
- package/plugins/axios.js +1 -1
- package/plugins/clean-html-directive.js +1 -1
- package/plugins/dashboard-store/__tests__/mutations.spec.js +4 -4
- package/plugins/dashboard-store/actions.js +4 -4
- package/plugins/dashboard-store/getters.js +1 -1
- package/plugins/dashboard-store/index.js +1 -1
- package/plugins/dashboard-store/mutations.js +2 -2
- package/plugins/dashboard-store/resource-class.js +8 -8
- package/plugins/i18n.js +1 -1
- package/plugins/plugin.js +5 -1
- package/plugins/steve/actions.js +3 -3
- package/plugins/steve/getters.js +3 -3
- package/plugins/steve/hybrid-class.js +1 -1
- package/plugins/steve/mutations.js +1 -1
- package/plugins/steve/performanceTesting.js +1 -1
- package/plugins/steve/resourceWatcher.js +1 -1
- package/plugins/steve/subscribe.js +6 -6
- package/plugins/steve/worker/web-worker.basic.js +1 -1
- package/promptRemove/management.cattle.io.project.vue +3 -3
- package/promptRemove/mixin/roleDeletionCheck.js +4 -4
- package/promptRemove/pod.vue +1 -1
- package/rancher-components/StringList/StringList.test.ts +80 -0
- package/rancher-components/StringList/StringList.vue +577 -0
- package/rancher-components/StringList/index.ts +1 -0
- package/rancher-components/components/Form/Checkbox/Checkbox.test.ts +2 -2
- package/rancher-components/components/Form/Checkbox/Checkbox.vue +1 -1
- package/rancher-components/components/Form/Radio/RadioButton.test.ts +1 -1
- package/rancher-components/components/Form/Radio/RadioButton.vue +2 -2
- package/rancher-components/components/Form/Radio/RadioGroup.vue +2 -2
- package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +1 -0
- package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.test.ts +1 -1
- package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.vue +7 -7
- package/rancher-components/components/StringList/StringList.test.ts +10 -9
- package/rancher-components/components/StringList/StringList.vue +5 -5
- package/scripts/extension/helm/charts/ui-plugin-server/Chart.yaml +1 -1
- package/store/action-menu.js +4 -4
- package/store/auth.js +40 -7
- package/store/aws.js +1 -1
- package/store/catalog.js +12 -11
- package/store/digitalocean.js +4 -4
- package/store/features.js +1 -0
- package/store/github.js +70 -213
- package/store/gitlab.js +159 -0
- package/store/growl.js +1 -1
- package/store/i18n.js +7 -7
- package/store/index.js +63 -22
- package/store/linode.js +1 -1
- package/store/plugins.js +5 -5
- package/store/pnap.js +1 -1
- package/store/prefs.js +6 -6
- package/store/resource-fetch.js +3 -3
- package/store/type-map.js +61 -42
- package/store/uiplugins.ts +2 -1
- package/store/wm.js +5 -4
- package/tsconfig.default.json +10 -0
- package/tsconfig.json +2 -9
- package/types/shell/index.d.ts +12 -4
- package/utils/__tests__/version.test.ts +28 -0
- package/utils/alertmanagerconfig.js +4 -4
- package/utils/array.ts +4 -4
- package/utils/async.ts +1 -1
- package/utils/auth.js +3 -3
- package/utils/axios.js +5 -5
- package/utils/cluster.js +4 -3
- package/utils/color.js +10 -0
- package/utils/create-yaml.js +4 -4
- package/utils/crypto/browserHashUtils.js +1 -1
- package/utils/crypto/browserMd5.js +1 -1
- package/utils/crypto/browserSha1.js +1 -1
- package/utils/crypto/browserSha256.js +1 -1
- package/utils/crypto/index.js +3 -3
- package/utils/favicon.js +2 -3
- package/utils/gatekeeper/util.js +3 -3
- package/utils/gc/gc.ts +2 -2
- package/utils/git.ts +92 -0
- package/utils/grafana.js +4 -4
- package/utils/monitoring.js +2 -2
- package/utils/nuxt.js +2 -2
- package/utils/object.js +5 -5
- package/utils/pod-security-admission.ts +1 -1
- package/utils/projectAndNamespaceFiltering.utils.ts +1 -1
- package/utils/select.js +2 -2
- package/utils/selector.js +2 -2
- package/utils/settings.ts +17 -2
- package/utils/socket.js +30 -6
- package/utils/sort.js +1 -1
- package/utils/string.js +1 -1
- package/utils/url.ts +1 -1
- package/utils/validators/formRules/index.ts +3 -3
- package/utils/validators/role-template.js +4 -4
- package/utils/version.js +14 -1
- package/vue.config.js +19 -13
- package/components/form/GithubPicker.vue +0 -390
|
@@ -23,6 +23,12 @@ export default {
|
|
|
23
23
|
type: String,
|
|
24
24
|
default: null
|
|
25
25
|
},
|
|
26
|
+
// change the grafana url prefix for local clusters in certain monitoring versions
|
|
27
|
+
// project monitoring (projectHelmCharts) supply a grafana url that never needs to be modified in this way
|
|
28
|
+
modifyPrefix: {
|
|
29
|
+
type: Boolean,
|
|
30
|
+
default: true
|
|
31
|
+
},
|
|
26
32
|
backgroundColor: {
|
|
27
33
|
type: String,
|
|
28
34
|
default: '#1b1c21'
|
|
@@ -138,7 +144,7 @@ export default {
|
|
|
138
144
|
const clusterId = this.$store.getters['currentCluster'].id;
|
|
139
145
|
const params = this.computeParams();
|
|
140
146
|
|
|
141
|
-
return computeDashboardUrl(this.monitoringVersion, embedUrl, clusterId, params);
|
|
147
|
+
return computeDashboardUrl(this.monitoringVersion, embedUrl, clusterId, params, this.modifyPrefix);
|
|
142
148
|
},
|
|
143
149
|
computeParams() {
|
|
144
150
|
const params = {};
|
|
@@ -1,13 +1,22 @@
|
|
|
1
1
|
<script>
|
|
2
|
+
import { mapGetters } from 'vuex';
|
|
3
|
+
import semver from 'semver';
|
|
4
|
+
|
|
2
5
|
import LabeledSelect from '@shell/components/form/LabeledSelect';
|
|
3
6
|
import { _CREATE } from '@shell/config/query-params';
|
|
4
7
|
import { get } from '@shell/utils/object';
|
|
5
8
|
import { HCI as HCI_LABELS_ANNOTATIONS } from '@shell/config/labels-annotations';
|
|
9
|
+
import { SERVICE } from '@shell/config/types';
|
|
10
|
+
import { allHash } from '@shell/utils/promise';
|
|
6
11
|
|
|
7
12
|
const HARVESTER_ADD_ON_CONFIG = [{
|
|
8
13
|
variableName: 'ipam',
|
|
9
14
|
key: HCI_LABELS_ANNOTATIONS.CLOUD_PROVIDER_IPAM,
|
|
10
15
|
default: 'dhcp'
|
|
16
|
+
}, {
|
|
17
|
+
variableName: 'sharedService',
|
|
18
|
+
key: HCI_LABELS_ANNOTATIONS.PRIMARY_SERVICE,
|
|
19
|
+
default: ''
|
|
11
20
|
}];
|
|
12
21
|
|
|
13
22
|
export default {
|
|
@@ -38,6 +47,19 @@ export default {
|
|
|
38
47
|
}
|
|
39
48
|
},
|
|
40
49
|
|
|
50
|
+
async fetch() {
|
|
51
|
+
const inStore = this.$store.getters['currentProduct'].inStore;
|
|
52
|
+
|
|
53
|
+
const hash = {
|
|
54
|
+
rke2Versions: this.$store.dispatch('management/request', { url: '/v1-rke2-release/releases' }),
|
|
55
|
+
services: this.$store.dispatch(`${ inStore }/findAll`, { type: SERVICE }),
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const res = await allHash(hash);
|
|
59
|
+
|
|
60
|
+
this.rke2Versions = res.rke2Versions;
|
|
61
|
+
},
|
|
62
|
+
|
|
41
63
|
data() {
|
|
42
64
|
const harvesterAddOnConfig = {};
|
|
43
65
|
|
|
@@ -45,10 +67,24 @@ export default {
|
|
|
45
67
|
harvesterAddOnConfig[c.variableName] = this.value.metadata.annotations[c.key] || c.default;
|
|
46
68
|
});
|
|
47
69
|
|
|
48
|
-
|
|
70
|
+
let showShareIP;
|
|
71
|
+
|
|
72
|
+
if (this.value.metadata.annotations[HCI_LABELS_ANNOTATIONS.PRIMARY_SERVICE]) {
|
|
73
|
+
showShareIP = true;
|
|
74
|
+
} else {
|
|
75
|
+
showShareIP = false;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return {
|
|
79
|
+
...harvesterAddOnConfig,
|
|
80
|
+
showShareIP,
|
|
81
|
+
rke2Versions: {},
|
|
82
|
+
};
|
|
49
83
|
},
|
|
50
84
|
|
|
51
85
|
computed: {
|
|
86
|
+
...mapGetters(['allowedNamespaces', 'namespaces', 'currentCluster']),
|
|
87
|
+
|
|
52
88
|
ipamOptions() {
|
|
53
89
|
return [{
|
|
54
90
|
label: 'DHCP',
|
|
@@ -62,15 +98,73 @@ export default {
|
|
|
62
98
|
portOptions() {
|
|
63
99
|
const ports = this.value?.spec?.ports || [];
|
|
64
100
|
|
|
65
|
-
return ports.filter(p => p.port && p.protocol === 'TCP').map(p => p.port) || [];
|
|
101
|
+
return ports.filter((p) => p.port && p.protocol === 'TCP').map((p) => p.port) || [];
|
|
102
|
+
},
|
|
103
|
+
|
|
104
|
+
serviceOptions() {
|
|
105
|
+
const inStore = this.$store.getters['currentProduct'].inStore;
|
|
106
|
+
const services = this.$store.getters[`${ inStore }/all`](SERVICE);
|
|
107
|
+
|
|
108
|
+
const namespaces = this.namespaces();
|
|
109
|
+
|
|
110
|
+
const out = services.filter((s) => {
|
|
111
|
+
const ingress = s?.status?.loadBalancer?.ingress || [];
|
|
112
|
+
|
|
113
|
+
return ingress.length > 0 &&
|
|
114
|
+
!s?.metadata?.annotations?.['cloudprovider.harvesterhci.io/primary-service'] &&
|
|
115
|
+
s.spec?.type === 'LoadBalancer' &&
|
|
116
|
+
namespaces[s.metadata.namespace];
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
return out.map((s) => s.id);
|
|
120
|
+
},
|
|
121
|
+
|
|
122
|
+
shareIPEnabled() {
|
|
123
|
+
const kubernetesVersion = this.currentCluster.kubernetesVersion || '';
|
|
124
|
+
const kubernetesVersionExtension = this.currentCluster.kubernetesVersionExtension;
|
|
125
|
+
|
|
126
|
+
if (kubernetesVersionExtension.startsWith('+rke2')) {
|
|
127
|
+
const charts = ((this.rke2Versions?.data || []).find((v) => v.id === kubernetesVersion) || {}).charts;
|
|
128
|
+
let ccmVersion = charts?.['harvester-cloud-provider']?.version || '';
|
|
129
|
+
|
|
130
|
+
if (ccmVersion.endsWith('00')) {
|
|
131
|
+
ccmVersion = ccmVersion.slice(0, -2);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return semver.satisfies(ccmVersion, '>=0.2.0');
|
|
135
|
+
} else {
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
66
138
|
},
|
|
67
139
|
},
|
|
68
140
|
|
|
69
141
|
methods: {
|
|
70
142
|
willSave() {
|
|
143
|
+
const errors = [];
|
|
144
|
+
|
|
145
|
+
if (this.showShareIP) {
|
|
146
|
+
if (!this.sharedService) {
|
|
147
|
+
errors.push(this.t('validation.required', { key: this.t('servicesPage.harvester.shareIP.label') }, true));
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
if (errors.length > 0) {
|
|
152
|
+
return Promise.reject(errors);
|
|
153
|
+
}
|
|
154
|
+
|
|
71
155
|
HARVESTER_ADD_ON_CONFIG.forEach((c) => {
|
|
72
156
|
this.value.metadata.annotations[c.key] = String(get(this, c.variableName));
|
|
73
157
|
});
|
|
158
|
+
|
|
159
|
+
if (this.showShareIP) {
|
|
160
|
+
delete this.value.metadata.annotations[HCI_LABELS_ANNOTATIONS.CLOUD_PROVIDER_IPAM];
|
|
161
|
+
} else {
|
|
162
|
+
delete this.value.metadata.annotations[HCI_LABELS_ANNOTATIONS.PRIMARY_SERVICE];
|
|
163
|
+
}
|
|
164
|
+
},
|
|
165
|
+
|
|
166
|
+
toggleShareIP() {
|
|
167
|
+
this.showShareIP = !this.showShareIP;
|
|
74
168
|
},
|
|
75
169
|
},
|
|
76
170
|
};
|
|
@@ -81,11 +175,32 @@ export default {
|
|
|
81
175
|
<div class="row mt-30">
|
|
82
176
|
<div class="col span-6">
|
|
83
177
|
<LabeledSelect
|
|
178
|
+
v-if="showShareIP"
|
|
179
|
+
v-model="sharedService"
|
|
180
|
+
:mode="mode"
|
|
181
|
+
:options="serviceOptions"
|
|
182
|
+
:label="t('servicesPage.harvester.shareIP.label')"
|
|
183
|
+
:disabled="mode === 'edit'"
|
|
184
|
+
/>
|
|
185
|
+
<LabeledSelect
|
|
186
|
+
v-else
|
|
84
187
|
v-model="ipam"
|
|
85
188
|
:mode="mode"
|
|
86
189
|
:options="ipamOptions"
|
|
87
190
|
:label="t('servicesPage.harvester.ipam.label')"
|
|
191
|
+
:disabled="mode === 'edit'"
|
|
88
192
|
/>
|
|
193
|
+
<div
|
|
194
|
+
v-if="mode === 'create'"
|
|
195
|
+
class="mt-10"
|
|
196
|
+
>
|
|
197
|
+
<a
|
|
198
|
+
role="button"
|
|
199
|
+
@click="toggleShareIP"
|
|
200
|
+
>
|
|
201
|
+
{{ showShareIP ? t('servicesPage.harvester.useIpam.label') : t('servicesPage.harvester.useShareIP.label') }}
|
|
202
|
+
</a>
|
|
203
|
+
</div>
|
|
89
204
|
</div>
|
|
90
205
|
</div>
|
|
91
206
|
</div>
|
package/components/IconOrSvg.vue
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
*/
|
|
19
19
|
import Vue from 'vue';
|
|
20
20
|
import { Solver } from '@shell/utils/svg-filter';
|
|
21
|
-
import { colorToRgb, mapStandardColors } from '@shell/utils/color';
|
|
21
|
+
import { colorToRgb, mapStandardColors, normalizeHex } from '@shell/utils/color';
|
|
22
22
|
|
|
23
23
|
const filterCache = {};
|
|
24
24
|
const cssCache = {};
|
|
@@ -75,11 +75,18 @@ export default {
|
|
|
75
75
|
if (stylesheet && stylesheet.cssRules) {
|
|
76
76
|
for (let x = 0; x < Object.keys(stylesheet.cssRules).length; x++) {
|
|
77
77
|
const cssRules = stylesheet.cssRules[x];
|
|
78
|
-
const selectorText = currTheme === 'light' ? 'body, .theme-light' : '.theme-dark';
|
|
79
78
|
|
|
80
|
-
if (cssRules.selectorText &&
|
|
79
|
+
if (cssRules.selectorText && ((currTheme === 'light' && cssRules.selectorText.includes('body') &&
|
|
80
|
+
cssRules.selectorText.includes('.theme-light') && cssRules.style.cssText.includes('--link:')) ||
|
|
81
|
+
(currTheme === 'dark' && cssRules.selectorText.includes('.theme-dark')))) {
|
|
82
|
+
// grab the colors to be used on the icon from the css rules
|
|
81
83
|
uiColor = mapStandardColors(cssRules.style.getPropertyValue(colors[this.color].color).trim());
|
|
82
84
|
hoverColor = mapStandardColors(cssRules.style.getPropertyValue(colors[this.color].hover).trim());
|
|
85
|
+
|
|
86
|
+
// normalize hex colors (#xxx to #xxxxxx)
|
|
87
|
+
uiColor = normalizeHex(uiColor);
|
|
88
|
+
hoverColor = normalizeHex(hoverColor);
|
|
89
|
+
|
|
83
90
|
found = true;
|
|
84
91
|
break;
|
|
85
92
|
}
|
|
@@ -35,7 +35,7 @@ export default {
|
|
|
35
35
|
routeFromDropdown: {
|
|
36
36
|
get() {
|
|
37
37
|
const route = this.customRoute || {};
|
|
38
|
-
const out = this.routeDropdownOptions.find(opt => opt.value.name === route.name && opt.value.params?.cluster === route.params?.cluster);
|
|
38
|
+
const out = this.routeDropdownOptions.find((opt) => opt.value.name === route.name && opt.value.params?.cluster === route.params?.cluster);
|
|
39
39
|
|
|
40
40
|
return out || this.routeDropdownOptions[0];
|
|
41
41
|
},
|
|
@@ -72,7 +72,7 @@ export default {
|
|
|
72
72
|
routeDropdownOptions() {
|
|
73
73
|
// Drop-down shows list of clusters that can ber set as login landing page
|
|
74
74
|
const out = [];
|
|
75
|
-
const kubeClusters = filterHiddenLocalCluster(filterOnlyKubernetesClusters(this.clusters), this.$store);
|
|
75
|
+
const kubeClusters = filterHiddenLocalCluster(filterOnlyKubernetesClusters(this.clusters, this.$store), this.$store);
|
|
76
76
|
|
|
77
77
|
kubeClusters.forEach((c) => {
|
|
78
78
|
if (c.isReady) {
|
package/components/MoveModal.vue
CHANGED
|
@@ -27,7 +27,7 @@ export default {
|
|
|
27
27
|
...mapGetters(['currentCluster']),
|
|
28
28
|
|
|
29
29
|
excludedProjects() {
|
|
30
|
-
return this.toMove.filter(namespace => !!namespace.project).map(namespace => namespace.project.shortId);
|
|
30
|
+
return this.toMove.filter((namespace) => !!namespace.project).map((namespace) => namespace.project.shortId);
|
|
31
31
|
},
|
|
32
32
|
|
|
33
33
|
projectOptions() {
|
|
@@ -83,7 +83,7 @@ export default Vue.extend({
|
|
|
83
83
|
// Generate PSA form controls
|
|
84
84
|
psaControls: toDictionary(PSAModes, getPsaControl) as Record<PSAMode, PSAControl>,
|
|
85
85
|
psaExemptionsControls: toDictionary(PSADimensions, getExemptionControl) as Record<PSADimension, PSAExemptionControl>,
|
|
86
|
-
options: PSALevels.map(level => ({
|
|
86
|
+
options: PSALevels.map((level) => ({
|
|
87
87
|
value: level,
|
|
88
88
|
label: this.t(`podSecurityAdmission.labels.${ level }`)
|
|
89
89
|
})),
|
|
@@ -145,7 +145,7 @@ export default Vue.extend({
|
|
|
145
145
|
*/
|
|
146
146
|
updateExemptions(): void {
|
|
147
147
|
const exemptions = PSADimensions.reduce((acc, dimension) => {
|
|
148
|
-
const value = this.psaExemptionsControls[dimension].value.split(',').map(value => value.trim());
|
|
148
|
+
const value = this.psaExemptionsControls[dimension].value.split(',').map((value) => value.trim());
|
|
149
149
|
const active = this.psaExemptionsControls[dimension].active;
|
|
150
150
|
|
|
151
151
|
return {
|
|
@@ -182,7 +182,7 @@ export default Vue.extend({
|
|
|
182
182
|
*/
|
|
183
183
|
getPsaExemptions(): Record<PSADimension, PSAExemptionControl> {
|
|
184
184
|
return PSADimensions.reduce((acc, dimension) => {
|
|
185
|
-
const values = (this.exemptions[dimension] || []).map(value => value.trim()).join(',');
|
|
185
|
+
const values = (this.exemptions[dimension] || []).map((value) => value.trim()).join(',');
|
|
186
186
|
|
|
187
187
|
return {
|
|
188
188
|
...acc,
|
|
@@ -68,7 +68,7 @@ export default {
|
|
|
68
68
|
if ( !this.max ) {
|
|
69
69
|
max = 100;
|
|
70
70
|
if ( out.length ) {
|
|
71
|
-
max = out.map(x => x.value).reduce((a, b) => a + b);
|
|
71
|
+
max = out.map((x) => x.value).reduce((a, b) => a + b);
|
|
72
72
|
}
|
|
73
73
|
}
|
|
74
74
|
|
|
@@ -88,7 +88,7 @@ export default {
|
|
|
88
88
|
obj.style = `width: ${ obj.percent }%`;
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
-
return out.filter(obj => obj.percent);
|
|
91
|
+
return out.filter((obj) => obj.percent);
|
|
92
92
|
},
|
|
93
93
|
}
|
|
94
94
|
};
|
|
@@ -9,11 +9,13 @@ import { uniq } from '@shell/utils/array';
|
|
|
9
9
|
import AsyncButton from '@shell/components/AsyncButton';
|
|
10
10
|
import { CATALOG as CATALOG_ANNOTATIONS } from '@shell/config/labels-annotations';
|
|
11
11
|
import { CATALOG } from '@shell/config/types';
|
|
12
|
+
import { LabeledInput } from '@components/Form/LabeledInput';
|
|
13
|
+
|
|
12
14
|
export default {
|
|
13
15
|
name: 'PromptRemove',
|
|
14
16
|
|
|
15
17
|
components: {
|
|
16
|
-
Card, Checkbox, AsyncButton
|
|
18
|
+
Card, Checkbox, AsyncButton, LabeledInput
|
|
17
19
|
},
|
|
18
20
|
props: {
|
|
19
21
|
/**
|
|
@@ -42,7 +44,7 @@ export default {
|
|
|
42
44
|
},
|
|
43
45
|
computed: {
|
|
44
46
|
names() {
|
|
45
|
-
return this.toRemove.map(obj => obj.nameDisplay).slice(0, 5);
|
|
47
|
+
return this.toRemove.map((obj) => obj.nameDisplay).slice(0, 5);
|
|
46
48
|
},
|
|
47
49
|
|
|
48
50
|
nameToMatchPosition() {
|
|
@@ -100,6 +102,11 @@ export default {
|
|
|
100
102
|
if (this.toRemove.length > 1) {
|
|
101
103
|
return null;
|
|
102
104
|
}
|
|
105
|
+
|
|
106
|
+
if (this.toRemove[0].doneLocationRemove) {
|
|
107
|
+
return this.toRemove[0].doneLocationRemove;
|
|
108
|
+
}
|
|
109
|
+
|
|
103
110
|
const currentRoute = this.toRemove[0].currentRoute();
|
|
104
111
|
const out = {};
|
|
105
112
|
const params = { ...currentRoute.params };
|
|
@@ -184,7 +191,7 @@ export default {
|
|
|
184
191
|
// if none found (delete is allowed), then check for any resources with a warning message
|
|
185
192
|
toRemove(neu) {
|
|
186
193
|
let message;
|
|
187
|
-
const preventDeletionMessages = neu.filter(item => item.preventDeletionMessage);
|
|
194
|
+
const preventDeletionMessages = neu.filter((item) => item.preventDeletionMessage);
|
|
188
195
|
|
|
189
196
|
this.preventDelete = false;
|
|
190
197
|
|
|
@@ -192,7 +199,7 @@ export default {
|
|
|
192
199
|
this.preventDelete = true;
|
|
193
200
|
message = preventDeletionMessages[0].preventDeletionMessage;
|
|
194
201
|
} else {
|
|
195
|
-
const warnDeletionMessages = neu.filter(item => item.warnDeletionMessage);
|
|
202
|
+
const warnDeletionMessages = neu.filter((item) => item.warnDeletionMessage);
|
|
196
203
|
|
|
197
204
|
if (!!warnDeletionMessages.length) {
|
|
198
205
|
message = warnDeletionMessages[0].warnDeletionMessage;
|
|
@@ -224,6 +231,7 @@ export default {
|
|
|
224
231
|
// doneLocation will recompute to undefined when delete request completes
|
|
225
232
|
this.cachedDoneLocation = { ...this.doneLocation };
|
|
226
233
|
}
|
|
234
|
+
|
|
227
235
|
if (this.hasCustomRemove && this.$refs?.customPrompt?.remove) {
|
|
228
236
|
let handled = this.$refs.customPrompt.remove(btnCB);
|
|
229
237
|
|
|
@@ -247,7 +255,7 @@ export default {
|
|
|
247
255
|
return;
|
|
248
256
|
}
|
|
249
257
|
}
|
|
250
|
-
const serialRemove = this.toRemove.some(resource => resource.removeSerially);
|
|
258
|
+
const serialRemove = this.toRemove.some((resource) => resource.removeSerially);
|
|
251
259
|
|
|
252
260
|
if (serialRemove) {
|
|
253
261
|
this.serialRemove(btnCB);
|
|
@@ -272,10 +280,16 @@ export default {
|
|
|
272
280
|
},
|
|
273
281
|
async parallelRemove(btnCB) {
|
|
274
282
|
try {
|
|
283
|
+
if (typeof this.toRemove[0].bulkRemove !== 'undefined') {
|
|
284
|
+
await this.toRemove[0].bulkRemove(this.toRemove, {});
|
|
285
|
+
} else {
|
|
286
|
+
await Promise.all(this.toRemove.map((resource) => resource.remove()));
|
|
287
|
+
}
|
|
288
|
+
|
|
275
289
|
const spoofedTypes = this.getSpoofedTypes(this.toRemove);
|
|
276
290
|
|
|
277
|
-
await Promise.all(this.toRemove.map(resource => resource.remove()));
|
|
278
291
|
await this.refreshSpoofedTypes(spoofedTypes);
|
|
292
|
+
|
|
279
293
|
this.done();
|
|
280
294
|
} catch (err) {
|
|
281
295
|
this.error = err.message || err;
|
|
@@ -289,7 +303,7 @@ export default {
|
|
|
289
303
|
this.close();
|
|
290
304
|
},
|
|
291
305
|
getSpoofedTypes(resources) {
|
|
292
|
-
const uniqueResourceTypes = uniq(this.toRemove.map(resource => resource.type));
|
|
306
|
+
const uniqueResourceTypes = uniq(this.toRemove.map((resource) => resource.type));
|
|
293
307
|
|
|
294
308
|
return uniqueResourceTypes.filter(this.$store.getters['type-map/isSpoofed']);
|
|
295
309
|
},
|
|
@@ -297,7 +311,7 @@ export default {
|
|
|
297
311
|
// If spoofed we need to reload the values as the server can't have watchers for them.
|
|
298
312
|
refreshSpoofedTypes(types) {
|
|
299
313
|
const inStore = this.$store.getters['currentProduct'].inStore;
|
|
300
|
-
const promises = types.map(type => this.$store.dispatch(`${ inStore }/findAll`, { type, opt: { force: true } }, { root: true }));
|
|
314
|
+
const promises = types.map((type) => this.$store.dispatch(`${ inStore }/findAll`, { type, opt: { force: true } }, { root: true }));
|
|
301
315
|
|
|
302
316
|
return Promise.all(promises);
|
|
303
317
|
},
|
|
@@ -372,32 +386,42 @@ export default {
|
|
|
372
386
|
</div>
|
|
373
387
|
</template>
|
|
374
388
|
</div>
|
|
375
|
-
<
|
|
389
|
+
<LabeledInput
|
|
376
390
|
v-if="needsConfirm"
|
|
377
391
|
id="confirm"
|
|
378
392
|
v-model="confirmName"
|
|
393
|
+
v-focus
|
|
379
394
|
:data-testid="componentTestid + '-input'"
|
|
380
395
|
type="text"
|
|
381
396
|
>
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
397
|
+
<div class="text-warning mb-10 mt-10">
|
|
398
|
+
{{ warning }}
|
|
399
|
+
</div>
|
|
400
|
+
<div class="text-error mb-10 mt-10">
|
|
401
|
+
{{ error }}
|
|
402
|
+
</div>
|
|
403
|
+
<div
|
|
404
|
+
v-if="!needsConfirm"
|
|
405
|
+
class="text-info mt-20"
|
|
406
|
+
>
|
|
407
|
+
{{ protip }}
|
|
408
|
+
</div>
|
|
409
|
+
<Checkbox
|
|
410
|
+
v-if="chartsToRemoveIsApp"
|
|
411
|
+
v-model="chartsDeleteCrd"
|
|
412
|
+
label-key="promptRemoveApp.removeCrd"
|
|
413
|
+
class="mt-10 type"
|
|
414
|
+
@input="chartAddCrdToRemove"
|
|
415
|
+
/>
|
|
416
|
+
</labeledinput>
|
|
417
|
+
<template v-else>
|
|
418
|
+
<div class="text-warning mb-10 mt-10">
|
|
419
|
+
{{ warning }}
|
|
420
|
+
</div>
|
|
421
|
+
<div class="text-error mb-10 mt-10">
|
|
422
|
+
{{ error }}
|
|
423
|
+
</div>
|
|
424
|
+
</template>
|
|
401
425
|
</div>
|
|
402
426
|
<template #actions>
|
|
403
427
|
<button
|
|
@@ -70,7 +70,7 @@ export default {
|
|
|
70
70
|
|
|
71
71
|
clusterSnapshots() {
|
|
72
72
|
if (this.sortedSnapshots) {
|
|
73
|
-
return this.sortedSnapshots.map(snapshot => ({ label: this.snapshotLabel(snapshot), value: snapshot.name }));
|
|
73
|
+
return this.sortedSnapshots.map((snapshot) => ({ label: this.snapshotLabel(snapshot), value: snapshot.name }));
|
|
74
74
|
} else {
|
|
75
75
|
return [];
|
|
76
76
|
}
|
|
@@ -115,13 +115,13 @@ export default {
|
|
|
115
115
|
|
|
116
116
|
if (!cluster.isRke2) {
|
|
117
117
|
promise = this.$store.dispatch('rancher/findAll', { type: NORMAN.ETCD_BACKUP }).then((snapshots) => {
|
|
118
|
-
return snapshots.filter(s => s.clusterId === cluster.metadata.name);
|
|
118
|
+
return snapshots.filter((s) => s.clusterId === cluster.metadata.name);
|
|
119
119
|
});
|
|
120
120
|
} else {
|
|
121
121
|
promise = this.$store.dispatch('management/findAll', { type: SNAPSHOT }).then((snapshots) => {
|
|
122
122
|
const toRestoreClusterName = cluster?.clusterName || cluster?.metadata?.name;
|
|
123
123
|
|
|
124
|
-
return snapshots.filter(s => s.clusterName === toRestoreClusterName);
|
|
124
|
+
return snapshots.filter((s) => s.clusterName === toRestoreClusterName);
|
|
125
125
|
});
|
|
126
126
|
}
|
|
127
127
|
|
|
@@ -67,9 +67,9 @@ function migrate(expr) {
|
|
|
67
67
|
let out;
|
|
68
68
|
|
|
69
69
|
if ( expr.includes('||') ) {
|
|
70
|
-
out = expr.split('||').map(x => migrate(x)).join(' || ');
|
|
70
|
+
out = expr.split('||').map((x) => migrate(x)).join(' || ');
|
|
71
71
|
} else if ( expr.includes('&&') ) {
|
|
72
|
-
out = expr.split('&&').map(x => migrate(x)).join(' && ');
|
|
72
|
+
out = expr.split('&&').map((x) => migrate(x)).join(' && ');
|
|
73
73
|
} else {
|
|
74
74
|
const parts = expr.match(/^(.*)(!?=)(.*)$/);
|
|
75
75
|
|
|
@@ -311,9 +311,9 @@ export default {
|
|
|
311
311
|
let result;
|
|
312
312
|
|
|
313
313
|
if ( get(or, 'length') > 1 ) {
|
|
314
|
-
result = or.some(showIf => this.calExpression(showIf, allQuestions));
|
|
314
|
+
result = or.some((showIf) => this.calExpression(showIf, allQuestions));
|
|
315
315
|
} else {
|
|
316
|
-
result = and.every(showIf => this.calExpression(showIf, allQuestions));
|
|
316
|
+
result = and.every((showIf) => this.calExpression(showIf, allQuestions));
|
|
317
317
|
}
|
|
318
318
|
|
|
319
319
|
return result;
|
|
@@ -368,7 +368,7 @@ export default {
|
|
|
368
368
|
return null;
|
|
369
369
|
},
|
|
370
370
|
getAnswer(variable, questions) {
|
|
371
|
-
const found = questions.find(q => q.variable === variable);
|
|
371
|
+
const found = questions.find((q) => q.variable === variable);
|
|
372
372
|
|
|
373
373
|
if ( found ) {
|
|
374
374
|
// Equivalent to finding question.answer in Ember
|
|
@@ -22,7 +22,7 @@ export default {
|
|
|
22
22
|
WORKLOAD_TYPES.JOB,
|
|
23
23
|
WORKLOAD_TYPES.STATEFUL_SET
|
|
24
24
|
];
|
|
25
|
-
const allWorkloadsNested = await Promise.all(types.map(type => this.$store.dispatch('cluster/findAll', { type })));
|
|
25
|
+
const allWorkloadsNested = await Promise.all(types.map((type) => this.$store.dispatch('cluster/findAll', { type })));
|
|
26
26
|
const allWorkloads = allWorkloadsNested.flat();
|
|
27
27
|
|
|
28
28
|
this.relatedWorkloadRows = allWorkloads.filter(this.filter);
|
|
@@ -139,7 +139,7 @@ export default {
|
|
|
139
139
|
}
|
|
140
140
|
|
|
141
141
|
// blocked-post means you can post through norman, but not through steve.
|
|
142
|
-
if ( this.schema && !this.schema?.collectionMethods.find(x => ['blocked-post', 'post'].includes(x.toLowerCase())) ) {
|
|
142
|
+
if ( this.schema && !this.schema?.collectionMethods.find((x) => ['blocked-post', 'post'].includes(x.toLowerCase())) ) {
|
|
143
143
|
return false;
|
|
144
144
|
}
|
|
145
145
|
|
|
@@ -225,7 +225,7 @@ export default {
|
|
|
225
225
|
|
|
226
226
|
// If only one namespace is selected, hide the namespace column
|
|
227
227
|
if ( !showNamespace ) {
|
|
228
|
-
const idx = headers.findIndex(header => header.name === NAMESPACE.name);
|
|
228
|
+
const idx = headers.findIndex((header) => header.name === NAMESPACE.name);
|
|
229
229
|
|
|
230
230
|
if ( idx >= 0 ) {
|
|
231
231
|
headers.splice(idx, 1);
|
|
@@ -236,7 +236,7 @@ export default {
|
|
|
236
236
|
const custom = this.listGroupMapped[this.group];
|
|
237
237
|
|
|
238
238
|
if (custom?.hideColumn) {
|
|
239
|
-
const idx = headers.findIndex(header => header.name === custom.hideColumn);
|
|
239
|
+
const idx = headers.findIndex((header) => header.name === custom.hideColumn);
|
|
240
240
|
|
|
241
241
|
if ( idx >= 0 ) {
|
|
242
242
|
headers.splice(idx, 1);
|
|
@@ -291,7 +291,7 @@ export default {
|
|
|
291
291
|
group: {
|
|
292
292
|
get() {
|
|
293
293
|
// Check group is valid
|
|
294
|
-
const exists = this.groupOptions.find(g => g.value === this._group);
|
|
294
|
+
const exists = this.groupOptions.find((g) => g.value === this._group);
|
|
295
295
|
|
|
296
296
|
if (!exists) {
|
|
297
297
|
return DEFAULT_GROUP;
|
|
@@ -166,7 +166,7 @@ export default {
|
|
|
166
166
|
try {
|
|
167
167
|
const parsed = jsyaml.load(this.currentYaml);
|
|
168
168
|
const annotations = Object.keys(parsed?.metadata?.annotations || {});
|
|
169
|
-
const regexes = ANNOTATIONS_TO_FOLD.map(x => ensureRegex(x));
|
|
169
|
+
const regexes = ANNOTATIONS_TO_FOLD.map((x) => ensureRegex(x));
|
|
170
170
|
|
|
171
171
|
let foldAnnotations = false;
|
|
172
172
|
|
|
@@ -179,7 +179,7 @@ export default {
|
|
|
179
179
|
},
|
|
180
180
|
|
|
181
181
|
existingBindings() {
|
|
182
|
-
const roles = this.roles.map(x => x.name);
|
|
182
|
+
const roles = this.roles.map((x) => x.name);
|
|
183
183
|
|
|
184
184
|
const out = this.allBindings.filter((binding) => {
|
|
185
185
|
if ( binding.roleRef.kind !== this.roleScope || !binding.roleRef?.name) {
|
|
@@ -197,7 +197,7 @@ export default {
|
|
|
197
197
|
},
|
|
198
198
|
|
|
199
199
|
unremovedRows() {
|
|
200
|
-
return this.rows.filter(x => x.remove !== true);
|
|
200
|
+
return this.rows.filter((x) => x.remove !== true);
|
|
201
201
|
},
|
|
202
202
|
},
|
|
203
203
|
|
|
@@ -37,7 +37,7 @@ export default {
|
|
|
37
37
|
},
|
|
38
38
|
|
|
39
39
|
accessibleResources() {
|
|
40
|
-
return RESOURCES.filter(resource => this.$store.getters['cluster/schemaFor'](resource));
|
|
40
|
+
return RESOURCES.filter((resource) => this.$store.getters['cluster/schemaFor'](resource));
|
|
41
41
|
},
|
|
42
42
|
|
|
43
43
|
totalCountGaugeInput() {
|
|
@@ -38,11 +38,11 @@ export default {
|
|
|
38
38
|
|
|
39
39
|
computed: {
|
|
40
40
|
availableActions() {
|
|
41
|
-
return this.bulkActionsForSelection.filter(act => !act.external);
|
|
41
|
+
return this.bulkActionsForSelection.filter((act) => !act.external);
|
|
42
42
|
},
|
|
43
43
|
|
|
44
44
|
keyedAvailableActions() {
|
|
45
|
-
return this.availableActions.map(aa => aa.action);
|
|
45
|
+
return this.availableActions.map((aa) => aa.action);
|
|
46
46
|
},
|
|
47
47
|
|
|
48
48
|
selectedRowsText() {
|
|
@@ -139,7 +139,7 @@ export default {
|
|
|
139
139
|
// Collate the actions in an array and hide in the normal row
|
|
140
140
|
const id = ba.attributes.getNamedItem('id').value;
|
|
141
141
|
|
|
142
|
-
this.hiddenActions.push(this.availableActions.find(aa => aa.action === id));
|
|
142
|
+
this.hiddenActions.push(this.availableActions.find((aa) => aa.action === id));
|
|
143
143
|
ba.style.display = 'none';
|
|
144
144
|
}
|
|
145
145
|
}
|