@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.
Files changed (312) hide show
  1. package/assets/data/aws-regions.json +1 -0
  2. package/assets/images/key.svg +17 -0
  3. package/assets/styles/base/_spacing.scss +2 -2
  4. package/assets/styles/global/_form.scss +1 -1
  5. package/assets/styles/global/_labeled-input.scss +1 -1
  6. package/assets/styles/themes/_dark.scss +3 -0
  7. package/assets/styles/themes/_light.scss +3 -0
  8. package/assets/styles/vendor/vue-select.scss +1 -1
  9. package/assets/translations/en-us.yaml +404 -64
  10. package/assets/translations/zh-hans.yaml +3 -4
  11. package/cloud-credential/gcp.vue +9 -1
  12. package/components/AppModal.vue +2 -0
  13. package/components/CodeMirror.vue +1 -1
  14. package/components/ConfigMapSettings/Settings.vue +377 -0
  15. package/components/ConfigMapSettings/index.vue +354 -0
  16. package/components/CruResource.vue +1 -2
  17. package/components/DetailText.vue +61 -11
  18. package/components/Drawer/Chrome.vue +116 -0
  19. package/components/Drawer/ResourceDetailDrawer/ConfigTab.vue +61 -0
  20. package/components/Drawer/ResourceDetailDrawer/YamlTab.vue +48 -0
  21. package/components/Drawer/ResourceDetailDrawer/__tests__/ConfigTab.test.ts +54 -0
  22. package/components/Drawer/ResourceDetailDrawer/__tests__/YamlTab.test.ts +80 -0
  23. package/components/Drawer/ResourceDetailDrawer/__tests__/composables.test.ts +82 -0
  24. package/components/Drawer/ResourceDetailDrawer/__tests__/helpers.test.ts +42 -0
  25. package/components/Drawer/ResourceDetailDrawer/composables.ts +50 -0
  26. package/components/Drawer/ResourceDetailDrawer/helpers.ts +10 -0
  27. package/components/Drawer/ResourceDetailDrawer/index.vue +110 -0
  28. package/components/GrowlManager.vue +16 -15
  29. package/components/IconOrSvg.vue +5 -0
  30. package/components/KeyValueView.vue +1 -1
  31. package/components/LocaleSelector.vue +9 -1
  32. package/components/ProgressBarMulti.vue +1 -0
  33. package/components/PromptModal.vue +6 -1
  34. package/components/RelatedResources.vue +4 -12
  35. package/components/Resource/Detail/Additional.vue +46 -0
  36. package/components/Resource/Detail/Metadata/Annotations/__tests__/index.test.ts +1 -1
  37. package/components/Resource/Detail/Metadata/Annotations/index.vue +5 -0
  38. package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/identifying-fields.test.ts +223 -0
  39. package/components/Resource/Detail/Metadata/IdentifyingInformation/composable.ts +37 -254
  40. package/components/Resource/Detail/Metadata/IdentifyingInformation/identifying-fields.ts +298 -0
  41. package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +27 -5
  42. package/components/Resource/Detail/Metadata/KeyValue.vue +25 -17
  43. package/components/Resource/Detail/Metadata/Labels/__tests__/index.test.ts +1 -1
  44. package/components/Resource/Detail/Metadata/Labels/index.vue +4 -0
  45. package/components/Resource/Detail/Metadata/__tests__/KeyValue.test.ts +1 -1
  46. package/components/Resource/Detail/Metadata/__tests__/Rectangle.test.ts +1 -1
  47. package/components/Resource/Detail/Metadata/__tests__/composables.test.ts +75 -0
  48. package/components/Resource/Detail/Metadata/composables.ts +60 -11
  49. package/components/Resource/Detail/Metadata/index.vue +12 -5
  50. package/components/Resource/Detail/Page.vue +15 -0
  51. package/components/Resource/Detail/ResourceRow.vue +37 -18
  52. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/composables.test.ts +29 -0
  53. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/index.test.ts +48 -0
  54. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/composables.ts +31 -0
  55. package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/index.vue +50 -0
  56. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/__tests__/composables.test.ts +66 -0
  57. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/composables.ts +21 -0
  58. package/components/Resource/Detail/ResourceTabs/KnownHostsTab/index.vue +31 -0
  59. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Basic.vue +45 -0
  60. package/components/Resource/Detail/ResourceTabs/SecretDataTab/BasicAuth.vue +31 -0
  61. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Certificate.vue +31 -0
  62. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Registry.vue +22 -0
  63. package/components/Resource/Detail/ResourceTabs/SecretDataTab/ServiceAccountToken.vue +31 -0
  64. package/components/Resource/Detail/ResourceTabs/SecretDataTab/Ssh.vue +32 -0
  65. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Basic.test.ts +40 -0
  66. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/BasicAuth.test.ts +33 -0
  67. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Certificate.test.ts +33 -0
  68. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Registry.test.ts +27 -0
  69. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/ServiceAccountToken.test.ts +33 -0
  70. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Ssh.test.ts +33 -0
  71. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/auth-types.test.ts +186 -0
  72. package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/composables.test.ts +102 -0
  73. package/components/Resource/Detail/ResourceTabs/SecretDataTab/auth-types.ts +109 -0
  74. package/components/Resource/Detail/ResourceTabs/SecretDataTab/composeables.ts +52 -0
  75. package/components/Resource/Detail/ResourceTabs/SecretDataTab/index.vue +71 -0
  76. package/components/Resource/Detail/TitleBar/Title.vue +2 -1
  77. package/components/Resource/Detail/TitleBar/__tests__/Title.test.ts +1 -1
  78. package/components/Resource/Detail/TitleBar/__tests__/Top.test.ts +1 -1
  79. package/components/Resource/Detail/TitleBar/__tests__/composables.test.ts +63 -0
  80. package/components/Resource/Detail/TitleBar/__tests__/index.test.ts +1 -1
  81. package/components/Resource/Detail/TitleBar/composables.ts +44 -0
  82. package/components/Resource/Detail/TitleBar/index.vue +83 -11
  83. package/components/Resource/Detail/composables.ts +45 -0
  84. package/components/ResourceDetail/Masthead/__tests__/index.test.ts +70 -0
  85. package/components/ResourceDetail/{__tests__/Masthead.test.ts → Masthead/__tests__/legacy.test.ts} +3 -3
  86. package/components/ResourceDetail/Masthead/index.vue +65 -0
  87. package/components/ResourceDetail/Masthead/latest.vue +44 -0
  88. package/components/ResourceDetail/__tests__/index.test.ts +26 -5
  89. package/components/ResourceDetail/index.vue +30 -16
  90. package/components/ResourceDetail/legacy.vue +18 -1
  91. package/components/ResourceList/Masthead.vue +6 -0
  92. package/components/ResourceYaml.vue +14 -1
  93. package/components/SlideInPanelManager.vue +46 -7
  94. package/components/StateDot/index.vue +28 -0
  95. package/components/Tabbed/index.vue +11 -15
  96. package/components/Wizard.vue +4 -2
  97. package/components/__tests__/ConfigMapSettings.test.ts +376 -0
  98. package/components/__tests__/GrowlManager.test.ts +0 -25
  99. package/components/auth/login/ldap.vue +1 -1
  100. package/components/fleet/FleetApplications.vue +0 -7
  101. package/components/fleet/FleetClusterTargets/TargetsList.vue +66 -0
  102. package/components/fleet/FleetClusterTargets/index.vue +455 -0
  103. package/components/fleet/FleetClusters.vue +25 -6
  104. package/components/fleet/FleetGitRepoPaths.vue +476 -0
  105. package/components/fleet/FleetHelmOps.vue +8 -0
  106. package/components/fleet/FleetRepos.vue +1 -6
  107. package/components/fleet/FleetResources.vue +4 -5
  108. package/components/fleet/FleetValuesFrom.vue +295 -0
  109. package/components/fleet/__tests__/FleetClusterTargets.test.ts +1224 -0
  110. package/components/fleet/__tests__/FleetGitRepoPaths.test.ts +265 -0
  111. package/components/fleet/__tests__/FleetOCIStorageSecret.test.ts +13 -13
  112. package/components/fleet/__tests__/FleetValuesFrom.test.ts +300 -0
  113. package/components/fleet/dashboard/ResourceCard.vue +1 -0
  114. package/components/fleet/dashboard/ResourceCardSummary.vue +1 -5
  115. package/components/fleet/dashboard/ResourceDetails.vue +8 -10
  116. package/components/fleet/dashboard/ResourcePanel.vue +15 -8
  117. package/components/form/ArrayList.vue +13 -2
  118. package/components/form/ChangePassword.vue +3 -1
  119. package/components/form/Footer.vue +10 -4
  120. package/components/form/KeyValue.vue +81 -43
  121. package/components/form/LabeledSelect.vue +56 -16
  122. package/components/form/Labels.vue +90 -17
  123. package/components/form/MatchExpressions.vue +46 -5
  124. package/components/form/NameNsDescription.vue +1 -1
  125. package/components/form/ResourceSelector.vue +1 -0
  126. package/components/form/ResourceTabs/index.vue +5 -0
  127. package/components/form/SecretSelector.vue +9 -2
  128. package/components/form/Select.vue +57 -19
  129. package/components/form/SimpleSecretSelector.vue +9 -2
  130. package/components/form/Taints.vue +21 -2
  131. package/components/form/UnitInput.vue +8 -0
  132. package/components/form/ValueFromResource.vue +1 -1
  133. package/components/form/__tests__/LabeledSelect.test.ts +8 -4
  134. package/components/form/__tests__/Labels.test.ts +360 -0
  135. package/components/form/__tests__/MatchExpressions.test.ts +16 -13
  136. package/components/form/__tests__/Select.test.ts +5 -2
  137. package/components/formatter/FleetApplicationSource.vue +1 -1
  138. package/components/formatter/WorkloadHealthScale.vue +1 -1
  139. package/components/google/AccountAccess.vue +211 -0
  140. package/components/google/types/gcp.d.ts +136 -0
  141. package/components/google/types/index.d.ts +101 -0
  142. package/components/google/util/__mocks__/gcp.ts +465 -0
  143. package/components/google/util/formatter.ts +82 -0
  144. package/components/google/util/gcp.ts +134 -0
  145. package/components/google/util/index.d.ts +11 -0
  146. package/components/nav/Favorite.vue +1 -1
  147. package/components/nav/Group.vue +70 -47
  148. package/components/nav/Header.vue +5 -1
  149. package/components/nav/NamespaceFilter.vue +13 -1
  150. package/components/nav/NotificationCenter/Notification.vue +510 -0
  151. package/components/nav/NotificationCenter/NotificationHeader.vue +112 -0
  152. package/components/nav/NotificationCenter/index.vue +148 -0
  153. package/composables/drawer.ts +26 -0
  154. package/composables/resources.test.ts +63 -0
  155. package/composables/resources.ts +38 -0
  156. package/composables/useIsNewDetailPageEnabled.ts +17 -0
  157. package/config/labels-annotations.js +6 -0
  158. package/config/product/auth.js +16 -1
  159. package/config/product/{cis.js → compliance.js} +23 -26
  160. package/config/product/explorer.js +5 -1
  161. package/config/product/fleet.js +7 -0
  162. package/config/product/settings.js +22 -11
  163. package/config/query-params.js +3 -0
  164. package/config/roles.ts +1 -1
  165. package/config/router/navigation-guards/authentication.js +51 -2
  166. package/config/router/routes.js +27 -31
  167. package/config/settings.ts +21 -3
  168. package/config/store.js +2 -0
  169. package/config/system-namespaces.js +1 -1
  170. package/config/table-headers.js +2 -2
  171. package/config/types.js +15 -6
  172. package/core/plugin.ts +32 -7
  173. package/core/types.ts +18 -1
  174. package/detail/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +22 -18
  175. package/detail/management.cattle.io.fleetworkspace.vue +18 -27
  176. package/detail/management.cattle.io.oidcclient.vue +369 -0
  177. package/detail/node.vue +2 -2
  178. package/detail/pod.vue +2 -2
  179. package/detail/service.vue +10 -1
  180. package/detail/workload/index.vue +8 -2
  181. package/dialog/ExtensionCatalogUninstallDialog.vue +7 -4
  182. package/dialog/GenericPrompt.vue +1 -1
  183. package/dialog/ImportDialog.vue +8 -8
  184. package/dialog/OidcClientSecretDialog.vue +117 -0
  185. package/edit/__tests__/cis.cattle.io.clusterscan.test.ts +3 -3
  186. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +5 -2
  187. package/edit/autoscaling.horizontalpodautoscaler/index.vue +4 -1
  188. package/edit/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +30 -31
  189. package/edit/{cis.cattle.io.clusterscanbenchmark.vue → compliance.cattle.io.clusterscanbenchmark.vue} +4 -4
  190. package/edit/{cis.cattle.io.clusterscanprofile.vue → compliance.cattle.io.clusterscanprofile.vue} +5 -5
  191. package/edit/configmap.vue +4 -1
  192. package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -0
  193. package/edit/fleet.cattle.io.gitrepo.vue +44 -222
  194. package/edit/fleet.cattle.io.helmop.vue +44 -269
  195. package/edit/helm.cattle.io.projecthelmchart.vue +1 -0
  196. package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +1 -0
  197. package/edit/logging-flow/index.vue +1 -0
  198. package/edit/logging.banzaicloud.io.output/index.vue +1 -0
  199. package/edit/management.cattle.io.fleetworkspace.vue +1 -0
  200. package/edit/management.cattle.io.oidcclient.vue +162 -0
  201. package/edit/management.cattle.io.project.vue +4 -1
  202. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +1 -1
  203. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +5 -0
  204. package/edit/monitoring.coreos.com.prometheusrule/index.vue +1 -0
  205. package/edit/monitoring.coreos.com.receiver/auth.vue +30 -30
  206. package/edit/monitoring.coreos.com.receiver/index.vue +1 -0
  207. package/edit/monitoring.coreos.com.receiver/types/email.vue +1 -1
  208. package/edit/monitoring.coreos.com.route.vue +1 -0
  209. package/edit/namespace.vue +1 -0
  210. package/edit/networking.istio.io.destinationrule/index.vue +4 -1
  211. package/edit/networking.k8s.io.ingress/index.vue +4 -1
  212. package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +7 -2
  213. package/edit/networking.k8s.io.networkpolicy/index.vue +6 -2
  214. package/edit/node.vue +1 -0
  215. package/edit/persistentvolume/index.vue +4 -1
  216. package/edit/provisioning.cattle.io.cluster/rke2.vue +418 -382
  217. package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +27 -27
  218. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +5 -0
  219. package/edit/resources.cattle.io.restore.vue +1 -1
  220. package/edit/secret/index.vue +1 -0
  221. package/edit/service.vue +4 -1
  222. package/edit/serviceaccount.vue +4 -1
  223. package/edit/storage.k8s.io.storageclass/index.vue +4 -1
  224. package/edit/workload/index.vue +5 -0
  225. package/list/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +2 -2
  226. package/list/management.cattle.io.oidcclient.vue +108 -0
  227. package/list/node.vue +2 -0
  228. package/machine-config/amazonec2.vue +3 -24
  229. package/machine-config/components/GCEImage.vue +374 -0
  230. package/machine-config/google.vue +617 -0
  231. package/mixins/__tests__/brand.spec.ts +170 -0
  232. package/mixins/brand.js +16 -17
  233. package/mixins/create-edit-view/index.js +5 -0
  234. package/mixins/resource-fetch-api-pagination.js +16 -0
  235. package/mixins/vue-select-overrides.js +1 -0
  236. package/models/{cis.cattle.io.clusterscan.js → compliance.cattle.io.clusterscan.js} +8 -8
  237. package/models/{cis.cattle.io.clusterscanbenchmark.js → compliance.cattle.io.clusterscanbenchmark.js} +1 -1
  238. package/models/{cis.cattle.io.clusterscanprofile.js → compliance.cattle.io.clusterscanprofile.js} +5 -5
  239. package/models/{cis.cattle.io.clusterscanreport.js → compliance.cattle.io.clusterscanreport.js} +1 -1
  240. package/models/fleet-application.js +8 -79
  241. package/models/fleet.cattle.io.cluster.js +11 -0
  242. package/models/fleet.cattle.io.gitrepo.js +2 -2
  243. package/models/fleet.cattle.io.helmop.js +9 -39
  244. package/models/management.cattle.io.fleetworkspace.js +2 -1
  245. package/models/management.cattle.io.oidcclient.js +18 -0
  246. package/models/management.cattle.io.registration.js +3 -0
  247. package/models/provisioning.cattle.io.cluster.js +5 -5
  248. package/models/service.js +4 -0
  249. package/models/workload.js +5 -0
  250. package/package.json +1 -1
  251. package/pages/about.vue +4 -58
  252. package/pages/auth/login.vue +1 -1
  253. package/pages/c/_cluster/apps/charts/AddRepoLink.vue +0 -1
  254. package/pages/c/_cluster/apps/charts/index.vue +285 -81
  255. package/pages/c/_cluster/auth/user.retention/index.vue +87 -78
  256. package/pages/c/_cluster/explorer/index.vue +3 -3
  257. package/pages/c/_cluster/explorer/tools/pages/_page.vue +0 -1
  258. package/pages/c/_cluster/fleet/application/create.vue +3 -2
  259. package/pages/c/_cluster/fleet/index.vue +94 -56
  260. package/pages/c/_cluster/fleet/settings/index.vue +229 -0
  261. package/pages/c/_cluster/longhorn/index.vue +5 -2
  262. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +16 -1
  263. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +2 -2
  264. package/pages/explorer/resource/detail/configmap.vue +30 -7
  265. package/pages/explorer/resource/detail/secret.vue +50 -0
  266. package/pages/home.vue +9 -55
  267. package/pages/support/index.vue +4 -6
  268. package/plugins/dashboard-store/actions.js +19 -5
  269. package/plugins/dashboard-store/getters.js +4 -0
  270. package/plugins/dashboard-store/resource-class.js +16 -2
  271. package/plugins/steve/steve-pagination-utils.ts +26 -18
  272. package/plugins/steve/subscribe.js +6 -1
  273. package/rancher-components/Banner/Banner.vue +13 -0
  274. package/rancher-components/Form/Checkbox/Checkbox.vue +9 -4
  275. package/rancher-components/Form/LabeledInput/LabeledInput.vue +1 -1
  276. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +1 -0
  277. package/rancher-components/RcItemCard/RcItemCard.vue +8 -3
  278. package/store/auth.js +2 -0
  279. package/store/catalog.js +23 -1
  280. package/store/growl.js +97 -8
  281. package/store/index.js +6 -0
  282. package/store/notifications.ts +426 -0
  283. package/store/prefs.js +0 -1
  284. package/store/type-map.js +19 -16
  285. package/store/uiplugins.ts +15 -1
  286. package/types/fleet.d.ts +24 -0
  287. package/types/notifications/index.ts +74 -0
  288. package/types/shell/index.d.ts +46 -32
  289. package/types/store/dashboard-store.types.ts +16 -0
  290. package/utils/__tests__/fleet.test.ts +148 -0
  291. package/utils/__tests__/object.test.ts +54 -1
  292. package/utils/__tests__/string.test.ts +273 -1
  293. package/utils/__tests__/time.test.ts +31 -0
  294. package/utils/auth.js +9 -2
  295. package/utils/crypto/encryption.ts +103 -0
  296. package/utils/cspAdaptor.ts +51 -0
  297. package/utils/fleet.ts +54 -65
  298. package/utils/object.js +36 -0
  299. package/utils/pagination-utils.ts +1 -1
  300. package/utils/release-notes.ts +48 -0
  301. package/utils/selector-typed.ts +7 -2
  302. package/utils/string.js +24 -0
  303. package/utils/{time.js → time.ts} +25 -6
  304. package/utils/uiplugins.ts +22 -0
  305. package/utils/validators/formRules/index.ts +3 -0
  306. package/components/Resource/Detail/TitleBar/composable.ts +0 -31
  307. package/config/product/legacy.js +0 -62
  308. package/pages/c/_cluster/legacy/pages/_page.vue +0 -29
  309. package/pages/c/_cluster/legacy/project/_page.vue +0 -57
  310. package/pages/c/_cluster/legacy/project/index.vue +0 -32
  311. package/pages/c/_cluster/legacy/project/pipelines.vue +0 -96
  312. /package/components/ResourceDetail/{Masthead.vue → Masthead/legacy.vue} +0 -0
@@ -0,0 +1,31 @@
1
+ <script lang="ts">
2
+ import DetailText from '@shell/components/DetailText.vue';
3
+
4
+ export interface Props {
5
+ crt?: string;
6
+ token?: string;
7
+ }
8
+ </script>
9
+
10
+ <script setup lang="ts">
11
+ const props = defineProps<Props>();
12
+ </script>
13
+
14
+ <template>
15
+ <div class="row secret-data-service-account-token">
16
+ <div class="col span-6 crt">
17
+ <DetailText
18
+ :value="props.crt"
19
+ label-key="secret.serviceAcct.ca"
20
+ />
21
+ </div>
22
+ <div class="col span-6 token">
23
+ <DetailText
24
+ :value="props.token"
25
+ label-key="secret.serviceAcct.token"
26
+ :conceal="true"
27
+ :conceal-stand-alone="true"
28
+ />
29
+ </div>
30
+ </div>
31
+ </template>
@@ -0,0 +1,32 @@
1
+ <script lang="ts">
2
+ import DetailText from '@shell/components/DetailText.vue';
3
+
4
+ export interface Props {
5
+ username?: string;
6
+ password?: string;
7
+ }
8
+ </script>
9
+
10
+ <script setup lang="ts">
11
+ const props = defineProps<Props>();
12
+
13
+ </script>
14
+
15
+ <template>
16
+ <div class="row secret-data-ssh">
17
+ <div class="col span-6 username">
18
+ <DetailText
19
+ :value="props.username"
20
+ label-key="secret.ssh.public"
21
+ />
22
+ </div>
23
+ <div class="col span-6 password">
24
+ <DetailText
25
+ :value="props.password"
26
+ label-key="secret.ssh.private"
27
+ :conceal="true"
28
+ :conceal-stand-alone="true"
29
+ />
30
+ </div>
31
+ </div>
32
+ </template>
@@ -0,0 +1,40 @@
1
+ import { mount } from '@vue/test-utils';
2
+ import Basic from '@shell/components/Resource/Detail/ResourceTabs/SecretDataTab/Basic.vue';
3
+
4
+ jest.mock('@shell/components/DetailText.vue', () => ({
5
+ name: 'DetailText',
6
+ template: `<div class="detail-text">DetailText</div>`,
7
+ props: ['value', 'label', 'conceal']
8
+ }));
9
+
10
+ jest.mock('vuex', () => ({ useStore: jest.fn() }));
11
+
12
+ describe('component: SecretDataTab/Basic', () => {
13
+ const rows = [
14
+ {
15
+ key: 'KEY',
16
+ value: 'VALUE'
17
+ }
18
+ ];
19
+
20
+ it('should render container with class secret-data-tab-basic', async() => {
21
+ const wrapper = mount(Basic, { props: { rows: [] } });
22
+
23
+ expect(wrapper.find('.secret-data-tab-basic').exists()).toBeTruthy();
24
+ });
25
+
26
+ it('should render no rows message if empty rows are passed', async() => {
27
+ const wrapper = mount(Basic, { props: { rows: [] } });
28
+
29
+ expect(wrapper.find('.no-rows').text()).toStrictEqual('sortableTable.noRows');
30
+ });
31
+
32
+ it('should render row of DetailText with appropriate props', async() => {
33
+ const wrapper = mount(Basic, { props: { rows } });
34
+
35
+ const detailTextComponent = wrapper.findComponent({ name: 'DetailText' });
36
+
37
+ expect(detailTextComponent.props('label')).toStrictEqual(rows[0].key);
38
+ expect(detailTextComponent.props('value')).toStrictEqual(rows[0].value);
39
+ });
40
+ });
@@ -0,0 +1,33 @@
1
+ import { mount } from '@vue/test-utils';
2
+ import BasicAuth from '@shell/components/Resource/Detail/ResourceTabs/SecretDataTab/BasicAuth.vue';
3
+
4
+ jest.mock('@shell/components/DetailText.vue', () => ({
5
+ name: 'DetailText',
6
+ template: `<div class="detail-text">DetailText</div>`,
7
+ props: ['value', 'label-key', 'conceal']
8
+ }));
9
+
10
+ describe('component: SecretDataTab/BasicAuth', () => {
11
+ const username = 'USERNAME';
12
+ const password = 'PASSWORD';
13
+
14
+ it('should render container with class secret-data-basic-auth', async() => {
15
+ const wrapper = mount(BasicAuth, { props: { username, password } });
16
+
17
+ expect(wrapper.find('.secret-data-basic-auth').exists()).toBeTruthy();
18
+ });
19
+
20
+ it('should render DetailText with username and password props passed correctly', async() => {
21
+ const wrapper = mount(BasicAuth, { props: { username, password } });
22
+
23
+ const usernameDetailTextComponent = wrapper.find('.username').findComponent({ name: 'DetailText' });
24
+ const passwordDetailTextComponent = wrapper.find('.password').findComponent({ name: 'DetailText' });
25
+
26
+ expect(usernameDetailTextComponent.props('value')).toStrictEqual(username);
27
+ expect(usernameDetailTextComponent.props('labelKey')).toStrictEqual('secret.registry.username');
28
+
29
+ expect(passwordDetailTextComponent.props('value')).toStrictEqual(password);
30
+ expect(passwordDetailTextComponent.props('labelKey')).toStrictEqual('secret.registry.password');
31
+ expect(passwordDetailTextComponent.props('conceal')).toStrictEqual(true);
32
+ });
33
+ });
@@ -0,0 +1,33 @@
1
+ import { mount } from '@vue/test-utils';
2
+ import Certificate from '@shell/components/Resource/Detail/ResourceTabs/SecretDataTab/Certificate.vue';
3
+
4
+ jest.mock('@shell/components/DetailText.vue', () => ({
5
+ name: 'DetailText',
6
+ template: `<div class="detail-text">DetailText</div>`,
7
+ props: ['value', 'label-key', 'conceal']
8
+ }));
9
+
10
+ describe('component: SecretDataTab/Certificate', () => {
11
+ const crt = 'CRT';
12
+ const token = 'TOKEN';
13
+
14
+ it('should render container with class secret-data-basic-auth', async() => {
15
+ const wrapper = mount(Certificate, { props: { crt, token } });
16
+
17
+ expect(wrapper.find('.secret-data-certificate').exists()).toBeTruthy();
18
+ });
19
+
20
+ it('should render DetailText with crt and token props passed correctly', async() => {
21
+ const wrapper = mount(Certificate, { props: { crt, token } });
22
+
23
+ const crtDetailTextComponent = wrapper.find('.crt').findComponent({ name: 'DetailText' });
24
+ const tokenDetailTextComponent = wrapper.find('.token').findComponent({ name: 'DetailText' });
25
+
26
+ expect(crtDetailTextComponent.props('value')).toStrictEqual(crt);
27
+ expect(crtDetailTextComponent.props('labelKey')).toStrictEqual('secret.certificate.certificate');
28
+
29
+ expect(tokenDetailTextComponent.props('value')).toStrictEqual(token);
30
+ expect(tokenDetailTextComponent.props('labelKey')).toStrictEqual('secret.certificate.privateKey');
31
+ expect(tokenDetailTextComponent.props('conceal')).toStrictEqual(true);
32
+ });
33
+ });
@@ -0,0 +1,27 @@
1
+ import { mount } from '@vue/test-utils';
2
+ import Registry from '@shell/components/Resource/Detail/ResourceTabs/SecretDataTab/Registry.vue';
3
+
4
+ jest.mock('@shell/components/DetailText.vue', () => ({
5
+ name: 'DetailText',
6
+ template: `<div class="detail-text">DetailText</div>`,
7
+ props: ['value', 'label-key']
8
+ }));
9
+
10
+ describe('component: SecretDataTab/Registry', () => {
11
+ const registryUrl = 'url';
12
+
13
+ it('should render container with class secret-data-registry', async() => {
14
+ const wrapper = mount(Registry, { props: { registryUrl } });
15
+
16
+ expect(wrapper.find('.secret-data-registry').exists()).toBeTruthy();
17
+ });
18
+
19
+ it('should render DetailText with crt and token props passed correctly', async() => {
20
+ const wrapper = mount(Registry, { props: { registryUrl } });
21
+
22
+ const registryUrlDetailTextComponent = wrapper.find('.registry-url').findComponent({ name: 'DetailText' });
23
+
24
+ expect(registryUrlDetailTextComponent.props('value')).toStrictEqual(registryUrl);
25
+ expect(registryUrlDetailTextComponent.props('labelKey')).toStrictEqual('secret.registry.domainName');
26
+ });
27
+ });
@@ -0,0 +1,33 @@
1
+ import { mount } from '@vue/test-utils';
2
+ import ServiceAccountToken from '@shell/components/Resource/Detail/ResourceTabs/SecretDataTab/ServiceAccountToken.vue';
3
+
4
+ jest.mock('@shell/components/DetailText.vue', () => ({
5
+ name: 'DetailText',
6
+ template: `<div class="detail-text">DetailText</div>`,
7
+ props: ['value', 'label-key', 'conceal']
8
+ }));
9
+
10
+ describe('component: SecretDataTab/ServiceAccountToken', () => {
11
+ const crt = 'CRT';
12
+ const token = 'TOKEN';
13
+
14
+ it('should render container with class secret-data-service-account-token', async() => {
15
+ const wrapper = mount(ServiceAccountToken, { props: { crt, token } });
16
+
17
+ expect(wrapper.find('.secret-data-service-account-token').exists()).toBeTruthy();
18
+ });
19
+
20
+ it('should render DetailText with ca and token props passed correctly', async() => {
21
+ const wrapper = mount(ServiceAccountToken, { props: { crt, token } });
22
+
23
+ const caDetailTextComponent = wrapper.find('.crt').findComponent({ name: 'DetailText' });
24
+ const tokenDetailTextComponent = wrapper.find('.token').findComponent({ name: 'DetailText' });
25
+
26
+ expect(caDetailTextComponent.props('value')).toStrictEqual(crt);
27
+ expect(caDetailTextComponent.props('labelKey')).toStrictEqual('secret.serviceAcct.ca');
28
+
29
+ expect(tokenDetailTextComponent.props('value')).toStrictEqual(token);
30
+ expect(tokenDetailTextComponent.props('labelKey')).toStrictEqual('secret.serviceAcct.token');
31
+ expect(tokenDetailTextComponent.props('conceal')).toStrictEqual(true);
32
+ });
33
+ });
@@ -0,0 +1,33 @@
1
+ import { mount } from '@vue/test-utils';
2
+ import Ssh from '@shell/components/Resource/Detail/ResourceTabs/SecretDataTab/Ssh.vue';
3
+
4
+ jest.mock('@shell/components/DetailText.vue', () => ({
5
+ name: 'DetailText',
6
+ template: `<div class="detail-text">DetailText</div>`,
7
+ props: ['value', 'label-key', 'conceal']
8
+ }));
9
+
10
+ describe('component: SecretDataTab/BasicAuth', () => {
11
+ const username = 'USERNAME';
12
+ const password = 'PASSWORD';
13
+
14
+ it('should render container with class secret-data-ssh', async() => {
15
+ const wrapper = mount(Ssh, { props: { username, password } });
16
+
17
+ expect(wrapper.find('.secret-data-ssh').exists()).toBeTruthy();
18
+ });
19
+
20
+ it('should render DetailText with username and password props passed correctly', async() => {
21
+ const wrapper = mount(Ssh, { props: { username, password } });
22
+
23
+ const usernameDetailTextComponent = wrapper.find('.username').findComponent({ name: 'DetailText' });
24
+ const passwordDetailTextComponent = wrapper.find('.password').findComponent({ name: 'DetailText' });
25
+
26
+ expect(usernameDetailTextComponent.props('value')).toStrictEqual(username);
27
+ expect(usernameDetailTextComponent.props('labelKey')).toStrictEqual('secret.ssh.public');
28
+
29
+ expect(passwordDetailTextComponent.props('value')).toStrictEqual(password);
30
+ expect(passwordDetailTextComponent.props('labelKey')).toStrictEqual('secret.ssh.private');
31
+ expect(passwordDetailTextComponent.props('conceal')).toStrictEqual(true);
32
+ });
33
+ });
@@ -0,0 +1,186 @@
1
+ import * as authTypes from '@shell/components/Resource/Detail/ResourceTabs/SecretDataTab/auth-types';
2
+ import * as crypto from '@shell/utils/crypto';
3
+
4
+ jest.mock('@shell/utils/crypto');
5
+ jest.mock('vuex', () => ({ useStore: jest.fn() }));
6
+
7
+ describe('composables: SecretDataTab/auth-types', () => {
8
+ const resource = { _type: 'RESOURCE', data: { type: 'data' } };
9
+ const base64 = '64 decoded string';
10
+ const base64DecodeSpy = jest.spyOn(crypto, 'base64Decode');
11
+
12
+ beforeEach(() => {
13
+ jest.clearAllMocks();
14
+ });
15
+
16
+ describe('useSecretInfo', () => {
17
+ it('should return the secret type and data set in resource', () => {
18
+ const info = authTypes.useSecretInfo(resource);
19
+
20
+ expect(info.value.secretType).toStrictEqual(resource._type);
21
+ expect(info.value.secretData).toStrictEqual(resource.data);
22
+ });
23
+
24
+ it('should return the an empty object for secretData if not set on resource', () => {
25
+ const info = authTypes.useSecretInfo({ _type: 'RESOURCE' });
26
+
27
+ expect(info.value.secretType).toStrictEqual(resource._type);
28
+ expect(info.value.secretData).toStrictEqual({});
29
+ });
30
+ });
31
+
32
+ describe('useSecretRows', () => {
33
+ it('should return empty array if data is not set', () => {
34
+ const rows = authTypes.useSecretRows({});
35
+
36
+ expect(rows.value).toStrictEqual([]);
37
+ });
38
+
39
+ it('should return a base64Decoded key/value if data is set', () => {
40
+ base64DecodeSpy.mockReturnValue(base64);
41
+ const row = { mockKey: 'value' };
42
+ const rows = authTypes.useSecretRows({ data: row });
43
+
44
+ expect(rows.value[0].key).toStrictEqual('mockKey');
45
+ expect(rows.value[0].value).toStrictEqual(base64);
46
+ expect(base64DecodeSpy).toHaveBeenCalledWith(row.mockKey);
47
+ });
48
+ });
49
+
50
+ describe('useDockerAuths', () => {
51
+ it('should return the auths field from a base64decoded json object in the `.dockerconfigjson` data field', () => {
52
+ const data = { '.dockerconfigjson': 'base64Json' };
53
+ const json = { auths: 'AUTHS' };
54
+
55
+ base64DecodeSpy.mockReturnValue(JSON.stringify(json));
56
+ const dockerAuths = authTypes.useDockerAuths({ data });
57
+
58
+ expect(dockerAuths.value).toStrictEqual(json.auths);
59
+ expect(base64DecodeSpy).toHaveBeenCalledWith(data['.dockerconfigjson']);
60
+ });
61
+ });
62
+
63
+ describe('useDockerRegistry', () => {
64
+ it('should return the first value from the docker auths', () => {
65
+ const data = { '.dockerconfigjson': 'base64Json' };
66
+ const registryUrl = 'registry-url.com';
67
+ const json = { auths: { [registryUrl]: { something: 'test' } } };
68
+
69
+ base64DecodeSpy.mockReturnValue(JSON.stringify(json));
70
+ const registry = authTypes.useDockerRegistry({ data });
71
+
72
+ expect(registry.value.registryUrl).toStrictEqual(registryUrl);
73
+ expect(base64DecodeSpy).toHaveBeenCalledWith(data['.dockerconfigjson']);
74
+ });
75
+ });
76
+
77
+ describe('useDockerBasic', () => {
78
+ it('should return the username and password from the docker auths', () => {
79
+ const data = { '.dockerconfigjson': 'base64Json' };
80
+ const registryUrl = 'registry-url.com';
81
+ const username = 'USERNAME';
82
+ const password = 'PASSWORD';
83
+ const json = { auths: { [registryUrl]: { username, password } } };
84
+
85
+ base64DecodeSpy.mockReturnValue(JSON.stringify(json));
86
+ const dockerBasic = authTypes.useDockerBasic({ data });
87
+
88
+ expect(dockerBasic.value.username).toStrictEqual(username);
89
+ expect(dockerBasic.value.password).toStrictEqual(password);
90
+ expect(base64DecodeSpy).toHaveBeenCalledWith(data['.dockerconfigjson']);
91
+ });
92
+ });
93
+
94
+ describe('useBasic', () => {
95
+ it('should return the username, password, rows from the docker auths', () => {
96
+ const username = 'USERNAME';
97
+ const password = 'PASSWORD';
98
+ const data = { username, password };
99
+
100
+ base64DecodeSpy
101
+ .mockReturnValueOnce(username)
102
+ .mockReturnValueOnce(password)
103
+ .mockReturnValueOnce(username)
104
+ .mockReturnValueOnce(password);
105
+
106
+ const basic = authTypes.useBasic({ data });
107
+
108
+ expect(basic.value.username).toStrictEqual(username);
109
+ expect(basic.value.password).toStrictEqual(password);
110
+ expect(basic.value.rows).toStrictEqual([{ key: 'username', value: username }, { key: 'password', value: password }]);
111
+ expect(base64DecodeSpy).toHaveBeenCalledWith(username);
112
+ expect(base64DecodeSpy).toHaveBeenCalledWith(password);
113
+ expect(base64DecodeSpy).toHaveBeenCalledWith(username);
114
+ expect(base64DecodeSpy).toHaveBeenCalledWith(password);
115
+ });
116
+ });
117
+
118
+ describe('useSsh', () => {
119
+ it('should return the username, password from data fields ssh-publickey/privatekey', () => {
120
+ const username = 'USERNAME';
121
+ const password = 'PASSWORD';
122
+ const data = {
123
+ 'ssh-publickey': username,
124
+ 'ssh-privatekey': password
125
+ };
126
+
127
+ base64DecodeSpy
128
+ .mockReturnValueOnce(username)
129
+ .mockReturnValueOnce(password);
130
+
131
+ const ssh = authTypes.useSsh({ data });
132
+
133
+ expect(ssh.value.username).toStrictEqual(username);
134
+ expect(ssh.value.password).toStrictEqual(password);
135
+
136
+ expect(base64DecodeSpy).toHaveBeenCalledWith(username);
137
+ expect(base64DecodeSpy).toHaveBeenCalledWith(password);
138
+ });
139
+ });
140
+
141
+ describe('useServiceAccount', () => {
142
+ it('should return the token, crt from data fields token, ca.crt', () => {
143
+ const token = 'TOKEN';
144
+ const crt = 'CRT';
145
+ const data = {
146
+ token,
147
+ 'ca.crt': crt
148
+ };
149
+
150
+ base64DecodeSpy
151
+ .mockReturnValueOnce(token)
152
+ .mockReturnValueOnce(crt);
153
+
154
+ const serviceAccount = authTypes.useServiceAccount({ data });
155
+
156
+ expect(serviceAccount.value.token).toStrictEqual(token);
157
+ expect(serviceAccount.value.crt).toStrictEqual(crt);
158
+
159
+ expect(base64DecodeSpy).toHaveBeenCalledWith(token);
160
+ expect(base64DecodeSpy).toHaveBeenCalledWith(crt);
161
+ });
162
+ });
163
+
164
+ describe('useTls', () => {
165
+ it('should return the token, crt from data fields token, ca.crt', () => {
166
+ const token = 'TOKEN';
167
+ const crt = 'CRT';
168
+ const data = {
169
+ 'tls.key': token,
170
+ 'tls.crt': crt
171
+ };
172
+
173
+ base64DecodeSpy
174
+ .mockReturnValueOnce(token)
175
+ .mockReturnValueOnce(crt);
176
+
177
+ const serviceAccount = authTypes.useTls({ data });
178
+
179
+ expect(serviceAccount.value.token).toStrictEqual(token);
180
+ expect(serviceAccount.value.crt).toStrictEqual(crt);
181
+
182
+ expect(base64DecodeSpy).toHaveBeenCalledWith(token);
183
+ expect(base64DecodeSpy).toHaveBeenCalledWith(crt);
184
+ });
185
+ });
186
+ });
@@ -0,0 +1,102 @@
1
+ import * as authTypes from '@shell/components/Resource/Detail/ResourceTabs/SecretDataTab/auth-types';
2
+ import { useSecretDataTabDefaultProps } from '@shell/components/Resource/Detail/ResourceTabs/SecretDataTab/composeables';
3
+ import { SECRET_TYPES } from '@shell/config/secret';
4
+
5
+ jest.mock('@shell/components/Resource/Detail/ResourceTabs/SecretDataTab/auth-types');
6
+ jest.mock('vuex', () => ({ useStore: jest.fn() }));
7
+
8
+ describe('composables: SecretDataTab/composables', () => {
9
+ describe('useSecretDataTabDefaultProps', () => {
10
+ const useSecretInfoSpy = jest.spyOn(authTypes, 'useSecretInfo');
11
+ const resource = { type: 'Resource' };
12
+
13
+ it('should return the appropriate props when secret type is DOCKER_JSON', () => {
14
+ const dockerRegistry = { type: 'DockerRegistry' };
15
+ const dockerBasic = { type: 'DockerBasic' };
16
+ const useDockerRegistrySpy = jest.spyOn(authTypes, 'useDockerRegistry');
17
+ const useDockerBasic = jest.spyOn(authTypes, 'useDockerBasic');
18
+
19
+ useSecretInfoSpy.mockImplementation((): any => ({ value: { secretType: SECRET_TYPES.DOCKER_JSON } }));
20
+ useDockerRegistrySpy.mockImplementation((): any => ({ value: dockerRegistry }));
21
+ useDockerBasic.mockImplementation((): any => ({ value: dockerBasic }));
22
+
23
+ const props = useSecretDataTabDefaultProps(resource);
24
+
25
+ expect(props.value.tabLabel).toStrictEqual('secret.data');
26
+ expect(useDockerRegistrySpy).toHaveBeenCalledWith(resource);
27
+ expect(useDockerBasic).toHaveBeenCalledWith(resource);
28
+ expect(props.value.secretData.registry).toStrictEqual(dockerRegistry);
29
+ expect(props.value.secretData.basicAuth).toStrictEqual(dockerBasic);
30
+ });
31
+
32
+ it('should return the appropriate props when secret type is TLS', () => {
33
+ const tls = { type: 'TLS' };
34
+ const useTlsSpy = jest.spyOn(authTypes, 'useTls');
35
+
36
+ useSecretInfoSpy.mockImplementation((): any => ({ value: { secretType: SECRET_TYPES.TLS } }));
37
+ useTlsSpy.mockImplementation((): any => ({ value: tls }));
38
+
39
+ const props = useSecretDataTabDefaultProps(resource);
40
+
41
+ expect(props.value.tabLabel).toStrictEqual('secret.certificate.certificate');
42
+ expect(useTlsSpy).toHaveBeenCalledWith(resource);
43
+ expect(props.value.secretData.certificate).toStrictEqual(tls);
44
+ });
45
+
46
+ it('should return the appropriate props when secret type is SERVICE_ACCT', () => {
47
+ const serviceAccount = { type: 'serviceAccount' };
48
+ const useServiceAccountSpy = jest.spyOn(authTypes, 'useServiceAccount');
49
+
50
+ useSecretInfoSpy.mockImplementation((): any => ({ value: { secretType: SECRET_TYPES.SERVICE_ACCT } }));
51
+ useServiceAccountSpy.mockImplementation((): any => ({ value: serviceAccount }));
52
+
53
+ const props = useSecretDataTabDefaultProps(resource);
54
+
55
+ expect(props.value.tabLabel).toStrictEqual('secret.data');
56
+ expect(useServiceAccountSpy).toHaveBeenCalledWith(resource);
57
+ expect(props.value.secretData.serviceAccount).toStrictEqual(serviceAccount);
58
+ });
59
+
60
+ it('should return the appropriate props when secret type is SSH', () => {
61
+ const ssh = { type: 'SSH' };
62
+ const useSshSpy = jest.spyOn(authTypes, 'useSsh');
63
+
64
+ useSecretInfoSpy.mockImplementation((): any => ({ value: { secretType: SECRET_TYPES.SSH } }));
65
+ useSshSpy.mockImplementation((): any => ({ value: ssh }));
66
+
67
+ const props = useSecretDataTabDefaultProps(resource);
68
+
69
+ expect(props.value.tabLabel).toStrictEqual('secret.ssh.keys');
70
+ expect(useSshSpy).toHaveBeenCalledWith(resource);
71
+ expect(props.value.secretData.ssh).toStrictEqual(ssh);
72
+ });
73
+
74
+ it('should return the appropriate props when secret type is BASIC', () => {
75
+ const basic = { type: 'basic' };
76
+ const useBasicSpy = jest.spyOn(authTypes, 'useBasic');
77
+
78
+ useSecretInfoSpy.mockImplementation((): any => ({ value: { secretType: SECRET_TYPES.BASIC } }));
79
+ useBasicSpy.mockImplementation((): any => ({ value: basic }));
80
+
81
+ const props = useSecretDataTabDefaultProps(resource);
82
+
83
+ expect(props.value.tabLabel).toStrictEqual('secret.data');
84
+ expect(useBasicSpy).toHaveBeenCalledWith(resource);
85
+ expect(props.value.secretData.basicAuth).toStrictEqual(basic);
86
+ });
87
+
88
+ it('should return the appropriate props when secret type is anything else', () => {
89
+ const basic = { type: 'basic' };
90
+ const useBasicSpy = jest.spyOn(authTypes, 'useBasic');
91
+
92
+ useSecretInfoSpy.mockImplementation((): any => ({ value: { secretType: SECRET_TYPES.FLEET_CLUSTER } }));
93
+ useBasicSpy.mockImplementation((): any => ({ value: basic }));
94
+
95
+ const props = useSecretDataTabDefaultProps(resource);
96
+
97
+ expect(props.value.tabLabel).toStrictEqual('secret.data');
98
+ expect(useBasicSpy).toHaveBeenCalledWith(resource);
99
+ expect(props.value.secretData.basic).toStrictEqual(basic);
100
+ });
101
+ });
102
+ });
@@ -0,0 +1,109 @@
1
+ import { computed, toValue } from 'vue';
2
+ import { base64Decode } from '@shell/utils/crypto';
3
+
4
+ export const useSecretInfo = (resource: any) => {
5
+ return computed(() => {
6
+ const resourceValue = toValue(resource);
7
+
8
+ return {
9
+ secretType: resourceValue._type,
10
+ secretData: resourceValue.data || {}
11
+ };
12
+ });
13
+ };
14
+
15
+ export const useSecretRows = (resource: any) => {
16
+ return computed(() => {
17
+ const resourceValue = toValue(resource);
18
+
19
+ const rows: any[] = [];
20
+ const { data = {} } = resourceValue;
21
+
22
+ Object.keys(data).forEach((key) => {
23
+ const value = base64Decode(data[key]);
24
+
25
+ rows.push({
26
+ key,
27
+ value
28
+ });
29
+ });
30
+
31
+ return rows;
32
+ });
33
+ };
34
+
35
+ export const useDockerAuths = (resource: any) => {
36
+ const secretInfo = useSecretInfo(resource);
37
+
38
+ return computed(() => {
39
+ const json = base64Decode(secretInfo.value.secretData['.dockerconfigjson']);
40
+
41
+ return JSON.parse(json).auths;
42
+ });
43
+ };
44
+
45
+ export const useDockerRegistry = (resource: any) => {
46
+ const dockerAuths = useDockerAuths(resource);
47
+
48
+ return computed(() => {
49
+ return { registryUrl: Object.keys(dockerAuths.value)[0] };
50
+ });
51
+ };
52
+
53
+ export const useDockerBasic = (resource: any) => {
54
+ const dockerAuths = useDockerAuths(resource);
55
+ const dockerRegistry = useDockerRegistry(resource);
56
+
57
+ return computed(() => {
58
+ return {
59
+ username: dockerAuths.value[dockerRegistry.value.registryUrl].username,
60
+ password: dockerAuths.value[dockerRegistry.value.registryUrl].password,
61
+ };
62
+ });
63
+ };
64
+
65
+ export const useBasic = (resource: any) => {
66
+ const rows = useSecretRows(resource);
67
+ const secretInfo = useSecretInfo(resource);
68
+
69
+ return computed(() => {
70
+ return {
71
+ username: base64Decode(secretInfo.value.secretData.username || ''),
72
+ password: base64Decode(secretInfo.value.secretData.password || ''),
73
+ rows: rows.value
74
+ };
75
+ });
76
+ };
77
+
78
+ export const useSsh = (resource: any) => {
79
+ const secretInfo = useSecretInfo(resource);
80
+
81
+ return computed(() => {
82
+ return {
83
+ username: base64Decode(secretInfo.value.secretData['ssh-publickey'] || ''),
84
+ password: base64Decode(secretInfo.value.secretData['ssh-privatekey'] || ''),
85
+ };
86
+ });
87
+ };
88
+
89
+ export const useServiceAccount = (resource: any) => {
90
+ const secretInfo = useSecretInfo(resource);
91
+
92
+ return computed(() => {
93
+ return {
94
+ token: base64Decode(secretInfo.value.secretData['token']),
95
+ crt: base64Decode(secretInfo.value.secretData['ca.crt']),
96
+ };
97
+ });
98
+ };
99
+
100
+ export const useTls = (resource: any) => {
101
+ const secretInfo = useSecretInfo(resource);
102
+
103
+ return computed(() => {
104
+ return {
105
+ token: base64Decode(secretInfo.value.secretData['tls.key']),
106
+ crt: base64Decode(secretInfo.value.secretData['tls.crt']),
107
+ };
108
+ });
109
+ };