dashboard-shell-shell 3.0.2-rc.105 → 3.0.5-test.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/data/aws-regions.json +3 -0
- package/assets/icons/demo.css:Zone.Identifier +0 -0
- package/assets/icons/demo_index.html:Zone.Identifier +0 -0
- package/assets/icons/iconfont.css:Zone.Identifier +0 -0
- package/assets/icons/iconfont.js:Zone.Identifier +0 -0
- package/assets/icons/iconfont.json:Zone.Identifier +0 -0
- package/assets/icons/iconfont.ttf:Zone.Identifier +0 -0
- package/assets/icons/iconfont.woff2:Zone.Identifier +0 -0
- package/assets/icons/iconfont.woff:Zone.Identifier +0 -0
- package/assets/images/icons/document.svg +3 -0
- package/assets/images/key.svg +17 -0
- package/assets/images/providers/sks.svg +1 -0
- package/assets/images/vendor/cognito.svg +1 -0
- package/assets/styles/app.scss +3 -0
- package/assets/styles/base/_basic.scss +10 -0
- package/assets/styles/base/_spacing.scss +29 -0
- package/assets/styles/base/_variables.scss +16 -10
- package/assets/styles/global/_labeled-input.scss +1 -1
- package/assets/styles/global/_layout.scss +1 -1
- package/assets/styles/themes/_dark.scss +30 -0
- package/assets/styles/themes/_light.scss +80 -2
- package/assets/translations/en-us.yaml +822 -105
- package/assets/translations/zh-hans.yaml +13 -3
- package/chart/__tests__/S3.test.ts +2 -1
- package/chart/monitoring/index.vue +1 -1
- package/cloud-credential/gcp.vue +9 -1
- package/components/ActionMenuShell.vue +3 -7
- package/components/AppModal.vue +9 -28
- package/components/AsyncButton.vue +2 -0
- package/components/BrandImage.vue +0 -21
- package/components/Certificates.vue +5 -0
- package/components/CodeMirror.vue +3 -3
- package/components/CommunityLinks.vue +3 -58
- package/components/ConfigMapSettings/Settings.vue +377 -0
- package/components/ConfigMapSettings/index.vue +354 -0
- package/components/CruResource.vue +103 -16
- package/components/DetailText.vue +61 -11
- package/components/Drawer/Chrome.vue +115 -0
- package/components/Drawer/ResourceDetailDrawer/ConfigTab.vue +61 -0
- package/components/Drawer/ResourceDetailDrawer/YamlTab.vue +48 -0
- package/components/Drawer/ResourceDetailDrawer/__tests__/ConfigTab.test.ts +54 -0
- package/components/Drawer/ResourceDetailDrawer/__tests__/YamlTab.test.ts +80 -0
- package/components/Drawer/ResourceDetailDrawer/__tests__/composables.test.ts +106 -0
- package/components/Drawer/ResourceDetailDrawer/__tests__/helpers.test.ts +42 -0
- package/components/Drawer/ResourceDetailDrawer/composables.ts +53 -0
- package/components/Drawer/ResourceDetailDrawer/helpers.ts +10 -0
- package/components/Drawer/ResourceDetailDrawer/index.vue +123 -0
- package/components/ExplorerProjectsNamespaces.vue +46 -29
- package/components/FilterPanel.vue +156 -0
- package/components/FixedBanner.vue +19 -5
- package/components/{fleet/ForceDirectedTreeChart/index.vue → ForceDirectedTreeChart.vue} +47 -41
- package/components/GrowlManager.vue +16 -15
- package/components/IconOrSvg.vue +19 -35
- package/components/KeyValueView.vue +1 -1
- package/components/LandingPagePreference.vue +2 -0
- package/components/Loading.vue +1 -1
- package/components/LocaleSelector.vue +10 -2
- package/components/PaginatedResourceTable.vue +53 -1
- package/components/ProgressBarMulti.vue +1 -0
- package/components/PromptModal.vue +38 -7
- package/components/PromptRemove.vue +5 -1
- package/components/PromptRestore.vue +22 -44
- package/components/RelatedResources.vue +4 -12
- package/components/Resource/Detail/Additional.vue +46 -0
- package/components/Resource/Detail/Card/PodsCard/Bubble.vue +13 -0
- package/components/Resource/Detail/Card/PodsCard/composable.ts +30 -0
- package/components/Resource/Detail/Card/PodsCard/index.vue +118 -0
- package/components/Resource/Detail/Card/ResourceUsageCard/composable.ts +51 -0
- package/components/Resource/Detail/Card/ResourceUsageCard/index.vue +79 -0
- package/components/Resource/Detail/Card/Scaler.vue +89 -0
- package/components/Resource/Detail/Card/StateCard/composables.ts +112 -0
- package/components/Resource/Detail/Card/StateCard/index.vue +39 -0
- package/components/Resource/Detail/Card/VerticalGap.vue +11 -0
- package/components/Resource/Detail/Card/__tests__/Card.test.ts +36 -0
- package/components/Resource/Detail/Card/__tests__/PodsCard.test.ts +84 -0
- package/components/Resource/Detail/Card/__tests__/ResourceUsageCard.test.ts +72 -0
- package/components/Resource/Detail/Card/__tests__/Scaler.test.ts +87 -0
- package/components/Resource/Detail/Card/__tests__/StateCard.test.ts +53 -0
- package/components/Resource/Detail/Card/__tests__/VerticalGap.test.ts +14 -0
- package/components/Resource/Detail/Card/__tests__/index.test.ts +36 -0
- package/components/Resource/Detail/Card/index.vue +56 -0
- package/components/Resource/Detail/Metadata/Annotations/__tests__/index.test.ts +19 -0
- package/components/Resource/Detail/Metadata/Annotations/composable.ts +12 -0
- package/components/Resource/Detail/Metadata/Annotations/index.vue +31 -0
- package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/identifying-fields.test.ts +223 -0
- package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/index.test.ts +103 -0
- package/components/Resource/Detail/Metadata/IdentifyingInformation/composable.ts +72 -0
- package/components/Resource/Detail/Metadata/IdentifyingInformation/identifying-fields.ts +317 -0
- package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +140 -0
- package/components/Resource/Detail/Metadata/KeyValue.vue +140 -0
- package/components/Resource/Detail/Metadata/Labels/__tests__/index.test.ts +18 -0
- package/components/Resource/Detail/Metadata/Labels/composable.ts +12 -0
- package/components/Resource/Detail/Metadata/Labels/index.vue +31 -0
- package/components/Resource/Detail/Metadata/Rectangle.vue +34 -0
- package/components/Resource/Detail/Metadata/__tests__/KeyValue.test.ts +107 -0
- package/components/Resource/Detail/Metadata/__tests__/Rectangle.test.ts +24 -0
- package/components/Resource/Detail/Metadata/__tests__/composables.test.ts +75 -0
- package/components/Resource/Detail/Metadata/__tests__/index.test.ts +91 -0
- package/components/Resource/Detail/Metadata/composables.ts +81 -0
- package/components/Resource/Detail/Metadata/index.vue +88 -0
- package/components/Resource/Detail/Page.vue +37 -0
- package/components/Resource/Detail/PercentageBar.vue +40 -0
- package/components/Resource/Detail/ResourceRow.vue +138 -0
- package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/composables.test.ts +29 -0
- package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/index.test.ts +48 -0
- package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/composables.ts +31 -0
- package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/index.vue +50 -0
- package/components/Resource/Detail/ResourceTabs/KnownHostsTab/__tests__/composables.test.ts +66 -0
- package/components/Resource/Detail/ResourceTabs/KnownHostsTab/composables.ts +21 -0
- package/components/Resource/Detail/ResourceTabs/KnownHostsTab/index.vue +31 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/Basic.vue +45 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/BasicAuth.vue +31 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/Certificate.vue +31 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/Registry.vue +22 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/ServiceAccountToken.vue +31 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/Ssh.vue +32 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Basic.test.ts +40 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/BasicAuth.test.ts +33 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Certificate.test.ts +33 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Registry.test.ts +27 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/ServiceAccountToken.test.ts +33 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Ssh.test.ts +33 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/auth-types.test.ts +186 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/composables.test.ts +102 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/auth-types.ts +109 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/composeables.ts +52 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/index.vue +71 -0
- package/components/Resource/Detail/SpacedRow.vue +14 -0
- package/components/Resource/Detail/StatusBar.vue +59 -0
- package/components/Resource/Detail/StatusRow.vue +61 -0
- package/components/Resource/Detail/TitleBar/Title.vue +14 -0
- package/components/Resource/Detail/TitleBar/Top.vue +14 -0
- package/components/Resource/Detail/TitleBar/__tests__/Title.test.ts +17 -0
- package/components/Resource/Detail/TitleBar/__tests__/Top.test.ts +17 -0
- package/components/Resource/Detail/TitleBar/__tests__/composables.test.ts +63 -0
- package/components/Resource/Detail/TitleBar/__tests__/index.test.ts +142 -0
- package/components/Resource/Detail/TitleBar/composables.ts +46 -0
- package/components/Resource/Detail/TitleBar/index.vue +204 -0
- package/components/Resource/Detail/Top/index.vue +34 -0
- package/components/Resource/Detail/__tests__/Page.test.ts +32 -0
- package/components/Resource/Detail/composables.ts +45 -0
- package/components/ResourceDetail/Masthead/__tests__/index.test.ts +70 -0
- package/components/ResourceDetail/{__tests__/Masthead.test.ts → Masthead/__tests__/legacy.test.ts} +3 -3
- package/components/ResourceDetail/Masthead/index.vue +65 -0
- package/components/ResourceDetail/Masthead/latest.vue +44 -0
- package/components/ResourceDetail/{Masthead.vue → Masthead/legacy.vue} +0 -1
- package/components/ResourceDetail/__tests__/index.test.ts +135 -0
- package/components/ResourceDetail/index.vue +75 -575
- package/components/ResourceDetail/legacy.vue +564 -0
- package/components/ResourceList/Masthead.vue +49 -8
- package/components/ResourceList/index.vue +3 -2
- package/components/ResourceTable.vue +59 -85
- package/components/ResourceYaml.vue +15 -2
- package/components/RichTranslation.vue +106 -0
- package/components/SlideInPanelManager.vue +116 -14
- package/components/SortableTable/index.vue +14 -5
- package/components/SortableTable/paging.js +15 -16
- package/components/SortableTable/selection.js +22 -10
- package/components/StateDot/index.vue +28 -0
- package/components/StatusBadge.vue +6 -4
- package/components/SubtleLink.vue +25 -0
- package/components/Tabbed/Tab.vue +1 -1
- package/components/Tabbed/index.vue +61 -64
- package/components/Wizard.vue +16 -3
- package/components/YamlEditor.vue +1 -2
- package/components/__tests__/AsyncButton.test.ts +39 -0
- package/components/__tests__/ConfigMapSettings.test.ts +376 -0
- package/components/__tests__/CruResource.test.ts +63 -0
- package/components/__tests__/FilterPanel.test.ts +81 -0
- package/components/__tests__/GrowlManager.test.ts +0 -25
- package/components/__tests__/PromptModal.test.ts +146 -0
- package/components/__tests__/PromptRestore.test.ts +1 -65
- package/components/__tests__/RichTranslation.test.ts +115 -0
- package/components/auth/AuthBanner.vue +15 -14
- package/components/auth/Principal.vue +0 -1
- package/components/auth/RoleDetailEdit.vue +44 -4
- package/components/auth/login/ldap.vue +2 -2
- package/components/auth/login/oidc.vue +6 -1
- package/components/fleet/FleetApplications.vue +174 -0
- package/components/fleet/FleetClusterTargets/TargetsList.vue +66 -0
- package/components/fleet/FleetClusterTargets/index.vue +455 -0
- package/components/fleet/FleetClusters.vue +25 -6
- package/components/fleet/FleetGitRepoPaths.vue +476 -0
- package/components/fleet/FleetHelmOps.vue +123 -0
- package/components/fleet/FleetIntro.vue +58 -28
- package/components/fleet/FleetNoWorkspaces.vue +5 -1
- package/components/fleet/FleetOCIStorageSecret.vue +171 -0
- package/components/fleet/FleetRepos.vue +37 -80
- package/components/fleet/FleetResources.vue +69 -27
- package/components/fleet/FleetSummary.vue +26 -51
- package/components/fleet/FleetValuesFrom.vue +295 -0
- package/components/fleet/__tests__/FleetClusterTargets.test.ts +1224 -0
- package/components/fleet/__tests__/FleetGitRepoPaths.test.ts +265 -0
- package/components/fleet/__tests__/FleetOCIStorageSecret.test.ts +213 -0
- package/components/fleet/__tests__/FleetSummary.test.ts +39 -39
- package/components/fleet/__tests__/FleetValuesFrom.test.ts +300 -0
- package/components/fleet/dashboard/Empty.vue +73 -0
- package/components/fleet/dashboard/ResourceCard.vue +184 -0
- package/components/fleet/dashboard/ResourceCardSummary.vue +195 -0
- package/components/fleet/dashboard/ResourceDetails.vue +194 -0
- package/components/fleet/dashboard/ResourcePanel.vue +384 -0
- package/components/form/ArrayList.vue +144 -116
- package/components/form/BannerSettings.vue +117 -50
- package/components/form/ChangePassword.vue +3 -1
- package/components/form/ColorInput.vue +35 -6
- package/components/form/FileImageSelector.vue +1 -1
- package/components/form/Footer.vue +10 -4
- package/components/form/KeyValue.vue +94 -66
- package/components/form/LabeledSelect.vue +72 -54
- package/components/form/Labels.vue +91 -21
- package/components/form/MatchExpressions.vue +58 -11
- package/components/form/NameNsDescription.vue +8 -4
- package/components/form/Networking.vue +24 -19
- package/components/form/NotificationSettings.vue +15 -1
- package/components/form/ResourceLabeledSelect.vue +22 -8
- package/components/form/ResourceSelector.vue +27 -23
- package/components/form/ResourceTabs/index.vue +7 -1
- package/components/form/SSHKnownHosts/index.vue +14 -11
- package/components/form/SecretSelector.vue +18 -2
- package/components/form/Select.vue +57 -26
- package/components/form/SelectOrCreateAuthSecret.vue +6 -3
- package/components/form/SimpleSecretSelector.vue +17 -4
- package/components/form/Taints.vue +21 -2
- package/components/form/UnitInput.vue +21 -0
- package/components/form/ValueFromResource.vue +31 -19
- package/components/form/__tests__/ArrayList.test.ts +32 -0
- package/components/form/__tests__/ColorInput.test.ts +35 -0
- package/components/form/__tests__/KeyValue.test.ts +36 -0
- package/components/form/__tests__/LabeledSelect.test.ts +79 -2
- package/components/form/__tests__/Labels.test.ts +360 -0
- package/components/form/__tests__/MatchExpressions.test.ts +16 -13
- package/components/form/__tests__/Networking.test.ts +116 -0
- package/components/form/__tests__/SSHKnownHosts.test.ts +11 -2
- package/components/form/__tests__/Select.test.ts +37 -1
- package/components/form/__tests__/UnitInput.test.ts +23 -1
- package/components/form/labeled-select-utils/labeled-select-pagination.ts +3 -38
- package/components/formatter/ClusterLink.vue +5 -8
- package/components/formatter/Description.vue +30 -0
- package/components/formatter/FleetApplicationClustersReady.vue +77 -0
- package/components/formatter/FleetApplicationSource.vue +79 -0
- package/components/formatter/FleetSummaryGraph.vue +7 -0
- package/components/formatter/PodImages.vue +1 -1
- package/components/formatter/WorkloadHealthScale.vue +1 -1
- package/components/formatter/__tests__/ClusterLink.test.ts +2 -32
- package/components/formatter/__tests__/LiveDate.test.ts +10 -2
- package/components/google/AccountAccess.vue +209 -0
- package/components/google/types/gcp.d.ts +136 -0
- package/components/google/types/index.d.ts +101 -0
- package/components/google/util/__mocks__/gcp.ts +465 -0
- package/components/google/util/formatter.ts +82 -0
- package/components/google/util/gcp.ts +134 -0
- package/components/google/util/index.d.ts +11 -0
- package/components/nav/Favorite.vue +1 -1
- package/components/nav/Group.vue +5 -0
- package/components/nav/Header.vue +24 -38
- package/components/nav/NamespaceFilter.vue +142 -85
- package/components/nav/NotificationCenter/Notification.vue +484 -0
- package/components/nav/NotificationCenter/NotificationHeader.vue +112 -0
- package/components/nav/NotificationCenter/index.vue +148 -0
- package/components/nav/TopLevelMenu.helper.ts +55 -34
- package/components/nav/TopLevelMenu.vue +11 -0
- package/components/nav/Type.vue +4 -1
- package/components/nav/WindowManager/ContainerLogs.vue +87 -61
- package/components/nav/WindowManager/ContainerLogsActions.vue +76 -0
- package/components/nav/WindowManager/index.vue +3 -2
- package/components/templates/default.vue +0 -3
- package/components/templates/plain.vue +0 -3
- package/composables/drawer.ts +26 -0
- package/composables/focusTrap.ts +3 -3
- package/composables/resources.test.ts +63 -0
- package/composables/resources.ts +38 -0
- package/composables/useI18n.ts +12 -11
- package/composables/useIsNewDetailPageEnabled.ts +17 -0
- package/config/labels-annotations.js +22 -11
- package/config/pagination-table-headers.js +8 -1
- package/config/private-label.js +0 -1
- package/config/product/auth.js +20 -3
- package/config/product/{cis.js → compliance.js} +23 -26
- package/config/product/explorer.js +49 -17
- package/config/product/fleet.js +77 -17
- package/config/product/manager.js +1 -29
- package/config/product/settings.js +23 -11
- package/config/query-params.js +16 -1
- package/config/roles.ts +2 -1
- package/config/router/navigation-guards/authentication.js +51 -2
- package/config/router/navigation-guards/index.js +5 -59
- package/config/router/routes.js +65 -31
- package/config/secret.ts +15 -0
- package/config/settings.ts +33 -16
- package/config/store.js +2 -0
- package/config/system-namespaces.js +1 -1
- package/config/table-headers.js +92 -31
- package/config/types.js +18 -7
- package/config/version.js +1 -1
- package/core/plugin-helpers.ts +3 -2
- package/core/plugin.ts +32 -7
- package/core/types.ts +25 -7
- package/detail/catalog.cattle.io.app.vue +5 -1
- package/detail/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +22 -18
- package/detail/fleet.cattle.io.bundle.vue +70 -6
- package/detail/fleet.cattle.io.cluster.vue +28 -15
- package/detail/fleet.cattle.io.gitrepo.vue +11 -2
- package/detail/fleet.cattle.io.helmop.vue +157 -0
- package/detail/management.cattle.io.fleetworkspace.vue +18 -27
- package/detail/management.cattle.io.oidcclient.vue +369 -0
- package/detail/namespace.vue +0 -3
- package/detail/node.vue +20 -16
- package/detail/pod.vue +2 -2
- package/detail/provisioning.cattle.io.cluster.vue +16 -50
- package/detail/service.vue +10 -2
- package/detail/workload/index.vue +48 -39
- package/dialog/AddCustomBadgeDialog.vue +0 -1
- package/{pages/c/_cluster/uiplugins/AddExtensionRepos.vue → dialog/AddExtensionReposDialog.vue} +72 -42
- package/dialog/AddonConfigConfirmationDialog.vue +1 -1
- package/dialog/AssignToDialog.vue +176 -0
- package/dialog/ChangePasswordDialog.vue +106 -0
- package/{pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue → dialog/DeveloperLoadExtensionDialog.vue} +74 -71
- package/dialog/DisableAuthProviderDialog.vue +101 -0
- package/dialog/DrainNode.vue +1 -1
- package/{pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue → dialog/ExtensionCatalogInstallDialog.vue} +100 -88
- package/{pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue → dialog/ExtensionCatalogUninstallDialog.vue} +87 -66
- package/dialog/FeatureFlagListDialog.vue +288 -0
- package/dialog/ForceMachineRemoveDialog.vue +1 -1
- package/dialog/GenericPrompt.vue +1 -1
- package/dialog/HelmOpForceUpdateDialog.vue +132 -0
- package/{components/Import.vue → dialog/ImportDialog.vue} +8 -13
- package/{pages/c/_cluster/uiplugins/InstallDialog.vue → dialog/InstallExtensionDialog.vue} +124 -106
- package/{components/form/SSHKnownHosts → dialog}/KnownHostsEditDialog.vue +52 -62
- package/dialog/MoveNamespaceDialog.vue +157 -0
- package/dialog/OidcClientSecretDialog.vue +117 -0
- package/dialog/RedeployWorkloadDialog.vue +164 -0
- package/dialog/RotateEncryptionKeyDialog.vue +10 -30
- package/dialog/ScalePoolDownDialog.vue +1 -1
- package/{components/nav/Jump.vue → dialog/SearchDialog.vue} +34 -14
- package/{pages/c/_cluster/uiplugins/UninstallDialog.vue → dialog/UninstallExtensionDialog.vue} +67 -58
- package/dialog/WechatDialog.vue +57 -0
- package/{components/form/SSHKnownHosts → dialog}/__tests__/KnownHostsEditDialog.test.ts +15 -34
- package/edit/__tests__/cis.cattle.io.clusterscan.test.ts +3 -3
- package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +60 -68
- package/edit/__tests__/fleet.cattle.io.helmop.test.ts +224 -0
- package/edit/__tests__/service.test.ts +2 -1
- package/edit/auth/ldap/__tests__/config.test.ts +14 -0
- package/edit/auth/ldap/config.vue +24 -0
- package/edit/auth/oidc.vue +159 -93
- package/edit/autoscaling.horizontalpodautoscaler/index.vue +4 -1
- package/edit/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +30 -31
- package/edit/{cis.cattle.io.clusterscanbenchmark.vue → compliance.cattle.io.clusterscanbenchmark.vue} +4 -4
- package/edit/{cis.cattle.io.clusterscanprofile.vue → compliance.cattle.io.clusterscanprofile.vue} +5 -5
- package/edit/configmap.vue +8 -2
- package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -0
- package/edit/fleet.cattle.io.gitrepo.vue +70 -256
- package/edit/fleet.cattle.io.helmop.vue +786 -0
- package/edit/helm.cattle.io.projecthelmchart.vue +1 -0
- package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +1 -0
- package/edit/logging-flow/index.vue +1 -0
- package/edit/logging.banzaicloud.io.output/index.vue +2 -1
- package/edit/logging.banzaicloud.io.output/providers/awsElasticsearch.vue +5 -6
- package/edit/management.cattle.io.fleetworkspace.vue +44 -10
- package/edit/management.cattle.io.oidcclient.vue +162 -0
- package/edit/management.cattle.io.project.vue +4 -1
- package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +1 -1
- package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +5 -0
- package/edit/monitoring.coreos.com.prometheusrule/index.vue +1 -0
- package/edit/monitoring.coreos.com.receiver/auth.vue +3 -3
- package/edit/monitoring.coreos.com.receiver/index.vue +1 -0
- package/edit/monitoring.coreos.com.receiver/types/email.vue +1 -1
- package/edit/monitoring.coreos.com.route.vue +1 -0
- package/edit/namespace.vue +2 -4
- package/edit/networking.istio.io.destinationrule/index.vue +4 -1
- package/edit/networking.k8s.io.ingress/Certificate.vue +11 -3
- package/edit/networking.k8s.io.ingress/__tests__/Certificate.test.ts +37 -0
- package/edit/networking.k8s.io.ingress/index.vue +4 -1
- package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +3 -14
- package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +57 -62
- package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +10 -16
- package/edit/networking.k8s.io.networkpolicy/__tests__/PolicyRuleTarget.test.ts +72 -41
- package/edit/networking.k8s.io.networkpolicy/__tests__/utils/mock.json +17 -1
- package/edit/networking.k8s.io.networkpolicy/index.vue +23 -31
- package/edit/node.vue +1 -0
- package/edit/persistentvolume/index.vue +4 -1
- package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +26 -12
- package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +69 -2
- package/edit/provisioning.cattle.io.cluster/__tests__/utils/rke2-test-data.ts +58 -0
- package/edit/provisioning.cattle.io.cluster/index.vue +21 -73
- package/edit/provisioning.cattle.io.cluster/rke2.vue +535 -428
- package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +48 -39
- package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +5 -3
- package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +5 -0
- package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +2 -2
- package/edit/resources.cattle.io.restore.vue +1 -1
- package/edit/secret/basic.vue +1 -0
- package/edit/secret/index.vue +127 -15
- package/edit/service.vue +17 -29
- package/edit/serviceaccount.vue +4 -1
- package/edit/storage.k8s.io.storageclass/index.vue +4 -1
- package/edit/workload/index.vue +11 -15
- package/edit/workload/mixins/workload.js +0 -2
- package/list/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +2 -2
- package/list/fleet.cattle.io.gitrepo.vue +1 -1
- package/list/fleet.cattle.io.helmop.vue +108 -0
- package/list/harvesterhci.io.management.cluster.vue +0 -17
- package/list/management.cattle.io.feature.vue +4 -288
- package/list/management.cattle.io.oidcclient.vue +108 -0
- package/list/management.cattle.io.user.vue +13 -20
- package/list/namespace.vue +6 -2
- package/list/node.vue +2 -0
- package/list/projectsecret.vue +345 -0
- package/list/secret.vue +109 -0
- package/list/workload.vue +6 -2
- package/machine-config/__tests__/vmwarevsphere.test.ts +5 -7
- package/machine-config/amazonec2.vue +3 -24
- package/machine-config/components/GCEImage.vue +374 -0
- package/machine-config/google.vue +617 -0
- package/machine-config/vmwarevsphere.vue +7 -17
- package/mixins/__tests__/brand.spec.ts +170 -0
- package/mixins/auth-config.js +8 -1
- package/mixins/brand.js +16 -17
- package/mixins/create-edit-view/impl.js +10 -1
- package/mixins/create-edit-view/index.js +5 -0
- package/mixins/preset.js +100 -0
- package/mixins/resource-fetch-api-pagination.js +73 -44
- package/mixins/resource-fetch.js +18 -8
- package/mixins/resource-table-watch.js +45 -0
- package/mixins/vue-select-overrides.js +1 -4
- package/models/__tests__/chart.test.ts +296 -0
- package/models/__tests__/fleet.cattle.io.gitrepo.test.ts +1 -1
- package/models/__tests__/fleet.cattle.io.helmop.test.ts +224 -0
- package/models/__tests__/node.test.ts +7 -63
- package/models/__tests__/workload.test.ts +1 -0
- package/models/chart.js +157 -2
- package/models/cluster/node.js +2 -1
- package/models/cluster.js +32 -2
- package/models/cluster.x-k8s.io.machinedeployment.js +11 -2
- package/models/{cis.cattle.io.clusterscan.js → compliance.cattle.io.clusterscan.js} +8 -8
- package/models/{cis.cattle.io.clusterscanbenchmark.js → compliance.cattle.io.clusterscanbenchmark.js} +1 -1
- package/models/{cis.cattle.io.clusterscanprofile.js → compliance.cattle.io.clusterscanprofile.js} +5 -5
- package/models/{cis.cattle.io.clusterscanreport.js → compliance.cattle.io.clusterscanreport.js} +1 -1
- package/models/fleet-application.js +297 -0
- package/models/fleet.cattle.io.bundle.js +9 -8
- package/models/fleet.cattle.io.cluster.js +21 -4
- package/models/fleet.cattle.io.gitrepo.js +46 -382
- package/models/fleet.cattle.io.helmop.js +202 -0
- package/models/management.cattle.io.authconfig.js +1 -0
- package/models/management.cattle.io.cluster.js +0 -20
- package/models/management.cattle.io.feature.js +7 -1
- package/models/management.cattle.io.fleetworkspace.js +14 -1
- package/models/management.cattle.io.node.js +7 -22
- package/models/management.cattle.io.nodepool.js +12 -0
- package/models/management.cattle.io.oidcclient.js +18 -0
- package/models/management.cattle.io.registration.js +3 -0
- package/models/management.cattle.io.setting.js +0 -1
- package/models/namespace.js +12 -1
- package/models/provisioning.cattle.io.cluster.js +60 -97
- package/models/secret.js +157 -2
- package/models/service.js +28 -9
- package/models/storage.k8s.io.storageclass.js +2 -2
- package/models/workload.js +91 -51
- package/package.json +6 -5
- package/pages/about.vue +17 -61
- package/pages/account/index.vue +9 -1
- package/pages/auth/login.vue +3 -38
- package/pages/auth/verify.vue +13 -1
- package/pages/c/_cluster/apps/charts/AddRepoLink.vue +36 -0
- package/pages/c/_cluster/apps/charts/AppChartCardFooter.vue +80 -0
- package/pages/c/_cluster/apps/charts/AppChartCardSubHeader.vue +57 -0
- package/pages/c/_cluster/apps/charts/StatusLabel.vue +33 -0
- package/pages/c/_cluster/apps/charts/index.vue +501 -468
- package/pages/c/_cluster/apps/charts/install.vue +0 -1
- package/pages/c/_cluster/auth/roles/index.vue +19 -48
- package/pages/c/_cluster/auth/user.retention/index.vue +87 -78
- package/pages/c/_cluster/explorer/EventsTable.vue +1 -1
- package/pages/c/_cluster/explorer/index.vue +14 -3
- package/pages/c/_cluster/explorer/projectsecret.vue +34 -0
- package/pages/c/_cluster/explorer/tools/pages/_page.vue +0 -1
- package/pages/c/_cluster/fleet/__tests__/index.test.ts +720 -0
- package/pages/c/_cluster/fleet/application/_resource/_id.vue +14 -0
- package/pages/c/_cluster/fleet/application/_resource/create.vue +14 -0
- package/pages/c/_cluster/fleet/application/create.vue +341 -0
- package/pages/c/_cluster/fleet/application/index.vue +139 -0
- package/pages/c/_cluster/fleet/graph/config.js +277 -0
- package/pages/c/_cluster/fleet/index.vue +866 -328
- package/pages/c/_cluster/fleet/settings/index.vue +229 -0
- package/pages/c/_cluster/longhorn/index.vue +5 -2
- package/pages/c/_cluster/settings/banners.vue +56 -2
- package/pages/c/_cluster/settings/brand.vue +2 -1
- package/pages/c/_cluster/settings/performance.vue +7 -26
- package/pages/c/_cluster/uiplugins/CatalogList/index.vue +16 -1
- package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +2 -2
- package/pages/c/_cluster/uiplugins/__tests__/AddExtensionRepos.test.ts +4 -7
- package/pages/c/_cluster/uiplugins/index.vue +98 -55
- package/pages/explorer/resource/detail/configmap.vue +42 -0
- package/pages/explorer/resource/detail/projectsecret.vue +9 -0
- package/pages/explorer/resource/detail/secret.vue +63 -0
- package/pages/home.vue +8 -104
- package/pages/prefs.vue +0 -1
- package/pages/support/index.vue +4 -6
- package/plugins/clean-html.js +2 -0
- package/plugins/dashboard-store/__tests__/actions.test.ts +4 -1
- package/plugins/dashboard-store/__tests__/normalize.test.ts +223 -0
- package/plugins/dashboard-store/__tests__/resource-class.test.ts +191 -0
- package/plugins/dashboard-store/__tests__/utils/normalize-usecases.ts +1526 -0
- package/plugins/dashboard-store/actions.js +212 -55
- package/plugins/dashboard-store/getters.js +112 -24
- package/plugins/dashboard-store/mutations.js +61 -12
- package/plugins/dashboard-store/normalize.js +29 -19
- package/plugins/dashboard-store/resource-class.js +132 -49
- package/plugins/steve/__tests__/getters.test.ts +19 -12
- package/plugins/steve/__tests__/steve-class.test.ts +1 -0
- package/plugins/steve/__tests__/subscribe.spec.ts +324 -1
- package/plugins/steve/actions.js +37 -24
- package/plugins/steve/getters.js +47 -12
- package/plugins/steve/resourceWatcher.js +10 -3
- package/plugins/steve/steve-class.js +5 -0
- package/plugins/steve/steve-pagination-utils.ts +225 -43
- package/plugins/steve/subscribe.js +418 -53
- package/plugins/steve/worker/web-worker.advanced.js +5 -1
- package/rancher-components/Banner/Banner.test.ts +51 -3
- package/rancher-components/Banner/Banner.vue +37 -6
- package/rancher-components/Form/Checkbox/Checkbox.test.ts +59 -1
- package/rancher-components/Form/Checkbox/Checkbox.vue +27 -9
- package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +51 -0
- package/rancher-components/Form/LabeledInput/LabeledInput.vue +21 -3
- package/rancher-components/Form/Radio/RadioButton.test.ts +36 -1
- package/rancher-components/Form/Radio/RadioButton.vue +21 -5
- package/rancher-components/Form/Radio/RadioGroup.test.ts +60 -0
- package/rancher-components/Form/Radio/RadioGroup.vue +81 -38
- package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +4 -0
- package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +22 -1
- package/rancher-components/LabeledTooltip/LabeledTooltip.vue +1 -0
- package/rancher-components/RcButton/RcButton.vue +1 -1
- package/rancher-components/RcDropdown/RcDropdown.test.ts +98 -0
- package/rancher-components/RcDropdown/RcDropdown.vue +6 -0
- package/rancher-components/RcDropdown/RcDropdownItem.vue +8 -55
- package/rancher-components/RcDropdown/RcDropdownItemCheckbox.vue +69 -0
- package/rancher-components/RcDropdown/RcDropdownItemSelect.vue +93 -0
- package/rancher-components/RcDropdown/RcDropdownMenu.vue +7 -8
- package/rancher-components/RcDropdown/index.ts +2 -0
- package/rancher-components/RcDropdown/useDropdownContext.ts +21 -0
- package/rancher-components/RcDropdown/useDropdownItem.ts +92 -0
- package/rancher-components/RcItemCard/RcItemCard.test.ts +189 -0
- package/rancher-components/RcItemCard/RcItemCard.vue +430 -0
- package/rancher-components/RcItemCard/RcItemCardAction.vue +24 -0
- package/rancher-components/RcItemCard/index.ts +2 -0
- package/rancher-components/StringList/StringList.vue +1 -1
- package/scripts/extension/publish +1 -1
- package/static/loading-indicator.html +1 -1
- package/store/action-menu.js +26 -56
- package/store/auth.js +3 -0
- package/store/catalog.js +85 -25
- package/store/features.js +0 -1
- package/store/growl.js +97 -8
- package/store/i18n.js +1 -1
- package/store/index.js +44 -14
- package/store/notifications.ts +426 -0
- package/store/prefs.js +2 -8
- package/store/slideInPanel.ts +6 -0
- package/store/type-map.js +35 -19
- package/store/type-map.utils.ts +49 -6
- package/store/uiplugins.ts +15 -1
- package/types/fleet.d.ts +60 -1
- package/types/kube/kube-api.ts +34 -0
- package/types/notifications/index.ts +74 -0
- package/types/resources/fleet.d.ts +43 -0
- package/types/resources/pod-security-admission.ts +36 -0
- package/types/resources/settings.d.ts +107 -0
- package/types/resources/userPreferences.d.ts +13 -0
- package/types/shell/index.d.ts +971 -745
- package/types/store/dashboard-store.types.ts +57 -4
- package/types/store/pagination.types.ts +41 -9
- package/types/store/subscribe.types.ts +50 -0
- package/utils/__mocks__/tabbable.js +13 -0
- package/utils/__tests__/back-off.test.ts +354 -0
- package/utils/__tests__/create-yaml.test.ts +235 -0
- package/utils/__tests__/fleet.test.ts +148 -0
- package/utils/__tests__/kontainer.test.ts +19 -0
- package/utils/__tests__/object.test.ts +54 -1
- package/utils/__tests__/string.test.ts +273 -1
- package/utils/__tests__/time.test.ts +31 -0
- package/utils/auth.js +41 -6
- package/utils/back-off.ts +176 -0
- package/utils/cluster.js +24 -20
- package/utils/create-yaml.js +103 -9
- package/utils/crypto/encryption.ts +103 -0
- package/utils/cspAdaptor.ts +51 -0
- package/utils/error.js +4 -5
- package/utils/fleet-types.ts +0 -0
- package/utils/fleet.ts +204 -74
- package/utils/grafana.js +1 -0
- package/utils/kontainer.ts +3 -5
- package/utils/object.js +36 -12
- package/utils/pagination-utils.ts +50 -3
- package/utils/pagination-wrapper.ts +132 -50
- package/utils/perf-setting.utils.ts +28 -0
- package/utils/release-notes.ts +48 -0
- package/utils/router.js +4 -4
- package/utils/selector-typed.ts +210 -0
- package/utils/selector.js +29 -6
- package/utils/settings.ts +4 -1
- package/utils/string.js +24 -0
- package/utils/style.ts +39 -0
- package/utils/{time.js → time.ts} +25 -6
- package/utils/uiplugins.ts +41 -8
- package/utils/v-sphere.ts +5 -1
- package/utils/validators/formRules/__tests__/index.test.ts +76 -6
- package/utils/validators/formRules/index.ts +99 -4
- package/utils/window.js +11 -7
- package/.DS_Store +0 -0
- package/components/AssignTo.vue +0 -199
- package/components/DisableAuthProviderModal.vue +0 -115
- package/components/MoveModal.vue +0 -167
- package/components/PromptChangePassword.vue +0 -123
- package/components/ResourceList/Masthead-btn.vue +0 -225
- package/components/__tests__/ApplicationCard.test.ts +0 -27
- package/components/cards/ApplicationCard.vue +0 -145
- package/components/fleet/FleetBundleResources.vue +0 -86
- package/components/fleet/ForceDirectedTreeChart/chartIcons.js +0 -17
- package/components/formatter/RKETemplateName.vue +0 -37
- package/config/product/legacy.js +0 -62
- package/config/secret.js +0 -14
- package/dialog/SaveAsRKETemplateDialog.vue +0 -139
- package/models/etcdbackup.js +0 -45
- package/pages/auth copy/login.vue +0 -595
- package/pages/auth copy/logout.vue +0 -47
- package/pages/auth copy/setup.vue +0 -523
- package/pages/auth copy/verify.vue +0 -203
- package/pages/c/_cluster/fleet/GitRepoGraphConfig.js +0 -249
- package/pages/c/_cluster/legacy/pages/_page.vue +0 -29
- package/pages/c/_cluster/legacy/project/_page.vue +0 -57
- package/pages/c/_cluster/legacy/project/index.vue +0 -32
- package/pages/c/_cluster/legacy/project/pipelines.vue +0 -96
package/utils/create-yaml.js
CHANGED
|
@@ -70,13 +70,14 @@ export const ACTIVELY_REMOVE = [
|
|
|
70
70
|
|
|
71
71
|
const INDENT = 2;
|
|
72
72
|
|
|
73
|
-
export function createYamlWithOptions(schemas, type, data, options) {
|
|
73
|
+
export function createYamlWithOptions(schemas, type, data, options, commentFieldsOptions) {
|
|
74
74
|
return createYaml(
|
|
75
75
|
schemas,
|
|
76
76
|
type,
|
|
77
77
|
data,
|
|
78
78
|
true, 0, '', null,
|
|
79
|
-
options
|
|
79
|
+
options,
|
|
80
|
+
commentFieldsOptions
|
|
80
81
|
);
|
|
81
82
|
}
|
|
82
83
|
|
|
@@ -89,6 +90,7 @@ export function createYaml(
|
|
|
89
90
|
path = '',
|
|
90
91
|
rootType = null,
|
|
91
92
|
dataOptions = {},
|
|
93
|
+
commentFieldsOptions = null
|
|
92
94
|
) {
|
|
93
95
|
data = data || {};
|
|
94
96
|
|
|
@@ -133,6 +135,10 @@ export function createYaml(
|
|
|
133
135
|
|
|
134
136
|
const regularFields = [];
|
|
135
137
|
|
|
138
|
+
if ( !commentFieldsOptions ) {
|
|
139
|
+
commentFieldsOptions = data?.commentFieldsOptions;
|
|
140
|
+
}
|
|
141
|
+
|
|
136
142
|
if (processAlwaysAdd) {
|
|
137
143
|
// Add all the parents of each key so that spec.template.foo.blah
|
|
138
144
|
// causes 'spec', 'template' and 'foo' keys to be created
|
|
@@ -230,6 +236,18 @@ export function createYaml(
|
|
|
230
236
|
out = 'type:';
|
|
231
237
|
}
|
|
232
238
|
|
|
239
|
+
commentFieldsOptions = addCommentSubFieldsOptions(commentFieldsOptions, data, path, key);
|
|
240
|
+
|
|
241
|
+
// If commentFieldOptions is defined on the model and the currentPath matches the path and key
|
|
242
|
+
// defined in one of the options, then comment out that line.
|
|
243
|
+
if ( Array.isArray(commentFieldsOptions) && commentFieldsOptions.length ) {
|
|
244
|
+
const currentPath = path ? `${ path }.${ key }` : key;
|
|
245
|
+
|
|
246
|
+
if ( commentFieldsOptions.some((option) => `${ option.path }.${ option.key }` === currentPath) ) {
|
|
247
|
+
out = `#${ out }`;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
233
251
|
// if a key on data is not listed in the schema's resourceFields, just convert it to yaml, add indents where needed, and return
|
|
234
252
|
if ( !field ) {
|
|
235
253
|
if (data[key]) {
|
|
@@ -275,7 +293,7 @@ export function createYaml(
|
|
|
275
293
|
out += `# key: ${ mapOf }`;
|
|
276
294
|
} else {
|
|
277
295
|
// If not a simple type ie some sort of object/array, recursively build out commented fields (note data = null here) per the type's (mapOf's) schema
|
|
278
|
-
const chunk = createYaml(schemas, mapOf, null, processAlwaysAdd, depth + 1, (path ? `${ path }.${ key }` : key), rootType, dataOptions);
|
|
296
|
+
const chunk = createYaml(schemas, mapOf, null, processAlwaysAdd, depth + 1, (path ? `${ path }.${ key }` : key), rootType, dataOptions, commentFieldsOptions);
|
|
279
297
|
let indented = indent(chunk);
|
|
280
298
|
|
|
281
299
|
// convert "# foo" to "#foo"
|
|
@@ -296,7 +314,34 @@ export function createYaml(
|
|
|
296
314
|
if ( cleaned?.[key] ) {
|
|
297
315
|
const parsedData = jsyaml.dump(cleaned[key]);
|
|
298
316
|
|
|
299
|
-
|
|
317
|
+
let chunk;
|
|
318
|
+
|
|
319
|
+
// If commentFieldOptions is defined on the model and the array has the property (`key`)
|
|
320
|
+
// defined in one of the options, then comment out that line.
|
|
321
|
+
if ( Array.isArray(commentFieldsOptions) && commentFieldsOptions.length ) {
|
|
322
|
+
let lines = parsedData.split('\n');
|
|
323
|
+
|
|
324
|
+
commentFieldsOptions.forEach((option) => {
|
|
325
|
+
// Assuming the path for the current array matches the option's path
|
|
326
|
+
// and the specific key to comment out exists in the array
|
|
327
|
+
if ( `${ path }.${ key }` === option.path && data[key][option.key] !== undefined ) {
|
|
328
|
+
// Comment out the line containing the target line
|
|
329
|
+
lines = lines.map((line, i) => {
|
|
330
|
+
if ( i === Number(option.key) ) {
|
|
331
|
+
return `#${ line }`;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
return line;
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
chunk = lines.join('\n').trim();
|
|
340
|
+
} else {
|
|
341
|
+
chunk = parsedData.trim();
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
out += `\n${ indent(chunk) }`;
|
|
300
345
|
}
|
|
301
346
|
} catch (e) {
|
|
302
347
|
console.error(`Error: Unable to parse array data for yaml of type: ${ type }`, e); // eslint-disable-line no-console
|
|
@@ -306,7 +351,7 @@ export function createYaml(
|
|
|
306
351
|
if ( SIMPLE_TYPES.includes(arrayOf) ) {
|
|
307
352
|
out += `\n# - ${ arrayOf }`;
|
|
308
353
|
} else {
|
|
309
|
-
const chunk = createYaml(schemas, arrayOf, null, false, depth + 1, (path ? `${ path }.${ key }` : key), rootType, dataOptions);
|
|
354
|
+
const chunk = createYaml(schemas, arrayOf, null, false, depth + 1, (path ? `${ path }.${ key }` : key), rootType, dataOptions, commentFieldsOptions);
|
|
310
355
|
let indented = indent(chunk, 2);
|
|
311
356
|
|
|
312
357
|
// turn "# foo" into "# - foo"
|
|
@@ -357,19 +402,45 @@ export function createYaml(
|
|
|
357
402
|
|
|
358
403
|
const subDef = schemaDefinitions?.[type] || findBy(schemas, 'id', type);
|
|
359
404
|
|
|
360
|
-
if ( subDef) {
|
|
405
|
+
if ( subDef ) {
|
|
361
406
|
let chunk;
|
|
362
407
|
|
|
363
408
|
if (subDef?.resourceFields && !isEmpty(subDef?.resourceFields)) {
|
|
364
|
-
chunk = createYaml(schemas, type, data[key], processAlwaysAdd, depth + 1, (path ? `${ path }.${ key }` : key), rootType, dataOptions);
|
|
409
|
+
chunk = createYaml(schemas, type, data[key], processAlwaysAdd, depth + 1, (path ? `${ path }.${ key }` : key), rootType, dataOptions, commentFieldsOptions);
|
|
365
410
|
} else if (data[key]) {
|
|
366
411
|
// if there are no fields defined on the schema but there are in the data, just format data as yaml and add to output yaml
|
|
367
412
|
try {
|
|
368
413
|
const parsed = jsyaml.dump(data[key]);
|
|
369
414
|
|
|
370
|
-
|
|
415
|
+
// If commentFieldOptions is defined on the model and `data[key]` has the property (`key`)
|
|
416
|
+
// defined in one of the options, then comment out that line.
|
|
417
|
+
if ( Array.isArray(commentFieldsOptions) && commentFieldsOptions.length ) {
|
|
418
|
+
let lines = parsed.split('\n');
|
|
419
|
+
|
|
420
|
+
commentFieldsOptions.forEach((option) => {
|
|
421
|
+
// Assuming the path for the current data[key] matches the option's path
|
|
422
|
+
// and the specific key to comment out exists in the data[key]
|
|
423
|
+
if ( `${ path }.${ key }` === option.path && data[key][option.key] !== undefined ) {
|
|
424
|
+
const targetKeyString = `${ option.key }:`;
|
|
425
|
+
|
|
426
|
+
// Comment out the line containing the target key
|
|
427
|
+
lines = lines.map((line) => {
|
|
428
|
+
if ( line.trim().startsWith(targetKeyString) ) {
|
|
429
|
+
return `# ${ line }`;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
return line;
|
|
433
|
+
});
|
|
434
|
+
}
|
|
435
|
+
});
|
|
436
|
+
|
|
437
|
+
chunk = lines.join('\n').trim();
|
|
438
|
+
} else {
|
|
439
|
+
// If commentFieldsOptions do not exist, use the original `parsed` string
|
|
440
|
+
chunk = parsed.trim();
|
|
441
|
+
}
|
|
371
442
|
} catch (e) {
|
|
372
|
-
console.error(`Error:
|
|
443
|
+
console.error(`Error: Unable to parse data for yaml of type: ${ type }`, e); // eslint-disable-line no-console
|
|
373
444
|
}
|
|
374
445
|
}
|
|
375
446
|
|
|
@@ -380,6 +451,29 @@ export function createYaml(
|
|
|
380
451
|
|
|
381
452
|
return out;
|
|
382
453
|
}
|
|
454
|
+
|
|
455
|
+
/**
|
|
456
|
+
* Extends original commentFieldsOptions to cover nested objects
|
|
457
|
+
*/
|
|
458
|
+
function addCommentSubFieldsOptions(options, data, path, key) {
|
|
459
|
+
if (!!options) {
|
|
460
|
+
if ( Array.isArray(options) && options.length ) {
|
|
461
|
+
const currentPath = path ? `${ path }.${ key }` : key;
|
|
462
|
+
|
|
463
|
+
if ( options.some((option) => `${ option.path }.${ option.key }` === currentPath) ) {
|
|
464
|
+
options = [
|
|
465
|
+
...options,
|
|
466
|
+
...Object.keys(data[key]).map((k) => ({
|
|
467
|
+
path: `${ path }.${ key }`,
|
|
468
|
+
key: k
|
|
469
|
+
}))
|
|
470
|
+
];
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
return options;
|
|
476
|
+
}
|
|
383
477
|
}
|
|
384
478
|
|
|
385
479
|
function comment(lines) {
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helpers for string encryption and decryption
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
// We just use a static salt
|
|
6
|
+
const SALT = new TextEncoder().encode('rancher-dashboard');
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Type for the result of encryption
|
|
10
|
+
*/
|
|
11
|
+
export type EncryptedString = {
|
|
12
|
+
cipher: string;
|
|
13
|
+
iv: string;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Generate an encryption key from a password
|
|
18
|
+
*
|
|
19
|
+
* @param password Password to use for the key
|
|
20
|
+
* @returns Encryption key
|
|
21
|
+
*/
|
|
22
|
+
export async function deriveKey(password: string): Promise<CryptoKey> {
|
|
23
|
+
const passwordBytes = stringToBytes(password);
|
|
24
|
+
|
|
25
|
+
const initialKey = await crypto.subtle.importKey(
|
|
26
|
+
'raw',
|
|
27
|
+
passwordBytes,
|
|
28
|
+
{ name: 'PBKDF2' },
|
|
29
|
+
false,
|
|
30
|
+
['deriveKey']
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
return await crypto.subtle.deriveKey(
|
|
34
|
+
{
|
|
35
|
+
name: 'PBKDF2',
|
|
36
|
+
salt: SALT,
|
|
37
|
+
iterations: 100000,
|
|
38
|
+
hash: 'SHA-256'
|
|
39
|
+
},
|
|
40
|
+
initialKey,
|
|
41
|
+
{
|
|
42
|
+
name: 'AES-GCM',
|
|
43
|
+
length: 256
|
|
44
|
+
},
|
|
45
|
+
false,
|
|
46
|
+
[
|
|
47
|
+
'encrypt',
|
|
48
|
+
'decrypt'
|
|
49
|
+
]
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Encrypt data
|
|
55
|
+
*
|
|
56
|
+
* @param content String to be encrypted
|
|
57
|
+
* @param key Encryption key
|
|
58
|
+
* @returns Encrypted data
|
|
59
|
+
*/
|
|
60
|
+
export async function encrypt(content: string, key: CryptoKey): Promise<EncryptedString> {
|
|
61
|
+
const iv = crypto.getRandomValues(new Uint8Array(12));
|
|
62
|
+
const contentBytes = stringToBytes(content);
|
|
63
|
+
const cipher = new Uint8Array(
|
|
64
|
+
await crypto.subtle.encrypt({ name: 'AES-GCM', iv }, key, contentBytes)
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
return {
|
|
68
|
+
iv: bytesToBase64(iv),
|
|
69
|
+
cipher: bytesToBase64(cipher),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Decrypt encrypted data
|
|
75
|
+
* @param encryptedData Encrypted data with `cipher` and `iv` field
|
|
76
|
+
* @param key Key to use for decryption
|
|
77
|
+
* @returns Decrypted value as a string
|
|
78
|
+
*/
|
|
79
|
+
export async function decrypt(encryptedData: EncryptedString, key: CryptoKey): Promise<string> {
|
|
80
|
+
const iv = base64ToBytes(encryptedData.iv);
|
|
81
|
+
const cipher = base64ToBytes(encryptedData.cipher);
|
|
82
|
+
const contentBytes = new Uint8Array(
|
|
83
|
+
await crypto.subtle.decrypt({ name: 'AES-GCM', iv }, key, cipher)
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
return bytesToString(contentBytes);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function bytesToString(bytes: any): string {
|
|
90
|
+
return new TextDecoder().decode(bytes);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function stringToBytes(str: string): Uint8Array {
|
|
94
|
+
return new TextEncoder().encode(str);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function bytesToBase64(arr: Uint8Array) {
|
|
98
|
+
return btoa(Array.from(arr, (b: number) => String.fromCharCode(b)).join(''));
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function base64ToBytes(base64: string): Uint8Array {
|
|
102
|
+
return Uint8Array.from(atob(base64), (c) => c.charCodeAt(0));
|
|
103
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// For testing these could be changed to something like...
|
|
2
|
+
|
|
3
|
+
import { CATALOG } from '@shell/config/types';
|
|
4
|
+
import { FilterArgs, PaginationFilterField, PaginationParamFilter } from '@shell/types/store/pagination.types';
|
|
5
|
+
import { VuexStore } from '@shell/types/store/vuex';
|
|
6
|
+
|
|
7
|
+
const CSP_ADAPTER_APPS = ['rancher-csp-adapter', 'rancher-csp-billing-adapter'];
|
|
8
|
+
// For testing above line could be replaced with below line...
|
|
9
|
+
// const cspAdaptorApp = ['rancher-webhooka', 'rancher-webhook'];
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Helpers in order to
|
|
13
|
+
*/
|
|
14
|
+
class CspAdapterUtils {
|
|
15
|
+
static canPagination($store: VuexStore): boolean {
|
|
16
|
+
return $store.getters[`management/paginationEnabled`]({ id: CATALOG.APP, context: 'branding' });
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
static fetchCspAdaptorApp($store: VuexStore): Promise<any> {
|
|
20
|
+
// For the login page, the schemas won't be loaded - we don't need the apps in this case
|
|
21
|
+
if ($store.getters['management/canList'](CATALOG.APP)) {
|
|
22
|
+
if (CspAdapterUtils.canPagination($store)) {
|
|
23
|
+
// Restrict the amount of apps we need to fetch
|
|
24
|
+
return $store.dispatch('management/findPage', {
|
|
25
|
+
type: CATALOG.APP,
|
|
26
|
+
opt: { // Of type ActionFindPageArgs
|
|
27
|
+
pagination: new FilterArgs({
|
|
28
|
+
filters: PaginationParamFilter.createMultipleFields(CSP_ADAPTER_APPS.map(
|
|
29
|
+
(t) => new PaginationFilterField({
|
|
30
|
+
field: 'metadata.name',
|
|
31
|
+
value: t,
|
|
32
|
+
})
|
|
33
|
+
)),
|
|
34
|
+
})
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return $store.dispatch('management/findAll', { type: CATALOG.APP });
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return Promise.resolve([]);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
static hasCspAdapter({ $store, apps }: { $store: VuexStore, apps: any[]}): Object {
|
|
46
|
+
// In theory this should contain the filtered apps when pagination is on, and all apps when off. Keep filtering though in both cases just in case
|
|
47
|
+
return apps?.find((a) => CSP_ADAPTER_APPS.includes(a.metadata?.name));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export default CspAdapterUtils;
|
package/utils/error.js
CHANGED
|
@@ -50,7 +50,6 @@ export class ApiError extends Error {
|
|
|
50
50
|
|
|
51
51
|
export function stringify(err) {
|
|
52
52
|
let str;
|
|
53
|
-
console.log('00043', err);
|
|
54
53
|
if ( typeof err === 'string' ) {
|
|
55
54
|
str = err;
|
|
56
55
|
} else if ( err && typeof err === 'object' ) {
|
|
@@ -90,7 +89,6 @@ export function stringify(err) {
|
|
|
90
89
|
}
|
|
91
90
|
|
|
92
91
|
export function exceptionToErrorsArray(err) {
|
|
93
|
-
console.log('00055', err);
|
|
94
92
|
if ( err?.response?.data ) {
|
|
95
93
|
const body = err.response.data;
|
|
96
94
|
|
|
@@ -138,6 +136,10 @@ export const normalizeError = (err) => {
|
|
|
138
136
|
};
|
|
139
137
|
};
|
|
140
138
|
export function translateError(error) {
|
|
139
|
+
error = typeof error === 'string'
|
|
140
|
+
? error
|
|
141
|
+
: error?.message || error?.toString() || '';
|
|
142
|
+
|
|
141
143
|
const originError = error;
|
|
142
144
|
error = error?.toLowerCase().replace(/admission webhook(.*?)denied the request:/g, (match, p1) => {
|
|
143
145
|
return '';
|
|
@@ -197,12 +199,9 @@ export function translateError(error) {
|
|
|
197
199
|
|
|
198
200
|
if (matches) {
|
|
199
201
|
if (matches.length == 1) {
|
|
200
|
-
console.log('00045', error);
|
|
201
202
|
error = error.replace(regex, translation.replacement);
|
|
202
203
|
} else {
|
|
203
204
|
error = translation.pattern.replace(/\$(.+)/g, (_, index) => matches[parseInt(index)]);
|
|
204
|
-
|
|
205
|
-
console.log('00046', error);
|
|
206
205
|
}
|
|
207
206
|
}
|
|
208
207
|
}
|
|
File without changes
|
package/utils/fleet.ts
CHANGED
|
@@ -1,13 +1,16 @@
|
|
|
1
|
+
import { isEmpty, isEqual } from 'lodash';
|
|
1
2
|
import {
|
|
2
3
|
BundleDeploymentResource,
|
|
3
4
|
BundleResourceKey,
|
|
4
5
|
BundleDeployment,
|
|
5
6
|
BundleDeploymentStatus,
|
|
6
|
-
BundleStatus,
|
|
7
7
|
Condition,
|
|
8
8
|
} from '@shell/types/resources/fleet';
|
|
9
|
-
import { STATES_ENUM } from '@shell/plugins/dashboard-store/resource-class';
|
|
10
|
-
import { FLEET as FLEET_LABELS } from '@shell/config/labels-annotations';
|
|
9
|
+
import { mapStateToEnum, STATES_ENUM, STATES } from '@shell/plugins/dashboard-store/resource-class';
|
|
10
|
+
import { FLEET as FLEET_LABELS, CAPI } from '@shell/config/labels-annotations';
|
|
11
|
+
import { NAME as EXPLORER_NAME } from '@shell/config/product/explorer';
|
|
12
|
+
import { FleetDashboardState, FleetResourceState, Target, TargetMode } from '@shell/types/fleet';
|
|
13
|
+
import { FLEET, VIRTUAL_HARVESTER_PROVIDER } from '@shell/config/types';
|
|
11
14
|
|
|
12
15
|
interface Resource extends BundleDeploymentResource {
|
|
13
16
|
state: string,
|
|
@@ -17,15 +20,6 @@ type Labels = {
|
|
|
17
20
|
[key: string]: string,
|
|
18
21
|
}
|
|
19
22
|
|
|
20
|
-
interface StatesCounter { [state: string]: number }
|
|
21
|
-
|
|
22
|
-
function incr(counter: StatesCounter, state: string) {
|
|
23
|
-
if (!counter[state]) {
|
|
24
|
-
counter[state] = 0;
|
|
25
|
-
}
|
|
26
|
-
counter[state]++;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
23
|
function resourceKey(r: BundleResourceKey): string {
|
|
30
24
|
return `${ r.kind }/${ r.namespace }/${ r.name }`;
|
|
31
25
|
}
|
|
@@ -38,7 +32,139 @@ function conditionIsTrue(conditions: Condition[] | undefined, type: string): boo
|
|
|
38
32
|
return !!conditions.find((c) => c.type === type && c.status.toLowerCase() === 'true');
|
|
39
33
|
}
|
|
40
34
|
|
|
35
|
+
class Application {
|
|
36
|
+
excludeHarvesterRule = {
|
|
37
|
+
clusterSelector: {
|
|
38
|
+
matchExpressions: [{
|
|
39
|
+
key: CAPI.PROVIDER,
|
|
40
|
+
operator: 'NotIn',
|
|
41
|
+
values: [
|
|
42
|
+
VIRTUAL_HARVESTER_PROVIDER
|
|
43
|
+
],
|
|
44
|
+
}],
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
getTargetMode(targets: Target[], namespace: string): TargetMode {
|
|
49
|
+
if (namespace === 'fleet-local') {
|
|
50
|
+
return 'local';
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (!targets.length) {
|
|
54
|
+
return 'none';
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
let mode: TargetMode = 'all';
|
|
58
|
+
|
|
59
|
+
for (const target of targets) {
|
|
60
|
+
const {
|
|
61
|
+
clusterName,
|
|
62
|
+
clusterSelector,
|
|
63
|
+
clusterGroup,
|
|
64
|
+
clusterGroupSelector,
|
|
65
|
+
} = target;
|
|
66
|
+
|
|
67
|
+
if (clusterGroup || clusterGroupSelector) {
|
|
68
|
+
return 'advanced';
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (clusterName) {
|
|
72
|
+
mode = 'clusters';
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (!isEmpty(clusterSelector)) {
|
|
76
|
+
mode = 'clusters';
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const normalized = [...targets].map((target) => {
|
|
81
|
+
delete target.name;
|
|
82
|
+
|
|
83
|
+
return target;
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
// Check if targets contains only harvester rule after name normalizing
|
|
87
|
+
if (isEqual(normalized, [this.excludeHarvesterRule])) {
|
|
88
|
+
mode = 'all';
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return mode;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
41
95
|
class Fleet {
|
|
96
|
+
resourceIcons = {
|
|
97
|
+
[FLEET.GIT_REPO]: 'icon icon-github',
|
|
98
|
+
[FLEET.HELM_OP]: 'icon icon-helm',
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
dashboardIcons = {
|
|
102
|
+
[FLEET.GIT_REPO]: 'icon icon-git',
|
|
103
|
+
[FLEET.HELM_OP]: 'icon icon-helm',
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
dashboardStates: FleetDashboardState[] = [
|
|
107
|
+
{
|
|
108
|
+
index: 0,
|
|
109
|
+
id: 'error',
|
|
110
|
+
label: 'Error',
|
|
111
|
+
color: '#F64747',
|
|
112
|
+
icon: 'icon icon-error',
|
|
113
|
+
stateBackground: 'bg-error'
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
index: 1,
|
|
117
|
+
id: 'warning',
|
|
118
|
+
label: 'Warning',
|
|
119
|
+
color: '#DAC342',
|
|
120
|
+
icon: 'icon icon-warning',
|
|
121
|
+
stateBackground: 'bg-warning'
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
index: 2,
|
|
125
|
+
id: 'success',
|
|
126
|
+
label: 'Active',
|
|
127
|
+
color: '#5D995D',
|
|
128
|
+
icon: 'icon icon-checkmark',
|
|
129
|
+
stateBackground: 'bg-success'
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
index: 3,
|
|
133
|
+
id: 'info',
|
|
134
|
+
label: 'Pending',
|
|
135
|
+
color: '#3d98d3',
|
|
136
|
+
icon: 'icon icon-warning',
|
|
137
|
+
stateBackground: 'bg-info'
|
|
138
|
+
},
|
|
139
|
+
];
|
|
140
|
+
|
|
141
|
+
Application = new Application();
|
|
142
|
+
|
|
143
|
+
GIT_HTTPS_REGEX = /^https?:\/\/github\.com\/(.*?)(\.git)?\/*$/;
|
|
144
|
+
GIT_SSH_REGEX = /^git@github\.com:.*\.git$/;
|
|
145
|
+
HTTP_REGEX = /^(https?:\/\/[^\s]+)$/;
|
|
146
|
+
OCI_REGEX = /^oci:\/\//;
|
|
147
|
+
|
|
148
|
+
quacksLikeAHash(str: string) {
|
|
149
|
+
if (str.match(/^[a-f0-9]{40,}$/i)) {
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
parseSSHUrl(url: string) {
|
|
157
|
+
const parts = (url || '').split(':');
|
|
158
|
+
|
|
159
|
+
const sshUserAndHost = parts[0];
|
|
160
|
+
const repoPath = parts[1]?.replace('.git', '');
|
|
161
|
+
|
|
162
|
+
return {
|
|
163
|
+
sshUserAndHost,
|
|
164
|
+
repoPath
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
|
|
42
168
|
resourceId(r: BundleResourceKey): string {
|
|
43
169
|
return r.namespace ? `${ r.namespace }/${ r.name }` : r.name;
|
|
44
170
|
}
|
|
@@ -57,6 +183,19 @@ class Fleet {
|
|
|
57
183
|
return `${ r.apiVersion.split('/', 2)[0] }.${ type }`;
|
|
58
184
|
}
|
|
59
185
|
|
|
186
|
+
detailLocation(r: Resource, mgmtClusterName: string): any {
|
|
187
|
+
return mapStateToEnum(r.state) === STATES_ENUM.MISSING ? undefined : {
|
|
188
|
+
name: `c-cluster-product-resource${ r.namespace ? '-namespace' : '' }-id`,
|
|
189
|
+
params: {
|
|
190
|
+
product: EXPLORER_NAME,
|
|
191
|
+
cluster: mgmtClusterName,
|
|
192
|
+
resource: this.resourceType(r),
|
|
193
|
+
namespace: r.namespace,
|
|
194
|
+
id: r.name,
|
|
195
|
+
},
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
|
|
60
199
|
/**
|
|
61
200
|
* resourcesFromBundleDeploymentStatus extracts the list of resources deployed by a BundleDeployment
|
|
62
201
|
*/
|
|
@@ -94,68 +233,6 @@ class Fleet {
|
|
|
94
233
|
return modified.concat(Object.values(resources));
|
|
95
234
|
}
|
|
96
235
|
|
|
97
|
-
/**
|
|
98
|
-
* resourcesFromBundleStatus extracts the list of resources deployed by a Bundle
|
|
99
|
-
*/
|
|
100
|
-
resourcesFromBundleStatus(status: BundleStatus): Resource[] {
|
|
101
|
-
// The state of every resource is spread all over the bundle status.
|
|
102
|
-
// resourceKey contains one entry per resource AND cluster (built by Fleet from all the child BundleDeployments).
|
|
103
|
-
// However, those entries do not contain the cluster that they belong to, leading to duplicate entries
|
|
104
|
-
|
|
105
|
-
// 1. Fold resourceKey by using a unique key, initializing counters for multiple occurrences of the same resource
|
|
106
|
-
const resources = (status.resourceKey || []).reduce((res, r) => {
|
|
107
|
-
const k = resourceKey(r);
|
|
108
|
-
|
|
109
|
-
if (!res[k]) {
|
|
110
|
-
res[k] = { r, count: {} };
|
|
111
|
-
}
|
|
112
|
-
incr(res[k].count, STATES_ENUM.READY);
|
|
113
|
-
|
|
114
|
-
return res;
|
|
115
|
-
}, {} as { [resourceKey: string]: { r: BundleResourceKey, count: StatesCounter } });
|
|
116
|
-
|
|
117
|
-
// 2. Non-ready resources are counted differently and may also appear in resourceKey, depending on their state
|
|
118
|
-
for (const bundle of status.summary?.nonReadyResources || []) {
|
|
119
|
-
for (const r of bundle.modifiedStatus || []) {
|
|
120
|
-
const k = resourceKey(r);
|
|
121
|
-
|
|
122
|
-
if (!resources[k]) {
|
|
123
|
-
resources[k] = { r, count: {} };
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
if (r.missing) {
|
|
127
|
-
incr(resources[k].count, STATES_ENUM.MISSING);
|
|
128
|
-
} else if (r.delete) {
|
|
129
|
-
resources[k].count[STATES_ENUM.READY]--;
|
|
130
|
-
incr(resources[k].count, STATES_ENUM.ORPHANED);
|
|
131
|
-
} else {
|
|
132
|
-
resources[k].count[STATES_ENUM.READY]--;
|
|
133
|
-
incr(resources[k].count, STATES_ENUM.MODIFIED);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
for (const r of bundle.nonReadyStatus || []) {
|
|
137
|
-
const k = resourceKey(r);
|
|
138
|
-
const state = r.summary?.state || STATES_ENUM.UNKNOWN;
|
|
139
|
-
|
|
140
|
-
resources[k].count[STATES_ENUM.READY]--;
|
|
141
|
-
incr(resources[k].count, state);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
// 3. Unfold back to an array of resources for display
|
|
146
|
-
return Object.values(resources).reduce((res, e) => {
|
|
147
|
-
const { r, count } = e;
|
|
148
|
-
|
|
149
|
-
for (const state in count) {
|
|
150
|
-
for (let x = 0; x < count[state]; x++) {
|
|
151
|
-
res.push(Object.assign({ state }, r));
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
return res;
|
|
156
|
-
}, [] as Resource[]);
|
|
157
|
-
}
|
|
158
|
-
|
|
159
236
|
clusterIdFromBundleDeploymentLabels(labels?: Labels): string {
|
|
160
237
|
const clusterNamespace = labels?.[FLEET_LABELS.CLUSTER_NAMESPACE];
|
|
161
238
|
const clusterName = labels?.[FLEET_LABELS.CLUSTER];
|
|
@@ -184,6 +261,59 @@ class Fleet {
|
|
|
184
261
|
return STATES_ENUM.READY;
|
|
185
262
|
}
|
|
186
263
|
}
|
|
264
|
+
|
|
265
|
+
getResourcesDefaultState(labelGetter: (key: string, args: any, fallback: any) => Record<string, any>, stateKey: string): Record<string, FleetResourceState> {
|
|
266
|
+
return [
|
|
267
|
+
STATES_ENUM.READY,
|
|
268
|
+
STATES_ENUM.NOT_READY,
|
|
269
|
+
STATES_ENUM.WAIT_APPLIED,
|
|
270
|
+
STATES_ENUM.MODIFIED,
|
|
271
|
+
STATES_ENUM.MISSING,
|
|
272
|
+
STATES_ENUM.ORPHANED,
|
|
273
|
+
STATES_ENUM.UNKNOWN,
|
|
274
|
+
].reduce((acc: Record<string, any>, state) => {
|
|
275
|
+
acc[state] = {
|
|
276
|
+
count: 0,
|
|
277
|
+
color: STATES[state].color,
|
|
278
|
+
label: labelGetter(`${ stateKey }.${ state }`, null, STATES[state].label ),
|
|
279
|
+
status: state
|
|
280
|
+
};
|
|
281
|
+
|
|
282
|
+
return acc;
|
|
283
|
+
}, {});
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
getBundlesDefaultState(labelGetter: (key: string, args: any, fallback: any) => Record<string, any>, stateKey: string): Record<string, FleetResourceState> {
|
|
287
|
+
return [
|
|
288
|
+
STATES_ENUM.READY,
|
|
289
|
+
STATES_ENUM.INFO,
|
|
290
|
+
STATES_ENUM.WARNING,
|
|
291
|
+
STATES_ENUM.NOT_READY,
|
|
292
|
+
STATES_ENUM.ERROR,
|
|
293
|
+
STATES_ENUM.ERR_APPLIED,
|
|
294
|
+
STATES_ENUM.WAIT_APPLIED,
|
|
295
|
+
STATES_ENUM.UNKNOWN,
|
|
296
|
+
].reduce((acc: Record<string, any>, state) => {
|
|
297
|
+
acc[state] = {
|
|
298
|
+
count: 0,
|
|
299
|
+
color: STATES[state].color,
|
|
300
|
+
label: labelGetter(`${ stateKey }.${ state }`, null, STATES[state].label ),
|
|
301
|
+
status: state
|
|
302
|
+
};
|
|
303
|
+
|
|
304
|
+
return acc;
|
|
305
|
+
}, {});
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
getDashboardStateId(resource: { stateColor: string }): string {
|
|
309
|
+
return resource?.stateColor?.replace('text-', '') || 'warning';
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
getDashboardState(resource: { stateColor: string }): FleetDashboardState | {} {
|
|
313
|
+
const stateId = this.getDashboardStateId(resource);
|
|
314
|
+
|
|
315
|
+
return this.dashboardStates.find(({ id }) => stateId === id) || {};
|
|
316
|
+
}
|
|
187
317
|
}
|
|
188
318
|
|
|
189
319
|
const instance = new Fleet();
|