@rancher/shell 0.3.29 → 0.5.0

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 (301) hide show
  1. package/assets/images/providers/ovhcloudmks.svg +122 -0
  2. package/assets/images/providers/ovhcloudpubliccloud.svg +122 -0
  3. package/assets/styles/global/_layout.scss +99 -0
  4. package/assets/translations/en-us.yaml +31 -6
  5. package/assets/translations/zh-hans.yaml +2 -2
  6. package/babel.config.js +7 -1
  7. package/chart/monitoring/alerting/index.vue +7 -21
  8. package/chart/monitoring/grafana/index.vue +55 -0
  9. package/chart/monitoring/index.vue +51 -17
  10. package/chart/monitoring/prometheus/index.vue +37 -43
  11. package/chart/rancher-backup/index.vue +2 -1
  12. package/cloud-credential/azure.vue +4 -17
  13. package/components/AsyncButton.vue +17 -5
  14. package/components/Certificates.vue +164 -0
  15. package/components/CodeMirror.vue +19 -21
  16. package/components/CopyCode.vue +6 -2
  17. package/components/CopyToClipboard.vue +2 -1
  18. package/components/CopyToClipboardText.vue +14 -9
  19. package/components/CruResource.vue +1 -0
  20. package/components/DraggableZone.vue +2 -2
  21. package/components/EtcdInfoBanner.vue +5 -5
  22. package/components/ExplorerProjectsNamespaces.vue +25 -1
  23. package/components/IconOrSvg.vue +1 -1
  24. package/components/LandingPagePreference.vue +1 -4
  25. package/components/Markdown.vue +16 -12
  26. package/components/PodSecurityAdmission.vue +2 -2
  27. package/components/Questions/index.vue +1 -1
  28. package/components/ResourceDetail/Masthead.vue +25 -9
  29. package/components/ResourceTable.vue +14 -2
  30. package/components/ResourceYaml.vue +5 -0
  31. package/components/SideNav.vue +1 -1
  32. package/components/SingleClusterInfo.vue +1 -4
  33. package/components/StatusTable.vue +5 -1
  34. package/components/Tabbed/index.vue +12 -0
  35. package/components/__tests__/CopyCode.test.ts +5 -4
  36. package/components/fleet/FleetBundles.vue +5 -11
  37. package/components/fleet/FleetRepos.vue +62 -27
  38. package/components/fleet/FleetResources.vue +6 -1
  39. package/components/fleet/FleetSummary.vue +3 -3
  40. package/components/fleet/__tests__/FleetSummary.test.ts +316 -0
  41. package/components/form/ArrayListSelect.vue +10 -0
  42. package/components/form/Error.vue +3 -3
  43. package/components/form/Footer.vue +2 -2
  44. package/components/form/GitPicker.vue +83 -38
  45. package/components/form/KeyValue.vue +4 -0
  46. package/components/form/LabeledSelect.vue +4 -0
  47. package/components/form/Password.vue +3 -1
  48. package/components/formatter/Checked.vue +11 -3
  49. package/components/formatter/FleetClusterSummaryGraph.vue +27 -0
  50. package/components/formatter/FleetSummaryGraph.vue +23 -11
  51. package/components/formatter/LiveDuration.vue +1 -1
  52. package/components/formatter/PercentageBar.vue +1 -1
  53. package/components/formatter/__tests__/Checked.test.ts +19 -0
  54. package/components/nav/Group.vue +2 -2
  55. package/components/nav/Header.vue +1 -2
  56. package/components/nav/TopLevelMenu.vue +36 -6
  57. package/components/nav/Type.vue +1 -3
  58. package/components/nav/WindowManager/ContainerLogs.vue +101 -3
  59. package/components/nav/WindowManager/ContainerShell.vue +6 -1
  60. package/components/nav/WindowManager/__tests__/ContainerLogs.test.ts +186 -0
  61. package/components/nav/WindowManager/index.vue +11 -10
  62. package/components/nav/__tests__/TopLevelMenu.test.ts +33 -0
  63. package/components/nav/__tests__/Type.test.ts +1 -1
  64. package/components/nuxt/nuxt-child.js +14 -78
  65. package/components/nuxt/nuxt.js +1 -1
  66. package/{layouts → components/templates}/blank.vue +1 -1
  67. package/{layouts → components/templates}/default.vue +8 -98
  68. package/{layouts → components/templates}/error.vue +10 -19
  69. package/{layouts → components/templates}/home.vue +4 -1
  70. package/{layouts → components/templates}/plain.vue +4 -1
  71. package/{layouts → components/templates}/standalone.vue +1 -1
  72. package/{layouts → components/templates}/unauthenticated.vue +1 -1
  73. package/composables/useCompactInput.test.ts +36 -0
  74. package/composables/useCompactInput.ts +20 -0
  75. package/composables/useLabeledFormElement.test.ts +135 -0
  76. package/composables/useLabeledFormElement.ts +138 -0
  77. package/config/harvester-manager-types.js +2 -0
  78. package/config/home-links.js +1 -1
  79. package/config/private-label.js +22 -0
  80. package/config/product/explorer.js +3 -0
  81. package/config/product/fleet.js +6 -1
  82. package/config/product/manager.js +8 -2
  83. package/config/query-params.js +1 -0
  84. package/config/router.js +385 -364
  85. package/config/settings.ts +1 -0
  86. package/config/store.js +1 -1
  87. package/config/system-namespaces.js +3 -0
  88. package/config/table-headers.js +47 -0
  89. package/core/plugin-helpers.js +3 -5
  90. package/core/plugin-routes.ts +56 -114
  91. package/core/plugin.ts +16 -10
  92. package/core/plugins-loader.js +7 -9
  93. package/core/plugins.js +0 -3
  94. package/creators/app/files/.gitlab-ci.yml +14 -0
  95. package/creators/app/init +19 -0
  96. package/detail/fleet.cattle.io.cluster.vue +11 -1
  97. package/detail/provisioning.cattle.io.cluster.vue +4 -3
  98. package/dialog/ScaleMachineDownDialog.vue +34 -17
  99. package/edit/__tests__/service.test.ts +89 -0
  100. package/edit/auth/googleoauth.vue +1 -5
  101. package/edit/cloudcredential.vue +2 -0
  102. package/edit/configmap.vue +2 -1
  103. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +2 -2
  104. package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +12 -3
  105. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +2 -1
  106. package/edit/networking.k8s.io.networkpolicy/__tests__/PolicyRuleTarget.spec.ts +1 -1
  107. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +15 -7
  108. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +112 -0
  109. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +473 -0
  110. package/edit/provisioning.cattle.io.cluster/__tests__/{CustomCommand.tests.ts → CustomCommand.test.ts} +6 -0
  111. package/edit/provisioning.cattle.io.cluster/__tests__/DrainOptions.test.ts +1 -1
  112. package/edit/provisioning.cattle.io.cluster/__tests__/index.test.ts +73 -0
  113. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +7 -1
  114. package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +386 -0
  115. package/edit/provisioning.cattle.io.cluster/import.vue +2 -2
  116. package/edit/provisioning.cattle.io.cluster/index.vue +92 -36
  117. package/edit/provisioning.cattle.io.cluster/rke2.vue +171 -583
  118. package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +137 -0
  119. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +157 -0
  120. package/edit/provisioning.cattle.io.cluster/{Basics.vue → tabs/Basics.vue} +94 -19
  121. package/edit/provisioning.cattle.io.cluster/{MachinePool.vue → tabs/MachinePool.vue} +1 -0
  122. package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +135 -0
  123. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +189 -0
  124. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +144 -0
  125. package/edit/provisioning.cattle.io.cluster/tabs/upgrade/index.vue +76 -0
  126. package/edit/service.vue +12 -0
  127. package/edit/workload/Upgrading.vue +3 -2
  128. package/edit/workload/mixins/workload.js +1 -1
  129. package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +2 -1
  130. package/initialize/App.js +25 -71
  131. package/initialize/client.js +21 -162
  132. package/initialize/index.js +47 -124
  133. package/list/management.cattle.io.feature.vue +1 -7
  134. package/list/node.vue +1 -0
  135. package/machine-config/__tests__/vmwarevsphere.test.ts +100 -21
  136. package/machine-config/vmwarevsphere.vue +73 -51
  137. package/middleware/authenticated.js +10 -17
  138. package/mixins/auth-config.js +2 -7
  139. package/mixins/brand.js +29 -41
  140. package/mixins/create-edit-view/index.js +2 -2
  141. package/mixins/labeled-form-element.ts +6 -1
  142. package/models/__tests__/management.cattle.io.cluster.test.ts +4 -0
  143. package/models/__tests__/management.cattle.io.node.ts +85 -0
  144. package/models/__tests__/management.cattle.io.nodepool.ts +83 -0
  145. package/models/__tests__/namespace.test.ts +49 -9
  146. package/models/__tests__/workload.test.ts +91 -0
  147. package/models/cluster/node.js +4 -4
  148. package/models/cluster.x-k8s.io.machinedeployment.js +14 -0
  149. package/models/fleet.cattle.io.cluster.js +4 -0
  150. package/models/fleet.cattle.io.gitrepo.js +56 -13
  151. package/models/management.cattle.io.cluster.js +7 -3
  152. package/models/management.cattle.io.kontainerdriver.js +1 -1
  153. package/models/management.cattle.io.node.js +18 -14
  154. package/models/management.cattle.io.nodepool.js +17 -0
  155. package/models/namespace.js +1 -1
  156. package/models/pod.js +20 -0
  157. package/models/provisioning.cattle.io.cluster.js +39 -4
  158. package/models/secret.js +117 -18
  159. package/models/workload.js +16 -0
  160. package/models/workload.service.js +18 -0
  161. package/package.json +11 -10
  162. package/pages/about.vue +0 -1
  163. package/pages/account/create-key.vue +0 -1
  164. package/pages/account/index.vue +0 -1
  165. package/pages/auth/login.vue +0 -1
  166. package/pages/auth/logout.vue +0 -2
  167. package/pages/auth/setup.vue +0 -4
  168. package/pages/auth/verify.vue +14 -8
  169. package/pages/c/_cluster/apps/charts/index.vue +64 -43
  170. package/pages/c/_cluster/apps/charts/install.vue +4 -4
  171. package/pages/c/_cluster/apps/index.vue +0 -2
  172. package/pages/c/_cluster/auth/index.vue +0 -2
  173. package/pages/c/_cluster/ecm/index.vue +0 -2
  174. package/pages/c/_cluster/explorer/index.vue +28 -2
  175. package/pages/c/_cluster/fleet/index.vue +1 -1
  176. package/pages/c/_cluster/index.vue +0 -2
  177. package/pages/c/_cluster/settings/banners.vue +0 -2
  178. package/pages/c/_cluster/settings/brand.vue +0 -2
  179. package/pages/c/_cluster/settings/index.vue +0 -2
  180. package/pages/c/_cluster/settings/links.vue +0 -1
  181. package/pages/c/_cluster/settings/performance.vue +0 -1
  182. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +2 -1
  183. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +10 -46
  184. package/pages/c/_cluster/uiplugins/index.vue +0 -2
  185. package/pages/diagnostic.vue +1 -2
  186. package/pages/fail-whale.vue +0 -1
  187. package/pages/prefs.vue +0 -1
  188. package/pages/support/index.vue +2 -8
  189. package/pkg/auto-import.js +1 -1
  190. package/plugins/axios.js +0 -36
  191. package/plugins/back-button.js +3 -5
  192. package/plugins/clean-html-directive.js +1 -19
  193. package/plugins/clean-html.js +53 -0
  194. package/plugins/clean-tooltip-directive.js +1 -1
  195. package/plugins/codemirror-loader.js +1 -1
  196. package/plugins/codemirror.js +41 -0
  197. package/plugins/dashboard-store/__tests__/{mutations.spec.ts → mutations.test.ts} +1 -1
  198. package/plugins/dashboard-store/__tests__/resource-class.test.ts +49 -0
  199. package/plugins/dashboard-store/__tests__/utils/store-mocks.ts +7 -0
  200. package/plugins/dashboard-store/actions.js +30 -4
  201. package/plugins/dashboard-store/classify.js +1 -18
  202. package/plugins/dashboard-store/getters.js +10 -5
  203. package/plugins/dashboard-store/index.js +0 -12
  204. package/plugins/dashboard-store/mutations.js +0 -4
  205. package/plugins/dashboard-store/resource-class.js +59 -18
  206. package/plugins/index.js +11 -0
  207. package/plugins/steve/__tests__/steve-class.spec.ts +59 -0
  208. package/plugins/steve/__tests__/utils/steve-mocks.ts +31 -0
  209. package/plugins/steve/getters.js +4 -1
  210. package/plugins/steve/norman-class.js +19 -0
  211. package/plugins/steve/steve-class.js +22 -0
  212. package/plugins/steve/subscribe.js +4 -10
  213. package/rancher-components/Accordion/Accordion.test.ts +45 -0
  214. package/rancher-components/Accordion/Accordion.vue +86 -0
  215. package/rancher-components/Accordion/index.ts +1 -0
  216. package/rancher-components/BadgeState/BadgeState.vue +3 -3
  217. package/rancher-components/Banner/Banner.vue +2 -2
  218. package/rancher-components/Card/Card.vue +3 -3
  219. package/rancher-components/Form/Checkbox/Checkbox.vue +3 -3
  220. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +18 -1
  221. package/rancher-components/Form/LabeledInput/LabeledInput.vue +65 -24
  222. package/rancher-components/Form/Radio/RadioButton.test.ts +7 -3
  223. package/rancher-components/Form/Radio/RadioButton.vue +13 -7
  224. package/rancher-components/Form/Radio/RadioGroup.test.ts +30 -0
  225. package/rancher-components/Form/Radio/RadioGroup.vue +8 -3
  226. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +6 -4
  227. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  228. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
  229. package/rancher-components/StringList/StringList.test.ts +270 -0
  230. package/rancher-components/StringList/StringList.vue +65 -26
  231. package/rancher-components/components/Accordion/Accordion.test.ts +45 -0
  232. package/rancher-components/components/Accordion/Accordion.vue +86 -0
  233. package/rancher-components/components/Accordion/index.ts +1 -0
  234. package/rancher-components/components/BadgeState/BadgeState.vue +3 -3
  235. package/rancher-components/components/Banner/Banner.vue +2 -2
  236. package/rancher-components/components/Card/Card.vue +3 -3
  237. package/rancher-components/components/Form/Checkbox/Checkbox.vue +3 -3
  238. package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +18 -1
  239. package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +57 -24
  240. package/rancher-components/components/Form/Radio/RadioButton.vue +13 -7
  241. package/rancher-components/components/Form/Radio/RadioGroup.vue +4 -3
  242. package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +6 -4
  243. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  244. package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +9 -4
  245. package/rancher-components/components/StringList/StringList.vue +8 -8
  246. package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +50 -0
  247. package/scripts/extension/bundle +19 -7
  248. package/scripts/extension/helm/scripts/package +11 -3
  249. package/scripts/extension/parse-tag-name +2 -2
  250. package/scripts/extension/publish +20 -9
  251. package/scripts/publish-shell.sh +10 -0
  252. package/scripts/test-plugins-build.sh +85 -9
  253. package/server/har-file.js +183 -0
  254. package/store/catalog.js +1 -1
  255. package/store/features.js +1 -0
  256. package/store/i18n.js +11 -0
  257. package/store/index.js +13 -15
  258. package/store/prefs.js +33 -35
  259. package/store/type-map.js +8 -7
  260. package/tsconfig.json +35 -9
  261. package/tsconfig.paths.json +21 -0
  262. package/types/shell/index.d.ts +433 -234
  263. package/types/vue-shim.d.ts +42 -0
  264. package/utils/__tests__/create-yaml.test.ts +60 -0
  265. package/utils/axios.js +0 -19
  266. package/utils/azure.js +24 -0
  267. package/utils/clipboard.js +5 -0
  268. package/utils/create-yaml.js +17 -10
  269. package/utils/git.ts +1 -1
  270. package/utils/monitoring.js +1 -1
  271. package/utils/nuxt.js +18 -39
  272. package/utils/object.js +14 -0
  273. package/utils/router.scrollBehavior.js +12 -14
  274. package/utils/time.js +1 -1
  275. package/utils/url.ts +1 -1
  276. package/vue.config.js +23 -2
  277. package/.DS_Store +0 -0
  278. package/assets/images/providers/aks-black.svg +0 -28
  279. package/assets/images/providers/aks.svg +0 -31
  280. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.tests.ts +0 -234
  281. package/initialize/layouts.ts +0 -26
  282. package/mixins/fetch.server.js +0 -73
  283. package/pages/c/index.vue +0 -9
  284. package/pages/rio/mesh.vue +0 -508
  285. package/plugins/transitions.js +0 -4
  286. package/plugins/vue-clipboard2.js +0 -4
  287. package/tsconfig.default.json +0 -46
  288. package/yarn-error.log +0 -200
  289. /package/components/form/__tests__/{NameNsDescription.ts → NameNsDescription.test.ts} +0 -0
  290. /package/edit/networking.k8s.io.networkpolicy/__tests__/utils/{selectors.ts → selectors.test.ts} +0 -0
  291. /package/edit/provisioning.cattle.io.cluster/{AgentConfiguration.vue → tabs/AgentConfiguration.vue} +0 -0
  292. /package/edit/provisioning.cattle.io.cluster/{MemberRoles.vue → tabs/MemberRoles.vue} +0 -0
  293. /package/edit/provisioning.cattle.io.cluster/{S3Config.vue → tabs/etcd/S3Config.vue} +0 -0
  294. /package/edit/provisioning.cattle.io.cluster/{ACE.vue → tabs/networking/ACE.vue} +0 -0
  295. /package/edit/provisioning.cattle.io.cluster/{RegistryConfigs.vue → tabs/registries/RegistryConfigs.vue} +0 -0
  296. /package/edit/provisioning.cattle.io.cluster/{RegistryMirrors.vue → tabs/registries/RegistryMirrors.vue} +0 -0
  297. /package/edit/provisioning.cattle.io.cluster/{DrainOptions.vue → tabs/upgrade/DrainOptions.vue} +0 -0
  298. /package/plugins/dashboard-store/__tests__/{actions.spec.ts → actions.test.ts} +0 -0
  299. /package/plugins/dashboard-store/__tests__/{getters.spec.ts → getters.test.ts} +0 -0
  300. /package/rancher-components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
  301. /package/rancher-components/components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
@@ -0,0 +1,50 @@
1
+ .podman-setup: &podman-setup
2
+ - zypper --non-interactive install jq podman
3
+ - usermod --add-subuids 100000-165535 --add-subgids 100000-165535 $(id -nu)
4
+ - podman login -u $REGISTRY_USER -p $REGISTRY_PASSWORD $REGISTRY
5
+
6
+ check_version_collisions:
7
+ stage: check_version
8
+ rules:
9
+ - changes:
10
+ - package.json
11
+ script:
12
+ - *podman-setup
13
+ - |
14
+ PACKAGE_VERSION=`jq -r .version package.json`
15
+ PACKAGE_NAME=`jq -r .name package.json`
16
+
17
+ readarray -t VERSIONS < <(podman search $REGISTRY/$IMAGE_NAMESPACE/ui-extension-$PACKAGE_NAME --list-tags --format {{.Tag}})
18
+
19
+ echo -e "Checking for version collisions with Extension version: ${PACKAGE_VERSION}"
20
+ for version in ${VERSIONS[@]}; do
21
+ if [[ ${version} == ${PACKAGE_VERSION} ]]; then
22
+ echo "Cannot overwrite production image version ${version} since it already exists."
23
+ podman logout $REGISTRY
24
+ exit 1
25
+ fi
26
+ done
27
+
28
+ echo -e "Published image not found for version ${PACKAGE_VERSION}, continuing build..."
29
+ tags:
30
+ - linux
31
+
32
+ build_and_release:
33
+ stage: build_catalog
34
+ rules:
35
+ - changes:
36
+ - package.json
37
+ script:
38
+ - *podman-setup
39
+ - zypper addrepo https://download.opensuse.org/repositories/devel:languages:nodejs/SLE_12_SP5/devel:languages:nodejs.repo
40
+ - zypper --non-interactive --no-gpg-checks refresh
41
+ - zypper --non-interactive install go git nodejs14 npm helm
42
+ - YQ_URL="https://github.com/mikefarah/yq/releases/download/v4.35.2/yq_linux_amd64"
43
+ - curl -sLf ${YQ_URL} -o /usr/bin/yq && chmod +x /usr/bin/yq
44
+ - npm install -g --unsafe-perm yarn
45
+ - yarn
46
+ - yarn publish-pkgs -cl -r $REGISTRY -o $IMAGE_NAMESPACE
47
+ - podman push `podman images -f reference!=registry.suse.com/bci/bci-base --format "{{index .Names 0}}"`
48
+ - podman logout $REGISTRY
49
+ tags:
50
+ - linux
@@ -16,6 +16,7 @@ REGISTRY="${3}"
16
16
  REGISTRY_ORG="${4}"
17
17
  IMAGE_PREFIX="${5}"
18
18
  PUSH="${6}"
19
+ PODMAN_CONTAINER="${7}"
19
20
 
20
21
  PKG_NAME="${PKG}-${PKG_VERSION}"
21
22
 
@@ -48,12 +49,15 @@ for d in ${BASE_DIR}/dist-pkg/*; do
48
49
  cp -R ${BASE_DIR}/dist-pkg/${pkg} ${TMP}/container/plugin
49
50
  done
50
51
 
51
- # Build the docker image
52
- pushd ${TMP}/container > /dev/null
53
- echo -e "${CYAN}Building container image ...${RESET}"
52
+ package() {
53
+ if [ "${PODMAN_CONTAINER}" == "true" ]; then
54
+ RUNTIME="podman"
55
+ else
56
+ RUNTIME="docker"
57
+ fi
58
+ echo -e "Container build: ${RUNTIME}"
54
59
 
55
- if [ ! -z "${REGISTRY}" ]; then
56
- REGISTRY=${REGISTRY} ORG=${REGISTRY_ORG} REPO=${IMAGE_PREFIX}${PKG} TAG=${PKG_VERSION} ./scripts/package
60
+ REGISTRY=${REGISTRY} ORG=${REGISTRY_ORG} REPO=${IMAGE_PREFIX}${PKG} TAG=${PKG_VERSION} RUNTIME=${RUNTIME} ./scripts/package
57
61
 
58
62
  if [ "${PUSH}" == "--push" ]; then
59
63
  echo -e "${CYAN}Pushing container image ...${RESET}"
@@ -61,14 +65,22 @@ if [ ! -z "${REGISTRY}" ]; then
61
65
  # Ensure that you do not overwrite production images
62
66
  if [[ "${REGISTRY_ORG}" == "rancher" ]]; then
63
67
  IMAGE=${REGISTRY}${REGISTRY_ORG}/${IMAGE_PREFIX}${PKG}:${PKG_VERSION}
64
- if docker manifest inspect 2>&1 1>/dev/null; then
68
+ if ${RUNTIME} manifest inspect ${IMAGE} 2>&1 1>/dev/null; then
65
69
  echo -e "${RED}${BOLD}Cannot overwrite production image ${IMAGE_PREFIX}${PKG} since it already exists${RESET}"
66
70
  exit 1
67
71
  fi
68
72
  fi
69
73
 
70
- docker push ${REGISTRY}${REGISTRY_ORG}/${IMAGE_PREFIX}${PKG}:${PKG_VERSION}
74
+ ${RUNTIME} push ${REGISTRY}${REGISTRY_ORG}/${IMAGE_PREFIX}${PKG}:${PKG_VERSION}
71
75
  fi
76
+ }
77
+
78
+ # Build the container image
79
+ pushd ${TMP}/container > /dev/null
80
+ echo -e "${CYAN}Building container image ...${RESET}"
81
+
82
+ if [ ! -z "${REGISTRY}" ]; then
83
+ package
72
84
  fi
73
85
 
74
86
  popd > /dev/null
@@ -5,8 +5,8 @@ source $(dirname $0)/version
5
5
 
6
6
  cd $(dirname $0)/..
7
7
 
8
- if [[ -z ${ORG} ]] || [[ -z ${REPO} ]] || [[ -z ${TAG} ]]; then
9
- echo "Usage: [REGISTRY=] ORG= REPO= TAG= ./scripts/package"
8
+ if [[ -z ${ORG} ]] || [[ -z ${REPO} ]] || [[ -z ${TAG} ]] || [[ -z ${RUNTIME} ]]; then
9
+ echo "Usage: [REGISTRY=] ORG= REPO= TAG= RUNTIME= ./scripts/package"
10
10
  exit 1
11
11
  fi
12
12
 
@@ -19,5 +19,13 @@ if [ -e ${DOCKERFILE}.${ARCH} ]; then
19
19
  DOCKERFILE=${DOCKERFILE}.${ARCH}
20
20
  fi
21
21
 
22
- docker build -f ${DOCKERFILE} -t ${IMAGE} .
22
+ BUILD="${RUNTIME} build -f ${DOCKERFILE} -t ${IMAGE}"
23
+
24
+ if [[ ${RUNTIME} == "podman" ]]; then
25
+ BUILD="$BUILD -v /var/lib/containers:/var/lib/containers ."
26
+ else
27
+ BUILD="$BUILD ."
28
+ fi
29
+
30
+ $BUILD
23
31
  echo Built ${IMAGE}
@@ -5,7 +5,7 @@ GITHUB_RUN_ID=$2
5
5
  GITHUB_WORKFLOW_TYPE=$3
6
6
 
7
7
  # Check packages for released tag name
8
- if [[ "${GITHUB_WORKFLOW_TYPE}" == "container" ]]; then
8
+ if [[ "${GITHUB_WORKFLOW_TYPE}" == "charts" ]]; then
9
9
  for d in pkg/*/ ; do
10
10
  pkg=$(basename $d)
11
11
 
@@ -27,4 +27,4 @@ else
27
27
  echo -e "tag: ${GITHUB_RELEASE_TAG}"
28
28
  gh run cancel ${GITHUB_RUN_ID}
29
29
  fi
30
- fi
30
+ fi
@@ -17,6 +17,7 @@ IMAGE_PREFIX="ui-extension-"
17
17
  FORCE="false"
18
18
  GITHUB_BUILD="true"
19
19
  GITHUB_RELEASE_TAG=""
20
+ PODMAN_CONTAINER="false"
20
21
 
21
22
  GITHUB_SOURCE=$(git config --get remote.origin.url | sed -e 's/^git@.*:\([[:graph:]]*\).git/\1/')
22
23
  GITHUB_BRANCH="main"
@@ -33,10 +34,11 @@ usage() {
33
34
  echo " -r <name> Specify destination container registry for built images"
34
35
  echo " -o <name> Specify destination container registry organization for built images"
35
36
  echo " -i <prefix> Specify prefix for the built container image (default: 'ui-extension-')"
37
+ echo " -l Specify Podman container build"
36
38
  exit 1
37
39
  }
38
40
 
39
- while getopts "hvr:o:pi:fcb:t:s:" opt; do
41
+ while getopts "hvr:o:pi:fcb:t:s:l" opt; do
40
42
  case $opt in
41
43
  h)
42
44
  usage
@@ -70,6 +72,9 @@ while getopts "hvr:o:pi:fcb:t:s:" opt; do
70
72
  t)
71
73
  GITHUB_RELEASE_TAG="${OPTARG}"
72
74
  ;;
75
+ l)
76
+ PODMAN_CONTAINER="true"
77
+ ;;
73
78
  *)
74
79
  usage
75
80
  ;;
@@ -126,7 +131,11 @@ fi
126
131
 
127
132
  COMMANDS=("node" "jq" "yq" "git" "helm" "yarn")
128
133
  if [ "${GITHUB_BUILD}" == "false" ]; then
129
- COMMANDS+=("docker")
134
+ if [ "${PODMAN_CONTAINER}" == "true" ]; then
135
+ COMMANDS+=("podman")
136
+ else
137
+ COMMANDS+=("docker")
138
+ fi
130
139
  fi
131
140
 
132
141
  HAVE_COMMANDS="true"
@@ -172,10 +181,12 @@ if [ "${GITHUB_BUILD}" == "false" ]; then
172
181
  exit 1
173
182
  fi
174
183
 
175
- docker images > /dev/null
176
- if [ $? -ne 0 ]; then
177
- echo "docker is not running - this is required to build container images for the UI Plugins"
178
- exit 1
184
+ if [ "${PODMAN_CONTAINER}" == "false" ]; then
185
+ docker images > /dev/null
186
+ if [ $? -ne 0 ]; then
187
+ echo "docker is not running - this is required to build container images for the UI Plugins"
188
+ exit 1
189
+ fi
179
190
  fi
180
191
  fi
181
192
 
@@ -354,8 +365,8 @@ if [ "${GITHUB_BUILD}" == "false" ]; then
354
365
  echo -e "${CYAN}Base extension: ${BASE_EXT}${RESET}"
355
366
  echo -e "${CYAN}Extension version: ${EXT_VERSION}${RESET}"
356
367
 
357
- # Build the docker image
358
- ${SCRIPT_DIR}/bundle ${BASE_EXT} ${EXT_VERSION} ${REGISTRY} ${REGISTRY_ORG} ${IMAGE_PREFIX} ${PUSH}
368
+ # Build the container image
369
+ ${SCRIPT_DIR}/bundle "${BASE_EXT}" "${EXT_VERSION}" "${REGISTRY}" "${REGISTRY_ORG}" "${IMAGE_PREFIX}" "${PUSH}" "${PODMAN_CONTAINER}"
359
370
  else
360
371
  rm -rf ${CHART_TEMPLATE}
361
372
  fi
@@ -386,5 +397,5 @@ fi
386
397
  rm -rf ${CHART_TMP}
387
398
 
388
399
  if [ "${GITHUB_BUILD}" == "false" ]; then
389
- rm -rf ${TMP}
400
+ rm -rf ${TMP} ${ASSETS} ${CHARTS} ${BASE_DIR}/extensions ${BASE_DIR}/dist-pkg ${ROOT_INDEX}
390
401
  fi
@@ -8,6 +8,8 @@ BASE_DIR="$(
8
8
  SHELL_DIR=$BASE_DIR/shell/
9
9
  TMP_DIR=$BASE_DIR/tmp
10
10
  PUBLISH_ARGS="--no-git-tag-version --access public $PUBLISH_ARGS"
11
+ FORCE_PUBLISH_TO_NPM="false"
12
+ DEFAULT_YARN_REGISTRY="https://registry.npmjs.org"
11
13
 
12
14
  if [ ! -d "${BASE_DIR}/node_modules" ]; then
13
15
  echo "You need to run 'yarn install' first"
@@ -16,6 +18,14 @@ fi
16
18
 
17
19
  echo "Publishing Shell Packages"
18
20
 
21
+ if [ "$1" == "--npm" ]; then
22
+ FORCE_PUBLISH_TO_NPM="true"
23
+ fi
24
+
25
+ if [ "$FORCE_PUBLISH_TO_NPM" == "true" ]; then
26
+ export YARN_REGISTRY=$DEFAULT_YARN_REGISTRY
27
+ fi
28
+
19
29
  # We use the version from the shell package for the creator packages
20
30
  # Need to copy them to a temporary location, so we can patch the version number
21
31
  # before publishing
@@ -7,6 +7,9 @@ echo "Checking plugin build"
7
7
  SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
8
8
  BASE_DIR="$( cd $SCRIPT_DIR && cd ../.. & pwd)"
9
9
  SHELL_DIR=$BASE_DIR/shell/
10
+ SHELL_VERSION="99.99.99"
11
+ DEFAULT_YARN_REGISTRY="https://registry.npmjs.org"
12
+ VERDACCIO_YARN_REGISTRY="http://localhost:4873"
10
13
 
11
14
  echo ${SCRIPT_DIR}
12
15
 
@@ -66,21 +69,24 @@ else
66
69
  rm -rf ~/.config/verdaccio/storage/@rancher/*
67
70
  fi
68
71
 
69
- export YARN_REGISTRY=http://localhost:4873
72
+ export YARN_REGISTRY=$VERDACCIO_YARN_REGISTRY
70
73
  export NUXT_TELEMETRY_DISABLED=1
71
74
 
72
75
  # Remove test package from previous run, if present
73
- rm -rf ${BASE_DIR}/pkg/test-pkg
76
+ if [ $TEST_PERSIST_BUILD != "true" ]; then
77
+ echo "Removing folder ${BASE_DIR}/pkg/test-pkg"
78
+ rm -rf ${BASE_DIR}/pkg/test-pkg
79
+ fi
74
80
 
75
81
  # We need to patch the version number of the shell, otherwise if we are running
76
82
  # with the currently published version, things will fail as those versions
77
83
  # are already published and Verdaccio will check, since it is a read-through cache
78
- sed -i.bak -e "s/\"version\": \"[0-9]*.[0-9]*.[0-9]*\",/\"version\": \"7.7.7\",/g" ${SHELL_DIR}/package.json
84
+ sed -i.bak -e "s/\"version\": \"[0-9]*.[0-9]*.[0-9]*\(-alpha\.[0-9]*\|-release[0-9]*.[0-9]*.[0-9]*\|-rc\.[0-9]*\)\{0,1\}\",/\"version\": \"${SHELL_VERSION}\",/g" ${SHELL_DIR}/package.json
79
85
  rm ${SHELL_DIR}/package.json.bak
80
86
 
81
87
  # Same as above for Rancher Components
82
88
  # We might have bumped the version number but its not published yet, so this will fail
83
- sed -i.bak -e "s/\"version\": \"[0-9]*.[0-9]*.[0-9]*\",/\"version\": \"7.7.7\",/g" ${BASE_DIR}/pkg/rancher-components/package.json
89
+ sed -i.bak -e "s/\"version\": \"[0-9]*.[0-9]*.[0-9]*\(-alpha\.[0-9]*\|-release[0-9]*.[0-9]*.[0-9]*\|-rc\.[0-9]*\)\{0,1\}\",/\"version\": \"${SHELL_VERSION}\",/g" ${BASE_DIR}/pkg/rancher-components/package.json
84
90
 
85
91
  # Publish shell
86
92
  echo "Publishing shell packages to local registry"
@@ -108,6 +114,7 @@ if [ "${SKIP_STANDALONE}" == "false" ]; then
108
114
  yarn install
109
115
 
110
116
  echo "Building skeleton app"
117
+
111
118
  FORCE_COLOR=true yarn build | cat
112
119
 
113
120
  # Package creator
@@ -127,22 +134,91 @@ if [ "${SKIP_STANDALONE}" == "false" ]; then
127
134
  echo "Cleaning temporary dir"
128
135
  popd > /dev/null
129
136
 
130
- rm -rf ${DIR}
137
+ if [ $TEST_PERSIST_BUILD != "true" ]; then
138
+ echo "Removing folder ${DIR}"
139
+ rm -rf ${DIR}
140
+ fi
131
141
  fi
132
142
 
133
143
  pushd $BASE_DIR
134
- pwd
135
- ls
136
144
 
137
145
  # Now try a plugin within the dashboard codebase
138
146
  echo "Validating in-tree package"
139
147
 
140
148
  yarn install
141
149
 
142
- rm -rf ./pkg/test-pkg
150
+ if [ $TEST_PERSIST_BUILD != "true" ]; then
151
+ echo "Removing folder ./pkg/test-pkg"
152
+ rm -rf ./pkg/test-pkg
153
+ fi
154
+
143
155
  yarn create @rancher/pkg test-pkg -t
144
156
  cp ${SHELL_DIR}/list/catalog.cattle.io.clusterrepo.vue ./pkg/test-pkg/list
145
157
  FORCE_COLOR=true yarn build-pkg test-pkg | cat
146
- rm -rf ./pkg/test-pkg
158
+ if [ $TEST_PERSIST_BUILD != "true" ]; then
159
+ echo "Removing folder ./pkg/test-pkg"
160
+ rm -rf ./pkg/test-pkg
161
+ fi
162
+
163
+ # function to clone repos and install dependencies (including the newly published shell version)
164
+ function clone_repo_test_extension_build() {
165
+ REPO_NAME=$1
166
+ PKG_NAME=$2
167
+
168
+ echo -e "\nSetting up $REPO_NAME repository locally\n"
169
+
170
+ # set registry to default (to install all of the other dependencies)
171
+ yarn config set registry ${DEFAULT_YARN_REGISTRY}
172
+
173
+ if [ $TEST_PERSIST_BUILD != "true" ]; then
174
+ echo "Removing folder ${BASE_DIR}/$REPO_NAME"
175
+ rm -rf ${BASE_DIR}/$REPO_NAME
176
+ fi
177
+
178
+ # cloning repo
179
+ git clone https://github.com/rancher/$REPO_NAME.git
180
+ pushd ${BASE_DIR}/$REPO_NAME
181
+
182
+ echo -e "\nInstalling dependencies for $REPO_NAME\n"
183
+ yarn install
184
+
185
+ # set registry to local verdaccio (to install new shell)
186
+ yarn config set registry ${VERDACCIO_YARN_REGISTRY}
187
+
188
+ # update package.json to use a specific version of shell
189
+ sed -i.bak -e "s/\"\@rancher\/shell\": \"[0-9]*.[0-9]*.[0-9]*\",/\"\@rancher\/shell\": \"${SHELL_VERSION}\",/g" package.json
190
+ rm package.json.bak
191
+
192
+ # we need to remove yarn.lock, otherwise it would install a version that we don't want
193
+ rm yarn.lock
194
+
195
+ echo -e "\nInstalling newly built shell version\n"
196
+
197
+ # installing new version of shell
198
+ yarn add @rancher/shell@${SHELL_VERSION}
199
+
200
+ # test build-pkg
201
+ FORCE_COLOR=true yarn build-pkg $PKG_NAME | cat
202
+
203
+ # kubewarden has some unit tests and they should be quick to run... Let's check them as well
204
+ if [ "${REPO_NAME}" == "kubewarden-ui" ]; then
205
+ yarn test:ci
206
+ fi
207
+
208
+ # return back to the base path
209
+ popd
210
+
211
+ # delete folder
212
+ if [ $TEST_PERSIST_BUILD != "true" ]; then
213
+ echo "Removing folder ${BASE_DIR}/$REPO_NAME"
214
+ rm -rf ${BASE_DIR}/$REPO_NAME
215
+ fi
216
+ yarn config set registry ${DEFAULT_YARN_REGISTRY}
217
+ }
218
+
219
+ # Here we just add the extension that we want to include as a check (all our official extensions should be included here)
220
+ # Don't forget to add the unit tests exception to clone_repo_test_extension_build function if a new extension has those
221
+ clone_repo_test_extension_build "kubewarden-ui" "kubewarden"
222
+ clone_repo_test_extension_build "elemental-ui" "elemental"
147
223
 
148
224
  echo "All done"
@@ -0,0 +1,183 @@
1
+ const fs = require('fs');
2
+ const path = require('path');
3
+
4
+ // When we receive a request to this URL we will reset the session to replay again from the HAR file
5
+ // This allows the user to refresh the browser and replay the HAR file again
6
+ const RESET_URL = '/api/v1/namespaces/cattle-ui-plugin-system/services/http:ui-plugin-operator:80/proxy/index.json';
7
+
8
+ const EXCLUDES_QS = '?exclude=metadata.managedFields';
9
+
10
+ /**
11
+ * Load the network requests/responses from the har file
12
+ * @param name name/path of the file
13
+ * @param port port that the local dev server is running on
14
+ * @returns har file data
15
+ */
16
+ function loadFile(name, port, dashboard) {
17
+ const newBase = `https://127.0.0.1:${ port }`;
18
+ const data = {};
19
+
20
+ console.log(`Loading HAR file: ${ name }`); // eslint-disable-line no-console
21
+
22
+ const rawData = fs.readFileSync(name);
23
+ const har = JSON.parse(rawData);
24
+ let base = '';
25
+ let uri = '';
26
+
27
+ if (har?.log?.pages) {
28
+ const page = har.log.pages.find((page) => page.title.includes('/dashboard/'));
29
+
30
+ if (page) {
31
+ const parts = page.title.split('/dashboard');
32
+
33
+ base = parts[0];
34
+ uri = parts[1];
35
+ }
36
+ }
37
+
38
+ if (har?.log?.entries) {
39
+ console.log('Network requests:'); // eslint-disable-line no-console
40
+
41
+ har.log.entries.forEach((r) => {
42
+ const mimeType = r.response.content.mimeType;
43
+
44
+ // Only cache json responses
45
+ if (mimeType === 'application/json' || mimeType === 'text/plain') {
46
+ let url = r.request.url;
47
+
48
+ if (url.startsWith(base)) {
49
+ url = url.substr(base.length);
50
+ }
51
+
52
+ console.log(` ${ r.request.method } ${ decodeURIComponent(url) }`); // eslint-disable-line no-console
53
+
54
+ data[url] = data[url] || {};
55
+ data[url][r.request.method] = data[url][r.request.method] || [];
56
+
57
+ const item = {
58
+ status: r.response.status,
59
+ statusText: r.response.statusText,
60
+ headers: r.response.headers,
61
+ content: r.response.content
62
+ };
63
+
64
+ if (item.content.text) {
65
+ item.content.text = item.content.text.replaceAll(base, newBase);
66
+ data[url][r.request.method].push(item);
67
+ } else {
68
+ console.log(' Warning: Omitting this response as there is no content - UI may not work as expected'); // eslint-disable-line no-console
69
+ }
70
+ }
71
+ });
72
+ }
73
+
74
+ console.log('Page:'); // eslint-disable-line no-console
75
+ console.log(` ${ newBase }${ dashboard }${ uri }`); // eslint-disable-line no-console
76
+ console.log(''); // eslint-disable-line no-console
77
+
78
+ return data;
79
+ }
80
+
81
+ function exportToFiles(data, folder) {
82
+ console.log(`Exporting request data to ${ folder }`); // eslint-disable-line no-console
83
+
84
+ Object.keys(data).forEach((r) => {
85
+ const out = path.join(folder, `.${ r }`);
86
+ const dir = path.dirname(out);
87
+
88
+ console.log(r); // eslint-disable-line no-console
89
+
90
+ Object.keys(data[r]).forEach((method) => {
91
+ const name = `${ path.basename(out) }.${ method.toLowerCase() }.json`;
92
+
93
+ fs.mkdirSync(dir, { recursive: true });
94
+
95
+ data[r][method].forEach((request) => {
96
+ const formatted = JSON.stringify(JSON.parse(request.content.text), null, 2);
97
+
98
+ fs.writeFileSync(path.join(dir, name), formatted);
99
+ });
100
+ });
101
+ });
102
+ }
103
+
104
+ function harProxy(responses, folder) {
105
+ let session = JSON.parse(JSON.stringify(responses));
106
+
107
+ return (req, res, next) => {
108
+ if (req.originalUrl === RESET_URL) {
109
+ session = JSON.parse(JSON.stringify(responses));
110
+ console.log('>>>>>>>> Reset session replay from har file'); // eslint-disable-line no-console
111
+ }
112
+
113
+ const url = decodeURIComponent(req.originalUrl);
114
+ let playback = session[req.originalUrl];
115
+
116
+ // If it did not match, try without the metadata excludes query string that was adding in 2.8.0
117
+ // This might allow HAR captures with Rancher < 2.8.0 to be replayed on >= 2.8.0
118
+ if (!playback && req.originalUrl.endsWith(EXCLUDES_QS)) {
119
+ playback = session[req.originalUrl.slice(0, -EXCLUDES_QS.length)];
120
+ }
121
+
122
+ if (playback && playback[req.method] && playback[req.method].length) {
123
+ const resp = playback[req.method][0];
124
+
125
+ if (playback[req.method].length > 1) {
126
+ playback[req.method].shift();
127
+ }
128
+
129
+ const body = resp.content?.text || '';
130
+
131
+ res.type(resp.content.mimeType);
132
+ res.status(resp.status);
133
+ res.send(Buffer.from(body));
134
+ res.end();
135
+
136
+ const char = !!resp.used ? '*' : ' ';
137
+
138
+ console.log(`${ req.method }${ char } ${ resp.status } ${ url }`); // eslint-disable-line no-console
139
+
140
+ resp.used = true;
141
+
142
+ return;
143
+ }
144
+
145
+ if (req.originalUrl.startsWith('/v1/') || req.originalUrl.startsWith('/v3/') || req.originalUrl.startsWith('/k8s/')) {
146
+ // If we have been configured with a folder, look for a file with the contents to use for the request
147
+ if (folder) {
148
+ // Remove query string
149
+ const name = req.originalUrl.split('?')[0];
150
+ const requestFile = path.join(folder, `.${ name }.${ req.method.toLowerCase() }.json`);
151
+
152
+ if (fs.existsSync(requestFile)) {
153
+ const data = fs.readFileSync(requestFile);
154
+
155
+ console.log(`${ req.method }f 200 ${ url }`); // eslint-disable-line no-console
156
+
157
+ res.type('application/json');
158
+ res.status(200);
159
+ res.send(data);
160
+
161
+ return res.end();
162
+ }
163
+ }
164
+
165
+ // Fallback to sending a 404 response
166
+ res.status(404);
167
+ res.send('Not Found');
168
+
169
+ console.log(`${ req.method }? 404 ${ url }`); // eslint-disable-line no-console
170
+
171
+ return res.end();
172
+ }
173
+
174
+ // Continue on to serve up other resources
175
+ return next();
176
+ };
177
+ }
178
+
179
+ module.exports = {
180
+ loadFile,
181
+ harProxy,
182
+ exportToFiles,
183
+ };
package/store/catalog.js CHANGED
@@ -354,7 +354,7 @@ export const actions = {
354
354
 
355
355
  // As per comment above, when there are no clusters this will be management. Store it such that it can be used for those cases
356
356
  commit('setInStore', inStore);
357
- hash.cluster = hash.cluster.filter((repo) => !(repo?.metadata?.annotations?.[CATALOG_ANNOTATIONS.HIDDEN_REPO] === 'true'));
357
+ hash.cluster = hash.cluster?.filter((repo) => !(repo?.metadata?.annotations?.[CATALOG_ANNOTATIONS.HIDDEN_REPO] === 'true'));
358
358
 
359
359
  commit('setRepos', hash);
360
360
 
package/store/features.js CHANGED
@@ -27,6 +27,7 @@ export const mapFeature = function(name) {
27
27
  export const MULTI_CLUSTER = create('multi-cluster-management', true);
28
28
  export const LEGACY = create('legacy', false);
29
29
  export const RKE2 = create('rke2', true);
30
+ export const RKE1_UI = create('rke1-ui', true);
30
31
  export const UNSUPPORTED_STORAGE_DRIVERS = create('unsupported-storage-drivers', false);
31
32
  export const FLEET = create('continuous-delivery', true);
32
33
  export const HARVESTER = create('harvester', true);
package/store/i18n.js CHANGED
@@ -308,6 +308,17 @@ export const actions = {
308
308
  p.push(dispatch('mergeLoad', { locale, module: fn }));
309
309
  });
310
310
 
311
+ // load all of the default locales from the plugins for fallback
312
+ if (locale !== DEFAULT_LOCALE) {
313
+ const defaultI18nExt = rootState.$plugin?.getDynamic('l10n', DEFAULT_LOCALE);
314
+
315
+ if (defaultI18nExt && defaultI18nExt.length) {
316
+ defaultI18nExt.forEach((fn) => {
317
+ p.push(dispatch('mergeLoad', { locale: DEFAULT_LOCALE, module: fn }));
318
+ });
319
+ }
320
+ }
321
+
311
322
  try {
312
323
  await Promise.all(p);
313
324
  } catch (e) {
package/store/index.js CHANGED
@@ -713,10 +713,7 @@ export const actions = {
713
713
 
714
714
  const promises = {
715
715
  // Clusters guaranteed always available or your money back
716
- clusters: dispatch('management/findAll', {
717
- type: MANAGEMENT.CLUSTER,
718
- opt: { url: MANAGEMENT.CLUSTER }
719
- }),
716
+ clusters: dispatch('management/findAll', { type: MANAGEMENT.CLUSTER }),
720
717
 
721
718
  // Features checks on its own if they are available
722
719
  features: dispatch('features/loadServer'),
@@ -804,14 +801,14 @@ export const actions = {
804
801
  commit('targetRoute', targetRoute);
805
802
  const sameCluster = state.clusterId && state.clusterId === id;
806
803
  const samePackage = oldPkg?.name === newPkg?.name;
804
+ const sameProduct = oldProduct === product;
807
805
  const isMultiCluster = getters['isMultiCluster'];
808
806
 
809
- // Are we in the same cluster and package?
810
- if ( sameCluster && samePackage) {
807
+ // Are we in the same cluster and package or product?
808
+ if ( sameCluster && (samePackage || sameProduct)) {
811
809
  // Do nothing, we're already connected/connecting to this cluster
812
810
  return;
813
811
  }
814
-
815
812
  const oldPkgClusterStore = oldPkg?.stores.find(
816
813
  (s) => getters[`${ s.storeName }/isClusterStore`]
817
814
  )?.storeName;
@@ -832,7 +829,6 @@ export const actions = {
832
829
  // so that the nav and header stay the same when going to things like prefs
833
830
  commit('clusterReady', false);
834
831
  commit('clusterId', undefined);
835
-
836
832
  await dispatch('cluster/unsubscribe');
837
833
  commit('cluster/reset');
838
834
 
@@ -888,6 +884,10 @@ export const actions = {
888
884
  // Try and wait until the schema exists before proceeding
889
885
  await dispatch('management/waitForSchema', { type: MANAGEMENT.CLUSTER });
890
886
 
887
+ // Similar to above, we're still waiting on loadManagement to fetch required resources
888
+ // If we don't have all mgmt clusters yet a request to fetch this cluster and then all clusters (in cleanNamespaces) is kicked off
889
+ await dispatch('management/waitForHaveAll', { type: MANAGEMENT.CLUSTER });
890
+
891
891
  // See if it really exists
892
892
  try {
893
893
  const cluster = await dispatch('management/find', {
@@ -1047,15 +1047,13 @@ export const actions = {
1047
1047
  if ( route.name === 'index' ) {
1048
1048
  router.replace('/auth/login');
1049
1049
  } else {
1050
- if (!process.server) {
1051
- const backTo = window.localStorage.getItem(BACK_TO);
1050
+ const backTo = window.localStorage.getItem(BACK_TO);
1052
1051
 
1053
- const isLogin = route.name === 'auth-login' || route.path === '/login'; // Cover dashboard and case of log out from ember;
1054
- const isLogout = route.name === 'auth-logout';
1052
+ const isLogin = route.name === 'auth-login' || route.path === '/login'; // Cover dashboard and case of log out from ember;
1053
+ const isLogout = route.name === 'auth-logout';
1055
1054
 
1056
- if (!backTo && !isLogin && !isLogout) {
1057
- window.localStorage.setItem(BACK_TO, window.location.href);
1058
- }
1055
+ if (!backTo && !isLogin && !isLogout) {
1056
+ window.localStorage.setItem(BACK_TO, window.location.href);
1059
1057
  }
1060
1058
 
1061
1059
  const QUERY = (LOGGED_OUT in route.query) ? LOGGED_OUT : TIMED_OUT;