@rancher/shell 0.2.5 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/styles/global/_button.scss +5 -1
- package/assets/styles/global/_columns.scss +4 -0
- package/assets/styles/global/_layout.scss +1 -2
- package/assets/styles/global/_select.scss +1 -4
- package/assets/styles/themes/_dark.scss +8 -4
- package/assets/styles/themes/_light.scss +9 -3
- package/assets/styles/themes/_suse.scss +1 -1
- package/assets/styles/vendor/vue-select.scss +4 -3
- package/assets/translations/en-us.yaml +682 -74
- package/assets/translations/zh-hans.yaml +554 -170
- package/chart/istio.vue +1 -1
- package/chart/monitoring/grafana/index.vue +1 -1
- package/chart/monitoring/index.vue +1 -1
- package/chart/monitoring/prometheus/index.vue +4 -4
- package/chart/monitoring/steps/uninstall-v1.vue +2 -2
- package/cloud-credential/azure.vue +23 -0
- package/cloud-credential/harvester.vue +25 -62
- package/cloud-credential/pnap.vue +80 -0
- package/components/AdvancedSection.vue +9 -2
- package/components/Alert.vue +2 -2
- package/components/AlertTable.vue +1 -1
- package/components/AssignTo.vue +1 -1
- package/components/AsyncButton.vue +2 -2
- package/components/BrandImage.vue +1 -1
- package/components/ButtonDropdown.vue +0 -2
- package/components/ButtonGroup.vue +2 -1
- package/components/ClusterProviderIcon.vue +2 -2
- package/components/Collapse.vue +6 -2
- package/components/CollapsibleCard.vue +2 -3
- package/components/ConsumptionGauge.vue +4 -4
- package/components/ContainerResourceLimit.vue +1 -1
- package/components/CountBox.vue +1 -1
- package/components/CountGauge.vue +1 -1
- package/components/CruResource.vue +43 -5
- package/components/DashboardMetrics.vue +2 -2
- package/components/DetailTop.vue +58 -3
- package/components/DisableAuthProviderModal.vue +106 -0
- package/components/DraggableZone.vue +181 -0
- package/components/ExplorerMembers.vue +253 -30
- package/components/ExplorerProjectsNamespaces.vue +82 -38
- package/components/FixedBanner.vue +6 -6
- package/components/GlobalRoleBindings.vue +6 -6
- package/components/GradientBox.vue +2 -2
- package/components/GrowlManager.vue +3 -3
- package/components/IconMessage.vue +4 -4
- package/components/IconOrSvg.vue +149 -0
- package/components/Import.vue +5 -5
- package/components/InputOrDisplay.vue +1 -1
- package/components/KeyValueView.vue +1 -1
- package/components/LabelValue.vue +1 -1
- package/components/LogItem.vue +69 -0
- package/components/ModalWithCard.vue +1 -1
- package/components/MoveModal.vue +1 -1
- package/components/PercentageBar.vue +2 -2
- package/components/PodSecurityAdmission.vue +302 -0
- package/components/PromptChangePassword.vue +1 -1
- package/components/PromptModal.vue +2 -1
- package/components/PromptRemove.vue +2 -2
- package/components/PromptRestore.vue +13 -13
- package/components/Questions/Question.js +1 -1
- package/components/ResourceCancelModal.vue +3 -3
- package/components/ResourceDetail/Masthead.vue +55 -3
- package/components/ResourceDetail/index.vue +12 -5
- package/components/ResourceList/Masthead.vue +12 -2
- package/components/ResourceList/ResourceLoadingIndicator.vue +12 -2
- package/components/ResourceList/index.vue +53 -12
- package/components/ResourceList/resource-list.config.js +7 -0
- package/components/ResourceSummary.vue +4 -4
- package/components/ResourceTable.vue +31 -6
- package/components/RoleBindings.vue +19 -19
- package/components/SimpleBox.vue +6 -2
- package/components/SingleClusterInfo.vue +5 -5
- package/components/SortableTable/THead.vue +20 -6
- package/components/SortableTable/actions.js +4 -2
- package/components/SortableTable/index.vue +30 -19
- package/components/SortableTable/selection.js +2 -2
- package/components/Tabbed/index.vue +20 -15
- package/components/TableSparkLine.vue +1 -1
- package/components/TypeDescription.vue +1 -1
- package/components/Wizard.vue +1 -1
- package/components/YamlEditor.vue +6 -6
- package/components/__tests__/ApplicationCard.test.ts +27 -0
- package/components/__tests__/AsyncButton.test.ts +140 -0
- package/components/__tests__/BackLink.test.ts +33 -0
- package/components/__tests__/ButtonGroup.test.ts +124 -0
- package/components/__tests__/ClusterBadge.test.ts +32 -0
- package/components/__tests__/Collapse.spec.ts +44 -0
- package/components/__tests__/CollapsibleCard.test.ts +64 -0
- package/components/__tests__/ConsumptionGauge.test.ts +88 -0
- package/components/__tests__/CruResource.test.ts +6 -5
- package/components/__tests__/FixedBanner.test.ts +129 -0
- package/components/__tests__/GrowlManager.test.ts +147 -0
- package/components/__tests__/NamespaceFilter.test.ts +221 -0
- package/components/__tests__/PercentageBar.test.ts +32 -0
- package/components/__tests__/PodSecurityAdmission.test.ts +398 -0
- package/components/__tests__/SimpleBox.spec.ts +28 -0
- package/components/auth/AuthBanner.vue +20 -10
- package/components/auth/RoleDetailEdit.vue +41 -30
- package/components/auth/SelectPrincipal.vue +45 -5
- package/components/auth/login/ldap.vue +3 -0
- package/components/cards/ApplicationCard.vue +10 -5
- package/components/fleet/FleetBundleResources.vue +8 -8
- package/components/fleet/FleetClusters.vue +10 -10
- package/components/fleet/FleetRepos.vue +5 -5
- package/components/fleet/FleetResources.vue +6 -6
- package/components/fleet/FleetSummary.vue +5 -5
- package/components/fleet/ResourcesSummary.vue +1 -1
- package/components/form/ArrayList.vue +3 -35
- package/components/form/ArrayListGrouped.vue +14 -5
- package/components/form/ArrayListSelect.vue +8 -8
- package/components/form/BannerSettings.vue +6 -6
- package/components/form/ChangePassword.vue +3 -3
- package/components/form/Error.vue +10 -2
- package/components/form/FileSelector.vue +3 -3
- package/components/form/Footer.vue +1 -1
- package/components/form/GithubPicker.vue +4 -4
- package/components/form/KeyValue.vue +41 -9
- package/components/form/LabeledSelect.vue +5 -2
- package/components/form/Labels.vue +46 -16
- package/components/form/MatchExpressions.vue +1 -1
- package/components/form/Members/ClusterPermissionsEditor.vue +28 -28
- package/components/form/Members/MembershipEditor.vue +14 -14
- package/components/form/NameNsDescription.vue +1 -1
- package/components/form/NodeAffinity.vue +1 -1
- package/components/form/NodeScheduling.vue +1 -1
- package/components/form/Password.vue +3 -3
- package/components/form/PodAffinity.vue +1 -1
- package/components/form/Probe.vue +3 -3
- package/components/form/ProjectMemberEditor.vue +1 -1
- package/components/form/ResourceQuota/Project.vue +6 -6
- package/components/form/ResourceQuota/shared.js +12 -12
- package/components/form/ResourceTabs/index.vue +1 -6
- package/components/form/SecretSelector.vue +1 -1
- package/components/form/Security.vue +8 -7
- package/components/form/Select.vue +7 -2
- package/components/form/SelectOrCreateAuthSecret.vue +22 -29
- package/components/form/ServicePorts.vue +8 -0
- package/components/form/SimpleSecretSelector.vue +1 -1
- package/components/form/Taints.vue +1 -1
- package/components/form/UnitInput.vue +7 -7
- package/components/form/ValueFromResource.vue +1 -1
- package/components/form/WorkloadPorts.vue +8 -2
- package/components/form/__tests__/ArrayList.test.ts +74 -0
- package/components/form/__tests__/ArrayListGrouped.test.ts +6 -4
- package/components/formatter/AppSummaryGraph.vue +4 -4
- package/components/formatter/BadgeStateFormatter.vue +2 -2
- package/components/formatter/Checked.vue +2 -2
- package/components/formatter/ClusterLink.vue +8 -3
- package/components/formatter/Date.vue +1 -1
- package/components/formatter/DelayedValue.vue +1 -1
- package/components/formatter/Endpoints.vue +1 -1
- package/components/formatter/FleetSummaryGraph.vue +4 -4
- package/components/formatter/IconIsDefault.vue +3 -3
- package/components/formatter/IconText.vue +4 -4
- package/components/formatter/ImagePercentageBar.vue +4 -4
- package/components/formatter/IngressFullPath.vue +1 -1
- package/components/formatter/InternalExternalIP.vue +11 -8
- package/components/formatter/LinkDetail.vue +3 -3
- package/components/formatter/List.vue +1 -1
- package/components/formatter/ListLink.vue +1 -1
- package/components/formatter/ListLinkDetail.vue +1 -1
- package/components/formatter/LiveDate.vue +3 -3
- package/components/formatter/LiveDuration.vue +78 -0
- package/components/formatter/LivePodRestarts.vue +1 -1
- package/components/formatter/Number.vue +1 -1
- package/components/formatter/Percentage.vue +2 -2
- package/components/formatter/PercentageBar.vue +3 -3
- package/components/formatter/PodImages.vue +1 -1
- package/components/formatter/Principal.vue +1 -1
- package/components/formatter/PrincipalGroupBindings.vue +2 -2
- package/components/formatter/QualityText.vue +1 -1
- package/components/formatter/ReceiverIcons.vue +2 -2
- package/components/formatter/Scale.vue +1 -1
- package/components/formatter/ScanResult.vue +1 -1
- package/components/formatter/SecretData.vue +1 -1
- package/components/formatter/ServiceType.vue +1 -1
- package/components/formatter/Shortened.vue +1 -1
- package/components/formatter/VerticalScroll.vue +2 -2
- package/components/formatter/VirtualServiceGateways.vue +3 -3
- package/components/formatter/Weight.vue +2 -2
- package/components/formatter/WorkloadDetailEndpoints.vue +1 -1
- package/components/formatter/WorkloadHealthScale.vue +7 -5
- package/components/formatter/__tests__/Date.test.ts +60 -0
- package/components/formatter/__tests__/LinkDetail.test.ts +72 -0
- package/components/formatter/__tests__/LiveDate.test.ts +84 -0
- package/components/formatter/__tests__/Si.test.ts +35 -0
- package/components/graph/LinePlot.vue +1 -1
- package/components/graph/ProgressArc.vue +5 -5
- package/components/nav/GlobalLoading.vue +1 -1
- package/components/nav/Header.vue +6 -4
- package/components/nav/Jump.vue +3 -3
- package/components/nav/NamespaceFilter.vue +200 -68
- package/components/nav/TopLevelMenu.vue +24 -21
- package/components/nav/Type.vue +1 -1
- package/components/nav/WindowManager/ChartReadme.vue +1 -1
- package/components/nav/WindowManager/ContainerLogs.vue +84 -127
- package/components/nav/WindowManager/ContainerShell.vue +28 -7
- package/components/nav/WindowManager/KubectlShell.vue +6 -6
- package/components/nav/WindowManager/MachineSsh.vue +1 -1
- package/components/nav/WindowManager/Window.vue +2 -0
- package/components/nav/WindowManager/index.vue +206 -25
- package/config/elemental-types.js +9 -0
- package/config/features.js +2 -0
- package/config/home-links.js +4 -1
- package/config/labels-annotations.js +19 -19
- package/config/pod-security-admission.ts +82 -0
- package/config/product/apps.js +5 -5
- package/config/product/auth.js +22 -21
- package/config/product/cis.js +24 -24
- package/config/product/explorer.js +25 -24
- package/config/product/fleet.js +7 -7
- package/config/product/gatekeeper.js +7 -7
- package/config/product/istio.js +7 -7
- package/config/product/legacy.js +21 -21
- package/config/product/logging.js +90 -90
- package/config/product/manager.js +19 -15
- package/config/product/monitoring.js +36 -36
- package/config/product/multi-cluster-apps.js +24 -24
- package/config/product/settings.js +42 -42
- package/config/secret.js +0 -1
- package/config/settings.ts +39 -22
- package/config/table-headers.js +70 -52
- package/config/types.js +11 -8
- package/config/uiplugins.js +4 -4
- package/content/docs/zh-hans/getting-started.md +113 -137
- package/content/docs/zh-hans/whats-new.md +8 -46
- package/creators/app/app.package.json +4 -1
- package/creators/app/{.eslintignore → files/.eslintignore} +0 -0
- package/creators/app/{.eslintrc.js → files/.eslintrc.js} +0 -0
- package/creators/app/{.vscode → files/.vscode}/settings.json +0 -0
- package/creators/app/{babel.config.js → files/babel.config.js} +0 -0
- package/creators/app/{nuxt.config.js → files/nuxt.config.js} +0 -0
- package/creators/app/{tsconfig.json → files/tsconfig.json} +2 -1
- package/creators/app/init +16 -17
- package/creators/app/package.json +7 -1
- package/creators/pkg/{babel.config.js → files/babel.config.js} +0 -0
- package/creators/pkg/{index.ts → files/index.ts} +0 -0
- package/creators/pkg/{tsconfig.json → files/tsconfig.json} +13 -12
- package/creators/pkg/{vue.config.js → files/vue.config.js} +0 -0
- package/creators/pkg/init +1 -1
- package/creators/pkg/package.json +2 -2
- package/creators/update/init +56 -0
- package/creators/update/package.json +20 -0
- package/creators/update/upgrade +56 -0
- package/detail/catalog.cattle.io.app.vue +1 -1
- package/detail/cis.cattle.io.clusterscan.vue +6 -6
- package/detail/configmap.vue +1 -1
- package/detail/constraints.gatekeeper.sh.constraint.vue +1 -1
- package/detail/fleet.cattle.io.bundle.vue +5 -5
- package/detail/fleet.cattle.io.gitrepo.vue +5 -5
- package/detail/helm.cattle.io.projecthelmchart.vue +1 -1
- package/detail/management.cattle.io.user.vue +3 -3
- package/detail/namespace.vue +13 -13
- package/detail/node.vue +2 -2
- package/detail/pod.vue +2 -2
- package/detail/provisioning.cattle.io.cluster.vue +47 -10
- package/detail/secret.vue +2 -2
- package/detail/service.vue +2 -9
- package/detail/workload/index.vue +1 -2
- package/dialog/AddClusterMemberDialog.vue +23 -29
- package/dialog/AddCustomBadgeDialog.vue +4 -4
- package/dialog/AddProjectMemberDialog.vue +81 -30
- package/dialog/AddonConfigConfirmationDialog.vue +1 -1
- package/dialog/DiagnosticTimingsDialog.vue +9 -8
- package/dialog/DrainNode.vue +56 -60
- package/dialog/ForceMachineRemoveDialog.vue +6 -8
- package/dialog/GenericPrompt.vue +16 -21
- package/dialog/RollbackWorkloadDialog.vue +22 -53
- package/dialog/RotateCertificatesDialog.vue +9 -11
- package/dialog/RotateEncryptionKeyDialog.vue +6 -10
- package/dialog/SaveAsRKETemplateDialog.vue +6 -14
- package/dialog/ScaleMachineDownDialog.vue +2 -2
- package/dialog/ScalePoolDownDialog.vue +121 -0
- package/edit/__tests__/management.cattle.io.setting.test.ts +4 -4
- package/edit/auth/azuread.vue +18 -18
- package/edit/auth/github.vue +10 -2
- package/edit/auth/googleoauth.vue +10 -1
- package/edit/auth/ldap/index.vue +14 -4
- package/edit/auth/oidc.vue +13 -3
- package/edit/auth/saml.vue +14 -4
- package/edit/autoscaling.horizontalpodautoscaler/external-metric.vue +2 -2
- package/edit/autoscaling.horizontalpodautoscaler/index.vue +1 -1
- package/edit/autoscaling.horizontalpodautoscaler/metric-object-reference.vue +1 -1
- package/edit/autoscaling.horizontalpodautoscaler/object-metric.vue +2 -2
- package/edit/autoscaling.horizontalpodautoscaler/pod-metric.vue +2 -2
- package/edit/cis.cattle.io.clusterscan.vue +2 -2
- package/edit/cloudcredential.vue +3 -7
- package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -1
- package/edit/fleet.cattle.io.clustergroup.vue +3 -3
- package/edit/fleet.cattle.io.gitrepo.vue +9 -9
- package/edit/group.principal.vue +2 -2
- package/edit/helm.cattle.io.projecthelmchart.vue +3 -3
- package/edit/logging-flow/Match.vue +39 -8
- package/edit/logging-flow/index.vue +28 -5
- package/edit/logging.banzaicloud.io.output/providers/datadog.vue +1 -1
- package/edit/logging.banzaicloud.io.output/providers/elasticsearch.vue +1 -1
- package/edit/logging.banzaicloud.io.output/providers/gcs.vue +1 -1
- package/edit/logging.banzaicloud.io.output/providers/gelf.vue +1 -1
- package/edit/logging.banzaicloud.io.output/providers/kafka.vue +1 -1
- package/edit/logging.banzaicloud.io.output/providers/logz.vue +1 -1
- package/edit/logging.banzaicloud.io.output/providers/loki.vue +1 -1
- package/edit/logging.banzaicloud.io.output/providers/opensearch.vue +213 -0
- package/edit/logging.banzaicloud.io.output/providers/redis.vue +142 -0
- package/edit/logging.banzaicloud.io.output/providers/s3.vue +1 -1
- package/edit/logging.banzaicloud.io.output/providers/splunkHec.vue +1 -1
- package/edit/logging.banzaicloud.io.output/providers/syslog.vue +1 -1
- package/edit/management.cattle.io.fleetworkspace.vue +1 -1
- package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +107 -0
- package/edit/management.cattle.io.project.vue +11 -4
- package/edit/management.cattle.io.projectroletemplatebinding.vue +5 -5
- package/edit/management.cattle.io.setting.vue +6 -3
- package/edit/management.cattle.io.user.vue +11 -5
- package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +33 -17
- package/edit/monitoring.coreos.com.alertmanagerconfig/tls.vue +1 -1
- package/edit/monitoring.coreos.com.alertmanagerconfig/types/email.vue +6 -6
- package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +5 -5
- package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +3 -3
- package/edit/monitoring.coreos.com.alertmanagerconfig/types/slack.vue +3 -3
- package/edit/monitoring.coreos.com.alertmanagerconfig/types/webhook.vue +4 -4
- package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +14 -6
- package/edit/monitoring.coreos.com.receiver/auth.vue +2 -2
- package/edit/monitoring.coreos.com.receiver/index.vue +1 -1
- package/edit/monitoring.coreos.com.receiver/types/email.vue +1 -1
- package/edit/monitoring.coreos.com.receiver/types/opsgenie.vue +1 -1
- package/edit/monitoring.coreos.com.receiver/types/pagerduty.vue +1 -1
- package/edit/monitoring.coreos.com.receiver/types/webhook.vue +1 -1
- package/edit/monitoring.coreos.com.route.vue +1 -1
- package/edit/namespace.vue +18 -4
- package/edit/networking.istio.io.destinationrule/LoadBalancer.vue +1 -1
- package/edit/networking.k8s.io.ingress/Certificate.vue +1 -0
- package/edit/networking.k8s.io.ingress/Certificates.vue +3 -3
- package/edit/networking.k8s.io.ingress/DefaultBackend.vue +2 -2
- package/edit/networking.k8s.io.ingress/IngressClass.vue +9 -7
- package/edit/networking.k8s.io.ingress/Rule.vue +1 -1
- package/edit/networking.k8s.io.ingress/RulePath.vue +17 -11
- package/edit/networking.k8s.io.ingress/Rules.vue +7 -7
- package/edit/networking.k8s.io.ingress/index.vue +8 -6
- package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +1 -1
- package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +3 -3
- package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +1 -1
- package/edit/networking.k8s.io.networkpolicy/index.vue +5 -5
- package/edit/persistentvolume/index.vue +30 -27
- package/edit/persistentvolume/plugins/awsElasticBlockStore.vue +1 -1
- package/edit/persistentvolume/plugins/azureDisk.vue +1 -1
- package/edit/persistentvolume/plugins/azureFile.vue +1 -1
- package/edit/persistentvolume/plugins/cephfs.vue +31 -31
- package/edit/persistentvolume/plugins/cinder.vue +1 -1
- package/edit/persistentvolume/plugins/csi.vue +104 -64
- package/edit/persistentvolume/plugins/fc.vue +21 -21
- package/edit/persistentvolume/plugins/flexVolume.vue +2 -2
- package/edit/persistentvolume/plugins/flocker.vue +1 -1
- package/edit/persistentvolume/plugins/gcePersistentDisk.vue +1 -1
- package/edit/persistentvolume/plugins/glusterfs.vue +1 -1
- package/edit/persistentvolume/plugins/hostPath.vue +1 -1
- package/edit/persistentvolume/plugins/iscsi.vue +47 -47
- package/edit/persistentvolume/plugins/local.vue +1 -1
- package/edit/persistentvolume/plugins/longhorn.vue +2 -2
- package/edit/persistentvolume/plugins/nfs.vue +1 -1
- package/edit/persistentvolume/plugins/photonPersistentDisk.vue +1 -1
- package/edit/persistentvolume/plugins/portworxVolume.vue +1 -1
- package/edit/persistentvolume/plugins/quobyte.vue +1 -1
- package/edit/persistentvolume/plugins/rbd.vue +41 -41
- package/edit/persistentvolume/plugins/scaleIO.vue +1 -1
- package/edit/persistentvolume/plugins/storageos.vue +1 -1
- package/edit/persistentvolume/plugins/vsphereVolume.vue +1 -1
- package/edit/persistentvolumeclaim.vue +78 -75
- package/edit/provisioning.cattle.io.cluster/DrainOptions.vue +1 -1
- package/edit/provisioning.cattle.io.cluster/MachinePool.vue +12 -8
- package/edit/provisioning.cattle.io.cluster/RegistryConfigs.vue +10 -1
- package/edit/provisioning.cattle.io.cluster/RegistryMirrors.vue +87 -27
- package/edit/provisioning.cattle.io.cluster/S3Config.vue +1 -1
- package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +3 -6
- package/edit/provisioning.cattle.io.cluster/__tests__/CustomCommand.tests.ts +1 -1
- package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +93 -0
- package/edit/provisioning.cattle.io.cluster/import.vue +3 -3
- package/edit/provisioning.cattle.io.cluster/index.vue +31 -8
- package/edit/provisioning.cattle.io.cluster/rke2.vue +458 -164
- package/edit/resources.cattle.io.backup.vue +2 -2
- package/edit/secret/generic.vue +1 -0
- package/edit/secret/index.vue +3 -7
- package/edit/service.vue +3 -1
- package/edit/storage.k8s.io.storageclass/index.vue +101 -17
- package/edit/storage.k8s.io.storageclass/provisioners/driver.harvesterhci.io.vue +114 -0
- package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/no-provisioner.vue +1 -1
- package/edit/token.vue +1 -1
- package/edit/ui.cattle.io.navlink.vue +8 -8
- package/edit/workload/Job.vue +3 -3
- package/edit/workload/Upgrading.vue +1 -1
- package/edit/workload/VolumeClaimTemplate.vue +1 -1
- package/edit/workload/__tests__/index.test.ts +98 -0
- package/edit/workload/index.vue +61 -11
- package/edit/workload/mixins/workload.js +128 -91
- package/edit/workload/storage/ContainerMountPaths.vue +1 -11
- package/edit/workload/storage/Mount.vue +1 -1
- package/edit/workload/storage/azureDisk.vue +1 -1
- package/edit/workload/storage/azureFile.vue +1 -1
- package/edit/workload/storage/csi/index.vue +1 -1
- package/edit/workload/storage/emptyDir.vue +88 -0
- package/edit/workload/storage/ephemeralVolume/index.vue +2 -2
- package/edit/workload/storage/gcePersistentDisk.vue +1 -1
- package/edit/workload/storage/hostPath.vue +1 -1
- package/edit/workload/storage/index.vue +8 -0
- package/edit/workload/storage/nfs.vue +1 -1
- package/edit/workload/storage/persistentVolumeClaim/index.vue +2 -2
- package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +1 -1
- package/edit/workload/storage/secret.vue +1 -1
- package/edit/workload/storage/vsphereVolume.vue +1 -1
- package/layouts/default.vue +132 -58
- package/list/__tests__/workload.test.ts +53 -0
- package/list/catalog.cattle.io.app.vue +1 -0
- package/list/cis.cattle.io.clusterscan.vue +1 -0
- package/list/fleet.cattle.io.bundle.vue +5 -6
- package/list/fleet.cattle.io.cluster.vue +6 -3
- package/list/fleet.cattle.io.clusterregistrationtoken.vue +5 -6
- package/list/fleet.cattle.io.gitrepo.vue +5 -10
- package/list/group.principal.vue +8 -8
- package/list/helm.cattle.io.projecthelmchart.vue +2 -6
- package/list/logging.banzaicloud.io.clusterflow.vue +4 -1
- package/list/logging.banzaicloud.io.flow.vue +6 -5
- package/list/management.cattle.io.cluster.vue +1 -0
- package/list/management.cattle.io.feature.vue +4 -5
- package/list/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +47 -0
- package/list/management.cattle.io.setting.vue +2 -2
- package/list/management.cattle.io.user.vue +4 -10
- package/list/monitoring.coreos.com.alertmanagerconfig.vue +2 -7
- package/list/node.vue +9 -6
- package/list/persistentvolume.vue +3 -3
- package/list/persistentvolumeclaim.vue +3 -4
- package/list/provisioning.cattle.io.cluster.vue +21 -22
- package/list/service.vue +6 -14
- package/list/workload.vue +43 -38
- package/machine-config/amazonec2.vue +1 -1
- package/machine-config/azure.vue +429 -60
- package/machine-config/pnap.vue +288 -0
- package/mixins/__tests__/create-edit-view.test.ts +1 -1
- package/mixins/auth-config.js +1 -3
- package/mixins/browser-tab-visibility.js +8 -14
- package/mixins/chart.js +15 -15
- package/mixins/create-edit-view/impl.js +4 -0
- package/mixins/create-edit-view/index.js +9 -7
- package/mixins/form-validation.js +1 -1
- package/mixins/labeled-form-element.ts +6 -6
- package/mixins/resource-fetch-namespaced.js +98 -0
- package/mixins/resource-fetch.js +82 -48
- package/mixins/resource-manager.js +2 -24
- package/models/apps.controllerrevision.js +7 -0
- package/models/apps.daemonset.js +18 -0
- package/models/apps.deployment.js +44 -0
- package/models/apps.replicaset.js +7 -0
- package/models/apps.statefulset.js +18 -0
- package/models/autoscaling.horizontalpodautoscaler.js +5 -5
- package/models/batch.cronjob.js +15 -15
- package/models/batch.job.js +15 -0
- package/models/catalog.cattle.io.app.js +6 -6
- package/models/catalog.cattle.io.clusterrepo.js +7 -7
- package/models/catalog.cattle.io.operation.js +5 -5
- package/models/chart.js +4 -4
- package/models/cis.cattle.io.clusterscan.js +10 -10
- package/models/cluster/node.js +46 -38
- package/models/cluster.x-k8s.io.machine.js +39 -17
- package/models/cluster.x-k8s.io.machinedeployment.js +12 -2
- package/models/constraints.gatekeeper.sh.constraint.js +1 -1
- package/models/etcdbackup.js +4 -4
- package/models/event.js +7 -0
- package/models/fleet.cattle.io.cluster.js +15 -15
- package/models/fleet.cattle.io.clustergroup.js +1 -1
- package/models/fleet.cattle.io.gitrepo.js +15 -15
- package/models/group.principal.js +1 -1
- package/models/logging.banzaicloud.io.clusterflow.js +2 -2
- package/models/logging.banzaicloud.io.flow.js +6 -2
- package/models/logging.banzaicloud.io.output.js +15 -3
- package/models/management.cattle.io.authconfig.js +4 -4
- package/models/management.cattle.io.cluster.js +10 -10
- package/models/management.cattle.io.clusterroletemplatebinding.js +9 -9
- package/models/management.cattle.io.globalrole.js +26 -5
- package/models/management.cattle.io.node.js +46 -11
- package/models/management.cattle.io.nodepool.js +3 -3
- package/models/management.cattle.io.nodetemplate.js +21 -21
- package/models/management.cattle.io.podsecurityadmissionconfigurationtemplate.ts +4 -0
- package/models/management.cattle.io.project.js +32 -13
- package/models/management.cattle.io.projectroletemplatebinding.js +6 -6
- package/models/management.cattle.io.roletemplate.js +54 -31
- package/models/management.cattle.io.setting.js +1 -1
- package/models/management.cattle.io.user.js +41 -5
- package/models/monitoring.coreos.com.alertmanagerconfig.js +4 -4
- package/models/monitoring.coreos.com.receiver.js +7 -7
- package/models/monitoring.coreos.com.route.js +2 -2
- package/models/namespace.js +55 -5
- package/models/persistentvolume.js +14 -2
- package/models/persistentvolumeclaim.js +4 -4
- package/models/pod.js +25 -10
- package/models/projectroletemplatebinding.js +7 -0
- package/models/provisioning.cattle.io.cluster.js +89 -38
- package/models/rbac.authorization.k8s.io.role.js +4 -4
- package/models/rke-machine.cattle.io.pnapmachinetemplate.js +15 -0
- package/models/rke.cattle.io.etcdsnapshot.js +4 -4
- package/models/service.js +29 -28
- package/models/storage.k8s.io.storageclass.js +41 -26
- package/models/workload.js +66 -35
- package/nuxt.config.js +59 -34
- package/package.json +7 -7
- package/pages/about.vue +15 -3
- package/pages/account/index.vue +1 -1
- package/pages/auth/login.vue +37 -7
- package/pages/auth/setup.vue +11 -11
- package/pages/c/_cluster/_product/_resource/_id.vue +2 -2
- package/pages/c/_cluster/apps/charts/chart.vue +4 -4
- package/pages/c/_cluster/apps/charts/index.vue +21 -20
- package/pages/c/_cluster/apps/charts/install.vue +73 -36
- package/pages/c/_cluster/auth/config/_id.vue +8 -2
- package/pages/c/_cluster/auth/config/index.vue +8 -6
- package/pages/c/_cluster/auth/group.principal/assign-edit.vue +1 -1
- package/pages/c/_cluster/auth/roles/_resource/_id.vue +2 -2
- package/pages/c/_cluster/auth/roles/index.vue +5 -7
- package/pages/c/_cluster/explorer/EventsTable.vue +8 -8
- package/pages/c/_cluster/explorer/index.vue +26 -20
- package/pages/c/_cluster/explorer/tools/index.vue +4 -4
- package/pages/c/_cluster/fleet/GitRepoGraphConfig.js +2 -2
- package/pages/c/_cluster/fleet/index.vue +10 -10
- package/pages/c/_cluster/gatekeeper/index.vue +1 -1
- package/pages/c/_cluster/legacy/index.vue +1 -1
- package/pages/c/_cluster/longhorn/index.vue +2 -2
- package/pages/c/_cluster/mcapps/index.vue +1 -1
- package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +15 -4
- package/pages/c/_cluster/monitoring/index.vue +1 -1
- package/pages/c/_cluster/navlinks/_group.vue +1 -1
- package/pages/c/_cluster/neuvector/index.vue +2 -2
- package/pages/c/_cluster/settings/banners.vue +30 -30
- package/pages/c/_cluster/settings/brand.vue +9 -9
- package/pages/c/_cluster/settings/links.vue +6 -6
- package/pages/c/_cluster/settings/performance.vue +48 -2
- package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +1 -1
- package/pages/c/_cluster/uiplugins/InstallDialog.vue +1 -1
- package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +59 -9
- package/pages/c/_cluster/uiplugins/index.vue +30 -4
- package/pages/diagnostic.vue +5 -4
- package/pages/home.vue +105 -30
- package/pages/prefs.vue +23 -12
- package/pages/rio/mesh.vue +5 -5
- package/pages/support/index.vue +7 -7
- package/pkg/dynamic-importer.lib.js +8 -0
- package/pkg/vue.config.js +14 -1
- package/plugins/dashboard-store/__tests__/mutations.spec.js +406 -0
- package/plugins/dashboard-store/actions.js +32 -25
- package/plugins/dashboard-store/getters.js +50 -33
- package/plugins/dashboard-store/mutations.js +134 -28
- package/plugins/dashboard-store/normalize.js +1 -1
- package/plugins/dashboard-store/resource-class.js +121 -141
- package/plugins/steve/actions.js +30 -0
- package/plugins/steve/caches/resourceCache.js +60 -0
- package/plugins/steve/getters.js +44 -1
- package/plugins/steve/mutations.js +97 -36
- package/plugins/steve/resourceWatcher.js +277 -0
- package/plugins/steve/schema.utils.js +25 -0
- package/plugins/steve/subscribe.js +292 -119
- package/plugins/steve/worker/index.js +17 -0
- package/plugins/steve/worker/web-worker.advanced.js +302 -0
- package/plugins/steve/{web-worker.steve-sub-worker.js → worker/web-worker.basic.js} +6 -47
- package/promptRemove/management.cattle.io.project.vue +1 -1
- package/promptRemove/mixin/roleDeletionCheck.js +7 -7
- package/promptRemove/pod.vue +2 -2
- package/rancher-components/components/BadgeState/BadgeState.spec.ts +12 -0
- package/rancher-components/components/BadgeState/BadgeState.vue +111 -0
- package/rancher-components/components/BadgeState/index.ts +1 -0
- package/rancher-components/components/Banner/Banner.test.ts +57 -0
- package/rancher-components/components/Banner/Banner.vue +242 -0
- package/rancher-components/components/Banner/index.ts +1 -0
- package/rancher-components/components/Card/Card.test.ts +37 -0
- package/rancher-components/components/Card/Card.vue +166 -0
- package/rancher-components/components/Card/index.ts +1 -0
- package/rancher-components/components/Form/Checkbox/Checkbox.test.ts +68 -0
- package/rancher-components/components/Form/Checkbox/Checkbox.vue +418 -0
- package/rancher-components/components/Form/Checkbox/index.ts +1 -0
- package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +23 -0
- package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +355 -0
- package/rancher-components/components/Form/LabeledInput/index.ts +1 -0
- package/rancher-components/components/Form/Radio/RadioButton.vue +276 -0
- package/rancher-components/components/Form/Radio/RadioGroup.vue +253 -0
- package/rancher-components/components/Form/Radio/index.ts +2 -0
- package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +169 -0
- package/rancher-components/components/Form/TextArea/index.ts +1 -0
- package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.test.ts +94 -0
- package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.vue +149 -0
- package/rancher-components/components/Form/ToggleSwitch/index.ts +1 -0
- package/rancher-components/components/Form/index.ts +5 -0
- package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +151 -0
- package/rancher-components/components/LabeledTooltip/index.ts +1 -0
- package/rancher-components/components/StringList/StringList.test.ts +483 -0
- package/rancher-components/components/StringList/StringList.vue +611 -0
- package/rancher-components/components/StringList/index.ts +1 -0
- package/scripts/publish-shell.sh +38 -5
- package/scripts/record-deps.js +37 -0
- package/scripts/test-plugins-build.sh +19 -7
- package/scripts/typegen.sh +84 -0
- package/static/loading-indicator.html +1 -1
- package/store/action-menu.js +3 -3
- package/store/auth.js +4 -4
- package/store/aws.js +4 -4
- package/store/catalog.js +22 -22
- package/store/index.js +58 -7
- package/store/plugins.js +2 -19
- package/store/pnap.js +128 -0
- package/store/prefs.js +13 -3
- package/store/type-map.js +101 -44
- package/store/uiplugins.ts +2 -2
- package/store/wm.js +10 -0
- package/types/pod-security-admission.ts +36 -0
- package/types/shell/index.d.ts +3159 -0
- package/types/vue-shim.d +20 -0
- package/utils/__tests__/object.test.ts +17 -1
- package/utils/__tests__/pod-security-admission.test.ts +61 -0
- package/utils/alertmanagerconfig.js +6 -6
- package/utils/async.ts +36 -0
- package/utils/color.js +45 -0
- package/utils/crypto/browserHashUtils.js +18 -0
- package/utils/dynamic-importer.js +8 -0
- package/utils/gc/gc-types.ts +1 -1
- package/utils/install-redirect.js +1 -1
- package/utils/object.js +26 -2
- package/utils/parse-externalid.js +5 -5
- package/utils/pod-security-admission.ts +39 -0
- package/utils/socket.js +61 -24
- package/utils/string.js +2 -0
- package/utils/svg-filter.js +301 -0
- package/utils/time.js +55 -0
- package/utils/validators/cidr.js +4 -0
- package/utils/validators/formRules/__tests__/index.test.ts +26 -6
- package/utils/validators/formRules/index.ts +14 -0
- package/config/product/harvester-manager.js +0 -162
- package/creators/pkg/nuxt.config.js +0 -6
- package/edit/harvesterhci.io.management.cluster.vue +0 -153
- package/list/harvesterhci.io.management.cluster.vue +0 -241
- package/machine-config/harvester.vue +0 -693
- package/models/harvesterhci.io.management.cluster.js +0 -228
- package/pages/c/_cluster/harvesterManager/index.vue +0 -24
|
@@ -6,6 +6,7 @@ import { NAME as EXPLORER } from '@shell/config/product/explorer';
|
|
|
6
6
|
import { listNodeRoles } from '@shell/models/cluster/node';
|
|
7
7
|
import { insertAt } from '@shell/utils/array';
|
|
8
8
|
import { downloadUrl } from '@shell/utils/download';
|
|
9
|
+
import findLast from 'lodash/findLast';
|
|
9
10
|
import HybridModel from '@shell/plugins/steve/hybrid-class';
|
|
10
11
|
|
|
11
12
|
export default class MgmtNode extends HybridModel {
|
|
@@ -13,18 +14,18 @@ export default class MgmtNode extends HybridModel {
|
|
|
13
14
|
const out = super._availableActions;
|
|
14
15
|
|
|
15
16
|
const downloadKeys = {
|
|
16
|
-
action:
|
|
17
|
-
enabled:
|
|
18
|
-
icon:
|
|
19
|
-
label:
|
|
17
|
+
action: 'downloadKeys',
|
|
18
|
+
enabled: !!this.norman?.links?.nodeConfig,
|
|
19
|
+
icon: 'icon icon-fw icon-download',
|
|
20
|
+
label: this.t('node.actions.downloadNodeConfig'),
|
|
20
21
|
};
|
|
21
22
|
|
|
22
23
|
const scaleDown = {
|
|
23
|
-
action:
|
|
24
|
-
enabled:
|
|
25
|
-
icon:
|
|
26
|
-
label:
|
|
27
|
-
bulkable:
|
|
24
|
+
action: 'scaleDown',
|
|
25
|
+
enabled: !!this.canScaleDown,
|
|
26
|
+
icon: 'icon icon-minus icon-fw',
|
|
27
|
+
label: this.t('node.actions.scaleDown'),
|
|
28
|
+
bulkable: true,
|
|
28
29
|
};
|
|
29
30
|
|
|
30
31
|
insertAt(out, 0, { divider: true });
|
|
@@ -124,8 +125,42 @@ export default class MgmtNode extends HybridModel {
|
|
|
124
125
|
return false;
|
|
125
126
|
}
|
|
126
127
|
|
|
127
|
-
get
|
|
128
|
-
|
|
128
|
+
get internalIp() {
|
|
129
|
+
// This shows in the IP address column for RKE1 nodes in the
|
|
130
|
+
// list of nodes in the cluster detail page of Cluster Management.
|
|
131
|
+
|
|
132
|
+
const internal = this.status?.addresses?.find(({ type }) => {
|
|
133
|
+
return type === ADDRESSES.INTERNAL_IP;
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
if (internal) {
|
|
137
|
+
return internal.address;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// For RKE1 clusters in EC2, node addresses are
|
|
141
|
+
// under status.rkeNode.address and status.rkeNode.internalAddress
|
|
142
|
+
if (!internal && this.status.rkeNode) {
|
|
143
|
+
return this.status.rkeNode.internalAddress;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
return this.t('generic.none');
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
get externalIp() {
|
|
150
|
+
const addresses = this.status?.addresses || [];
|
|
151
|
+
const statusAddress = findLast(addresses, address => address.type === 'ExternalIP')?.address;
|
|
152
|
+
|
|
153
|
+
if (statusAddress) {
|
|
154
|
+
return statusAddress;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// For RKE1 clusters in EC2, node addresses are
|
|
158
|
+
// under status.rkeNode.address and status.rkeNode.internalAddress
|
|
159
|
+
if (!statusAddress && this.status.rkeNode) {
|
|
160
|
+
return this.status.rkeNode.address;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return this.t('generic.none');
|
|
129
164
|
}
|
|
130
165
|
|
|
131
166
|
get canScaleDown() {
|
|
@@ -79,9 +79,9 @@ export default class MgmtNodePool extends HybridModel {
|
|
|
79
79
|
// These are used in `stateParts` which is show in the same context as `stateParts` for machine deployments (rke2 pools))
|
|
80
80
|
// Using actual states here would look strange when against bucket states for RKE2
|
|
81
81
|
const res = {
|
|
82
|
-
pending:
|
|
83
|
-
unavailable:
|
|
84
|
-
ready:
|
|
82
|
+
pending: 0,
|
|
83
|
+
unavailable: 0,
|
|
84
|
+
ready: 0,
|
|
85
85
|
};
|
|
86
86
|
|
|
87
87
|
if (!this.nodes) {
|
|
@@ -3,8 +3,8 @@ import HybridModel from '@shell/plugins/steve/hybrid-class';
|
|
|
3
3
|
|
|
4
4
|
const CONFIG_KEYS = [
|
|
5
5
|
{
|
|
6
|
-
driver:
|
|
7
|
-
size:
|
|
6
|
+
driver: 'aliyunecs',
|
|
7
|
+
size: { key: 'instanceType' },
|
|
8
8
|
location: {
|
|
9
9
|
getDisplayProperty(that) {
|
|
10
10
|
return `${ that.providerConfig?.region }${ that.providerConfig?.zone }`;
|
|
@@ -12,8 +12,8 @@ const CONFIG_KEYS = [
|
|
|
12
12
|
}
|
|
13
13
|
},
|
|
14
14
|
{
|
|
15
|
-
driver:
|
|
16
|
-
size:
|
|
15
|
+
driver: 'amazonec2',
|
|
16
|
+
size: { key: 'instanceType' },
|
|
17
17
|
location: {
|
|
18
18
|
getDisplayProperty(that) {
|
|
19
19
|
return `${ that.providerConfig?.region }${ that.providerConfig?.zone }`;
|
|
@@ -21,47 +21,47 @@ const CONFIG_KEYS = [
|
|
|
21
21
|
}
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
|
-
driver:
|
|
25
|
-
size:
|
|
24
|
+
driver: 'azure',
|
|
25
|
+
size: { key: 'size' },
|
|
26
26
|
location: { key: 'location' }
|
|
27
27
|
},
|
|
28
28
|
{
|
|
29
|
-
driver:
|
|
30
|
-
size:
|
|
29
|
+
driver: 'digitalocean',
|
|
30
|
+
size: { key: 'size' },
|
|
31
31
|
location: { key: 'region' }
|
|
32
32
|
},
|
|
33
33
|
{
|
|
34
|
-
driver:
|
|
35
|
-
size:
|
|
34
|
+
driver: 'exoscale',
|
|
35
|
+
size: { key: 'instanceProfile' },
|
|
36
36
|
location: { key: 'availabilityZone' }
|
|
37
37
|
},
|
|
38
38
|
{
|
|
39
|
-
driver:
|
|
40
|
-
size:
|
|
39
|
+
driver: 'linode',
|
|
40
|
+
size: { key: 'instanceType' },
|
|
41
41
|
location: { key: 'region' }
|
|
42
42
|
},
|
|
43
43
|
{
|
|
44
|
-
driver:
|
|
45
|
-
size:
|
|
44
|
+
driver: 'oci',
|
|
45
|
+
size: { key: 'nodeShape' },
|
|
46
46
|
location: {}
|
|
47
47
|
},
|
|
48
48
|
{
|
|
49
|
-
driver:
|
|
50
|
-
size:
|
|
49
|
+
driver: 'packet',
|
|
50
|
+
size: { key: 'plan' },
|
|
51
51
|
location: { key: 'facilityCode' }
|
|
52
52
|
},
|
|
53
53
|
{
|
|
54
|
-
driver:
|
|
55
|
-
size:
|
|
54
|
+
driver: 'pnap',
|
|
55
|
+
size: { key: 'serverType' },
|
|
56
56
|
location: { key: 'serverLocation' }
|
|
57
57
|
},
|
|
58
58
|
{
|
|
59
|
-
driver:
|
|
60
|
-
size:
|
|
59
|
+
driver: 'rackspace',
|
|
60
|
+
size: { key: 'flavorId' },
|
|
61
61
|
location: { key: 'region' }
|
|
62
62
|
},
|
|
63
63
|
{
|
|
64
|
-
driver:
|
|
64
|
+
driver: 'vmwarevsphere',
|
|
65
65
|
size: {
|
|
66
66
|
getDisplayProperty(that) {
|
|
67
67
|
const size = formatSi(that.providerConfig?.memorySize * 1048576, 1024, 'iB');
|
|
@@ -2,7 +2,7 @@ import { DEFAULT_PROJECT, SYSTEM_PROJECT } from '@shell/config/labels-annotation
|
|
|
2
2
|
import { MANAGEMENT, NAMESPACE, NORMAN } from '@shell/config/types';
|
|
3
3
|
import HybridModel from '@shell/plugins/steve/hybrid-class';
|
|
4
4
|
import isEmpty from 'lodash/isEmpty';
|
|
5
|
-
import { HARVESTER_NAME as HARVESTER } from '@shell/config/
|
|
5
|
+
import { HARVESTER_NAME as HARVESTER } from '@shell/config/features';
|
|
6
6
|
|
|
7
7
|
function clearUnusedResourceQuotas(spec, types) {
|
|
8
8
|
types.forEach((type) => {
|
|
@@ -99,18 +99,36 @@ export default class Project extends HybridModel {
|
|
|
99
99
|
// and the PUT request should have a query param _replace=true.
|
|
100
100
|
const newValue = await norman.save({ replace: forceReplaceOnReq });
|
|
101
101
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
// The backend updates each new project soon after it is created,
|
|
107
|
-
// so there is a chance of a resource conflict or forbidden error. If that happens,
|
|
108
|
-
// retry the action.
|
|
102
|
+
let retryCount = 0;
|
|
103
|
+
|
|
104
|
+
const finishProjectCreation = async() => {
|
|
105
|
+
try {
|
|
109
106
|
await newValue.doAction('setpodsecuritypolicytemplate', { podSecurityPolicyTemplateId: this.spec.podSecurityPolicyTemplateId || null });
|
|
110
|
-
}
|
|
111
|
-
|
|
107
|
+
} catch (err) {
|
|
108
|
+
if ( err.status === 409 || err.status === 403 ) {
|
|
109
|
+
// The backend updates each new project soon after it is created,
|
|
110
|
+
// so there is a chance of a 409 resource conflict or forbidden error. If that happens,
|
|
111
|
+
// retry the action.
|
|
112
|
+
|
|
113
|
+
// The 403 permission error can happen due to the user requesting
|
|
114
|
+
// the project before the project is fully created and the project
|
|
115
|
+
// permissions are assigned to the user so we allow some
|
|
116
|
+
// time for that process to complete.
|
|
117
|
+
|
|
118
|
+
if (retryCount < 3) {
|
|
119
|
+
retryCount++;
|
|
120
|
+
await setTimeout(() => {
|
|
121
|
+
// Delay for three seconds to avoid another failure due to latency.
|
|
122
|
+
finishProjectCreation();
|
|
123
|
+
}, '3000');
|
|
124
|
+
} else {
|
|
125
|
+
throw err;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
112
128
|
}
|
|
113
|
-
}
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
await finishProjectCreation();
|
|
114
132
|
|
|
115
133
|
return newValue;
|
|
116
134
|
}
|
|
@@ -153,8 +171,8 @@ export default class Project extends HybridModel {
|
|
|
153
171
|
get normanEditProject() {
|
|
154
172
|
return (async() => {
|
|
155
173
|
const normanProject = await this.$dispatch('rancher/find', {
|
|
156
|
-
type:
|
|
157
|
-
id:
|
|
174
|
+
type: NORMAN.PROJECT,
|
|
175
|
+
id: this.id.replace('/', ':'),
|
|
158
176
|
}, { root: true });
|
|
159
177
|
|
|
160
178
|
const clearedResourceQuotas = clearUnusedResourceQuotas(this.spec, ['resourceQuota', 'namespaceDefaultResourceQuota']);
|
|
@@ -163,6 +181,7 @@ export default class Project extends HybridModel {
|
|
|
163
181
|
normanProject.setLabels(this.metadata.labels);
|
|
164
182
|
normanProject.setResourceQuotas(clearedResourceQuotas);
|
|
165
183
|
normanProject.description = this.spec.description;
|
|
184
|
+
normanProject.name = this.spec.displayName;
|
|
166
185
|
normanProject.containerDefaultResourceLimit = this.spec.containerDefaultResourceLimit;
|
|
167
186
|
|
|
168
187
|
return normanProject;
|
|
@@ -80,9 +80,9 @@ export default class PRTB extends HybridModel {
|
|
|
80
80
|
const name = `c-cluster-product-resource-id`;
|
|
81
81
|
|
|
82
82
|
const params = {
|
|
83
|
-
resource:
|
|
84
|
-
id:
|
|
85
|
-
product:
|
|
83
|
+
resource: MANAGEMENT.PROJECT,
|
|
84
|
+
id: this.projectId,
|
|
85
|
+
product: 'explorer',
|
|
86
86
|
};
|
|
87
87
|
|
|
88
88
|
return { name, params };
|
|
@@ -96,9 +96,9 @@ export default class PRTB extends HybridModel {
|
|
|
96
96
|
const name = `c-cluster-product-resource-id`;
|
|
97
97
|
|
|
98
98
|
const params = {
|
|
99
|
-
resource:
|
|
100
|
-
id:
|
|
101
|
-
product:
|
|
99
|
+
resource: MANAGEMENT.CLUSTER_ROLE_TEMPLATE_BINDING,
|
|
100
|
+
id: this.clusterName,
|
|
101
|
+
product: 'explorer',
|
|
102
102
|
};
|
|
103
103
|
|
|
104
104
|
return { name, params };
|
|
@@ -4,44 +4,45 @@ import { DESCRIPTION } from '@shell/config/labels-annotations';
|
|
|
4
4
|
import { NORMAN } from '@shell/config/types';
|
|
5
5
|
import SteveDescriptionModel from '@shell/plugins/steve/steve-description-class';
|
|
6
6
|
import Role from './rbac.authorization.k8s.io.role';
|
|
7
|
+
import { AS, MODE, _CLONE, _UNFLAG } from '@shell/config/query-params';
|
|
7
8
|
|
|
8
9
|
export const CATTLE_API_GROUP = '.cattle.io';
|
|
9
10
|
|
|
10
11
|
export const SUBTYPE_MAPPING = {
|
|
11
|
-
GLOBAL:
|
|
12
|
-
key:
|
|
13
|
-
type:
|
|
14
|
-
defaultKey:
|
|
15
|
-
id:
|
|
16
|
-
labelKey:
|
|
12
|
+
GLOBAL: {
|
|
13
|
+
key: 'GLOBAL',
|
|
14
|
+
type: 'management.cattle.io.globalrole',
|
|
15
|
+
defaultKey: 'newUserDefault',
|
|
16
|
+
id: 'GLOBAL',
|
|
17
|
+
labelKey: 'rbac.roletemplate.subtypes.GLOBAL.label',
|
|
17
18
|
},
|
|
18
|
-
CLUSTER:
|
|
19
|
-
key:
|
|
20
|
-
type:
|
|
21
|
-
context:
|
|
22
|
-
defaultKey:
|
|
23
|
-
id:
|
|
24
|
-
labelKey:
|
|
19
|
+
CLUSTER: {
|
|
20
|
+
key: 'CLUSTER',
|
|
21
|
+
type: 'management.cattle.io.roletemplate',
|
|
22
|
+
context: 'cluster',
|
|
23
|
+
defaultKey: 'clusterCreatorDefault',
|
|
24
|
+
id: 'CLUSTER',
|
|
25
|
+
labelKey: 'rbac.roletemplate.subtypes.CLUSTER.label',
|
|
25
26
|
},
|
|
26
27
|
NAMESPACE: {
|
|
27
|
-
key:
|
|
28
|
-
type:
|
|
29
|
-
context:
|
|
30
|
-
defaultKey:
|
|
31
|
-
id:
|
|
32
|
-
labelKey:
|
|
28
|
+
key: 'NAMESPACE',
|
|
29
|
+
type: 'management.cattle.io.roletemplate',
|
|
30
|
+
context: 'project',
|
|
31
|
+
defaultKey: 'projectCreatorDefault',
|
|
32
|
+
id: 'NAMESPACE',
|
|
33
|
+
labelKey: 'rbac.roletemplate.subtypes.NAMESPACE.label',
|
|
33
34
|
},
|
|
34
35
|
RBAC_ROLE: {
|
|
35
|
-
key:
|
|
36
|
-
type:
|
|
37
|
-
id:
|
|
38
|
-
labelKey:
|
|
36
|
+
key: 'RBAC_ROLE',
|
|
37
|
+
type: 'rbac.authorization.k8s.io.role',
|
|
38
|
+
id: 'RBAC_ROLE',
|
|
39
|
+
labelKey: 'rbac.roletemplate.subtypes.RBAC_ROLE.label',
|
|
39
40
|
},
|
|
40
41
|
RBAC_CLUSTER_ROLE: {
|
|
41
|
-
key:
|
|
42
|
-
type:
|
|
43
|
-
id:
|
|
44
|
-
labelKey:
|
|
42
|
+
key: 'RBAC_CLUSTER_ROLE',
|
|
43
|
+
type: 'rbac.authorization.k8s.io.clusterrole',
|
|
44
|
+
id: 'RBAC_CLUSTER_ROLE',
|
|
45
|
+
labelKey: 'rbac.roletemplate.subtypes.RBAC_CLUSTER_ROLE.label',
|
|
45
46
|
}
|
|
46
47
|
};
|
|
47
48
|
|
|
@@ -55,6 +56,8 @@ export const VERBS = [
|
|
|
55
56
|
'watch',
|
|
56
57
|
];
|
|
57
58
|
|
|
59
|
+
export const CREATE_VERBS = new Set(['PUT', 'blocked-PUT']);
|
|
60
|
+
|
|
58
61
|
export default class RoleTemplate extends SteveDescriptionModel {
|
|
59
62
|
get customValidationRules() {
|
|
60
63
|
return Role.customValidationRules();
|
|
@@ -64,13 +67,13 @@ export default class RoleTemplate extends SteveDescriptionModel {
|
|
|
64
67
|
const out = this._details;
|
|
65
68
|
|
|
66
69
|
out.unshift({
|
|
67
|
-
label:
|
|
68
|
-
content:
|
|
70
|
+
label: this.t('resourceDetail.detailTop.name'),
|
|
71
|
+
content: get(this, 'name')
|
|
69
72
|
},
|
|
70
73
|
// API returns a blank description property, this overrides our own link to the description
|
|
71
74
|
{
|
|
72
|
-
label:
|
|
73
|
-
content:
|
|
75
|
+
label: this.t('resourceDetail.detailTop.description'),
|
|
76
|
+
content: this.metadata?.annotations?.[DESCRIPTION]
|
|
74
77
|
});
|
|
75
78
|
|
|
76
79
|
return out;
|
|
@@ -159,6 +162,26 @@ export default class RoleTemplate extends SteveDescriptionModel {
|
|
|
159
162
|
})();
|
|
160
163
|
}
|
|
161
164
|
|
|
165
|
+
get canCreate() {
|
|
166
|
+
const schema = this.$getters['schemaFor'](this.type);
|
|
167
|
+
|
|
168
|
+
return schema?.resourceMethods.find(verb => CREATE_VERBS.has(verb));
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
goToClone(moreQuery = {}) {
|
|
172
|
+
const location = this.detailLocation;
|
|
173
|
+
|
|
174
|
+
location.query = {
|
|
175
|
+
...location.query,
|
|
176
|
+
[MODE]: _CLONE,
|
|
177
|
+
[AS]: _UNFLAG,
|
|
178
|
+
roleContext: this.subtype,
|
|
179
|
+
...moreQuery
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
this.currentRouter().push(location);
|
|
183
|
+
}
|
|
184
|
+
|
|
162
185
|
async save() {
|
|
163
186
|
const norman = await this.norman;
|
|
164
187
|
|
|
@@ -1,7 +1,25 @@
|
|
|
1
1
|
import { NORMAN } from '@shell/config/types';
|
|
2
|
-
import HybridModel from '@shell/plugins/steve/hybrid-class';
|
|
2
|
+
import HybridModel, { cleanHybridResources } from '@shell/plugins/steve/hybrid-class';
|
|
3
3
|
|
|
4
4
|
export default class User extends HybridModel {
|
|
5
|
+
// Preserve description
|
|
6
|
+
constructor(data, ctx, rehydrateNamespace = null, setClone = false) {
|
|
7
|
+
const _description = data.description;
|
|
8
|
+
|
|
9
|
+
super(data, ctx, rehydrateNamespace, setClone);
|
|
10
|
+
this.description = _description;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// Clean the Norman properties, but keep description
|
|
14
|
+
cleanResource(data) {
|
|
15
|
+
const desc = data.description;
|
|
16
|
+
const clean = cleanHybridResources(data);
|
|
17
|
+
|
|
18
|
+
clean._description = desc;
|
|
19
|
+
|
|
20
|
+
return clean;
|
|
21
|
+
}
|
|
22
|
+
|
|
5
23
|
get isSystem() {
|
|
6
24
|
for ( const p of this.principalIds || [] ) {
|
|
7
25
|
if ( p.startsWith('system://') ) {
|
|
@@ -89,6 +107,24 @@ export default class User extends HybridModel {
|
|
|
89
107
|
return this.metadata?.state?.name || 'unknown';
|
|
90
108
|
}
|
|
91
109
|
|
|
110
|
+
get description() {
|
|
111
|
+
return this._description;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
set description(value) {
|
|
115
|
+
this._description = value;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Ensure when we clone that we preserve the description
|
|
119
|
+
toJSON() {
|
|
120
|
+
const data = super.toJSON();
|
|
121
|
+
|
|
122
|
+
data.description = this._description;
|
|
123
|
+
delete data._description;
|
|
124
|
+
|
|
125
|
+
return data;
|
|
126
|
+
}
|
|
127
|
+
|
|
92
128
|
async save(opt) {
|
|
93
129
|
const clone = await this.$dispatch('clone', { resource: this });
|
|
94
130
|
|
|
@@ -123,7 +159,7 @@ export default class User extends HybridModel {
|
|
|
123
159
|
|
|
124
160
|
async refreshGroupMembership() {
|
|
125
161
|
const user = await this.$dispatch('rancher/find', {
|
|
126
|
-
type:
|
|
162
|
+
type: NORMAN.USER,
|
|
127
163
|
id: this.id,
|
|
128
164
|
}, { root: true });
|
|
129
165
|
|
|
@@ -158,9 +194,9 @@ export default class User extends HybridModel {
|
|
|
158
194
|
weight: 1
|
|
159
195
|
},
|
|
160
196
|
{
|
|
161
|
-
action:
|
|
162
|
-
label:
|
|
163
|
-
icon:
|
|
197
|
+
action: 'refreshGroupMembership',
|
|
198
|
+
label: this.t('authGroups.actions.refresh'),
|
|
199
|
+
icon: 'icon icon-refresh',
|
|
164
200
|
enabled: this.canRefreshAccess
|
|
165
201
|
},
|
|
166
202
|
{ divider: true },
|
|
@@ -102,9 +102,9 @@ export default class AlertmanagerConfig extends SteveModel {
|
|
|
102
102
|
alertmanagerconfigid: this.id
|
|
103
103
|
},
|
|
104
104
|
query: {
|
|
105
|
-
mode:
|
|
105
|
+
mode: queryMode || _VIEW,
|
|
106
106
|
receiverName,
|
|
107
|
-
currentView:
|
|
107
|
+
currentView: _YAML
|
|
108
108
|
}
|
|
109
109
|
};
|
|
110
110
|
}
|
|
@@ -117,9 +117,9 @@ export default class AlertmanagerConfig extends SteveModel {
|
|
|
117
117
|
alertmanagerconfigid: this.id
|
|
118
118
|
},
|
|
119
119
|
query: {
|
|
120
|
-
mode:
|
|
120
|
+
mode: queryMode || _VIEW,
|
|
121
121
|
receiverName,
|
|
122
|
-
currentView:
|
|
122
|
+
currentView: _CONFIG
|
|
123
123
|
}
|
|
124
124
|
};
|
|
125
125
|
}
|
|
@@ -36,13 +36,13 @@ export const RECEIVERS_TYPES = [
|
|
|
36
36
|
logo: require(`~shell/assets/images/vendor/email.svg`)
|
|
37
37
|
},
|
|
38
38
|
{
|
|
39
|
-
name:
|
|
40
|
-
label:
|
|
41
|
-
title:
|
|
42
|
-
key:
|
|
43
|
-
logo:
|
|
44
|
-
banner:
|
|
45
|
-
addButton:
|
|
39
|
+
name: 'webhook',
|
|
40
|
+
label: 'monitoringReceiver.webhook.label',
|
|
41
|
+
title: 'monitoringReceiver.webhook.title',
|
|
42
|
+
key: 'webhook_configs',
|
|
43
|
+
logo: require(`~shell/assets/images/vendor/webhook.svg`),
|
|
44
|
+
banner: 'webhook.banner',
|
|
45
|
+
addButton: 'webhook.add'
|
|
46
46
|
},
|
|
47
47
|
{
|
|
48
48
|
name: 'custom',
|
|
@@ -150,8 +150,8 @@ export default class Route extends SteveModel {
|
|
|
150
150
|
|
|
151
151
|
get receiverLink() {
|
|
152
152
|
return {
|
|
153
|
-
text:
|
|
154
|
-
to:
|
|
153
|
+
text: this.spec.receiver,
|
|
154
|
+
to: {
|
|
155
155
|
name: 'c-cluster-product-resource-id',
|
|
156
156
|
params: {
|
|
157
157
|
resource: MONITORING.SPOOFED.RECEIVER, product: MONITORING_PRODUCT, id: this.spec.receiver
|
package/models/namespace.js
CHANGED
|
@@ -9,7 +9,9 @@ import { escapeHtml } from '@shell/utils/string';
|
|
|
9
9
|
import { insertAt, isArray } from '@shell/utils/array';
|
|
10
10
|
import SteveModel from '@shell/plugins/steve/steve-class';
|
|
11
11
|
import Vue from 'vue';
|
|
12
|
-
import { HARVESTER_NAME as HARVESTER } from '@shell/config/
|
|
12
|
+
import { HARVESTER_NAME as HARVESTER } from '@shell/config/features';
|
|
13
|
+
import { hasPSALabels, getPSATooltipsDescription, getPSALabels } from '@shell/utils/pod-security-admission';
|
|
14
|
+
import { PSAIconsDisplay, PSALabelsNamespaceVersion } from '@shell/config/pod-security-admission';
|
|
13
15
|
|
|
14
16
|
const OBSCURE_NAMESPACE_PREFIX = [
|
|
15
17
|
'c-', // cluster namespace
|
|
@@ -185,11 +187,10 @@ export default class Namespace extends SteveModel {
|
|
|
185
187
|
}
|
|
186
188
|
|
|
187
189
|
get _detailLocation() {
|
|
188
|
-
|
|
190
|
+
let _detailLocation = super._detailLocation;
|
|
189
191
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
_detailLocation.name = `${ HARVESTER }-${ _detailLocation.name }`.replace('-product', '');
|
|
192
|
+
if (this.$rootGetters['currentProduct'].hideNamespaceLocation) {
|
|
193
|
+
_detailLocation = false;
|
|
193
194
|
}
|
|
194
195
|
|
|
195
196
|
return _detailLocation;
|
|
@@ -210,4 +211,53 @@ export default class Namespace extends SteveModel {
|
|
|
210
211
|
set resourceQuota(value) {
|
|
211
212
|
Vue.set(this.metadata.annotations, RESOURCE_QUOTA, JSON.stringify(value));
|
|
212
213
|
}
|
|
214
|
+
|
|
215
|
+
get detailTopTooltips() {
|
|
216
|
+
return this.psaTooltipsDescription;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
get detailTopIcons() {
|
|
220
|
+
return PSAIconsDisplay;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Check if resource contains PSA labels
|
|
225
|
+
*/
|
|
226
|
+
get hasSystemLabels() {
|
|
227
|
+
return hasPSALabels(this);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
get filteredSystemLabels() {
|
|
231
|
+
return Object.entries(this.labels).reduce((res, [key, value]) => {
|
|
232
|
+
if (!PSALabelsNamespaceVersion.includes(key)) {
|
|
233
|
+
res[key] = value;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
return res;
|
|
237
|
+
}, {});
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Generate list of present keys which can be filtered based on existing label keys and system keys
|
|
242
|
+
*/
|
|
243
|
+
get systemLabels() {
|
|
244
|
+
return getPSALabels(this);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
get psaTooltipsDescription() {
|
|
248
|
+
return getPSATooltipsDescription(this);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// Preserve the project label - ensures we preserve project when cloning a namespace
|
|
252
|
+
cleanForNew() {
|
|
253
|
+
const project = this.metadata?.labels?.[PROJECT];
|
|
254
|
+
|
|
255
|
+
super.cleanForNew();
|
|
256
|
+
|
|
257
|
+
if (project) {
|
|
258
|
+
this.metadata = this.metadata || {};
|
|
259
|
+
this.metadata.labels = this.metadata.labels || {};
|
|
260
|
+
this.metadata.labels[PROJECT] = project;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
213
263
|
}
|
|
@@ -112,10 +112,22 @@ export const LONGHORN_DRIVER = 'driver.longhorn.io';
|
|
|
112
112
|
export const LONGHORN_PLUGIN = VOLUME_PLUGINS.find(plugin => plugin.value === 'longhorn');
|
|
113
113
|
|
|
114
114
|
export default class PV extends SteveModel {
|
|
115
|
+
// plugin display value table
|
|
115
116
|
get source() {
|
|
116
|
-
const
|
|
117
|
+
const csiDriver = this.spec?.csi?.driver;
|
|
118
|
+
const fallback = `${ csiDriver } ${ this.t('persistentVolume.csi.drivers.suffix') }`;
|
|
117
119
|
|
|
118
|
-
|
|
120
|
+
if (csiDriver) {
|
|
121
|
+
return this.$rootGetters['i18n/withFallback'](`persistentVolume.csi.drivers.${ csiDriver.replaceAll('.', '-') }`, null, fallback);
|
|
122
|
+
}
|
|
123
|
+
const pluginDef = VOLUME_PLUGINS.find(plugin => this.spec[plugin.value]);
|
|
124
|
+
|
|
125
|
+
if (pluginDef) {
|
|
126
|
+
return this.t(pluginDef.labelKey);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// every source should be a csi driver or listed in VOLUME_PLUGIN but just in case..
|
|
130
|
+
return this.t('generic.unknown');
|
|
119
131
|
}
|
|
120
132
|
|
|
121
133
|
get isLonghorn() {
|