@rancher/shell 0.5.2 → 1.2.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 (338) hide show
  1. package/.DS_Store +0 -0
  2. package/assets/images/providers/aks-black.svg +28 -0
  3. package/assets/images/providers/aks.svg +31 -0
  4. package/assets/styles/global/_labeled-input.scss +1 -0
  5. package/assets/styles/global/_layout.scss +0 -99
  6. package/assets/translations/en-us.yaml +77 -71
  7. package/assets/translations/zh-hans.yaml +25 -23
  8. package/babel.config.js +1 -7
  9. package/chart/gatekeeper.vue +11 -2
  10. package/chart/istio.vue +10 -1
  11. package/chart/logging/index.vue +11 -2
  12. package/chart/monitoring/alerting/index.vue +21 -7
  13. package/chart/monitoring/grafana/index.vue +2 -57
  14. package/chart/monitoring/index.vue +26 -52
  15. package/chart/monitoring/prometheus/index.vue +43 -37
  16. package/chart/rancher-backup/index.vue +10 -3
  17. package/cloud-credential/azure.vue +17 -4
  18. package/components/AsyncButton.vue +0 -9
  19. package/components/Carousel.vue +0 -1
  20. package/components/ChartPsp.vue +76 -0
  21. package/components/CodeMirror.vue +21 -19
  22. package/components/CopyCode.vue +2 -6
  23. package/components/CopyToClipboard.vue +1 -2
  24. package/components/CopyToClipboardText.vue +9 -14
  25. package/components/CruResource.vue +0 -1
  26. package/components/EtcdInfoBanner.vue +5 -5
  27. package/components/ExplorerProjectsNamespaces.vue +1 -25
  28. package/components/IconOrSvg.vue +1 -1
  29. package/components/Markdown.vue +12 -16
  30. package/components/Questions/index.vue +1 -1
  31. package/components/ResourceDetail/Masthead.vue +9 -25
  32. package/components/ResourceList/Masthead.vue +18 -1
  33. package/components/ResourceTable.vue +2 -14
  34. package/components/ResourceYaml.vue +0 -5
  35. package/components/SideNav.vue +1 -1
  36. package/components/SortableTable/THead.vue +9 -7
  37. package/components/SortableTable/index.vue +3 -2
  38. package/components/StatusTable.vue +1 -5
  39. package/components/TabTitle.vue +84 -0
  40. package/components/Tabbed/index.vue +0 -12
  41. package/components/__tests__/ChartPsp.test.ts +75 -0
  42. package/components/__tests__/CopyCode.test.ts +4 -5
  43. package/components/fleet/FleetBundles.vue +11 -5
  44. package/components/fleet/FleetRepos.vue +27 -62
  45. package/components/fleet/FleetResources.vue +1 -6
  46. package/components/fleet/FleetStatus.vue +3 -3
  47. package/components/fleet/FleetSummary.vue +30 -35
  48. package/components/form/ArrayList.vue +8 -1
  49. package/components/form/ArrayListSelect.vue +9 -9
  50. package/components/form/KeyValue.vue +0 -1
  51. package/components/form/LabeledSelect.vue +0 -4
  52. package/components/form/Password.vue +1 -3
  53. package/components/form/Select.vue +1 -1
  54. package/components/form/SelectOrCreateAuthSecret.vue +4 -4
  55. package/components/form/__tests__/KeyValue.test.ts +1 -1
  56. package/components/formatter/Checked.vue +3 -11
  57. package/components/formatter/ClusterProvider.vue +18 -1
  58. package/components/formatter/FleetSummaryGraph.vue +11 -23
  59. package/components/formatter/LiveDate.vue +16 -0
  60. package/components/formatter/LiveDuration.vue +1 -1
  61. package/components/formatter/PercentageBar.vue +1 -1
  62. package/components/formatter/__tests__/ClusterProvider.test.ts +28 -0
  63. package/components/nav/Group.vue +2 -2
  64. package/components/nav/Header.vue +2 -1
  65. package/components/nav/TopLevelMenu.vue +3 -29
  66. package/components/nav/Type.vue +3 -1
  67. package/components/nav/WindowManager/ContainerLogs.vue +19 -120
  68. package/components/nav/WindowManager/ContainerShell.vue +1 -6
  69. package/components/nav/WindowManager/index.vue +10 -11
  70. package/components/nav/__tests__/TopLevelMenu.test.ts +0 -33
  71. package/components/nav/__tests__/Type.test.ts +1 -1
  72. package/components/nuxt/nuxt-child.js +78 -14
  73. package/components/nuxt/nuxt.js +1 -1
  74. package/components/user.retention/user-retention-header.vue +34 -0
  75. package/composables/useI18n.ts +26 -0
  76. package/composables/useStore.ts +16 -0
  77. package/config/harvester-manager-types.js +0 -2
  78. package/config/home-links.js +32 -2
  79. package/config/private-label.js +0 -22
  80. package/config/product/explorer.js +4 -4
  81. package/config/product/fleet.js +1 -6
  82. package/config/product/legacy.js +1 -84
  83. package/config/product/manager.js +15 -8
  84. package/config/query-params.js +0 -1
  85. package/config/router.js +368 -385
  86. package/config/settings.ts +9 -2
  87. package/config/store.js +1 -1
  88. package/config/system-namespaces.js +0 -3
  89. package/config/table-headers.js +27 -47
  90. package/config/types.js +5 -0
  91. package/config/uiplugins.js +1 -1
  92. package/core/plugin-helpers.js +5 -3
  93. package/core/plugin-routes.ts +114 -56
  94. package/core/plugin.ts +10 -16
  95. package/core/plugins-loader.js +9 -7
  96. package/core/plugins.js +3 -0
  97. package/core/types-provisioning.ts +0 -7
  98. package/creators/app/init +0 -19
  99. package/detail/fleet.cattle.io.cluster.vue +1 -11
  100. package/detail/node.vue +0 -42
  101. package/detail/pod.vue +1 -68
  102. package/detail/provisioning.cattle.io.cluster.vue +4 -6
  103. package/detail/workload/index.vue +1 -15
  104. package/dialog/ScaleMachineDownDialog.vue +17 -34
  105. package/edit/auth/googleoauth.vue +5 -1
  106. package/edit/catalog.cattle.io.clusterrepo.vue +7 -20
  107. package/edit/cloudcredential.vue +0 -2
  108. package/edit/fleet.cattle.io.gitrepo.vue +4 -3
  109. package/edit/management.cattle.io.project.vue +52 -1
  110. package/edit/management.cattle.io.setting.vue +2 -31
  111. package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +3 -12
  112. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +1 -2
  113. package/edit/networking.k8s.io.networkpolicy/__tests__/PolicyRuleTarget.spec.ts +1 -1
  114. package/edit/provisioning.cattle.io.cluster/{tabs/Basics.vue → Basics.vue} +126 -109
  115. package/edit/provisioning.cattle.io.cluster/{tabs/MachinePool.vue → MachinePool.vue} +7 -1
  116. package/edit/provisioning.cattle.io.cluster/{tabs/registries/RegistryConfigs.vue → RegistryConfigs.vue} +3 -1
  117. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +7 -15
  118. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.tests.ts +237 -0
  119. package/edit/provisioning.cattle.io.cluster/__tests__/{CustomCommand.test.ts → CustomCommand.tests.ts} +0 -6
  120. package/edit/provisioning.cattle.io.cluster/__tests__/DrainOptions.test.ts +1 -1
  121. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +1 -7
  122. package/edit/provisioning.cattle.io.cluster/import.vue +2 -2
  123. package/edit/provisioning.cattle.io.cluster/index.vue +37 -99
  124. package/edit/provisioning.cattle.io.cluster/rke2.vue +690 -181
  125. package/edit/service.vue +0 -12
  126. package/edit/workload/Upgrading.vue +2 -3
  127. package/edit/workload/index.vue +1 -2
  128. package/edit/workload/mixins/workload.js +1 -1
  129. package/initialize/App.js +71 -25
  130. package/initialize/client.js +162 -21
  131. package/initialize/index.js +124 -47
  132. package/initialize/layouts.ts +26 -0
  133. package/{components/templates → layouts}/blank.vue +1 -1
  134. package/{components/templates → layouts}/default.vue +98 -8
  135. package/{components/templates → layouts}/error.vue +19 -10
  136. package/{components/templates → layouts}/home.vue +1 -4
  137. package/{components/templates → layouts}/plain.vue +1 -4
  138. package/{components/templates → layouts}/standalone.vue +1 -1
  139. package/{components/templates → layouts}/unauthenticated.vue +1 -1
  140. package/list/management.cattle.io.feature.vue +7 -1
  141. package/list/management.cattle.io.user.vue +25 -1
  142. package/list/node.vue +0 -1
  143. package/machine-config/__tests__/vmwarevsphere.test.ts +161 -56
  144. package/machine-config/amazonec2.vue +1 -0
  145. package/machine-config/azure.vue +37 -21
  146. package/machine-config/vmwarevsphere.vue +47 -42
  147. package/middleware/authenticated.js +19 -14
  148. package/mixins/auth-config.js +7 -2
  149. package/mixins/brand.js +41 -29
  150. package/mixins/fetch.server.js +73 -0
  151. package/mixins/labeled-form-element.ts +1 -6
  152. package/models/__tests__/management.cattle.io.node.ts +0 -85
  153. package/models/__tests__/namespace.test.ts +9 -49
  154. package/models/cluster/node.js +4 -4
  155. package/models/cluster.x-k8s.io.machine.js +1 -1
  156. package/models/cluster.x-k8s.io.machinedeployment.js +0 -14
  157. package/models/fleet.cattle.io.cluster.js +0 -4
  158. package/models/fleet.cattle.io.gitrepo.js +13 -56
  159. package/models/management.cattle.io.cluster.js +3 -11
  160. package/models/management.cattle.io.kontainerdriver.js +0 -1
  161. package/models/management.cattle.io.node.js +14 -18
  162. package/models/management.cattle.io.nodepool.js +0 -17
  163. package/models/management.cattle.io.project.js +36 -0
  164. package/models/management.cattle.io.setting.js +7 -11
  165. package/models/management.cattle.io.user.js +65 -0
  166. package/models/namespace.js +1 -1
  167. package/models/pod.js +0 -20
  168. package/models/provisioning.cattle.io.cluster.js +8 -55
  169. package/models/secret.js +18 -117
  170. package/models/workload.js +0 -16
  171. package/models/workload.service.js +0 -18
  172. package/package.json +10 -12
  173. package/pages/about.vue +1 -0
  174. package/pages/account/create-key.vue +1 -0
  175. package/pages/account/index.vue +1 -0
  176. package/pages/auth/login.vue +1 -0
  177. package/pages/auth/logout.vue +2 -0
  178. package/pages/auth/setup.vue +4 -37
  179. package/pages/auth/verify.vue +8 -14
  180. package/pages/c/_cluster/apps/charts/__tests__/install.helper.test.ts +17 -2
  181. package/pages/c/_cluster/apps/charts/index.vue +58 -64
  182. package/pages/c/_cluster/apps/charts/install.helpers.js +13 -2
  183. package/pages/c/_cluster/apps/charts/install.vue +5 -5
  184. package/pages/c/_cluster/apps/index.vue +2 -0
  185. package/pages/c/_cluster/auth/index.vue +2 -0
  186. package/pages/c/_cluster/auth/user.retention/index.vue +384 -0
  187. package/pages/c/_cluster/ecm/index.vue +2 -0
  188. package/pages/c/_cluster/explorer/index.vue +53 -56
  189. package/pages/c/_cluster/explorer/tools/index.vue +3 -171
  190. package/pages/c/_cluster/fleet/index.vue +1 -1
  191. package/pages/c/_cluster/index.vue +2 -0
  192. package/pages/c/_cluster/manager/pages/_page.vue +5 -4
  193. package/pages/c/_cluster/monitoring/index.vue +1 -17
  194. package/pages/c/_cluster/settings/DefaultLinksEditor.vue +1 -0
  195. package/pages/c/_cluster/settings/banners.vue +2 -0
  196. package/pages/c/_cluster/settings/brand.vue +2 -0
  197. package/pages/c/_cluster/settings/index.vue +2 -0
  198. package/pages/c/_cluster/settings/links.vue +3 -2
  199. package/pages/c/_cluster/settings/performance.vue +1 -0
  200. package/pages/c/_cluster/uiplugins/AddExtensionRepos.vue +4 -4
  201. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +1 -2
  202. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +46 -10
  203. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +5 -2
  204. package/pages/c/_cluster/uiplugins/__tests__/AddExtensionRepos.test.ts +96 -0
  205. package/pages/c/_cluster/uiplugins/__tests__/SetupUIPlugins.test.ts +128 -0
  206. package/pages/c/_cluster/uiplugins/index.vue +2 -0
  207. package/pages/c/index.vue +9 -0
  208. package/pages/diagnostic.vue +2 -1
  209. package/pages/fail-whale.vue +1 -0
  210. package/pages/prefs.vue +1 -0
  211. package/pages/rio/mesh.vue +508 -0
  212. package/pages/support/index.vue +8 -2
  213. package/pkg/auto-import.js +1 -1
  214. package/plugins/axios.js +36 -0
  215. package/plugins/back-button.js +5 -3
  216. package/plugins/clean-html-directive.js +19 -1
  217. package/plugins/clean-tooltip-directive.js +1 -1
  218. package/plugins/codemirror-loader.js +1 -1
  219. package/plugins/codemirror.js +0 -41
  220. package/plugins/dashboard-store/__tests__/actions.spec.ts +250 -0
  221. package/plugins/dashboard-store/__tests__/{mutations.test.ts → mutations.spec.ts} +1 -1
  222. package/plugins/dashboard-store/actions.js +21 -22
  223. package/plugins/dashboard-store/classify.js +18 -1
  224. package/plugins/dashboard-store/getters.js +5 -10
  225. package/plugins/dashboard-store/index.js +12 -0
  226. package/plugins/dashboard-store/mutations.js +4 -0
  227. package/plugins/dashboard-store/resource-class.js +18 -59
  228. package/plugins/i18n.js +1 -1
  229. package/plugins/steve/__tests__/getters.spec.ts +56 -24
  230. package/plugins/steve/__tests__/subscribe.spec.ts +106 -0
  231. package/plugins/steve/getters.js +30 -7
  232. package/plugins/steve/mutations.js +5 -2
  233. package/plugins/steve/norman-class.js +0 -19
  234. package/plugins/steve/steve-class.js +0 -22
  235. package/plugins/steve/subscribe.js +34 -13
  236. package/plugins/transitions.js +4 -0
  237. package/plugins/vue-clipboard2.js +4 -0
  238. package/rancher-components/Accordion/Accordion.vue +3 -2
  239. package/rancher-components/BadgeState/BadgeState.vue +3 -3
  240. package/rancher-components/Banner/Banner.test.ts +1 -5
  241. package/rancher-components/Banner/Banner.vue +2 -2
  242. package/rancher-components/Card/Card.vue +4 -4
  243. package/rancher-components/Form/Checkbox/Checkbox.vue +4 -3
  244. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +1 -1
  245. package/rancher-components/Form/LabeledInput/LabeledInput.vue +55 -24
  246. package/rancher-components/Form/Radio/RadioButton.test.ts +1 -3
  247. package/rancher-components/Form/Radio/RadioButton.vue +13 -7
  248. package/rancher-components/Form/Radio/RadioGroup.vue +4 -3
  249. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +7 -5
  250. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  251. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
  252. package/rancher-components/StringList/StringList.vue +8 -8
  253. package/rancher-components/components/Accordion/Accordion.vue +3 -2
  254. package/rancher-components/components/BadgeState/BadgeState.test.ts +12 -0
  255. package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +2 -19
  256. package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +14 -11
  257. package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +1 -1
  258. package/rancher-components/components/StringList/StringList.test.ts +0 -270
  259. package/rancher-components/components/StringList/StringList.vue +18 -57
  260. package/scripts/extension/bundle +7 -19
  261. package/scripts/extension/helm/scripts/package +3 -11
  262. package/scripts/extension/parse-tag-name +4 -4
  263. package/scripts/extension/publish +9 -20
  264. package/scripts/publish-shell.sh +1 -11
  265. package/scripts/test-plugins-build.sh +9 -85
  266. package/store/catalog.js +1 -1
  267. package/store/features.js +0 -1
  268. package/store/i18n.js +0 -11
  269. package/store/index.js +11 -8
  270. package/store/prefs.js +38 -33
  271. package/store/type-map.js +8 -13
  272. package/tsconfig.default.json +46 -0
  273. package/tsconfig.json +9 -35
  274. package/types/shell/index.d.ts +404 -463
  275. package/utils/__tests__/create-yaml.test.ts +10 -0
  276. package/utils/axios.js +19 -0
  277. package/utils/create-yaml.js +6 -6
  278. package/utils/custom-validators.js +2 -0
  279. package/utils/error.js +1 -16
  280. package/utils/monitoring.js +2 -37
  281. package/utils/nuxt.js +39 -18
  282. package/utils/object.js +0 -14
  283. package/utils/router.scrollBehavior.js +14 -12
  284. package/utils/socket.js +1 -0
  285. package/utils/time.js +1 -1
  286. package/utils/title.ts +3 -0
  287. package/utils/url.ts +1 -1
  288. package/utils/validators/formRules/__tests__/index.test.ts +4 -49
  289. package/utils/validators/formRules/index.ts +9 -12
  290. package/utils/validators/setting.js +10 -6
  291. package/vue.config.js +3 -24
  292. package/chart/monitoring/steps/uninstall-v1.vue +0 -135
  293. package/components/Certificates.vue +0 -164
  294. package/components/fleet/__tests__/FleetSummary.test.ts +0 -316
  295. package/components/formatter/FleetClusterSummaryGraph.vue +0 -27
  296. package/components/formatter/__tests__/Checked.test.ts +0 -19
  297. package/components/nav/WindowManager/__tests__/ContainerLogs.test.ts +0 -186
  298. package/composables/useCompactInput.ts +0 -20
  299. package/composables/useLabeledFormElement.ts +0 -138
  300. package/creators/app/files/.gitlab-ci.yml +0 -14
  301. package/edit/__tests__/service.test.ts +0 -89
  302. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +0 -112
  303. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +0 -473
  304. package/edit/provisioning.cattle.io.cluster/__tests__/index.test.ts +0 -73
  305. package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +0 -386
  306. package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +0 -137
  307. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +0 -157
  308. package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +0 -135
  309. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +0 -189
  310. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +0 -144
  311. package/edit/provisioning.cattle.io.cluster/tabs/upgrade/index.vue +0 -76
  312. package/mixins/v1-workload-metrics.js +0 -43
  313. package/models/__tests__/management.cattle.io.cluster.test.ts +0 -23
  314. package/models/__tests__/management.cattle.io.nodepool.ts +0 -83
  315. package/models/__tests__/provisioning.cattle.io.cluster.test.ts +0 -90
  316. package/models/__tests__/workload.test.ts +0 -91
  317. package/plugins/clean-html.js +0 -53
  318. package/plugins/dashboard-store/__tests__/actions.test.ts +0 -165
  319. package/plugins/dashboard-store/__tests__/resource-class.test.ts +0 -49
  320. package/plugins/dashboard-store/__tests__/utils/store-mocks.ts +0 -7
  321. package/plugins/index.js +0 -11
  322. package/plugins/steve/__tests__/steve-class.spec.ts +0 -59
  323. package/plugins/steve/__tests__/utils/steve-mocks.ts +0 -31
  324. package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +0 -50
  325. package/server/har-file.js +0 -183
  326. package/tsconfig.paths.json +0 -18
  327. package/utils/azure.js +0 -24
  328. package/utils/clipboard.js +0 -5
  329. /package/components/form/__tests__/{NameNsDescription.test.ts → NameNsDescription.ts} +0 -0
  330. /package/edit/networking.k8s.io.networkpolicy/__tests__/utils/{selectors.test.ts → selectors.ts} +0 -0
  331. /package/edit/provisioning.cattle.io.cluster/{tabs/networking/ACE.vue → ACE.vue} +0 -0
  332. /package/edit/provisioning.cattle.io.cluster/{tabs/AgentConfiguration.vue → AgentConfiguration.vue} +0 -0
  333. /package/edit/provisioning.cattle.io.cluster/{tabs/upgrade/DrainOptions.vue → DrainOptions.vue} +0 -0
  334. /package/edit/provisioning.cattle.io.cluster/{tabs/MemberRoles.vue → MemberRoles.vue} +0 -0
  335. /package/edit/provisioning.cattle.io.cluster/{tabs/registries/RegistryMirrors.vue → RegistryMirrors.vue} +0 -0
  336. /package/edit/provisioning.cattle.io.cluster/{tabs/etcd/S3Config.vue → S3Config.vue} +0 -0
  337. /package/plugins/dashboard-store/__tests__/{getters.test.ts → getters.spec.ts} +0 -0
  338. /package/rancher-components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
package/babel.config.js CHANGED
@@ -10,13 +10,7 @@ module.exports = function(api) {
10
10
  { targets: { node: 'current' } }
11
11
  ]
12
12
  ];
13
- const env = {
14
- test: {
15
- presets: [[
16
- '@babel/env', { targets: { node: 'current' } }
17
- ]]
18
- }
19
- };
13
+ const env = { test: { presets: [['@babel/env', { targets: { node: 'current' } }]] } };
20
14
 
21
15
  const plugins = [];
22
16
 
@@ -1,11 +1,14 @@
1
1
  <script>
2
2
  import UnitInput from '@shell/components/form/UnitInput';
3
+ import ChartPsp from '@shell/components/ChartPsp';
3
4
  import { Checkbox } from '@components/Form/Checkbox';
4
5
  import { mapGetters } from 'vuex';
5
6
 
6
7
  export default {
7
- components: { UnitInput, Checkbox },
8
- props: {
8
+ components: {
9
+ UnitInput, ChartPsp, Checkbox
10
+ },
11
+ props: {
9
12
  value: {
10
13
  type: Object,
11
14
  default: () => {
@@ -57,6 +60,12 @@ export default {
57
60
  </div>
58
61
  </div>
59
62
 
63
+ <!-- Conditionally display PSP checkbox -->
64
+ <ChartPsp
65
+ :value="value"
66
+ :cluster="currentCluster"
67
+ />
68
+
60
69
  <template v-if="crdValues">
61
70
  <!-- gatekeeper versions <1.0.2 do not have this option -->
62
71
  <Checkbox
package/chart/istio.vue CHANGED
@@ -6,6 +6,7 @@ import YamlEditor from '@shell/components/YamlEditor';
6
6
  import { mapGetters } from 'vuex';
7
7
  import FileSelector from '@shell/components/form/FileSelector';
8
8
  import { Banner } from '@components/Banner';
9
+ import ChartPsp from '@shell/components/ChartPsp';
9
10
 
10
11
  const defaultOverlayFile = `#apiVersion: install.istio.io/v1alpha1
11
12
  #kind: IstioOperator
@@ -53,7 +54,8 @@ export default {
53
54
  Checkbox,
54
55
  FileSelector,
55
56
  YamlEditor,
56
- Banner
57
+ Banner,
58
+ ChartPsp
57
59
  },
58
60
 
59
61
  props: {
@@ -138,6 +140,13 @@ export default {
138
140
 
139
141
  <template>
140
142
  <div>
143
+ <!-- Conditionally display PSP checkbox -->
144
+ <ChartPsp
145
+ :value="value"
146
+ :title="t('catalog.chart.global')"
147
+ :cluster="currentCluster"
148
+ />
149
+
141
150
  <h3>
142
151
  {{ t('istio.titles.components') }}
143
152
  </h3>
@@ -2,10 +2,13 @@
2
2
  import { mapGetters } from 'vuex';
3
3
  import { LabeledInput } from '@components/Form/LabeledInput';
4
4
  import { Checkbox } from '@components/Form/Checkbox';
5
+ import ChartPsp from '@shell/components/ChartPsp';
5
6
 
6
7
  export default {
7
- components: { Checkbox, LabeledInput },
8
- props: {
8
+ components: {
9
+ Checkbox, LabeledInput, ChartPsp
10
+ },
11
+ props: {
9
12
  value: {
10
13
  type: Object,
11
14
  default: () => {
@@ -80,5 +83,11 @@ export default {
80
83
  />
81
84
  </div>
82
85
  </div>
86
+
87
+ <!-- Conditionally display PSP checkbox -->
88
+ <ChartPsp
89
+ :value="value"
90
+ :cluster="currentCluster"
91
+ />
83
92
  </div>
84
93
  </template>
@@ -5,6 +5,8 @@ import { Checkbox } from '@components/Form/Checkbox';
5
5
  import LabeledSelect from '@shell/components/form/LabeledSelect';
6
6
  import { RadioGroup } from '@components/Form/Radio';
7
7
 
8
+ const DEFAULT_MONITORING_NAMESPACE = 'cattle-monitoring-system';
9
+
8
10
  export default {
9
11
  components: {
10
12
  Checkbox,
@@ -18,7 +20,7 @@ export default {
18
20
  default: 'create',
19
21
  },
20
22
 
21
- monitoringSecrets: {
23
+ secrets: {
22
24
  type: Array,
23
25
  default: () => [],
24
26
  },
@@ -41,7 +43,12 @@ export default {
41
43
 
42
44
  computed: {
43
45
  allSecrets() {
44
- return this.monitoringSecrets
46
+ const { secrets } = this;
47
+
48
+ return secrets
49
+ .filter(
50
+ (sec) => sec.metadata.namespace === DEFAULT_MONITORING_NAMESPACE
51
+ )
45
52
  .map((sec) => ({ label: sec.metadata.name, value: sec.metadata.name }));
46
53
  },
47
54
 
@@ -55,15 +62,22 @@ export default {
55
62
  },
56
63
 
57
64
  existingSecret() {
58
- return this.monitoringSecrets
59
- .find((sec) => sec?.metadata?.name === 'alertmanager-rancher-monitoring-alertmanager');
65
+ return this.secrets.find(
66
+ (sec) => sec?.metadata?.name ===
67
+ 'alertmanager-rancher-monitoring-alertmanager' &&
68
+ sec?.metadata?.namespace === DEFAULT_MONITORING_NAMESPACE
69
+ );
60
70
  },
61
71
 
62
72
  filteredSecrets() {
73
+ const { secrets } = this;
63
74
  const filtered = [];
64
75
 
65
- this.monitoringSecrets.forEach((secret) => {
66
- if ( secret.metadata.name ) {
76
+ secrets.forEach((secret) => {
77
+ if (
78
+ secret.metadata.name &&
79
+ secret.metadata.namespace === DEFAULT_MONITORING_NAMESPACE
80
+ ) {
67
81
  filtered.push(secret.metadata.name);
68
82
  }
69
83
  });
@@ -79,7 +93,7 @@ export default {
79
93
  },
80
94
 
81
95
  watch: {
82
- filteredSecrets(newValue) {
96
+ filteredSecrets(newValue, oldValue) {
83
97
  if (isEmpty(newValue)) {
84
98
  this.$set(
85
99
  this.value.alertmanager.alertmanagerSpec,
@@ -87,9 +87,6 @@ export default {
87
87
 
88
88
  return (storageClasses || []).length >= 1;
89
89
  },
90
- showGrafanaResourceConfig() {
91
- return this.value?.grafana?.resources?.requests && this.value?.grafana?.resources?.limits;
92
- }
93
90
  },
94
91
  watch: {
95
92
  persistentStorageType(newType, oldType) {
@@ -139,7 +136,7 @@ export default {
139
136
  newValsOut = {
140
137
  accessModes: null,
141
138
  storageClassName: null,
142
- size: '10Gi',
139
+ size: null,
143
140
  subPath: null,
144
141
  type: 'pvc',
145
142
  annotations: null,
@@ -151,7 +148,7 @@ export default {
151
148
  newValsOut = {
152
149
  accessModes: null,
153
150
  storageClassName: null,
154
- size: '10Gi',
151
+ size: null,
155
152
  subPath: null,
156
153
  type: 'statefulset',
157
154
  enabled: true,
@@ -175,58 +172,6 @@ export default {
175
172
  <h3>{{ t('monitoring.grafana.title') }}</h3>
176
173
  </div>
177
174
  <div class="grafana-config">
178
- <!-- Request and Limits -->
179
- <!-- Note, we use the same labels for resource config as Prometheus since they are generic -->
180
- <div
181
- v-if="showGrafanaResourceConfig"
182
- class="row"
183
- >
184
- <div class="col span-12 mt-5">
185
- <h4 class="mb-0">
186
- {{ t('monitoring.prometheus.config.resourceLimits') }}
187
- </h4>
188
- </div>
189
- </div>
190
- <div
191
- v-if="showGrafanaResourceConfig"
192
- class="row"
193
- >
194
- <div class="col span-6">
195
- <LabeledInput
196
- v-model="value.grafana.resources.requests.cpu"
197
- data-testid="input-grafana-requests-cpu"
198
- :label="t('monitoring.prometheus.config.requests.cpu')"
199
- :mode="mode"
200
- />
201
- </div>
202
- <div class="col span-6">
203
- <LabeledInput
204
- v-model="value.grafana.resources.requests.memory"
205
- data-testid="input-grafana-requests-memory"
206
- :label="t('monitoring.prometheus.config.requests.memory')"
207
- :mode="mode"
208
- />
209
- </div>
210
- </div>
211
- <div class="row">
212
- <div class="col span-6">
213
- <LabeledInput
214
- v-model="value.grafana.resources.limits.cpu"
215
- data-testid="input-grafana-limits-cpu"
216
- :label="t('monitoring.prometheus.config.limits.cpu')"
217
- :mode="mode"
218
- />
219
- </div>
220
- <div class="col span-6">
221
- <LabeledInput
222
- v-model="value.grafana.resources.limits.memory"
223
- data-testid="input-grafana-limits-memory"
224
- :label="t('monitoring.prometheus.config.limits.memory')"
225
- :mode="mode"
226
- />
227
- </div>
228
- </div>
229
-
230
175
  <div class="row pt-10 pb-10">
231
176
  <div class="col span-12 persistent-storage-config">
232
177
  <RadioGroup
@@ -12,10 +12,10 @@ import { LabeledInput } from '@components/Form/LabeledInput';
12
12
  import Loading from '@shell/components/Loading';
13
13
  import Prometheus from '@shell/chart/monitoring/prometheus';
14
14
  import Tab from '@shell/components/Tabbed/Tab';
15
+ import ChartPsp from '@shell/components/ChartPsp';
15
16
 
16
17
  import { allHash } from '@shell/utils/promise';
17
18
  import { STORAGE_CLASS, PVC, SECRET, WORKLOAD_TYPES } from '@shell/config/types';
18
- import { CATTLE_MONITORING_NAMESPACE } from '@shell/utils/monitoring';
19
19
 
20
20
  export default {
21
21
  components: {
@@ -26,7 +26,8 @@ export default {
26
26
  LabeledInput,
27
27
  Loading,
28
28
  Prometheus,
29
- Tab
29
+ Tab,
30
+ ChartPsp
30
31
  },
31
32
 
32
33
  hasTabs: true,
@@ -53,40 +54,17 @@ export default {
53
54
  async fetch() {
54
55
  const { $store } = this;
55
56
 
56
- // Fetch all the resources required for all the tabs asyncronously up front
57
- const hashPromises = {
58
- namespaces: $store.getters['namespaces'](),
59
- pvcs: $store.dispatch('cluster/findAll', { type: PVC }),
60
- // Used in Alerting tab
61
- monitoringSecrets: $store.dispatch('cluster/findAll', {
62
- type: SECRET,
63
- opt: { namespaced: CATTLE_MONITORING_NAMESPACE }
64
- }),
57
+ const hash = await allHash({
58
+ namespaces: $store.getters['namespaces'](),
59
+ pvcs: $store.dispatch('cluster/findAll', { type: PVC }),
60
+ secrets: $store.dispatch('cluster/findAll', { type: SECRET }),
65
61
  storageClasses: $store.dispatch('cluster/findAll', { type: STORAGE_CLASS }),
66
- };
67
-
68
- // Are we editing an existing chart?
69
- // (ported from shell/chart/monitoring/prometheus/index.vue)
70
- const { existing = false } = this.$attrs;
71
-
72
- // If needed, fetch all the workloads that have prometheus operator like containers
73
- this.workloadTypes = !existing ? Object.values(WORKLOAD_TYPES) : [];
74
-
75
- this.workloadTypes.forEach((type) => {
76
- // We'll use a filter to fetch the results. Atm there's no neat way to differentiate between ALL results and JUST filtered
77
- // So to avoid calls to all getting these filtered (and vice-versa) forget type before and after
78
- $store.dispatch('cluster/forgetType', type);
79
- hashPromises[type] = $store.dispatch('cluster/findAll', {
80
- type,
81
- opt: {
82
- watch: false,
83
- // We're only interested in images with operator like names (note: these will match partial strings)
84
- filter: { 'spec.template.spec.containers.image': ['quay.io/coreos/prometheus-operator', 'rancher/coreos-prometheus-operator'] }
85
- }
86
- });
87
62
  });
88
63
 
89
- const hash = await allHash(hashPromises);
64
+ await Promise.all(
65
+ Object.values(WORKLOAD_TYPES).map((type) => this.$store.dispatch('cluster/findAll', { type })
66
+ )
67
+ );
90
68
 
91
69
  this.targetNamespace = hash.namespaces[this.chart.targetNamespace] || false;
92
70
 
@@ -98,21 +76,9 @@ export default {
98
76
  this.pvcs = hash.pvcs;
99
77
  }
100
78
 
101
- if (!isEmpty(hash.monitoringSecrets)) {
102
- this.monitoringSecrets = hash.monitoringSecrets;
79
+ if (!isEmpty(hash.secrets)) {
80
+ this.secrets = hash.secrets;
103
81
  }
104
-
105
- this.workloadTypes.forEach((type) => {
106
- if (hash[type]) {
107
- this.filteredWorkloads.push(...hash[type]);
108
- }
109
- });
110
- },
111
-
112
- beforeDestroy() {
113
- this.workloadTypes.forEach((type) => {
114
- this.$store.dispatch('cluster/forgetType', type);
115
- });
116
82
  },
117
83
 
118
84
  data() {
@@ -135,11 +101,9 @@ export default {
135
101
  disableAggregateRoles: false,
136
102
  prometheusResources: [],
137
103
  pvcs: [],
138
- monitoringSecrets: [],
104
+ secrets: [],
139
105
  storageClasses: [],
140
106
  targetNamespace: null,
141
- filteredWorkloads: [],
142
- workloadTypes: []
143
107
  };
144
108
  },
145
109
 
@@ -148,6 +112,10 @@ export default {
148
112
  provider() {
149
113
  return this.currentCluster.status.provider.toLowerCase();
150
114
  },
115
+ workloads() {
116
+ return Object.values(WORKLOAD_TYPES).flatMap((type) => this.$store.getters['cluster/all'](type)
117
+ );
118
+ },
151
119
  },
152
120
 
153
121
  watch: {
@@ -297,6 +265,12 @@ export default {
297
265
  />
298
266
  </div>
299
267
  </div>
268
+
269
+ <!-- Conditionally display PSP checkbox -->
270
+ <ChartPsp
271
+ :value="value"
272
+ :cluster="currentCluster"
273
+ />
300
274
  </div>
301
275
  </Tab>
302
276
  <Tab
@@ -312,7 +286,7 @@ export default {
312
286
  :mode="mode"
313
287
  :storage-classes="storageClasses"
314
288
  :prometheus-pods="prometheusResources"
315
- :filteredWorkloads="filteredWorkloads"
289
+ :workloads="workloads"
316
290
  />
317
291
  </div>
318
292
  </Tab>
@@ -325,7 +299,7 @@ export default {
325
299
  <Alerting
326
300
  v-model="value"
327
301
  :mode="mode"
328
- :monitoringSecrets="monitoringSecrets"
302
+ :secrets="secrets"
329
303
  />
330
304
  </div>
331
305
  </Tab>
@@ -1,4 +1,5 @@
1
1
  <script>
2
+ import isEmpty from 'lodash/isEmpty';
2
3
  import { mapGetters } from 'vuex';
3
4
 
4
5
  import { Banner } from '@components/Banner';
@@ -50,19 +51,21 @@ export default {
50
51
  default: () => ({}),
51
52
  },
52
53
 
53
- filteredWorkloads: {
54
+ workloads: {
54
55
  type: Array,
55
56
  default: () => ([]),
56
57
  },
57
58
  },
58
59
 
59
60
  data() {
60
- return { enablePersistentStorage: !!this.value?.prometheus?.prometheusSpec?.storageSpec?.volumeClaimTemplate?.spec };
61
+ return {
62
+ enablePersistentStorage: !!this.value?.prometheus?.prometheusSpec?.storageSpec?.volumeClaimTemplate?.spec,
63
+ warnUser: false,
64
+ };
61
65
  },
62
66
 
63
67
  computed: {
64
68
  ...mapGetters(['currentCluster']),
65
-
66
69
  matchExpressions: {
67
70
  get() {
68
71
  const selector = this.value?.prometheus?.prometheusSpec?.storageSpec?.volumeClaimTemplate?.spec?.selector;
@@ -77,21 +80,42 @@ export default {
77
80
  }
78
81
  }
79
82
  },
83
+ filteredWorkloads() {
84
+ let { workloads } = this;
85
+ const { existing = false } = this.$attrs;
80
86
 
81
- mappedFilteredWorkloads() {
82
- return this.filteredWorkloads.map((wl) => ({
83
- label: wl.id,
84
- link: {
85
- name: 'c-cluster-product-resource-namespace-id',
86
- params: {
87
- cluster: this.currentCluster.id,
88
- product: 'explorer',
89
- resource: wl.type,
90
- namespace: wl.metadata.namespace,
91
- id: wl.metadata.name
92
- },
93
- }
94
- }));
87
+ if (!existing) {
88
+ workloads = workloads.filter((workload) => {
89
+ if (
90
+ !isEmpty(workload?.spec?.template?.spec?.containers) &&
91
+ (workload.spec.template.spec.containers.find((c) => c.image.includes('quay.io/coreos/prometheus-operator') ||
92
+ c.image.includes('rancher/coreos-prometheus-operator'))
93
+ )
94
+ ) {
95
+ if (!this.warnUser) {
96
+ this.warnUser = true;
97
+ }
98
+
99
+ return workload;
100
+ }
101
+ });
102
+ }
103
+
104
+ return workloads.map((wl) => {
105
+ return {
106
+ label: wl.id,
107
+ link: {
108
+ name: 'c-cluster-product-resource-namespace-id',
109
+ params: {
110
+ cluster: this.currentCluster.id,
111
+ product: 'explorer',
112
+ resource: wl.type,
113
+ namespace: wl.metadata.namespace,
114
+ id: wl.metadata.name
115
+ },
116
+ }
117
+ };
118
+ });
95
119
  },
96
120
 
97
121
  podsAndNamespaces() {
@@ -155,23 +179,6 @@ export default {
155
179
 
156
180
  this.$set(storageSpec.selector, 'matchLabels', matchLabels);
157
181
  this.$set(storageSpec.selector, 'matchExpressions', matchExpressions);
158
-
159
- // Remove an empty selector object if present
160
- // User can add a selector and then remove the selector - this will leave an empty structure as above
161
- // We want to ensure we remove .selector.matchExpressions, .selector.matchLabels, and .selector if empty
162
- // See: https://github.com/rancher/dashboard/issues/10016
163
-
164
- if (storageSpec.selector.matchExpressions?.length === 0) {
165
- delete storageSpec.selector.matchExpressions;
166
- }
167
-
168
- if (storageSpec.selector.matchLabels && Object.keys(storageSpec.selector.matchLabels).length === 0) {
169
- delete storageSpec.selector.matchLabels;
170
- }
171
-
172
- if (Object.keys(storageSpec.selector).length === 0) {
173
- delete storageSpec.selector;
174
- }
175
182
  },
176
183
  },
177
184
  };
@@ -182,9 +189,8 @@ export default {
182
189
  <div class="title">
183
190
  <h3>{{ t('monitoring.prometheus.title') }}</h3>
184
191
  </div>
185
- <!-- https://github.com/rancher/dashboard/issues/1167 -->
186
192
  <Banner
187
- v-if="mappedFilteredWorkloads.length"
193
+ v-if="filteredWorkloads && warnUser"
188
194
  color="warning"
189
195
  >
190
196
  <template #default>
@@ -193,7 +199,7 @@ export default {
193
199
  :raw="true"
194
200
  />
195
201
  <div
196
- v-for="wl in mappedFilteredWorkloads"
202
+ v-for="wl in filteredWorkloads"
197
203
  :key="wl.id"
198
204
  class="mt-10"
199
205
  >
@@ -10,6 +10,7 @@ import { allHash } from '@shell/utils/promise';
10
10
  import { STORAGE_CLASS, SECRET, PV } from '@shell/config/types';
11
11
  import { mapGetters } from 'vuex';
12
12
  import { STORAGE } from '@shell/config/labels-annotations';
13
+ import ChartPsp from '@shell/components/ChartPsp';
13
14
 
14
15
  export default {
15
16
  components: {
@@ -18,7 +19,8 @@ export default {
18
19
  S3,
19
20
  LabeledInput,
20
21
  LabeledSelect,
21
- Banner
22
+ Banner,
23
+ ChartPsp
22
24
  },
23
25
 
24
26
  hasTabs: true,
@@ -65,7 +67,7 @@ export default {
65
67
 
66
68
  computed: {
67
69
  defaultStorageClass() {
68
- return this.storageClasses.filter((sc) => sc.metadata.annotations?.[STORAGE.DEFAULT_STORAGE_CLASS] && sc.metadata.annotations[STORAGE.DEFAULT_STORAGE_CLASS] !== 'false' )[0] || '';
70
+ return this.storageClasses.filter((sc) => sc.metadata.annotations[STORAGE.DEFAULT_STORAGE_CLASS] && sc.metadata.annotations[STORAGE.DEFAULT_STORAGE_CLASS] !== 'false' )[0] || '';
69
71
  },
70
72
 
71
73
  availablePVs() {
@@ -167,6 +169,12 @@ export default {
167
169
  label="Chart Options"
168
170
  name="chartOptions"
169
171
  >
172
+ <!-- Conditionally display PSP checkbox -->
173
+ <ChartPsp
174
+ :value="value"
175
+ :cluster="currentCluster"
176
+ />
177
+
170
178
  <Banner
171
179
  color="info"
172
180
  :label="t('backupRestoreOperator.deployment.storage.tip')"
@@ -200,7 +208,6 @@ export default {
200
208
  :status="reclaimWarning ? 'warning' : null"
201
209
  :options="storageClasses"
202
210
  :hover-tooltip="true"
203
- data-testid="backup-chart-select-existing-storage-class"
204
211
  />
205
212
  </div>
206
213
  <div class="col span-6">
@@ -2,9 +2,11 @@
2
2
  import CreateEditView from '@shell/mixins/create-edit-view';
3
3
  import { LabeledInput } from '@components/Form/LabeledInput';
4
4
  import { azureEnvironments } from '@shell/machine-config/azure';
5
- import { parseAzureError } from '@shell/utils/azure';
6
5
  import LabeledSelect from '@shell/components/form/LabeledSelect';
7
6
 
7
+ const AZURE_ERROR_MSG_REGEX = /^.*Message=\"(.*)\"$/;
8
+ const AZURE_ERROR_JSON_REGEX = /^.*Response body: ({.*})/;
9
+
8
10
  export default {
9
11
  components: { LabeledInput, LabeledSelect },
10
12
  mixins: [CreateEditView],
@@ -57,10 +59,21 @@ export default {
57
59
  return true;
58
60
  } catch (e) {
59
61
  if (e.error) {
60
- const parsed = parseAzureError(e.error);
62
+ // Try and parse the response from Azure a couple of ways
63
+ const msgMatch = e.error.match(AZURE_ERROR_MSG_REGEX);
64
+
65
+ if (msgMatch?.length === 2) {
66
+ return { errors: [msgMatch[1]] };
67
+ } else {
68
+ const jsonMatch = e.error.match(AZURE_ERROR_JSON_REGEX);
69
+
70
+ if (jsonMatch?.length === 2) {
71
+ try {
72
+ const errorObj = JSON.parse(jsonMatch[1]);
61
73
 
62
- if (parsed) {
63
- return { errors: [parsed] };
74
+ return { errors: [errorObj.error_description] };
75
+ } catch (e) {}
76
+ }
64
77
  }
65
78
  }
66
79
 
@@ -273,7 +273,6 @@ export default Vue.extend<{ phase: string}, any, any, any>({
273
273
  :data-testid="componentTestid + '-async-button'"
274
274
  @click="clicked"
275
275
  >
276
- <span v-if="mode === 'manual-refresh'">{{ t('action.refresh') }}</span>
277
276
  <i
278
277
  v-if="displayIcon"
279
278
  v-clean-tooltip="tooltip"
@@ -286,11 +285,3 @@ export default Vue.extend<{ phase: string}, any, any, any>({
286
285
  />
287
286
  </button>
288
287
  </template>
289
-
290
- <style lang="scss" scoped>
291
- // refresh mode has icon + text. We need to fix the positioning of the icon and sizing
292
- .manual-refresh i {
293
- margin: 0 0 0 8px !important;
294
- font-size: 1rem !important;
295
- }
296
- </style>
@@ -282,7 +282,6 @@ export default {
282
282
  .slide-content {
283
283
  display: flex;
284
284
  padding: 30px;
285
- height: 100%;
286
285
 
287
286
  .slide-img {
288
287
  width: 150px;