@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
@@ -1,508 +0,0 @@
1
- <script>
2
- import { escapeHtml } from '@shell/utils/string';
3
-
4
- const RADIUS = 5;
5
-
6
- const INTERVAL = 10000;
7
-
8
- /*
9
- function randomStats() {
10
- return {
11
- 'p50ms': Math.random(),
12
- 'p90ms': Math.random() * 2,
13
- 'p99ms': Math.random() * 5,
14
- 'rps': Math.random() * 100,
15
- 'successRate': Math.random(),
16
- };
17
- }
18
-
19
- function randomItem(ary) {
20
- const idx = Math.floor(Math.random() * ary.length);
21
-
22
- return ary[idx];
23
- }
24
-
25
- function randomData() {
26
- const nodes = [];
27
- const edges = [];
28
-
29
- ['foo', 'bar', 'baz', 'bat', 'qux'].forEach((name) => {
30
- nodes.push({
31
- 'namespace': 'default',
32
- 'app': name,
33
- 'version': 'v1',
34
- 'stats': randomStats(),
35
- });
36
- });
37
-
38
- ['a', 'b', 'c', 'd', 'e'].forEach((name) => {
39
- nodes.push({
40
- 'namespace': 'another',
41
- 'app': name,
42
- 'version': 'v1',
43
- 'stats': randomStats(),
44
- });
45
- });
46
-
47
- for ( let i = 0 ; i < 10 ; i++ ) {
48
- const from = randomItem(nodes);
49
- const crossNs = Math.random() < 0.2;
50
- const toChoices = nodes.filter((x) => {
51
- if ( x === from ) {
52
- return false;
53
- }
54
-
55
- if ( crossNs ) {
56
- return x.namespace !== from.namespace;
57
- } else {
58
- return x.namespace === from.namespace;
59
- }
60
- });
61
- const to = randomItem(toChoices);
62
-
63
- edges.push({
64
- fromNamespace: from.namespace,
65
- fromApp: from.app,
66
- fromVersion: from.version,
67
- toNamespace: to.namespace,
68
- toApp: to.app,
69
- toVersion: to.version,
70
- stats: randomStats(),
71
- });
72
- }
73
-
74
- return {
75
- nodes,
76
- edges
77
- };
78
- }
79
- */
80
-
81
- function nodeIdFor(obj) {
82
- return `${ obj.namespace }:${ obj.app }@${ obj.version }`;
83
- }
84
-
85
- function fromId(obj) {
86
- return `${ obj.fromNamespace }:${ obj.fromApp }@${ obj.fromVersion }`;
87
- }
88
-
89
- function toId(obj) {
90
- return `${ obj.toNamespace }:${ obj.toApp }@${ obj.toVersion }`;
91
- }
92
-
93
- async function loadData(store) {
94
- const data = await store.dispatch('rancher/request', { url: '/v1-metrics/meshsummary' });
95
-
96
- const known = {};
97
-
98
- data.nodes = data.nodes.filter((x) => !!x.app && !!x.namespace);
99
- data.nodes.forEach((x) => {
100
- x.id = nodeIdFor(x);
101
- known[x.id] = true;
102
- });
103
-
104
- data.edges = data.edges.filter((x) => known[fromId(x)] && known[toId(x)]);
105
-
106
- return data;
107
- }
108
-
109
- function round3Digits(num) {
110
- if ( !num ) {
111
- return 0;
112
- }
113
-
114
- if ( num > 100 ) {
115
- return Math.round(num);
116
- } else if ( num > 10 ) {
117
- return Math.round(num * 10) / 10;
118
- } else {
119
- return Math.round(num * 100) / 100;
120
- }
121
- }
122
-
123
- export default {
124
-
125
- /* (
126
- data() {
127
- return {
128
- loading: true,
129
- ...randomData(),
130
- };
131
- },
132
- */
133
-
134
- async asyncData({ store }) {
135
- const data = await loadData(store);
136
-
137
- return data;
138
- },
139
- computed: {
140
- namespaces() {
141
- return this.$store.getters['namespaces']();
142
- },
143
-
144
- displayNodes() {
145
- console.log('get displayNodes'); // eslint-disable-line no-console
146
- const namespaces = this.namespaces;
147
-
148
- const out = this.nodes.filter((x) => {
149
- return namespaces[x.namespace];
150
- });
151
-
152
- return out;
153
- },
154
-
155
- displayEdges() {
156
- console.log('get displayEdges'); // eslint-disable-line no-console
157
- const namespaces = this.namespaces;
158
-
159
- const out = this.edges.filter((x) => {
160
- const ns1 = x.fromNamespace;
161
- const ns2 = x.toNamespace;
162
-
163
- return namespaces[ns1] && namespaces[ns2];
164
- });
165
-
166
- return out;
167
- },
168
- },
169
-
170
- watch: {
171
- // Nodes isn't watched, but gets updated at the same time...
172
- nodes() {
173
- console.log('nodes updated'); // eslint-disable-line no-console
174
- this.updateGraph();
175
- this.renderGraph();
176
- },
177
-
178
- namespaces() {
179
- console.log('namespaces updated'); // eslint-disable-line no-console
180
- this.updateGraph();
181
- this.renderGraph();
182
- },
183
-
184
- edges() {
185
- console.log('edges updated'); // eslint-disable-line no-console
186
- this.updateGraph();
187
- this.renderGraph();
188
- },
189
- },
190
-
191
- async mounted() {
192
- console.log('Mounted'); // eslint-disable-line no-console
193
- this.timer = setInterval(() => {
194
- console.log('Timer'); // eslint-disable-line no-console
195
- this.refreshData();
196
- }, INTERVAL);
197
-
198
- await this.initGraph();
199
- this.updateGraph();
200
- this.renderGraph();
201
-
202
- window.m = this;
203
- },
204
-
205
- beforeDestroy() {
206
- clearInterval(this.timer);
207
- },
208
-
209
- methods: {
210
- async refreshData() {
211
- console.log('Refreshing...'); // eslint-disable-line no-console
212
- const neu = await loadData(this.$store);
213
-
214
- this.nodes = neu.nodes;
215
- this.edges = neu.edges;
216
- console.log('Refreshed'); // eslint-disable-line no-console
217
- },
218
-
219
- async initGraph() {
220
- const d3 = await import('d3');
221
- const dagreD3 = await import('dagre-d3');
222
-
223
- const g = new dagreD3.graphlib.Graph({ compound: true });
224
-
225
- g.setGraph({
226
- marginx: 0,
227
- marginy: 0,
228
- rankdir: 'LR',
229
- align: 'UL',
230
- ranker: 'longest-path', // 'tight-tree',
231
- });
232
-
233
- g.setDefaultEdgeLabel(() => {
234
- return {};
235
- });
236
-
237
- // Create the renderer
238
- const render = new dagreD3.render();
239
-
240
- // Add our custom arrow
241
- render.arrows().smaller = function normal(parent, id, edge, type) {
242
- const marker = parent.append('marker')
243
- .attr('id', id)
244
- .attr('viewBox', '0 0 12 12')
245
- .attr('refX', 6)
246
- .attr('refY', 6)
247
- .attr('markerUnits', 'userSpaceOnUse')
248
- .attr('markerWidth', 12)
249
- .attr('markerHeight', 12)
250
- .attr('orient', 'auto');
251
- const path = marker.append('path')
252
- .attr('class', 'arrowhead')
253
- .attr('d', 'M 6 0 L 0 6 L 6 12 L 12 6 z')
254
- .style('stroke-width', 1)
255
- .style('stroke-dasharray', '1,0');
256
-
257
- dagreD3.util.applyStyle(path, edge[`${ type }Style`]);
258
- };
259
-
260
- // Set up an SVG group so that we can translate the final graph.
261
- const svg = d3.select(this.$refs.mesh);
262
- const group = svg.append('g');
263
-
264
- const zoom = d3.zoom().on('zoom', () => {
265
- if ( d3.event.sourceEvent ) {
266
- this.lastZoom = d3.event.transform;
267
- }
268
- group.attr('transform', d3.event.transform);
269
- });
270
-
271
- svg.call(zoom);
272
-
273
- this.d3 = d3;
274
- this.dagreD3 = dagreD3;
275
- this.graph = g;
276
- this.render = render;
277
- this.group = group;
278
- this.zoom = zoom;
279
- },
280
-
281
- updateGraph() {
282
- // @TODO diff nodes/edges, remove unexpected and add missing ones
283
- console.log('Updating...'); // eslint-disable-line no-console
284
-
285
- const e = escapeHtml;
286
- const g = this.graph;
287
-
288
- const seenNamespaces = {};
289
-
290
- for ( const node of this.displayNodes ) {
291
- const nsId = ensureNamespace(node.namespace);
292
- const id = nodeIdFor(node);
293
-
294
- node.label = `${ node.app }@${ node.version }`;
295
-
296
- let p99 = node.stats.p99ms;
297
- let unit = 'ms';
298
-
299
- if ( p99 > 1000 ) {
300
- p99 /= 1000;
301
- unit = 's';
302
- }
303
-
304
- const html = `
305
- <div class="version">
306
- <h4>${ e(node.app) }@${ e(node.version) }</h4>
307
- <div class="row">
308
- <div class="col span-4 sr">
309
- <span>${ round3Digits(node.stats.successRate * 100) }</span><span class="unit">%</span>
310
- </div>
311
- <div class="col span-4 rps">
312
- <span>${ round3Digits(node.stats.rps) }</span>
313
- </div>
314
- <div class="col span-4 p99">
315
- <span>${ round3Digits(p99) }</span><span class="unit">${ unit }</span>
316
- </div>
317
- </div>
318
- </div>
319
- `;
320
-
321
- g.setNode(id, {
322
- labelType: 'html',
323
- label: html,
324
- width: 158,
325
- height: 80,
326
- rx: RADIUS,
327
- ry: RADIUS,
328
- });
329
- g.setParent(id, nsId);
330
- }
331
-
332
- const rpses = this.displayEdges.map((x) => x.stats.rps);
333
- const min = Math.min(...rpses);
334
- const max = Math.max(...rpses);
335
-
336
- for ( const edge of this.displayEdges ) {
337
- ensureNamespace(edge.fromNamespace);
338
- ensureNamespace(edge.toNamespace);
339
- const weight = Math.floor(4 * (edge.stats.rps - min) / (max - min)) + 1;
340
-
341
- g.setEdge(fromId(edge), toId(edge), {
342
- arrowhead: 'smaller',
343
- arrowheadClass: 'arrowhead',
344
- class: `weight${ weight }`,
345
- curve: this.d3.curveBasis,
346
- weight,
347
- });
348
- }
349
-
350
- function ensureNamespace(name) {
351
- const id = `ns:${ name }`;
352
-
353
- if ( !seenNamespaces[name] ) {
354
- seenNamespaces[name] = true;
355
- g.setNode(id, {
356
- label: `Namespace: ${ name }`,
357
- clusterLabelPos: 'top',
358
- rx: RADIUS,
359
- ry: RADIUS
360
- });
361
- }
362
-
363
- return id;
364
- }
365
- },
366
-
367
- renderGraph() {
368
- console.log('Rendering...'); // eslint-disable-line no-console
369
-
370
- const d3 = this.d3;
371
- const svg = this.d3.select(this.$refs.mesh);
372
- const group = this.group;
373
- const g = this.graph;
374
- const render = this.render;
375
- const zoom = this.zoom;
376
-
377
- svg.call(zoom.transform, d3.zoomIdentity.translate(0, 0).scale(1));
378
-
379
- // Run the renderer. This is what draws the final graph.
380
- render(group, g);
381
-
382
- const graphWidth = g.graph().width;
383
- const graphHeight = g.graph().height;
384
- const width = parseInt(svg.style('width').replace(/px/, ''));
385
- const height = parseInt(svg.style('height').replace(/px/, ''));
386
- const scale = Math.min(width / graphWidth, height / graphHeight);
387
- const dX = (width / 2) - ((graphWidth * scale) / 2);
388
- const dY = (height / 2) - ((graphHeight * scale) / 2);
389
-
390
- console.log('render'); // eslint-disable-line no-console
391
- if ( this.lastZoom ) {
392
- svg.call(zoom.transform, d3.zoomIdentity.translate(this.lastZoom.x, this.lastZoom.y).scale(this.lastZoom.k));
393
- } else {
394
- svg.call(zoom.transform, d3.zoomIdentity.translate(dX, dY).scale(scale));
395
- }
396
-
397
- this.loading = false;
398
- },
399
-
400
- clicked(event) {
401
- const path = event.target.closest('.edgePath');
402
-
403
- console.log(path); // eslint-disable-line no-console
404
- }
405
- },
406
- };
407
- </script>
408
- <template>
409
- <div class="mesh">
410
- <header>
411
- <h1>App Mesh</h1>
412
- </header>
413
-
414
- <svg
415
- id="mesh"
416
- ref="mesh"
417
- @click="clicked"
418
- />
419
- </div>
420
- </template>
421
-
422
- <style lang="scss">
423
- #mesh {
424
- width: 100%;
425
- height: calc(100vh - 165px);
426
-
427
- .version {
428
- width: 158px;
429
- height: 80px;
430
- color: #b6b6c2;
431
- text-align: center;
432
-
433
- .row {
434
- margin: 0;
435
- }
436
-
437
- H4 {
438
- color: #b6b6c2;
439
- display: block;
440
- border-bottom: 1px solid #555;
441
- text-align: left;
442
- padding-bottom: 5px;
443
- margin-bottom: 5px;
444
- }
445
-
446
- .sr, .rps, .p99 {
447
- font-size: 20px;
448
-
449
- .unit {
450
- font-size: 12px;
451
- }
452
- }
453
-
454
- .sr:before, .rps:before, .p99:before {
455
- color: white;
456
- font-weight: bold;
457
- font-size: 15px;
458
- display: block;
459
- }
460
-
461
- .sr:before {
462
- content: 'SR';
463
- }
464
-
465
- .rps:before {
466
- content: 'RPS';
467
- }
468
-
469
- .p99:before {
470
- content: '99%';
471
- }
472
-
473
- }
474
-
475
- .clusters .label text {
476
- fill: #b6b6c2;
477
- font-weight: bold;
478
- }
479
-
480
- .clusters RECT {
481
- fill: #222;
482
- stroke: #555;
483
- }
484
-
485
- .arrowhead {
486
- fill: #6c6c76;
487
- }
488
-
489
- .node RECT {
490
- fill: #111;
491
- stroke: #555;
492
- }
493
-
494
- PATH {
495
- stroke: #6c6c76;
496
- }
497
-
498
- .edgePath {
499
- cursor: pointer;
500
- }
501
-
502
- .weight1 { stroke-width: 2px; }
503
- .weight2 { stroke-width: 3px; }
504
- .weight3 { stroke-width: 4px; }
505
- .weight4 { stroke-width: 5px; }
506
- .weight5 { stroke-width: 6px; }
507
- }
508
- </style>
@@ -1,4 +0,0 @@
1
- import Vue from 'vue';
2
- import Transitions from 'vue2-transitions';
3
-
4
- Vue.use(Transitions);
@@ -1,4 +0,0 @@
1
- import Vue from 'vue';
2
- import VueClipboard from 'vue-clipboard2';
3
-
4
- Vue.use(VueClipboard);
@@ -1,46 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ES2018",
4
- "module": "ESNext",
5
- "moduleResolution": "Node",
6
- "lib": [
7
- "ESNext",
8
- "ESNext.AsyncIterable",
9
- "DOM"
10
- ],
11
- "esModuleInterop": true,
12
- "allowJs": true,
13
- "sourceMap": true,
14
- "strict": true,
15
- "noEmit": false,
16
- "baseUrl": ".",
17
- "rootDir": ".",
18
- "paths": {
19
- "~/*": [
20
- "../*"
21
- ],
22
- "@/*": [
23
- "../*"
24
- ],
25
- "@shell/*": [
26
- "../shell/*"
27
- ],
28
- "@pkg/*": [
29
- "../shell/pkg/*"
30
- ]
31
- },
32
- "typeRoots": [
33
- "./node_modules/@types"
34
- ],
35
- },
36
- "exclude": [
37
- "node_modules",
38
- ".nuxt",
39
- "dist",
40
- "dist-pkg",
41
- "shell/creators",
42
- "shell/scripts",
43
- "script/standalone",
44
- "docusaurus"
45
- ]
46
- }