@rancher/shell 0.3.5 → 0.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/images/providers/outscale.svg +19 -0
- package/assets/styles/base/_basic.scss +18 -0
- package/assets/styles/base/_mixins.scss +0 -11
- package/assets/styles/base/_variables.scss +2 -4
- package/assets/styles/global/_button.scss +12 -2
- package/assets/translations/en-us.yaml +35 -1
- package/assets/translations/zh-hans.yaml +30 -10
- package/chart/gatekeeper.vue +3 -2
- package/chart/istio.vue +29 -3
- package/components/BrandImage.vue +1 -4
- package/components/Carousel.vue +85 -37
- package/components/EtcdInfoBanner.vue +7 -3
- package/components/ExplorerMembers.vue +100 -5
- package/components/ExplorerProjectsNamespaces.vue +32 -2
- package/components/GrafanaDashboard.vue +9 -2
- package/components/SortableTable/index.vue +23 -11
- package/components/SortableTable/selection.js +58 -50
- package/components/Wizard.vue +4 -2
- package/components/auth/AuthBanner.vue +6 -0
- package/components/auth/RoleDetailEdit.vue +2 -2
- package/components/form/HookOption.vue +14 -10
- package/components/form/Labels.vue +32 -27
- package/components/form/MatchExpressions.vue +2 -2
- package/components/form/Members/ClusterPermissionsEditor.vue +32 -7
- package/components/form/NameNsDescription.vue +1 -1
- package/components/form/ProjectMemberEditor.vue +46 -21
- package/components/form/Tolerations.vue +4 -1
- package/components/form/ValueFromResource.vue +14 -9
- package/components/form/WorkloadPorts.vue +2 -2
- package/components/form/__tests__/NameNsDescription.ts +27 -0
- package/components/formatter/WorkloadHealthScale.vue +8 -2
- package/components/nav/NamespaceFilter.vue +8 -0
- package/{nuxt/components → components/nuxt}/nuxt.js +1 -1
- package/{nuxt → config}/middleware.js +8 -8
- package/config/product/explorer.js +24 -3
- package/config/query-params.js +1 -0
- package/config/router.js +1 -1
- package/{nuxt → config}/store.js +82 -79
- package/config/table-headers.js +46 -12
- package/config/types.js +7 -0
- package/core/plugin.ts +4 -2
- package/core/types.ts +258 -1
- package/creators/app/files/tsconfig.json +0 -1
- package/creators/app/files/vue.config.js +0 -1
- package/creators/pkg/files/.github/workflows/build-extension.yml +3 -4
- package/creators/pkg/files/tsconfig.json +0 -1
- package/creators/pkg/pkg.package.json +3 -3
- package/detail/constraints.gatekeeper.sh.constraint.vue +14 -7
- package/detail/fleet.cattle.io.clustergroup.vue +7 -1
- package/edit/auth/ldap/config.vue +21 -1
- package/edit/auth/saml.vue +132 -37
- package/edit/fleet.cattle.io.gitrepo.vue +16 -1
- package/edit/logging.banzaicloud.io.output/index.vue +18 -5
- package/edit/logging.banzaicloud.io.output/providers/loki.vue +1 -0
- package/edit/namespace.vue +12 -8
- package/edit/provisioning.cattle.io.cluster/MachinePool.vue +11 -4
- package/edit/provisioning.cattle.io.cluster/import.vue +23 -25
- package/edit/provisioning.cattle.io.cluster/rke2.vue +96 -18
- package/edit/workload/mixins/workload.js +6 -7
- package/edit/workload/storage/Mount.vue +3 -3
- package/initialize/App.js +206 -0
- package/{nuxt → initialize}/client.js +406 -360
- package/{nuxt → initialize}/index.js +21 -22
- package/layouts/standalone.vue +13 -0
- package/list/catalog.cattle.io.clusterrepo.vue +1 -0
- package/list/rbac.authorization.k8s.io.clusterrolebinding.vue +48 -0
- package/list/workload.vue +6 -4
- package/mixins/chart.js +29 -1
- package/mixins/fetch.client.js +95 -0
- package/{nuxt/mixins → mixins}/fetch.server.js +30 -26
- package/mixins/labeled-form-element.ts +2 -2
- package/models/constraints.gatekeeper.sh.constraint.js +37 -0
- package/models/pod.js +4 -0
- package/models/rbac.authorization.k8s.io.clusterrolebinding.js +16 -0
- package/models/rbac.authorization.k8s.io.rolebinding.js +16 -0
- package/package.json +9 -13
- package/pages/c/_cluster/apps/charts/install.vue +61 -39
- package/pages/diagnostic.vue +32 -25
- package/pages/rio/mesh.vue +1 -2
- package/pkg/tsconfig.json +0 -1
- package/plugins/clean-html-directive.js +3 -0
- package/plugins/dashboard-store/index.js +1 -1
- package/plugins/plugin.js +0 -14
- package/plugins/portal-vue.js +4 -0
- package/rancher-components/components/Banner/Banner.test.ts +3 -5
- package/rancher-components/components/Banner/Banner.vue +1 -0
- package/rancher-components/components/Form/Radio/RadioButton.test.ts +31 -0
- package/rancher-components/components/Form/Radio/RadioButton.vue +14 -3
- package/scripts/extension/publish +42 -23
- package/scripts/serve-pkgs +6 -2
- package/store/type-map.js +1 -1
- package/tsconfig.json +0 -1
- package/types/rancher/index.d.ts +2 -0
- package/types/shell/index.d.ts +353 -284
- package/utils/__tests__/grafana.test.ts +44 -0
- package/utils/axios.js +190 -0
- package/{nuxt → utils}/cookie-universal-nuxt.js +7 -6
- package/utils/dom.js +15 -0
- package/utils/gc/gc.ts +1 -1
- package/utils/grafana.js +35 -16
- package/{nuxt/utils.js → utils/nuxt.js} +265 -236
- package/utils/router.scrollBehavior.js +1 -1
- package/vue.config.js +30 -19
- package/nuxt/App.js +0 -210
- package/nuxt/axios.js +0 -186
- package/nuxt/empty.js +0 -1
- package/nuxt/jsonp.js +0 -82
- package/nuxt/loading.html +0 -39
- package/nuxt/mixins/fetch.client.js +0 -90
- package/nuxt/portal-vue.js +0 -4
- package/nuxt/server.js +0 -312
- package/nuxt/views/app.template.html +0 -9
- package/nuxt/views/error.html +0 -23
- package/plugins/dashboard-store/extensions.js +0 -22
- /package/{nuxt/components → components/nuxt}/nuxt-build-indicator.vue +0 -0
- /package/{nuxt/components → components/nuxt}/nuxt-child.js +0 -0
- /package/{nuxt/components → components/nuxt}/nuxt-error.vue +0 -0
- /package/{nuxt/components → components/nuxt}/nuxt-link.client.js +0 -0
- /package/{nuxt/components → components/nuxt}/nuxt-link.server.js +0 -0
- /package/{nuxt/components → components/nuxt}/nuxt-loading.vue +0 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { getClusterPrefix } from '@shell/utils/grafana';
|
|
2
|
+
|
|
3
|
+
describe('fx: getClusterPrefix', () => {
|
|
4
|
+
it('old monitoring version, downstream cluster', () => {
|
|
5
|
+
const prefix = getClusterPrefix('101.0.0+up19.0.3', 'c-abcd');
|
|
6
|
+
|
|
7
|
+
expect(prefix).toStrictEqual('/k8s/clusters/c-abcd');
|
|
8
|
+
});
|
|
9
|
+
it('old monitoring version, local cluster', () => {
|
|
10
|
+
const prefix = getClusterPrefix('101.0.0+up19.0.3', 'local');
|
|
11
|
+
|
|
12
|
+
expect(prefix).toStrictEqual('');
|
|
13
|
+
});
|
|
14
|
+
it('new monitoring version, downstream cluster', () => {
|
|
15
|
+
const prefix = getClusterPrefix('102.0.0+up40.1.2', 'c-abcd');
|
|
16
|
+
|
|
17
|
+
expect(prefix).toStrictEqual('/k8s/clusters/c-abcd');
|
|
18
|
+
});
|
|
19
|
+
it('new monitoring version, local cluster', () => {
|
|
20
|
+
const prefix = getClusterPrefix('102.0.0+up40.1.2', 'local');
|
|
21
|
+
|
|
22
|
+
expect(prefix).toStrictEqual('/k8s/clusters/local');
|
|
23
|
+
});
|
|
24
|
+
it('future monitoring version, downstream cluster', () => {
|
|
25
|
+
const prefix = getClusterPrefix('103.0.0+up41.0.0', 'c-abcd');
|
|
26
|
+
|
|
27
|
+
expect(prefix).toStrictEqual('/k8s/clusters/c-abcd');
|
|
28
|
+
});
|
|
29
|
+
it('future monitoring version, local cluster', () => {
|
|
30
|
+
const prefix = getClusterPrefix('103.0.0+up41.0.0', 'local');
|
|
31
|
+
|
|
32
|
+
expect(prefix).toStrictEqual('/k8s/clusters/local');
|
|
33
|
+
});
|
|
34
|
+
it('empty monitoring version, downstream cluster', () => {
|
|
35
|
+
const prefix = getClusterPrefix('', 'c-abcd');
|
|
36
|
+
|
|
37
|
+
expect(prefix).toStrictEqual('/k8s/clusters/c-abcd');
|
|
38
|
+
});
|
|
39
|
+
it('empty monitoring version, local cluster', () => {
|
|
40
|
+
const prefix = getClusterPrefix('', 'local');
|
|
41
|
+
|
|
42
|
+
expect(prefix).toStrictEqual('/k8s/clusters/local');
|
|
43
|
+
});
|
|
44
|
+
});
|
package/utils/axios.js
ADDED
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import Axios from 'axios';
|
|
2
|
+
import defu from 'defu';
|
|
3
|
+
import axiosRetry from 'axios-retry';
|
|
4
|
+
|
|
5
|
+
// Axios.prototype cannot be modified
|
|
6
|
+
const axiosExtra = {
|
|
7
|
+
setBaseURL(baseURL) {
|
|
8
|
+
this.defaults.baseURL = baseURL;
|
|
9
|
+
},
|
|
10
|
+
setHeader(name, value, scopes = 'common') {
|
|
11
|
+
for (const scope of Array.isArray(scopes) ? scopes : [scopes]) {
|
|
12
|
+
if (!value) {
|
|
13
|
+
delete this.defaults.headers[scope][name];
|
|
14
|
+
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
this.defaults.headers[scope][name] = value;
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
setToken(token, type, scopes = 'common') {
|
|
21
|
+
const value = !token ? null : (type ? `${ type } ` : '') + token;
|
|
22
|
+
|
|
23
|
+
this.setHeader('Authorization', value, scopes);
|
|
24
|
+
},
|
|
25
|
+
onRequest(fn) {
|
|
26
|
+
this.interceptors.request.use(config => fn(config) || config);
|
|
27
|
+
},
|
|
28
|
+
onResponse(fn) {
|
|
29
|
+
this.interceptors.response.use(response => fn(response) || response);
|
|
30
|
+
},
|
|
31
|
+
onRequestError(fn) {
|
|
32
|
+
this.interceptors.request.use(undefined, error => fn(error) || Promise.reject(error));
|
|
33
|
+
},
|
|
34
|
+
onResponseError(fn) {
|
|
35
|
+
this.interceptors.response.use(undefined, error => fn(error) || Promise.reject(error));
|
|
36
|
+
},
|
|
37
|
+
onError(fn) {
|
|
38
|
+
this.onRequestError(fn);
|
|
39
|
+
this.onResponseError(fn);
|
|
40
|
+
},
|
|
41
|
+
create(options) {
|
|
42
|
+
return createAxiosInstance(defu(options, this.defaults));
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
// Request helpers ($get, $post, ...)
|
|
47
|
+
for (const method of ['request', 'delete', 'get', 'head', 'options', 'post', 'put', 'patch']) {
|
|
48
|
+
axiosExtra[`$${ method }`] = function() {
|
|
49
|
+
return this[method].apply(this, arguments).then(res => res && res.data);
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const extendAxiosInstance = (axios) => {
|
|
54
|
+
for (const key in axiosExtra) {
|
|
55
|
+
axios[key] = axiosExtra[key].bind(axios);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const createAxiosInstance = (axiosOptions) => {
|
|
60
|
+
// Create new axios instance
|
|
61
|
+
const axios = Axios.create(axiosOptions);
|
|
62
|
+
|
|
63
|
+
axios.CancelToken = Axios.CancelToken;
|
|
64
|
+
axios.isCancel = Axios.isCancel;
|
|
65
|
+
|
|
66
|
+
// Extend axios proto
|
|
67
|
+
extendAxiosInstance(axios);
|
|
68
|
+
|
|
69
|
+
// Setup interceptors
|
|
70
|
+
|
|
71
|
+
setupProgress(axios);
|
|
72
|
+
axiosRetry(axios, { retries: 0 });
|
|
73
|
+
|
|
74
|
+
return axios;
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
const setupProgress = (axios) => {
|
|
78
|
+
if (process.server) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// A noop loading inteterface for when $nuxt is not yet ready
|
|
83
|
+
const noopLoading = {
|
|
84
|
+
finish: () => { },
|
|
85
|
+
start: () => { },
|
|
86
|
+
fail: () => { },
|
|
87
|
+
set: () => { }
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
const $loading = () => {
|
|
91
|
+
const $nuxt = typeof window !== 'undefined' && window['$nuxt'];
|
|
92
|
+
|
|
93
|
+
return ($nuxt && $nuxt.$loading && $nuxt.$loading.set) ? $nuxt.$loading : noopLoading;
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
let currentRequests = 0;
|
|
97
|
+
|
|
98
|
+
axios.onRequest((config) => {
|
|
99
|
+
if (config && config.progress === false) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
currentRequests++;
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
axios.onResponse((response) => {
|
|
107
|
+
if (response && response.config && response.config.progress === false) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
currentRequests--;
|
|
112
|
+
if (currentRequests <= 0) {
|
|
113
|
+
currentRequests = 0;
|
|
114
|
+
$loading().finish();
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
axios.onError((error) => {
|
|
119
|
+
if (error && error.config && error.config.progress === false) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
currentRequests--;
|
|
124
|
+
|
|
125
|
+
if (Axios.isCancel(error)) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
$loading().fail();
|
|
130
|
+
$loading().finish();
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
const onProgress = (e) => {
|
|
134
|
+
if (!currentRequests) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
const progress = ((e.loaded * 100) / (e.total * currentRequests));
|
|
138
|
+
|
|
139
|
+
$loading().set(Math.min(100, progress));
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
axios.defaults.onUploadProgress = onProgress;
|
|
143
|
+
axios.defaults.onDownloadProgress = onProgress;
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
export default (ctx, inject) => {
|
|
147
|
+
// runtimeConfig
|
|
148
|
+
const runtimeConfig = (ctx.$config && ctx.$config.axios) || {};
|
|
149
|
+
// baseURL
|
|
150
|
+
const baseURL = process.browser ? (runtimeConfig.browserBaseURL || runtimeConfig.baseURL || '/') : (runtimeConfig.baseURL || process.env._AXIOS_BASE_URL_ || 'https://localhost:8005/');
|
|
151
|
+
|
|
152
|
+
// Create fresh objects for all default header scopes
|
|
153
|
+
// Axios creates only one which is shared across SSR requests!
|
|
154
|
+
// https://github.com/mzabriskie/axios/blob/master/lib/defaults.js
|
|
155
|
+
const headers = {
|
|
156
|
+
common: { Accept: 'application/json, text/plain, */*' },
|
|
157
|
+
delete: {},
|
|
158
|
+
get: {},
|
|
159
|
+
head: {},
|
|
160
|
+
post: {},
|
|
161
|
+
put: {},
|
|
162
|
+
patch: {}
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
const axiosOptions = {
|
|
166
|
+
baseURL,
|
|
167
|
+
headers
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
// Proxy SSR request headers headers
|
|
171
|
+
if (process.server && ctx.req && ctx.req.headers) {
|
|
172
|
+
const reqHeaders = { ...ctx.req.headers };
|
|
173
|
+
|
|
174
|
+
for (const h of ['accept', 'host', 'cf-ray', 'cf-connecting-ip', 'content-length', 'content-md5', 'content-type']) {
|
|
175
|
+
delete reqHeaders[h];
|
|
176
|
+
}
|
|
177
|
+
axiosOptions.headers.common = { ...reqHeaders, ...axiosOptions.headers.common };
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
if (process.server) {
|
|
181
|
+
// Don't accept brotli encoding because Node can't parse it
|
|
182
|
+
axiosOptions.headers.common['accept-encoding'] = 'gzip, deflate';
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
const axios = createAxiosInstance(axiosOptions);
|
|
186
|
+
|
|
187
|
+
// Inject axios to the context as $axios
|
|
188
|
+
ctx.$axios = axios;
|
|
189
|
+
inject('axios', axios);
|
|
190
|
+
};
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import cookieUniversal from 'cookie-universal'
|
|
1
|
+
import cookieUniversal from 'cookie-universal';
|
|
2
2
|
|
|
3
3
|
export default ({ req, res }, inject) => {
|
|
4
4
|
const options = {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
alias: 'cookies',
|
|
6
|
+
parseJSON: true
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
inject(options.alias, cookieUniversal(req, res, options.parseJSON));
|
|
10
|
+
};
|
package/utils/dom.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export function getParent(el, parentSelector) {
|
|
2
|
+
el = el?.parentElement;
|
|
3
|
+
|
|
4
|
+
if (!el) {
|
|
5
|
+
return null;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
const matchFn = el.matches || el.matchesSelector;
|
|
9
|
+
|
|
10
|
+
if (!matchFn.call(el, parentSelector)) {
|
|
11
|
+
return getParent(el, parentSelector);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
return el;
|
|
15
|
+
}
|
package/utils/gc/gc.ts
CHANGED
|
@@ -29,7 +29,7 @@ class GarbageCollect {
|
|
|
29
29
|
* To avoid JSON.parse on the `ui-performance` setting keep a local cache
|
|
30
30
|
*/
|
|
31
31
|
private getUiPerfGarbageCollection = (rootState: any) => {
|
|
32
|
-
const uiPerfSetting = rootState.management.types[MANAGEMENT.SETTING]
|
|
32
|
+
const uiPerfSetting = rootState.management.types[MANAGEMENT.SETTING]?.list.find((s: any) => s.id === SETTING.UI_PERFORMANCE);
|
|
33
33
|
|
|
34
34
|
if (!uiPerfSetting || !uiPerfSetting.value) {
|
|
35
35
|
// Could be in the process of logging out
|
package/utils/grafana.js
CHANGED
|
@@ -1,11 +1,22 @@
|
|
|
1
1
|
import { haveV2Monitoring } from '@shell/utils/monitoring';
|
|
2
2
|
import { parse as parseUrl, addParam } from '@shell/utils/url';
|
|
3
|
+
import { compare } from '@shell/utils/version';
|
|
4
|
+
import { CATALOG } from '@shell/config/types';
|
|
3
5
|
|
|
4
|
-
|
|
6
|
+
const MONITORING_VERSION_NEW_URL_PATTERN = '102.0.0+up40.1.2';
|
|
7
|
+
|
|
8
|
+
export function getClusterPrefix(monitoringVersion, clusterId) {
|
|
9
|
+
if (compare(monitoringVersion, MONITORING_VERSION_NEW_URL_PATTERN) >= 0) {
|
|
10
|
+
return `/k8s/clusters/${ clusterId }`;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
return clusterId === 'local' ? '' : `/k8s/clusters/${ clusterId }`;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function computeDashboardUrl(monitoringVersion, embedUrl, clusterId, params) {
|
|
5
17
|
const url = parseUrl(embedUrl);
|
|
6
|
-
const clusterPrefix = clusterId === 'local' ? '' : `/k8s/clusters/${ clusterId }`;
|
|
7
18
|
|
|
8
|
-
let newUrl = `${
|
|
19
|
+
let newUrl = `${ getClusterPrefix(monitoringVersion, clusterId) }${ url.path }`;
|
|
9
20
|
|
|
10
21
|
if (url.query.viewPanel) {
|
|
11
22
|
newUrl = addParam(newUrl, 'viewPanel', url.query.viewPanel);
|
|
@@ -20,14 +31,13 @@ export function computeDashboardUrl(embedUrl, clusterId, params) {
|
|
|
20
31
|
return newUrl;
|
|
21
32
|
}
|
|
22
33
|
|
|
23
|
-
export async function dashboardExists(store, clusterId, embedUrl, storeName = 'cluster') {
|
|
34
|
+
export async function dashboardExists(monitoringVersion, store, clusterId, embedUrl, storeName = 'cluster') {
|
|
24
35
|
if ( !haveV2Monitoring(store.getters) ) {
|
|
25
36
|
return false;
|
|
26
37
|
}
|
|
27
38
|
|
|
28
39
|
const url = parseUrl(embedUrl);
|
|
29
|
-
const
|
|
30
|
-
const prefix = `${ clusterPrefix }/api/v1/namespaces/cattle-monitoring-system/services/http:rancher-monitoring-grafana:80/proxy/`;
|
|
40
|
+
const prefix = `${ getClusterPrefix(monitoringVersion, clusterId) }/api/v1/namespaces/cattle-monitoring-system/services/http:rancher-monitoring-grafana:80/proxy/`;
|
|
31
41
|
const delimiter = 'http:rancher-monitoring-grafana:80/proxy/';
|
|
32
42
|
const path = url.path.split(delimiter)[1];
|
|
33
43
|
const uid = path.split('/')[1];
|
|
@@ -43,41 +53,50 @@ export async function dashboardExists(store, clusterId, embedUrl, storeName = 'c
|
|
|
43
53
|
}
|
|
44
54
|
|
|
45
55
|
export async function allDashboardsExist(store, clusterId, embeddedUrls, storeName = 'cluster') {
|
|
46
|
-
|
|
56
|
+
let res;
|
|
57
|
+
|
|
58
|
+
try {
|
|
59
|
+
res = await store.dispatch(`${ storeName }/find`, { type: CATALOG.APP, id: 'cattle-monitoring-system/rancher-monitoring' });
|
|
60
|
+
} catch (err) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const monitoringVersion = res?.currentVersion;
|
|
65
|
+
|
|
66
|
+
const existPromises = embeddedUrls.map(url => dashboardExists(monitoringVersion, store, clusterId, url, storeName));
|
|
47
67
|
|
|
48
68
|
return (await Promise.all(existPromises)).every(exists => exists);
|
|
49
69
|
}
|
|
50
70
|
|
|
51
|
-
export function queryGrafana(dispatch, clusterId, query, range, step) {
|
|
52
|
-
const
|
|
53
|
-
const url = `${ clusterPrefix }/api/v1/namespaces/cattle-monitoring-system/services/http:rancher-monitoring-grafana:80/proxy/api/datasources/proxy/1/api/v1/query_range?query=${ query }&start=${ range.start }&end=${ range.end }&step=${ step }`;
|
|
71
|
+
export function queryGrafana(monitoringVersion, dispatch, clusterId, query, range, step) {
|
|
72
|
+
const url = `${ getClusterPrefix(monitoringVersion, clusterId) }/api/v1/namespaces/cattle-monitoring-system/services/http:rancher-monitoring-grafana:80/proxy/api/datasources/proxy/1/api/v1/query_range?query=${ query }&start=${ range.start }&end=${ range.end }&step=${ step }`;
|
|
54
73
|
|
|
55
74
|
return dispatch('cluster/request', { url, redirectUnauthorized: false });
|
|
56
75
|
}
|
|
57
76
|
|
|
58
|
-
export async function hasLeader(dispatch, clusterId) {
|
|
77
|
+
export async function hasLeader(monitoringVersion, dispatch, clusterId) {
|
|
59
78
|
const end = Date.now() / 1000;
|
|
60
79
|
const start = end - (5 * 60);
|
|
61
80
|
|
|
62
|
-
const response = await queryGrafana(dispatch, clusterId, 'max(etcd_server_has_leader)', { start, end }, 30);
|
|
81
|
+
const response = await queryGrafana(monitoringVersion, dispatch, clusterId, 'max(etcd_server_has_leader)', { start, end }, 30);
|
|
63
82
|
|
|
64
83
|
return response.data.result[0]?.values?.[0]?.[1] === '1';
|
|
65
84
|
}
|
|
66
85
|
|
|
67
|
-
export async function leaderChanges(dispatch, clusterId) {
|
|
86
|
+
export async function leaderChanges(monitoringVersion, dispatch, clusterId) {
|
|
68
87
|
const end = Date.now() / 1000;
|
|
69
88
|
const start = end - (60 * 60);
|
|
70
89
|
|
|
71
|
-
const response = await queryGrafana(dispatch, clusterId, 'max(etcd_server_leader_changes_seen_total)', { start, end }, 30);
|
|
90
|
+
const response = await queryGrafana(monitoringVersion, dispatch, clusterId, 'max(etcd_server_leader_changes_seen_total)', { start, end }, 30);
|
|
72
91
|
|
|
73
92
|
return response.data.result[0]?.values?.[0]?.[1] || 0;
|
|
74
93
|
}
|
|
75
94
|
|
|
76
|
-
export async function failedProposals(dispatch, clusterId) {
|
|
95
|
+
export async function failedProposals(monitoringVersion, dispatch, clusterId) {
|
|
77
96
|
const end = Date.now() / 1000;
|
|
78
97
|
const start = end - (60 * 60);
|
|
79
98
|
|
|
80
|
-
const response = await queryGrafana(dispatch, clusterId, 'sum(etcd_server_proposals_failed_total)', { start, end }, 30);
|
|
99
|
+
const response = await queryGrafana(monitoringVersion, dispatch, clusterId, 'sum(etcd_server_proposals_failed_total)', { start, end }, 30);
|
|
81
100
|
|
|
82
101
|
return response.data.result[0]?.values?.[0]?.[1] || 0;
|
|
83
102
|
}
|