@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
package/types/vue-shim.d
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
declare module '*.vue' {
|
|
2
|
+
import Vue from 'vue';
|
|
3
|
+
export default Vue;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
// This is required to keep typescript from complaining. It is required for
|
|
7
|
+
// our i18n plugin. For more info see:
|
|
8
|
+
// https://v2.vuejs.org/v2/guide/typescript.html?redirect=true#Augmenting-Types-for-Use-with-Plugins
|
|
9
|
+
declare module 'vue/types/vue' {
|
|
10
|
+
// eslint-disable-next-line no-unused-vars
|
|
11
|
+
interface Vue {
|
|
12
|
+
/**
|
|
13
|
+
* Lookup a given string with the given arguments
|
|
14
|
+
* @param raw if set, do not do HTML escaping.
|
|
15
|
+
*/
|
|
16
|
+
t: (key: string, args?: Record<string, any>, raw?: boolean) => string,
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
declare module 'js-yaml';
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
clone, get, getter, isEmpty, toDictionary
|
|
3
|
+
} from '@shell/utils/object';
|
|
2
4
|
|
|
3
5
|
describe('fx: get', () => {
|
|
4
6
|
describe('should return value of an object', () => {
|
|
@@ -126,3 +128,17 @@ describe('fx: isEmpty', () => {
|
|
|
126
128
|
expect(result).toBe(expected);
|
|
127
129
|
});
|
|
128
130
|
});
|
|
131
|
+
|
|
132
|
+
describe('fX: toDictionary', () => {
|
|
133
|
+
it('should return a dictionary from an array', () => {
|
|
134
|
+
const array = ['a', 'b', 'c'];
|
|
135
|
+
const asd = (value: string) => value.toUpperCase();
|
|
136
|
+
const expectation = {
|
|
137
|
+
a: 'A', b: 'B', c: 'C'
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
const result = toDictionary(array, asd);
|
|
141
|
+
|
|
142
|
+
expect(result).toStrictEqual(expectation);
|
|
143
|
+
});
|
|
144
|
+
});
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { PSA } from '@shell/types/pod-security-admission';
|
|
2
|
+
import { getPSATooltipsDescription } from '@shell/utils/pod-security-admission';
|
|
3
|
+
|
|
4
|
+
describe('fX: getPSATooltipsDescription', () => {
|
|
5
|
+
it('should return empty object if no labels', () => {
|
|
6
|
+
const resource = { metadata: { labels: {} } } as Partial<PSA> as PSA;
|
|
7
|
+
|
|
8
|
+
const result = getPSATooltipsDescription(resource);
|
|
9
|
+
|
|
10
|
+
expect(result).toStrictEqual({});
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
it('should return prettified dictionary of labels', () => {
|
|
14
|
+
const resource = { metadata: { labels: { 'pod-security.kubernetes.io/enforce': 'restricted' } } } as Partial<PSA> as PSA;
|
|
15
|
+
|
|
16
|
+
const result = getPSATooltipsDescription(resource);
|
|
17
|
+
|
|
18
|
+
expect(result).toStrictEqual({ 'pod-security.kubernetes.io/enforce': 'Enforce Restricted (latest)' });
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('should exclude non-PSA labels', () => {
|
|
22
|
+
const resource = {
|
|
23
|
+
metadata: {
|
|
24
|
+
labels: {
|
|
25
|
+
'field.cattle.io/projectId': 'p-68z77',
|
|
26
|
+
'kubernetes.io/metadata.name': 'psa-test-ns',
|
|
27
|
+
'pod-security.kubernetes.io/enforce': 'privileged',
|
|
28
|
+
bananas: 'potatoes'
|
|
29
|
+
},
|
|
30
|
+
}
|
|
31
|
+
} as Partial<PSA> as PSA;
|
|
32
|
+
|
|
33
|
+
const result = getPSATooltipsDescription(resource);
|
|
34
|
+
|
|
35
|
+
expect(result).toStrictEqual({ 'pod-security.kubernetes.io/enforce': 'Enforce Privileged (latest)' });
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('should return prettified dictionary of labels with version', () => {
|
|
39
|
+
const version = '1.0.0';
|
|
40
|
+
const resource = {
|
|
41
|
+
metadata: {
|
|
42
|
+
labels: {
|
|
43
|
+
'pod-security.kubernetes.io/enforce': 'privileged',
|
|
44
|
+
'pod-security.kubernetes.io/enforce-version': version
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
} as Partial<PSA> as PSA;
|
|
48
|
+
|
|
49
|
+
const result = getPSATooltipsDescription(resource);
|
|
50
|
+
|
|
51
|
+
expect(result).toStrictEqual({ 'pod-security.kubernetes.io/enforce': `Enforce Privileged (${ version })` });
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it(`should return prettified dictionary of labels with 'latest' as default version if none`, () => {
|
|
55
|
+
const resource = { metadata: { labels: { 'pod-security.kubernetes.io/enforce': 'privileged' } } } as Partial<PSA> as PSA;
|
|
56
|
+
|
|
57
|
+
const result = getPSATooltipsDescription(resource);
|
|
58
|
+
|
|
59
|
+
expect(result).toStrictEqual({ 'pod-security.kubernetes.io/enforce': `Enforce Privileged (latest)` });
|
|
60
|
+
});
|
|
61
|
+
});
|
|
@@ -99,9 +99,9 @@ export async function getAllReceivers(dispatch) {
|
|
|
99
99
|
const receivers = config.receivers || [];
|
|
100
100
|
const receiversWithName = receivers.filter(receiver => receiver.name);
|
|
101
101
|
const mapped = receiversWithName.map(receiver => dispatch('cluster/create', {
|
|
102
|
-
id:
|
|
103
|
-
spec:
|
|
104
|
-
type:
|
|
102
|
+
id: receiver.name,
|
|
103
|
+
spec: receiver,
|
|
104
|
+
type: MONITORING.SPOOFED.RECEIVER,
|
|
105
105
|
secret
|
|
106
106
|
}, { root: true }));
|
|
107
107
|
|
|
@@ -124,9 +124,9 @@ export async function getAllRoutes(dispatch) {
|
|
|
124
124
|
routes.push(config.route);
|
|
125
125
|
|
|
126
126
|
const mapped = routes.map(route => dispatch('cluster/create', {
|
|
127
|
-
id:
|
|
128
|
-
spec:
|
|
129
|
-
type:
|
|
127
|
+
id: route.name,
|
|
128
|
+
spec: route,
|
|
129
|
+
type: MONITORING.SPOOFED.ROUTE,
|
|
130
130
|
secret
|
|
131
131
|
}, { root: true }));
|
|
132
132
|
|
package/utils/async.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export const waitFor = (testFn: Function, msg = '', timeoutMs = 3000000, intervalMs = 500, log = false) => {
|
|
2
|
+
gatedLog('Starting wait for', msg);
|
|
3
|
+
|
|
4
|
+
return new Promise((resolve, reject) => {
|
|
5
|
+
if (testFn()) {
|
|
6
|
+
gatedLog('Wait for', msg || 'unknown', 'done immediately');
|
|
7
|
+
resolve(this);
|
|
8
|
+
}
|
|
9
|
+
const timeout = setTimeout(() => {
|
|
10
|
+
gatedLog('Wait for', msg, 'timed out');
|
|
11
|
+
clearInterval(interval);
|
|
12
|
+
clearTimeout(timeout);
|
|
13
|
+
if (msg) {
|
|
14
|
+
reject(new Error(`Failed waiting for: ${ msg }`));
|
|
15
|
+
} else {
|
|
16
|
+
throw new Error(`waitFor timed out after ${ timeoutMs / 1000 } seconds`);
|
|
17
|
+
}
|
|
18
|
+
}, timeoutMs);
|
|
19
|
+
const interval = setInterval(() => {
|
|
20
|
+
if ( testFn() ) {
|
|
21
|
+
gatedLog('Wait for', msg, 'done');
|
|
22
|
+
clearInterval(interval);
|
|
23
|
+
clearTimeout(timeout);
|
|
24
|
+
resolve(this);
|
|
25
|
+
} else if (msg) {
|
|
26
|
+
gatedLog('Wait for', msg, 'not done yet');
|
|
27
|
+
}
|
|
28
|
+
}, intervalMs);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
function gatedLog(...args: any[]) {
|
|
32
|
+
if (log) {
|
|
33
|
+
console.log(...args); // eslint-disable-line no-console
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
};
|
package/utils/color.js
CHANGED
|
@@ -63,6 +63,11 @@ const DARK_CONTRAST_COLORS = {
|
|
|
63
63
|
|
|
64
64
|
};
|
|
65
65
|
|
|
66
|
+
const STANDARD_COLORS = {
|
|
67
|
+
black: '#000000',
|
|
68
|
+
white: '#ffffff',
|
|
69
|
+
};
|
|
70
|
+
|
|
66
71
|
// contrastColor(color, {light, dark}) returns which of 2 options is higher contrast with color
|
|
67
72
|
export function contrastColor(color, contrastOptions = LIGHT_CONTRAST_COLORS) {
|
|
68
73
|
let out = contrastOptions.light;
|
|
@@ -90,3 +95,43 @@ export function textColor(color) {
|
|
|
90
95
|
|
|
91
96
|
return (brightness > 125) ? 'black' : 'white';
|
|
92
97
|
}
|
|
98
|
+
|
|
99
|
+
export function hexToRgb(hex) {
|
|
100
|
+
const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
|
|
101
|
+
|
|
102
|
+
return result ? {
|
|
103
|
+
r: parseInt(result[1], 16),
|
|
104
|
+
g: parseInt(result[2], 16),
|
|
105
|
+
b: parseInt(result[3], 16)
|
|
106
|
+
} : null;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export function mapStandardColors(color) {
|
|
110
|
+
return STANDARD_COLORS[color] || color;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export function rgbToRgb(rgb) {
|
|
114
|
+
const result = /^rgb\(([0-9]{1,3}),\s*([0-9]{1,3}),\s*([0-9]{1,3})\)$/i.exec(rgb);
|
|
115
|
+
|
|
116
|
+
return result ? {
|
|
117
|
+
r: parseInt(result[1], 10),
|
|
118
|
+
g: parseInt(result[2], 10),
|
|
119
|
+
b: parseInt(result[3], 10)
|
|
120
|
+
} : null;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export function colorToRgb(color) {
|
|
124
|
+
let value;
|
|
125
|
+
|
|
126
|
+
if (color.startsWith('rgb(')) {
|
|
127
|
+
value = rgbToRgb(color);
|
|
128
|
+
} else if (color.startsWith('#')) {
|
|
129
|
+
value = hexToRgb(color);
|
|
130
|
+
} else {
|
|
131
|
+
console.warn(`Unable to parse color: ${ color }`); // eslint-disable-line no-console
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return value || {
|
|
135
|
+
r: 0, g: 0, b: 0
|
|
136
|
+
};
|
|
137
|
+
}
|
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
import { Buffer } from 'buffer';
|
|
2
2
|
|
|
3
|
+
function hashString(str) {
|
|
4
|
+
let hash = 0;
|
|
5
|
+
|
|
6
|
+
for (let i = 0; i < str.length; i++) {
|
|
7
|
+
const char = str.charCodeAt(i);
|
|
8
|
+
|
|
9
|
+
hash = (hash << 5) - hash + char;
|
|
10
|
+
hash &= hash;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
return new Uint32Array([hash])[0].toString(36);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// Quick, simple hash function to generate hash for an object
|
|
17
|
+
export function hashObj(obj) {
|
|
18
|
+
return hashString(JSON.stringify(obj, null, 2));
|
|
19
|
+
}
|
|
20
|
+
|
|
3
21
|
/**
|
|
4
22
|
* @api private
|
|
5
23
|
*/
|
|
@@ -122,3 +122,11 @@ export function resolveDetail(key) {
|
|
|
122
122
|
export function resolveWindowComponent(key) {
|
|
123
123
|
return require.resolve(`@shell/components/nav/WindowManager/${ key }`);
|
|
124
124
|
}
|
|
125
|
+
|
|
126
|
+
export function resolveMachineConfigComponent(key) {
|
|
127
|
+
return require.resolve(`@shell/machine-config/${ key }`);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export function resolveCloudCredentialComponent(key) {
|
|
131
|
+
return require.resolve(`@shell/cloud-credential/${ key }`);
|
|
132
|
+
}
|
package/utils/gc/gc-types.ts
CHANGED
|
@@ -26,7 +26,7 @@ export default function(product, chartName, defaultResourceOrRoute, install = tr
|
|
|
26
26
|
} else if (install) {
|
|
27
27
|
// The product is not installed, redirect to the details chart
|
|
28
28
|
|
|
29
|
-
await store.dispatch('catalog/load');
|
|
29
|
+
await store.dispatch('catalog/load', { force: true });
|
|
30
30
|
|
|
31
31
|
const chart = store.getters['catalog/chart']({ chartName });
|
|
32
32
|
|
package/utils/object.js
CHANGED
|
@@ -63,8 +63,8 @@ export function get(obj, path) {
|
|
|
63
63
|
try {
|
|
64
64
|
return JSONPath({
|
|
65
65
|
path,
|
|
66
|
-
json:
|
|
67
|
-
wrap:
|
|
66
|
+
json: obj,
|
|
67
|
+
wrap: false,
|
|
68
68
|
});
|
|
69
69
|
} catch (e) {
|
|
70
70
|
console.log('JSON Path error', e, path, obj); // eslint-disable-line no-console
|
|
@@ -353,3 +353,27 @@ export function applyChangeset(obj, changeset) {
|
|
|
353
353
|
|
|
354
354
|
return obj;
|
|
355
355
|
}
|
|
356
|
+
|
|
357
|
+
/**
|
|
358
|
+
* Creates an object composed of the `object` properties `predicate` returns
|
|
359
|
+
*/
|
|
360
|
+
export function pickBy(obj = {}, predicate = (value, key) => false) {
|
|
361
|
+
return Object.entries(obj)
|
|
362
|
+
.reduce((res, [key, value]) => {
|
|
363
|
+
if (predicate(value, key)) {
|
|
364
|
+
res[key] = value;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
return res;
|
|
368
|
+
}, {});
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
/**
|
|
372
|
+
* Convert list to dictionary from a given function
|
|
373
|
+
* @param {*} array
|
|
374
|
+
* @param {*} callback
|
|
375
|
+
* @returns
|
|
376
|
+
*/
|
|
377
|
+
export const toDictionary = (array, callback) => Object.assign(
|
|
378
|
+
{}, ...array.map(item => ({ [item]: callback(item) }))
|
|
379
|
+
);
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
const EXTERNAL_ID = {
|
|
2
|
-
KIND_SEPARATOR:
|
|
3
|
-
GROUP_SEPARATOR:
|
|
4
|
-
BASE_SEPARATOR:
|
|
5
|
-
ID_SEPARATOR:
|
|
6
|
-
KIND_ALL:
|
|
2
|
+
KIND_SEPARATOR: '://',
|
|
3
|
+
GROUP_SEPARATOR: ':',
|
|
4
|
+
BASE_SEPARATOR: '*',
|
|
5
|
+
ID_SEPARATOR: ':',
|
|
6
|
+
KIND_ALL: 'containers',
|
|
7
7
|
SYSTEM_CATEGORIES: [
|
|
8
8
|
'Rancher services'
|
|
9
9
|
],
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { reduce, filter, keys } from 'lodash';
|
|
2
|
+
import { PSALabelPrefix, PSALabelsNamespaces } from '@shell/config/pod-security-admission';
|
|
3
|
+
import { camelToTitle } from '@shell/utils/string';
|
|
4
|
+
import { PSA } from '@shell/types/pod-security-admission';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Return PSA labels present in the resource
|
|
8
|
+
* @returns string[]
|
|
9
|
+
*/
|
|
10
|
+
export const getPSALabels = (resource: PSA): string[] => filter(keys(resource?.metadata?.labels), key => PSALabelsNamespaces.includes(key));
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Return boolean value if the label is a PSA label
|
|
14
|
+
* @returns Boolean
|
|
15
|
+
*/
|
|
16
|
+
export const hasPSALabels = (resource: PSA): boolean => getPSALabels(resource).length > 0;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Generate tooltips dictionary from a given PSA namespaced label pair of key and values
|
|
20
|
+
*/
|
|
21
|
+
export const getPSATooltipsDescription = (resource: PSA): Record<string, string> => reduce(
|
|
22
|
+
resource?.metadata?.labels,
|
|
23
|
+
(acc, value, key) => {
|
|
24
|
+
const isPSA = PSALabelsNamespaces.includes(key);
|
|
25
|
+
|
|
26
|
+
// Retrieve version from paired label ending with `-version`
|
|
27
|
+
const suffix = '-version';
|
|
28
|
+
const isVersionLabel = key.includes(suffix);
|
|
29
|
+
const versionLabel = resource?.metadata?.labels[`${ key }${ suffix }`];
|
|
30
|
+
const version = versionLabel || 'latest';
|
|
31
|
+
|
|
32
|
+
// Add SPA labels and discard paired version label
|
|
33
|
+
return isPSA && !isVersionLabel ? {
|
|
34
|
+
...acc,
|
|
35
|
+
[key]: `${ camelToTitle(key.replace(PSALabelPrefix, '')) } ${ camelToTitle(value) } (${ version })`
|
|
36
|
+
} : acc;
|
|
37
|
+
},
|
|
38
|
+
{ }
|
|
39
|
+
);
|
package/utils/socket.js
CHANGED
|
@@ -10,8 +10,9 @@ const INSECURE = 'ws://';
|
|
|
10
10
|
const SECURE = 'wss://';
|
|
11
11
|
|
|
12
12
|
const STATE_DISCONNECTED = 'disconnected';
|
|
13
|
-
|
|
14
|
-
const
|
|
13
|
+
|
|
14
|
+
export const STATE_CONNECTING = 'connecting';
|
|
15
|
+
export const STATE_CONNECTED = 'connected';
|
|
15
16
|
const STATE_CLOSING = 'closing';
|
|
16
17
|
const STATE_RECONNECTING = 'reconnecting';
|
|
17
18
|
|
|
@@ -23,6 +24,9 @@ export const EVENT_FRAME_TIMEOUT = 'frame_timeout';
|
|
|
23
24
|
export const EVENT_CONNECT_ERROR = 'connect_error';
|
|
24
25
|
export const EVENT_DISCONNECT_ERROR = 'disconnect_error';
|
|
25
26
|
|
|
27
|
+
export const NO_WATCH = 'NO_WATCH';
|
|
28
|
+
export const NO_SCHEMA = 'NO_SCHEMA';
|
|
29
|
+
|
|
26
30
|
export default class Socket extends EventTarget {
|
|
27
31
|
url;
|
|
28
32
|
autoReconnect = true;
|
|
@@ -33,6 +37,7 @@ export default class Socket extends EventTarget {
|
|
|
33
37
|
protocol = null;
|
|
34
38
|
maxTries = null;
|
|
35
39
|
tries = 0;
|
|
40
|
+
idAsTimestamp = false;
|
|
36
41
|
|
|
37
42
|
// "Private"
|
|
38
43
|
socket = null;
|
|
@@ -40,11 +45,11 @@ export default class Socket extends EventTarget {
|
|
|
40
45
|
framesReceived = 0;
|
|
41
46
|
frameTimer;
|
|
42
47
|
reconnectTimer;
|
|
43
|
-
|
|
48
|
+
disconnectCallBacks = [];
|
|
44
49
|
disconnectedAt = 0;
|
|
45
50
|
closingId = 0;
|
|
46
51
|
|
|
47
|
-
constructor(url, autoReconnect = true, frameTimeout = null, protocol = null, maxTries = null) {
|
|
52
|
+
constructor(url, autoReconnect = true, frameTimeout = null, protocol = null, maxTries = null, idAsTimestamp = false) {
|
|
48
53
|
super();
|
|
49
54
|
|
|
50
55
|
this.setUrl(url);
|
|
@@ -53,6 +58,7 @@ export default class Socket extends EventTarget {
|
|
|
53
58
|
// maxTries = null === never stop trying to reconnect
|
|
54
59
|
// allow maxTries to be defined on individual sockets bc not all will clearly warn the user that we've stopped trying
|
|
55
60
|
this.maxTries = maxTries;
|
|
61
|
+
this.idAsTimestamp = idAsTimestamp;
|
|
56
62
|
|
|
57
63
|
if ( frameTimeout !== null ) {
|
|
58
64
|
this.frameTimeout = frameTimeout;
|
|
@@ -84,10 +90,10 @@ export default class Socket extends EventTarget {
|
|
|
84
90
|
|
|
85
91
|
Object.assign(this.metadata, metadata);
|
|
86
92
|
|
|
87
|
-
const id = sockId++;
|
|
93
|
+
const id = this.idAsTimestamp ? new Date().getTime() : sockId++;
|
|
88
94
|
const url = addParam(this.url, 'sockId', id);
|
|
89
95
|
|
|
90
|
-
|
|
96
|
+
this._baseLog('connecting', { id, url: url.replace(/\?.*/, '') });
|
|
91
97
|
|
|
92
98
|
let socket;
|
|
93
99
|
|
|
@@ -122,9 +128,9 @@ export default class Socket extends EventTarget {
|
|
|
122
128
|
return false;
|
|
123
129
|
}
|
|
124
130
|
|
|
125
|
-
disconnect(
|
|
126
|
-
if (
|
|
127
|
-
this.
|
|
131
|
+
disconnect(callBack) {
|
|
132
|
+
if ( callBack ) {
|
|
133
|
+
this.disconnectCallBacks.push(callBack);
|
|
128
134
|
}
|
|
129
135
|
|
|
130
136
|
const self = this;
|
|
@@ -140,7 +146,7 @@ export default class Socket extends EventTarget {
|
|
|
140
146
|
|
|
141
147
|
this.addEventListener(EVENT_CONNECT_ERROR, onError);
|
|
142
148
|
|
|
143
|
-
this.
|
|
149
|
+
this.disconnectCallBacks.push(() => {
|
|
144
150
|
this.removeEventListener(EVENT_CONNECT_ERROR, onError);
|
|
145
151
|
resolve();
|
|
146
152
|
});
|
|
@@ -208,7 +214,7 @@ export default class Socket extends EventTarget {
|
|
|
208
214
|
socket.onmessage = null;
|
|
209
215
|
socket.close();
|
|
210
216
|
} catch (e) {
|
|
211
|
-
this._log('
|
|
217
|
+
this._log('exception', { e: e.toString() });
|
|
212
218
|
// Continue anyway...
|
|
213
219
|
}
|
|
214
220
|
|
|
@@ -256,7 +262,7 @@ export default class Socket extends EventTarget {
|
|
|
256
262
|
|
|
257
263
|
if ( timeout && this.state === STATE_CONNECTED) {
|
|
258
264
|
this.frameTimer = setTimeout(() => {
|
|
259
|
-
this._log(
|
|
265
|
+
this._log(`watchdog expired after${ timeout }. Closing`);
|
|
260
266
|
this._close();
|
|
261
267
|
this.dispatchEvent(new CustomEvent(EVENT_FRAME_TIMEOUT));
|
|
262
268
|
}, timeout);
|
|
@@ -268,17 +274,22 @@ export default class Socket extends EventTarget {
|
|
|
268
274
|
this._log('error');
|
|
269
275
|
}
|
|
270
276
|
|
|
271
|
-
_closed() {
|
|
272
|
-
|
|
277
|
+
_closed(event) {
|
|
278
|
+
const { code, reason, wasClean } = event;
|
|
279
|
+
|
|
280
|
+
this._baseLog('closed', {
|
|
281
|
+
id: this.closingId || this.socket?.sockId || 'unknown', code, reason, clean: wasClean
|
|
282
|
+
});
|
|
283
|
+
|
|
273
284
|
this.closingId = 0;
|
|
274
285
|
this.socket = null;
|
|
275
286
|
clearTimeout(this.reconnectTimer);
|
|
276
287
|
clearTimeout(this.frameTimer);
|
|
277
288
|
|
|
278
|
-
const
|
|
289
|
+
const callBacks = this.disconnectCallBacks;
|
|
279
290
|
|
|
280
|
-
while (
|
|
281
|
-
const fn =
|
|
291
|
+
while ( callBacks.length ) {
|
|
292
|
+
const fn = callBacks.pop();
|
|
282
293
|
|
|
283
294
|
if ( fn ) {
|
|
284
295
|
fn.apply(this);
|
|
@@ -305,17 +316,19 @@ export default class Socket extends EventTarget {
|
|
|
305
316
|
this.state = STATE_RECONNECTING;
|
|
306
317
|
|
|
307
318
|
if (this.maxTries && this.tries > 1 && this.tries <= this.maxTries) {
|
|
308
|
-
// dispatch an event which will trigger a growl from steve-plugin sockets warning users that we've lost connection and are
|
|
319
|
+
// dispatch an event which will trigger a growl from steve-plugin sockets warning users that we've lost connection and are attempting to reconnect
|
|
309
320
|
const e = new CustomEvent(EVENT_CONNECT_ERROR);
|
|
310
321
|
|
|
311
322
|
this.dispatchEvent(e);
|
|
312
323
|
}
|
|
313
324
|
|
|
314
325
|
if (this.maxTries && this.tries > this.maxTries) {
|
|
326
|
+
this._log('closed. Will not reconnect (hit max attempts)');
|
|
315
327
|
this.state = STATE_DISCONNECTED;
|
|
316
328
|
// dispatch an event which will trigger a growl from steve-plugin sockets warning users that we've given up trying to reconnect
|
|
317
329
|
this.dispatchEvent(new CustomEvent(EVENT_DISCONNECT_ERROR));
|
|
318
330
|
} else {
|
|
331
|
+
this._log('closed. Attempting to reconnect');
|
|
319
332
|
const delay = Math.max(1000, Math.min(1000 * this.tries, 30000));
|
|
320
333
|
|
|
321
334
|
this.reconnectTimer = setTimeout(() => {
|
|
@@ -333,13 +346,37 @@ export default class Socket extends EventTarget {
|
|
|
333
346
|
}
|
|
334
347
|
}
|
|
335
348
|
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
349
|
+
/**
|
|
350
|
+
* `console.log` the provided summary statement, with default information to identify the socket and the provided props
|
|
351
|
+
*/
|
|
352
|
+
_log(summary, props) {
|
|
353
|
+
this._baseLog(summary, {
|
|
354
|
+
state: this.state, id: this.socket?.sockId || 0, ...props
|
|
355
|
+
});
|
|
356
|
+
}
|
|
340
357
|
|
|
341
|
-
|
|
358
|
+
/**
|
|
359
|
+
* `console.log` the provided summary statement and props
|
|
360
|
+
*
|
|
361
|
+
* This does not contain information to identify the socket and can be used in scenarios where it's not known or default
|
|
362
|
+
*/
|
|
363
|
+
_baseLog(summary, props) {
|
|
364
|
+
const message = [summary];
|
|
365
|
+
const values = Object.entries(props || {});
|
|
366
|
+
|
|
367
|
+
message.unshift('Socket ');
|
|
368
|
+
|
|
369
|
+
if (values.length) {
|
|
370
|
+
message.push(' (');
|
|
371
|
+
values.forEach(([key, value], index) => {
|
|
372
|
+
if (index !== 0) {
|
|
373
|
+
message.push(`, `);
|
|
374
|
+
}
|
|
375
|
+
message.push(`${ key }=${ value }`);
|
|
376
|
+
});
|
|
377
|
+
message.push(')');
|
|
378
|
+
}
|
|
342
379
|
|
|
343
|
-
console.log(message.join('
|
|
380
|
+
console.log(message.join('')); // eslint-disable-line no-console
|
|
344
381
|
}
|
|
345
382
|
}
|
package/utils/string.js
CHANGED
|
@@ -129,6 +129,8 @@ export function formatPercent(value, maxPrecision = 2) {
|
|
|
129
129
|
export function pluralize(str) {
|
|
130
130
|
if ( str.match(/.*[^aeiou]y$/i) ) {
|
|
131
131
|
return `${ str.substr(0, str.length - 1) }ies`;
|
|
132
|
+
} else if ( str.endsWith('ics') ) {
|
|
133
|
+
return str;
|
|
132
134
|
} else if ( str.endsWith('s') ) {
|
|
133
135
|
return `${ str }es`;
|
|
134
136
|
} else {
|