@rancher/shell 3.0.5-rc.5 → 3.0.5-rc.6
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 +1 -0
- package/assets/images/key.svg +17 -0
- package/assets/styles/base/_spacing.scss +2 -2
- package/assets/styles/global/_form.scss +1 -1
- package/assets/styles/global/_labeled-input.scss +1 -1
- package/assets/styles/themes/_dark.scss +3 -0
- package/assets/styles/themes/_light.scss +3 -0
- package/assets/styles/vendor/vue-select.scss +1 -1
- package/assets/translations/en-us.yaml +404 -64
- package/assets/translations/zh-hans.yaml +3 -4
- package/cloud-credential/gcp.vue +9 -1
- package/components/AppModal.vue +2 -0
- package/components/CodeMirror.vue +1 -1
- package/components/ConfigMapSettings/Settings.vue +377 -0
- package/components/ConfigMapSettings/index.vue +354 -0
- package/components/CruResource.vue +1 -2
- package/components/DetailText.vue +61 -11
- package/components/Drawer/Chrome.vue +116 -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 +82 -0
- package/components/Drawer/ResourceDetailDrawer/__tests__/helpers.test.ts +42 -0
- package/components/Drawer/ResourceDetailDrawer/composables.ts +50 -0
- package/components/Drawer/ResourceDetailDrawer/helpers.ts +10 -0
- package/components/Drawer/ResourceDetailDrawer/index.vue +110 -0
- package/components/GrowlManager.vue +16 -15
- package/components/IconOrSvg.vue +5 -0
- package/components/KeyValueView.vue +1 -1
- package/components/LocaleSelector.vue +9 -1
- package/components/ProgressBarMulti.vue +1 -0
- package/components/PromptModal.vue +6 -1
- package/components/RelatedResources.vue +4 -12
- package/components/Resource/Detail/Additional.vue +46 -0
- package/components/Resource/Detail/Metadata/Annotations/__tests__/index.test.ts +1 -1
- package/components/Resource/Detail/Metadata/Annotations/index.vue +5 -0
- package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/identifying-fields.test.ts +223 -0
- package/components/Resource/Detail/Metadata/IdentifyingInformation/composable.ts +37 -254
- package/components/Resource/Detail/Metadata/IdentifyingInformation/identifying-fields.ts +298 -0
- package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +27 -5
- package/components/Resource/Detail/Metadata/KeyValue.vue +25 -17
- package/components/Resource/Detail/Metadata/Labels/__tests__/index.test.ts +1 -1
- package/components/Resource/Detail/Metadata/Labels/index.vue +4 -0
- package/components/Resource/Detail/Metadata/__tests__/KeyValue.test.ts +1 -1
- package/components/Resource/Detail/Metadata/__tests__/Rectangle.test.ts +1 -1
- package/components/Resource/Detail/Metadata/__tests__/composables.test.ts +75 -0
- package/components/Resource/Detail/Metadata/composables.ts +60 -11
- package/components/Resource/Detail/Metadata/index.vue +12 -5
- package/components/Resource/Detail/Page.vue +15 -0
- package/components/Resource/Detail/ResourceRow.vue +37 -18
- 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/TitleBar/Title.vue +2 -1
- package/components/Resource/Detail/TitleBar/__tests__/Title.test.ts +1 -1
- package/components/Resource/Detail/TitleBar/__tests__/Top.test.ts +1 -1
- package/components/Resource/Detail/TitleBar/__tests__/composables.test.ts +63 -0
- package/components/Resource/Detail/TitleBar/__tests__/index.test.ts +1 -1
- package/components/Resource/Detail/TitleBar/composables.ts +44 -0
- package/components/Resource/Detail/TitleBar/index.vue +83 -11
- 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/__tests__/index.test.ts +26 -5
- package/components/ResourceDetail/index.vue +30 -16
- package/components/ResourceDetail/legacy.vue +18 -1
- package/components/ResourceList/Masthead.vue +6 -0
- package/components/ResourceYaml.vue +14 -1
- package/components/SlideInPanelManager.vue +46 -7
- package/components/StateDot/index.vue +28 -0
- package/components/Tabbed/index.vue +11 -15
- package/components/Wizard.vue +4 -2
- package/components/__tests__/ConfigMapSettings.test.ts +376 -0
- package/components/__tests__/GrowlManager.test.ts +0 -25
- package/components/auth/login/ldap.vue +1 -1
- package/components/fleet/FleetApplications.vue +0 -7
- 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 +8 -0
- package/components/fleet/FleetRepos.vue +1 -6
- package/components/fleet/FleetResources.vue +4 -5
- 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 +13 -13
- package/components/fleet/__tests__/FleetValuesFrom.test.ts +300 -0
- package/components/fleet/dashboard/ResourceCard.vue +1 -0
- package/components/fleet/dashboard/ResourceCardSummary.vue +1 -5
- package/components/fleet/dashboard/ResourceDetails.vue +8 -10
- package/components/fleet/dashboard/ResourcePanel.vue +15 -8
- package/components/form/ArrayList.vue +13 -2
- package/components/form/ChangePassword.vue +3 -1
- package/components/form/Footer.vue +10 -4
- package/components/form/KeyValue.vue +81 -43
- package/components/form/LabeledSelect.vue +56 -16
- package/components/form/Labels.vue +90 -17
- package/components/form/MatchExpressions.vue +46 -5
- package/components/form/NameNsDescription.vue +1 -1
- package/components/form/ResourceSelector.vue +1 -0
- package/components/form/ResourceTabs/index.vue +5 -0
- package/components/form/SecretSelector.vue +9 -2
- package/components/form/Select.vue +57 -19
- package/components/form/SimpleSecretSelector.vue +9 -2
- package/components/form/Taints.vue +21 -2
- package/components/form/UnitInput.vue +8 -0
- package/components/form/ValueFromResource.vue +1 -1
- package/components/form/__tests__/LabeledSelect.test.ts +8 -4
- package/components/form/__tests__/Labels.test.ts +360 -0
- package/components/form/__tests__/MatchExpressions.test.ts +16 -13
- package/components/form/__tests__/Select.test.ts +5 -2
- package/components/formatter/FleetApplicationSource.vue +1 -1
- package/components/formatter/WorkloadHealthScale.vue +1 -1
- package/components/google/AccountAccess.vue +211 -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 +70 -47
- package/components/nav/Header.vue +5 -1
- package/components/nav/NamespaceFilter.vue +13 -1
- package/components/nav/NotificationCenter/Notification.vue +510 -0
- package/components/nav/NotificationCenter/NotificationHeader.vue +112 -0
- package/components/nav/NotificationCenter/index.vue +148 -0
- package/composables/drawer.ts +26 -0
- package/composables/resources.test.ts +63 -0
- package/composables/resources.ts +38 -0
- package/composables/useIsNewDetailPageEnabled.ts +17 -0
- package/config/labels-annotations.js +6 -0
- package/config/product/auth.js +16 -1
- package/config/product/{cis.js → compliance.js} +23 -26
- package/config/product/explorer.js +5 -1
- package/config/product/fleet.js +7 -0
- package/config/product/settings.js +22 -11
- package/config/query-params.js +3 -0
- package/config/roles.ts +1 -1
- package/config/router/navigation-guards/authentication.js +51 -2
- package/config/router/routes.js +27 -31
- package/config/settings.ts +21 -3
- package/config/store.js +2 -0
- package/config/system-namespaces.js +1 -1
- package/config/table-headers.js +2 -2
- package/config/types.js +15 -6
- package/core/plugin.ts +32 -7
- package/core/types.ts +18 -1
- package/detail/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +22 -18
- package/detail/management.cattle.io.fleetworkspace.vue +18 -27
- package/detail/management.cattle.io.oidcclient.vue +369 -0
- package/detail/node.vue +2 -2
- package/detail/pod.vue +2 -2
- package/detail/service.vue +10 -1
- package/detail/workload/index.vue +8 -2
- package/dialog/ExtensionCatalogUninstallDialog.vue +7 -4
- package/dialog/GenericPrompt.vue +1 -1
- package/dialog/ImportDialog.vue +8 -8
- package/dialog/OidcClientSecretDialog.vue +117 -0
- package/edit/__tests__/cis.cattle.io.clusterscan.test.ts +3 -3
- package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +5 -2
- 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 +4 -1
- package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -0
- package/edit/fleet.cattle.io.gitrepo.vue +44 -222
- package/edit/fleet.cattle.io.helmop.vue +44 -269
- 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 +1 -0
- package/edit/management.cattle.io.fleetworkspace.vue +1 -0
- 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 +30 -30
- 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 +1 -0
- package/edit/networking.istio.io.destinationrule/index.vue +4 -1
- package/edit/networking.k8s.io.ingress/index.vue +4 -1
- package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +7 -2
- package/edit/networking.k8s.io.networkpolicy/index.vue +6 -2
- package/edit/node.vue +1 -0
- package/edit/persistentvolume/index.vue +4 -1
- package/edit/provisioning.cattle.io.cluster/rke2.vue +418 -382
- package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +27 -27
- package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +5 -0
- package/edit/resources.cattle.io.restore.vue +1 -1
- package/edit/secret/index.vue +1 -0
- package/edit/service.vue +4 -1
- package/edit/serviceaccount.vue +4 -1
- package/edit/storage.k8s.io.storageclass/index.vue +4 -1
- package/edit/workload/index.vue +5 -0
- package/list/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +2 -2
- package/list/management.cattle.io.oidcclient.vue +108 -0
- package/list/node.vue +2 -0
- package/machine-config/amazonec2.vue +3 -24
- package/machine-config/components/GCEImage.vue +374 -0
- package/machine-config/google.vue +617 -0
- package/mixins/__tests__/brand.spec.ts +170 -0
- package/mixins/brand.js +16 -17
- package/mixins/create-edit-view/index.js +5 -0
- package/mixins/resource-fetch-api-pagination.js +16 -0
- package/mixins/vue-select-overrides.js +1 -0
- 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 +8 -79
- package/models/fleet.cattle.io.cluster.js +11 -0
- package/models/fleet.cattle.io.gitrepo.js +2 -2
- package/models/fleet.cattle.io.helmop.js +9 -39
- package/models/management.cattle.io.fleetworkspace.js +2 -1
- package/models/management.cattle.io.oidcclient.js +18 -0
- package/models/management.cattle.io.registration.js +3 -0
- package/models/provisioning.cattle.io.cluster.js +5 -5
- package/models/service.js +4 -0
- package/models/workload.js +5 -0
- package/package.json +1 -1
- package/pages/about.vue +4 -58
- package/pages/auth/login.vue +1 -1
- package/pages/c/_cluster/apps/charts/AddRepoLink.vue +0 -1
- package/pages/c/_cluster/apps/charts/index.vue +285 -81
- package/pages/c/_cluster/auth/user.retention/index.vue +87 -78
- package/pages/c/_cluster/explorer/index.vue +3 -3
- package/pages/c/_cluster/explorer/tools/pages/_page.vue +0 -1
- package/pages/c/_cluster/fleet/application/create.vue +3 -2
- package/pages/c/_cluster/fleet/index.vue +94 -56
- package/pages/c/_cluster/fleet/settings/index.vue +229 -0
- package/pages/c/_cluster/longhorn/index.vue +5 -2
- package/pages/c/_cluster/uiplugins/CatalogList/index.vue +16 -1
- package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +2 -2
- package/pages/explorer/resource/detail/configmap.vue +30 -7
- package/pages/explorer/resource/detail/secret.vue +50 -0
- package/pages/home.vue +9 -55
- package/pages/support/index.vue +4 -6
- package/plugins/dashboard-store/actions.js +19 -5
- package/plugins/dashboard-store/getters.js +4 -0
- package/plugins/dashboard-store/resource-class.js +16 -2
- package/plugins/steve/steve-pagination-utils.ts +26 -18
- package/plugins/steve/subscribe.js +6 -1
- package/rancher-components/Banner/Banner.vue +13 -0
- package/rancher-components/Form/Checkbox/Checkbox.vue +9 -4
- package/rancher-components/Form/LabeledInput/LabeledInput.vue +1 -1
- package/rancher-components/LabeledTooltip/LabeledTooltip.vue +1 -0
- package/rancher-components/RcItemCard/RcItemCard.vue +8 -3
- package/store/auth.js +2 -0
- package/store/catalog.js +23 -1
- package/store/growl.js +97 -8
- package/store/index.js +6 -0
- package/store/notifications.ts +426 -0
- package/store/prefs.js +0 -1
- package/store/type-map.js +19 -16
- package/store/uiplugins.ts +15 -1
- package/types/fleet.d.ts +24 -0
- package/types/notifications/index.ts +74 -0
- package/types/shell/index.d.ts +46 -32
- package/types/store/dashboard-store.types.ts +16 -0
- package/utils/__tests__/fleet.test.ts +148 -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 +9 -2
- package/utils/crypto/encryption.ts +103 -0
- package/utils/cspAdaptor.ts +51 -0
- package/utils/fleet.ts +54 -65
- package/utils/object.js +36 -0
- package/utils/pagination-utils.ts +1 -1
- package/utils/release-notes.ts +48 -0
- package/utils/selector-typed.ts +7 -2
- package/utils/string.js +24 -0
- package/utils/{time.js → time.ts} +25 -6
- package/utils/uiplugins.ts +22 -0
- package/utils/validators/formRules/index.ts +3 -0
- package/components/Resource/Detail/TitleBar/composable.ts +0 -31
- package/config/product/legacy.js +0 -62
- 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/components/ResourceDetail/{Masthead.vue → Masthead/legacy.vue} +0 -0
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { mount } from '@vue/test-utils';
|
|
2
|
+
import { CATALOG, MANAGEMENT } from '@shell/config/types';
|
|
3
|
+
import Brand from '@shell/mixins/brand';
|
|
4
|
+
|
|
5
|
+
describe('brandMixin', () => {
|
|
6
|
+
const createWrapper = (vaiOn = false) => {
|
|
7
|
+
const Component = {
|
|
8
|
+
template: '<div></div>',
|
|
9
|
+
mixins: [Brand],
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
const data = {
|
|
13
|
+
apps: null, haveAppsAndSettings: null, canPaginate: false
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const store = {
|
|
17
|
+
dispatch: (action, ...args) => {
|
|
18
|
+
switch (action) {
|
|
19
|
+
case 'management/findAll':
|
|
20
|
+
if (args[0] === MANAGEMENT.SETTING) {
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
if (args[0] === CATALOG.APP) {
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
getters: {
|
|
30
|
+
'auth/loggedIn': () => true,
|
|
31
|
+
'auth/fromHeader': () => false,
|
|
32
|
+
'management/byId': () => undefined,
|
|
33
|
+
'management/canList': () => () => true,
|
|
34
|
+
'management/schemaFor': (type: string) => {
|
|
35
|
+
switch (type) {
|
|
36
|
+
case MANAGEMENT.SETTING:
|
|
37
|
+
return { linkFor: () => undefined };
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
'management/generation': () => undefined,
|
|
41
|
+
'management/paginationEnabled': () => vaiOn,
|
|
42
|
+
'management/all': (type: string) => {
|
|
43
|
+
switch (type) {
|
|
44
|
+
case MANAGEMENT.SETTING:
|
|
45
|
+
return [];
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
const wrapper = mount(
|
|
52
|
+
Component,
|
|
53
|
+
{
|
|
54
|
+
data: () => data,
|
|
55
|
+
global: { mocks: { $store: store } }
|
|
56
|
+
});
|
|
57
|
+
const spyManagementFindAll = jest.spyOn(store, 'dispatch');
|
|
58
|
+
|
|
59
|
+
return {
|
|
60
|
+
wrapper,
|
|
61
|
+
store,
|
|
62
|
+
spyManagementFindAll,
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
describe('should make correct requests', () => {
|
|
67
|
+
it('vai off', async() => {
|
|
68
|
+
const { wrapper, spyManagementFindAll } = createWrapper(false);
|
|
69
|
+
|
|
70
|
+
// NOTE - wrapper.vm.$options.fetch() doesn't work
|
|
71
|
+
await wrapper.vm.$options.fetch.apply(wrapper.vm);
|
|
72
|
+
|
|
73
|
+
// wrapper.vm.$nextTick();
|
|
74
|
+
expect(spyManagementFindAll).toHaveBeenNthCalledWith(1, 'management/findAll', {
|
|
75
|
+
type: MANAGEMENT.SETTING,
|
|
76
|
+
opt: {
|
|
77
|
+
load: 'multi', redirectUnauthorized: false, url: `/v1/${ MANAGEMENT.SETTING }s`
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
expect(spyManagementFindAll).toHaveBeenNthCalledWith(2, 'management/findAll', { type: CATALOG.APP });
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it('vai on', async() => {
|
|
84
|
+
const { wrapper, spyManagementFindAll } = createWrapper(true);
|
|
85
|
+
|
|
86
|
+
// NOTE - wrapper.vm.$options.fetch() doesn't work
|
|
87
|
+
await wrapper.vm.$options.fetch.apply(wrapper.vm);
|
|
88
|
+
|
|
89
|
+
expect(spyManagementFindAll).toHaveBeenNthCalledWith(1, 'management/findAll', {
|
|
90
|
+
type: MANAGEMENT.SETTING,
|
|
91
|
+
opt: {
|
|
92
|
+
load: 'multi', url: `/v1/${ MANAGEMENT.SETTING }s`, redirectUnauthorized: false
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
expect(spyManagementFindAll).toHaveBeenNthCalledWith(2, 'management/findPage', {
|
|
96
|
+
type: CATALOG.APP,
|
|
97
|
+
opt: {
|
|
98
|
+
pagination: {
|
|
99
|
+
filters: [{
|
|
100
|
+
equals: true,
|
|
101
|
+
fields: [{
|
|
102
|
+
equals: true, exact: true, field: 'metadata.name', value: 'rancher-csp-adapter'
|
|
103
|
+
}, {
|
|
104
|
+
equals: true, exact: true, field: 'metadata.name', value: 'rancher-csp-billing-adapter'
|
|
105
|
+
}],
|
|
106
|
+
param: 'filter'
|
|
107
|
+
}],
|
|
108
|
+
labelSelector: undefined,
|
|
109
|
+
page: null,
|
|
110
|
+
pageSize: null,
|
|
111
|
+
projectsOrNamespaces: [],
|
|
112
|
+
sort: []
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
describe('cspAdapter', () => {
|
|
120
|
+
it('should have correct csp values (off)', async() => {
|
|
121
|
+
const { wrapper, store } = createWrapper();
|
|
122
|
+
|
|
123
|
+
const spyManagementFindAll = jest.spyOn(store, 'dispatch').mockImplementation((_, options) => {
|
|
124
|
+
const { type } = options as any;
|
|
125
|
+
|
|
126
|
+
if (type === MANAGEMENT.SETTING) {
|
|
127
|
+
return Promise.resolve([]);
|
|
128
|
+
}
|
|
129
|
+
if (type === CATALOG.APP) {
|
|
130
|
+
return Promise.resolve([]);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return Promise.reject(new Error('reason'));
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
// NOTE - wrapper.vm.$options.fetch() doesn't work
|
|
137
|
+
await wrapper.vm.$options.fetch.apply(wrapper.vm, []);
|
|
138
|
+
|
|
139
|
+
expect(spyManagementFindAll).toHaveBeenCalledTimes(2);
|
|
140
|
+
|
|
141
|
+
expect(wrapper.vm.canCalcCspAdapter).toBeTruthy();
|
|
142
|
+
expect(wrapper.vm.cspAdapter).toBeFalsy();
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
it.each(['rancher-csp-adapter', 'rancher-csp-billing-adapter'])('should have correct csp values (on - %p )', async(chartName) => {
|
|
146
|
+
const { wrapper, store } = createWrapper();
|
|
147
|
+
|
|
148
|
+
const spyManagementFindAll = jest.spyOn(store, 'dispatch').mockImplementation((_, options) => {
|
|
149
|
+
const { type } = options as any;
|
|
150
|
+
|
|
151
|
+
if (type === MANAGEMENT.SETTING) {
|
|
152
|
+
return Promise.resolve([]);
|
|
153
|
+
}
|
|
154
|
+
if (type === CATALOG.APP) {
|
|
155
|
+
return Promise.resolve([{ metadata: { name: chartName } }]);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return Promise.reject(new Error('reason'));
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
// NOTE - wrapper.vm.$options.fetch() doesn't work
|
|
162
|
+
await wrapper.vm.$options.fetch.apply(wrapper.vm, []);
|
|
163
|
+
|
|
164
|
+
expect(spyManagementFindAll).toHaveBeenCalledTimes(2);
|
|
165
|
+
|
|
166
|
+
expect(wrapper.vm.canCalcCspAdapter).toBeTruthy();
|
|
167
|
+
expect(wrapper.vm.cspAdapter).toBeTruthy();
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
});
|
package/mixins/brand.js
CHANGED
|
@@ -1,39 +1,38 @@
|
|
|
1
1
|
import { mapGetters } from 'vuex';
|
|
2
|
-
import {
|
|
2
|
+
import { MANAGEMENT } from '@shell/config/types';
|
|
3
3
|
import { SETTING } from '@shell/config/settings';
|
|
4
4
|
import { createCssVars } from '@shell/utils/color';
|
|
5
5
|
import { setTitle } from '@shell/config/private-label';
|
|
6
6
|
import { setFavIcon, haveSetFavIcon } from '@shell/utils/favicon';
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
export const hasCspAdapter = (apps) => {
|
|
11
|
-
return apps?.find((a) => cspAdaptorApp.includes(a.metadata?.name));
|
|
12
|
-
};
|
|
7
|
+
import { allHash } from '@shell/utils/promise';
|
|
8
|
+
import { fetchInitialSettings } from '@shell/utils/settings';
|
|
9
|
+
import CspAdapterUtils from '@shell/utils/cspAdaptor';
|
|
13
10
|
|
|
14
11
|
export default {
|
|
15
12
|
async fetch() {
|
|
16
|
-
// For the login page, the schemas won't be loaded - we don't need the apps in this case
|
|
17
13
|
try {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
14
|
+
const res = await allHash({
|
|
15
|
+
// Ensure we read the settings even when we are not authenticated
|
|
16
|
+
globalSettings: fetchInitialSettings(this.$store),
|
|
17
|
+
apps: CspAdapterUtils.fetchCspAdaptorApp(this.$store),
|
|
18
|
+
});
|
|
22
19
|
|
|
23
|
-
// Ensure we read the settings even when we are not authenticated
|
|
24
|
-
try {
|
|
25
20
|
// The favicon is implicitly dependent on the initial settings having already been fetched
|
|
26
21
|
if (!haveSetFavIcon()) {
|
|
27
22
|
setFavIcon(this.$store);
|
|
28
23
|
}
|
|
29
|
-
|
|
24
|
+
|
|
25
|
+
this.apps = res.apps;
|
|
26
|
+
} catch (e) { }
|
|
30
27
|
|
|
31
28
|
// Setting this up front will remove `computed` churn, and we only care that we've initialised them
|
|
32
29
|
this.haveAppsAndSettings = !!this.apps && !!this.globalSettings;
|
|
33
30
|
},
|
|
34
31
|
|
|
35
32
|
data() {
|
|
36
|
-
return {
|
|
33
|
+
return {
|
|
34
|
+
apps: null, haveAppsAndSettings: null, canPaginate: false
|
|
35
|
+
};
|
|
37
36
|
},
|
|
38
37
|
|
|
39
38
|
computed: {
|
|
@@ -87,7 +86,7 @@ export default {
|
|
|
87
86
|
// Note! this used to be `findBy(this.app)` however for that case we lost reactivity on the collection
|
|
88
87
|
// (computed fires before fetch, fetch happens and update apps, computed would not fire again - even with vue.set)
|
|
89
88
|
// So use `.find` in method instead
|
|
90
|
-
return hasCspAdapter(this.apps);
|
|
89
|
+
return CspAdapterUtils.hasCspAdapter({ $store: this.$store, apps: this.apps });
|
|
91
90
|
},
|
|
92
91
|
|
|
93
92
|
canCalcCspAdapter() {
|
|
@@ -7,6 +7,7 @@ import paginationUtils from '@shell/utils/pagination-utils';
|
|
|
7
7
|
import debounce from 'lodash/debounce';
|
|
8
8
|
import { PaginationParamFilter, PaginationFilterField, PaginationArgs } from '@shell/types/store/pagination.types';
|
|
9
9
|
import stevePaginationUtils from '@shell/plugins/steve/steve-pagination-utils';
|
|
10
|
+
import { STEVE_WATCH_MODE } from '@shell/types/store/subscribe.types';
|
|
10
11
|
|
|
11
12
|
/**
|
|
12
13
|
* Companion mixin used with `resource-fetch` for `ResourceList` to determine if the user needs to filter the list by a single namespace
|
|
@@ -350,4 +351,19 @@ export default {
|
|
|
350
351
|
});
|
|
351
352
|
}
|
|
352
353
|
},
|
|
354
|
+
|
|
355
|
+
unmounted() {
|
|
356
|
+
if (this.havePaginated) {
|
|
357
|
+
// of type @STEVE_WATCH_PARAMS
|
|
358
|
+
const watchArgs = {
|
|
359
|
+
type: this.resource,
|
|
360
|
+
mode: STEVE_WATCH_MODE.RESOURCE_CHANGES,
|
|
361
|
+
};
|
|
362
|
+
|
|
363
|
+
this.$store.dispatch(`${ this.inStore }/forgetType`, this.resource, (watchParams) => {
|
|
364
|
+
return watchParams.type === watchArgs.type &&
|
|
365
|
+
watchParams.mode === watchArgs.type.mode;
|
|
366
|
+
});
|
|
367
|
+
}
|
|
368
|
+
}
|
|
353
369
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { NAME as PRODUCT_NAME } from '@shell/config/product/
|
|
2
|
-
import {
|
|
1
|
+
import { NAME as PRODUCT_NAME } from '@shell/config/product/compliance';
|
|
2
|
+
import { COMPLIANCE } from '@shell/config/types';
|
|
3
3
|
import { findBy } from '@shell/utils/array';
|
|
4
4
|
import { downloadFile, generateZip } from '@shell/utils/download';
|
|
5
5
|
import { get, isEmpty } from '@shell/utils/object';
|
|
@@ -53,7 +53,7 @@ export default class ClusterScan extends SteveModel {
|
|
|
53
53
|
action: 'downloadLatestReport',
|
|
54
54
|
enabled: this.hasReport,
|
|
55
55
|
icon: 'icon icon-fw icon-download',
|
|
56
|
-
label: t('
|
|
56
|
+
label: t('compliance.downloadReport'),
|
|
57
57
|
total: 1,
|
|
58
58
|
};
|
|
59
59
|
|
|
@@ -61,7 +61,7 @@ export default class ClusterScan extends SteveModel {
|
|
|
61
61
|
action: 'downloadAllReports',
|
|
62
62
|
enabled: this.hasReport,
|
|
63
63
|
icon: 'icon icon-fw icon-download',
|
|
64
|
-
label: t('
|
|
64
|
+
label: t('compliance.downloadAllReports'),
|
|
65
65
|
total: 1,
|
|
66
66
|
};
|
|
67
67
|
|
|
@@ -69,7 +69,7 @@ export default class ClusterScan extends SteveModel {
|
|
|
69
69
|
out.unshift({ divider: true });
|
|
70
70
|
if (this.spec?.scheduledScanConfig?.cronSchedule) {
|
|
71
71
|
out.unshift(downloadAllReports);
|
|
72
|
-
downloadReport.label = t('
|
|
72
|
+
downloadReport.label = t('compliance.downloadLatestReport');
|
|
73
73
|
}
|
|
74
74
|
out.unshift(downloadReport);
|
|
75
75
|
}
|
|
@@ -92,7 +92,7 @@ export default class ClusterScan extends SteveModel {
|
|
|
92
92
|
get hasReports() {
|
|
93
93
|
const { relationships = [] } = this.metadata;
|
|
94
94
|
|
|
95
|
-
const reportRel = findBy(relationships, 'toType',
|
|
95
|
+
const reportRel = findBy(relationships, 'toType', COMPLIANCE.REPORT);
|
|
96
96
|
|
|
97
97
|
return !!reportRel;
|
|
98
98
|
}
|
|
@@ -100,7 +100,7 @@ export default class ClusterScan extends SteveModel {
|
|
|
100
100
|
async getReports() {
|
|
101
101
|
const owned = await this.findOwned();
|
|
102
102
|
|
|
103
|
-
const reports = owned.filter((obj) => obj.type ===
|
|
103
|
+
const reports = owned.filter((obj) => obj.type === COMPLIANCE.REPORT) || [];
|
|
104
104
|
|
|
105
105
|
return sortBy(reports, 'metadata.creationTimestamp', true);
|
|
106
106
|
}
|
|
@@ -158,7 +158,7 @@ export default class ClusterScan extends SteveModel {
|
|
|
158
158
|
return {
|
|
159
159
|
name: 'c-cluster-product-resource-id',
|
|
160
160
|
params: {
|
|
161
|
-
resource:
|
|
161
|
+
resource: COMPLIANCE.CLUSTER_SCAN_PROFILE,
|
|
162
162
|
product: PRODUCT_NAME,
|
|
163
163
|
id: this.status?.lastRunScanProfileName
|
|
164
164
|
}
|
|
@@ -3,7 +3,7 @@ import SteveModel from '@shell/plugins/steve/steve-class';
|
|
|
3
3
|
|
|
4
4
|
export default class ClusterScanBenchmark extends SteveModel {
|
|
5
5
|
warnDeletionMessage(toRemove = []) {
|
|
6
|
-
return this.$rootGetters['i18n/t']('
|
|
6
|
+
return this.$rootGetters['i18n/t']('compliance.deleteBenchmarkWarning', { count: toRemove.length });
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
get isDefault() {
|
package/models/{cis.cattle.io.clusterscanprofile.js → compliance.cattle.io.clusterscanprofile.js}
RENAMED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
|
|
2
2
|
import SteveModel from '@shell/plugins/steve/steve-class';
|
|
3
|
-
import { NAME as PRODUCT_NAME } from '@shell/config/product/
|
|
4
|
-
import {
|
|
3
|
+
import { NAME as PRODUCT_NAME } from '@shell/config/product/compliance';
|
|
4
|
+
import { COMPLIANCE } from '@shell/config/types';
|
|
5
5
|
|
|
6
|
-
export default class
|
|
6
|
+
export default class ComplianceProfile extends SteveModel {
|
|
7
7
|
warnDeletionMessage(toRemove = []) {
|
|
8
|
-
return this.$rootGetters['i18n/t']('
|
|
8
|
+
return this.$rootGetters['i18n/t']('compliance.deleteProfileWarning', { count: toRemove.length });
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
get numberTestsSkipped() {
|
|
@@ -19,7 +19,7 @@ export default class CISProfile extends SteveModel {
|
|
|
19
19
|
return {
|
|
20
20
|
name: 'c-cluster-product-resource-id',
|
|
21
21
|
params: {
|
|
22
|
-
resource:
|
|
22
|
+
resource: COMPLIANCE.BENCHMARK,
|
|
23
23
|
product: PRODUCT_NAME,
|
|
24
24
|
id: this.spec?.benchmarkVersion
|
|
25
25
|
}
|
package/models/{cis.cattle.io.clusterscanreport.js → compliance.cattle.io.clusterscanreport.js}
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { compare } from '@shell/utils/sort';
|
|
2
2
|
import SteveModel from '@shell/plugins/steve/steve-class';
|
|
3
3
|
|
|
4
|
-
export default class
|
|
4
|
+
export default class ComplianceReport extends SteveModel {
|
|
5
5
|
get aggregatedTests() {
|
|
6
6
|
const json = this.parsedReport;
|
|
7
7
|
const results = json?.results;
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import jsyaml from 'js-yaml';
|
|
1
|
+
import { matching, convertSelectorObj } from '@shell/utils/selector';
|
|
3
2
|
import isEmpty from 'lodash/isEmpty';
|
|
4
3
|
import { escapeHtml } from '@shell/utils/string';
|
|
5
4
|
import { FLEET, MANAGEMENT } from '@shell/config/types';
|
|
@@ -139,85 +138,11 @@ export default class FleetApplication extends SteveModel {
|
|
|
139
138
|
}
|
|
140
139
|
|
|
141
140
|
get targetInfo() {
|
|
142
|
-
|
|
143
|
-
let cluster = null;
|
|
144
|
-
let clusterGroup = null;
|
|
145
|
-
let advanced = null;
|
|
146
|
-
|
|
147
|
-
const targets = this.spec.targets || [];
|
|
148
|
-
|
|
149
|
-
advanced = jsyaml.dump(targets);
|
|
150
|
-
|
|
151
|
-
if (advanced === '[]\n') {
|
|
152
|
-
advanced = `# - name:
|
|
153
|
-
# clusterSelector:
|
|
154
|
-
# matchLabels:
|
|
155
|
-
# foo: bar
|
|
156
|
-
# matchExpressions:
|
|
157
|
-
# - key: foo
|
|
158
|
-
# op: In
|
|
159
|
-
# values: [bar, baz]
|
|
160
|
-
# clusterGroup: foo
|
|
161
|
-
# clusterGroupSelector:
|
|
162
|
-
# matchLabels:
|
|
163
|
-
# foo: bar
|
|
164
|
-
# matchExpressions:
|
|
165
|
-
# - key: foo
|
|
166
|
-
# op: In
|
|
167
|
-
# values: [bar, baz]
|
|
168
|
-
`;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
if (this.metadata.namespace === 'fleet-local') {
|
|
172
|
-
mode = 'local';
|
|
173
|
-
} else if (!targets.length) {
|
|
174
|
-
mode = 'none';
|
|
175
|
-
} else if (targets.length === 1) {
|
|
176
|
-
const target = targets[0];
|
|
177
|
-
|
|
178
|
-
if (Object.keys(target).length > 1) {
|
|
179
|
-
// There are multiple properties in a single target, so use the 'advanced' mode
|
|
180
|
-
// (otherwise any existing content is nuked for what we provide)
|
|
181
|
-
mode = 'advanced';
|
|
182
|
-
} else if (target.clusterGroup) {
|
|
183
|
-
clusterGroup = target.clusterGroup;
|
|
184
|
-
|
|
185
|
-
if (!mode) {
|
|
186
|
-
mode = 'clusterGroup';
|
|
187
|
-
}
|
|
188
|
-
} else if (target.clusterName) {
|
|
189
|
-
mode = 'cluster';
|
|
190
|
-
cluster = target.clusterName;
|
|
191
|
-
} else if (target.clusterSelector) {
|
|
192
|
-
if (Object.keys(target.clusterSelector).length === 0) {
|
|
193
|
-
mode = 'all';
|
|
194
|
-
} else {
|
|
195
|
-
const expressions = convert(target.clusterSelector.matchLabels, target.clusterSelector.matchExpressions);
|
|
196
|
-
|
|
197
|
-
if (expressions.length === 1 &&
|
|
198
|
-
expressions[0].key === FLEET_ANNOTATIONS.CLUSTER_NAME &&
|
|
199
|
-
expressions[0].operator === 'In' &&
|
|
200
|
-
expressions[0].values.length === 1
|
|
201
|
-
) {
|
|
202
|
-
cluster = expressions[0].values[0];
|
|
203
|
-
if (!mode) {
|
|
204
|
-
mode = 'cluster';
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
if (!mode) {
|
|
212
|
-
mode = 'advanced';
|
|
213
|
-
}
|
|
141
|
+
const mode = FleetUtils.Application.getTargetMode(this.spec.targets || [], this.metadata.namespace);
|
|
214
142
|
|
|
215
143
|
return {
|
|
216
144
|
mode,
|
|
217
145
|
modeDisplay: this.t(`fleet.gitRepo.targetDisplay."${ mode }"`),
|
|
218
|
-
cluster,
|
|
219
|
-
clusterGroup,
|
|
220
|
-
advanced
|
|
221
146
|
};
|
|
222
147
|
}
|
|
223
148
|
|
|
@@ -361,17 +286,21 @@ export default class FleetApplication extends SteveModel {
|
|
|
361
286
|
return this.status?.readyClusters || 0;
|
|
362
287
|
}
|
|
363
288
|
|
|
289
|
+
get meta() {
|
|
290
|
+
return this.currentRoute()?.meta || {};
|
|
291
|
+
}
|
|
292
|
+
|
|
364
293
|
get _detailLocation() {
|
|
365
294
|
return {
|
|
366
295
|
...super._detailLocation,
|
|
367
|
-
name:
|
|
296
|
+
name: this.meta.detailLocation || super._detailLocation.name
|
|
368
297
|
};
|
|
369
298
|
}
|
|
370
299
|
|
|
371
300
|
get doneOverride() {
|
|
372
301
|
return {
|
|
373
302
|
...super.listLocation,
|
|
374
|
-
name:
|
|
303
|
+
name: this.meta.doneOverride || super.listLocation.name
|
|
375
304
|
};
|
|
376
305
|
}
|
|
377
306
|
|
|
@@ -136,6 +136,17 @@ export default class FleetCluster extends SteveModel {
|
|
|
136
136
|
};
|
|
137
137
|
}
|
|
138
138
|
|
|
139
|
+
get helmOpsInfo() {
|
|
140
|
+
const ready = this.status?.readyHelmOps || 0;
|
|
141
|
+
const total = this.status?.desiredReadyHelmOps || 0;
|
|
142
|
+
|
|
143
|
+
return {
|
|
144
|
+
ready,
|
|
145
|
+
unready: total - ready,
|
|
146
|
+
total,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
|
|
139
150
|
get bundleInfo() {
|
|
140
151
|
const bundlesData = {
|
|
141
152
|
ready: 0,
|
|
@@ -118,10 +118,10 @@ export default class GitRepo extends FleetApplication {
|
|
|
118
118
|
|
|
119
119
|
get resourceIcon() {
|
|
120
120
|
if (this.github) {
|
|
121
|
-
return
|
|
121
|
+
return 'icon icon-github';
|
|
122
122
|
}
|
|
123
123
|
|
|
124
|
-
return
|
|
124
|
+
return FleetUtils.resourceIcons[FLEET.GIT_REPO];
|
|
125
125
|
}
|
|
126
126
|
|
|
127
127
|
get repoDisplay() {
|
|
@@ -57,34 +57,11 @@ export default class HelmOp extends FleetApplication {
|
|
|
57
57
|
enabled: !!this.links.update && !this.spec?.disablePolling
|
|
58
58
|
});
|
|
59
59
|
|
|
60
|
-
insertAt(out, 4, {
|
|
61
|
-
action: 'forceUpdate',
|
|
62
|
-
label: this.t('fleet.helmOp.actions.forceUpdate.label'),
|
|
63
|
-
icon: 'icon icon-refresh',
|
|
64
|
-
bulkable: true,
|
|
65
|
-
bulkAction: 'forceUpdateBulk',
|
|
66
|
-
enabled: !!this.links.update
|
|
67
|
-
});
|
|
68
|
-
|
|
69
60
|
insertAt(out, 5, { divider: true });
|
|
70
61
|
|
|
71
62
|
return out;
|
|
72
63
|
}
|
|
73
64
|
|
|
74
|
-
forceUpdate(resources = [this]) {
|
|
75
|
-
this.$dispatch('promptModal', {
|
|
76
|
-
componentProps: { helmOps: resources },
|
|
77
|
-
component: 'HelmOpForceUpdateDialog'
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
forceUpdateBulk(resources) {
|
|
82
|
-
this.$dispatch('promptModal', {
|
|
83
|
-
componentProps: { helmOps: resources },
|
|
84
|
-
component: 'HelmOpForceUpdateDialog'
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
|
|
88
65
|
get dashboardIcon() {
|
|
89
66
|
return FleetUtils.dashboardIcons[FLEET.HELM_OP];
|
|
90
67
|
}
|
|
@@ -124,7 +101,6 @@ export default class HelmOp extends FleetApplication {
|
|
|
124
101
|
|
|
125
102
|
repo = repo.replace(/.git$/, '');
|
|
126
103
|
repo = repo.replace(/^https:\/\//, '');
|
|
127
|
-
repo = repo.replace(/^oci:\/\//, '');
|
|
128
104
|
repo = repo.replace(/\/+$/, '');
|
|
129
105
|
|
|
130
106
|
return repo;
|
|
@@ -140,16 +116,16 @@ export default class HelmOp extends FleetApplication {
|
|
|
140
116
|
* chart: fleet-agent
|
|
141
117
|
* version: 0.12.1-beta.2
|
|
142
118
|
* oci:
|
|
143
|
-
*
|
|
119
|
+
* repo: oci://ghcr.io/rancher/fleet-test-configmap-chart
|
|
144
120
|
* version: the-tag
|
|
145
121
|
*/
|
|
146
122
|
get sourceType() {
|
|
147
|
-
if (this.spec.helm?.repo
|
|
148
|
-
return SOURCE_TYPE.
|
|
123
|
+
if (this.spec.helm?.repo?.startsWith('oci://')) {
|
|
124
|
+
return SOURCE_TYPE.OCI;
|
|
149
125
|
}
|
|
150
126
|
|
|
151
|
-
if (this.spec.helm?.chart
|
|
152
|
-
return SOURCE_TYPE.
|
|
127
|
+
if (this.spec.helm?.repo && this.spec.helm?.chart) {
|
|
128
|
+
return SOURCE_TYPE.REPO;
|
|
153
129
|
}
|
|
154
130
|
|
|
155
131
|
if (this.spec.helm?.chart) {
|
|
@@ -164,20 +140,14 @@ export default class HelmOp extends FleetApplication {
|
|
|
164
140
|
|
|
165
141
|
switch (this.sourceType) {
|
|
166
142
|
case SOURCE_TYPE.REPO:
|
|
143
|
+
case SOURCE_TYPE.OCI:
|
|
167
144
|
value = this.spec.helm?.repo || '';
|
|
168
145
|
break;
|
|
169
|
-
case SOURCE_TYPE.OCI: {
|
|
170
|
-
const parsed = parse(this.spec.helm?.chart || '');
|
|
171
|
-
|
|
172
|
-
value = parsed?.host ? `oci://${ parsed?.host }` : '';
|
|
173
|
-
break;
|
|
174
|
-
}
|
|
175
146
|
case SOURCE_TYPE.TARBALL:
|
|
176
|
-
value = this.spec.helm?.chart || '';
|
|
147
|
+
value = this.spec.helm?.chart || '';
|
|
177
148
|
}
|
|
178
149
|
|
|
179
150
|
const matchHttps = value.match(FleetUtils.HTTP_REGEX);
|
|
180
|
-
const matchOCI = value.match(FleetUtils.OCI_REGEX);
|
|
181
151
|
const matchSSH = value.match(FleetUtils.GIT_SSH_REGEX);
|
|
182
152
|
|
|
183
153
|
if (matchSSH) {
|
|
@@ -190,7 +160,7 @@ export default class HelmOp extends FleetApplication {
|
|
|
190
160
|
value,
|
|
191
161
|
display: this.repoDisplay(value),
|
|
192
162
|
icon: 'icon icon-application',
|
|
193
|
-
showLink: matchHttps || matchSSH
|
|
163
|
+
showLink: matchHttps || matchSSH
|
|
194
164
|
};
|
|
195
165
|
}
|
|
196
166
|
|
|
@@ -203,7 +173,7 @@ export default class HelmOp extends FleetApplication {
|
|
|
203
173
|
chart = this.spec.helm.chart || '';
|
|
204
174
|
break;
|
|
205
175
|
case SOURCE_TYPE.OCI: {
|
|
206
|
-
const parsed = parse(this.spec.helm.
|
|
176
|
+
const parsed = parse(this.spec.helm.repo || '');
|
|
207
177
|
|
|
208
178
|
chart = parsed?.path ? parsed?.path.substring(1) : '';
|
|
209
179
|
break;
|
|
@@ -15,7 +15,8 @@ export default class Workspace extends HybridModel {
|
|
|
15
15
|
const out = {
|
|
16
16
|
clusterGroups: summary[FLEET.CLUSTER_GROUP]?.namespaces?.[name]?.count || 0,
|
|
17
17
|
clusters: summary[FLEET.CLUSTER]?.namespaces?.[name]?.count || 0,
|
|
18
|
-
gitRepos: summary[FLEET.GIT_REPO]?.namespaces?.[name]?.count || 0
|
|
18
|
+
gitRepos: summary[FLEET.GIT_REPO]?.namespaces?.[name]?.count || 0,
|
|
19
|
+
helmOps: summary[FLEET.HELM_OP]?.namespaces?.[name]?.count || 0
|
|
19
20
|
};
|
|
20
21
|
|
|
21
22
|
return out;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import SteveModel from '@shell/plugins/steve/steve-class';
|
|
2
|
+
|
|
3
|
+
export default class OIDCClient extends SteveModel {
|
|
4
|
+
get details() {
|
|
5
|
+
return [
|
|
6
|
+
...this._details, {
|
|
7
|
+
label: this.t('oidcclient.redirectURIs.label'),
|
|
8
|
+
content: this.spec.redirectURIs?.join(', ')
|
|
9
|
+
}, {
|
|
10
|
+
label: this.t('oidcclient.refreshTokenExpirationSeconds.detailLabel'),
|
|
11
|
+
content: this.spec.refreshTokenExpirationSeconds
|
|
12
|
+
}, {
|
|
13
|
+
label: this.t('oidcclient.tokenExpirationSeconds.detailLabel'),
|
|
14
|
+
content: this.spec.tokenExpirationSeconds
|
|
15
|
+
}
|
|
16
|
+
];
|
|
17
|
+
}
|
|
18
|
+
}
|