ui/lib/shared/addon/catalog/service.js

224 lines
5.8 KiB
JavaScript

import { resolve } from 'rsvp';
import Service, { inject as service } from '@ember/service';
import { addQueryParams, uniqKeys } from 'shared/utils/util';
import { get, setProperties } from '@ember/object';
import { /* parseExternalId, */ parseHelmExternalId } from 'ui/utils/parse-externalid';
import { allSettled, hash } from 'rsvp';
import { union } from '@ember/object/computed';
import C from 'shared/utils/constants';
export default Service.extend({
globalStore: service(),
settings: service(),
store: service(),
scope: service(),
app: service(),
catalogs: null,
_allCatalogs: union('globalCatalogs', 'clusterCatalogs', 'projectCatalogs'),
_allTemplates: null,
globalCatalogs: null,
clusterCatalogs: null,
projectCatalogs: null,
init() {
this._super(...arguments);
const store = get(this, 'globalStore');
setProperties(this, {
globalCatalogs: store.all('catalog'),
clusterCatalogs: store.all('clustercatalog'),
projectCatalogs: store.all('projectcatalog'),
'_allTemplates': store.all('template'),
});
},
reset() {
this.setProperties({ catalogs: null });
},
refresh() {
const store = get(this, 'globalStore');
return this.fetchUnScopedCatalogs().then(() => {
return hash({
projectCatalogs: store.request({
method: 'POST',
url: `${ get(this, 'app.apiEndpoint') }/projectcatalogs?action=refresh`,
}),
clusterCatalogs: store.request({
method: 'POST',
url: `${ get(this, 'app.apiEndpoint') }/clustercatalogs?action=refresh`,
}),
globalCatalogs: store.request({
method: 'POST',
url: `${ get(this, 'app.apiEndpoint') }/catalogs?action=refresh`,
})
});
});
},
fetchAppTemplates(apps) {
let deps = [];
apps.forEach((app) => {
let extInfo = parseHelmExternalId(app.get('externalId'));
if ( extInfo && extInfo.templateId ) {
deps.push(this.fetchTemplate(extInfo.templateId, false, extInfo.version));
}
});
return allSettled(deps);
},
fetchMultiClusterAppTemplates(apps) {
let deps = [];
apps.forEach((app) => {
let extInfo = get(app, 'externalIdInfo');
if ( extInfo && extInfo.templateId ) {
deps.push(this.fetchTemplate(extInfo.templateId, false, extInfo.version));
}
});
return allSettled(deps);
},
fetchUnScopedCatalogs() {
return hash({
projectCatalogs: this.fetchCatalogs('projectCatalog'),
clusterCatalogs: this.fetchCatalogs('clusterCatalog'),
globalCatalogs: this.fetchCatalogs('catalog')
});
},
fetchCatalogs(catalogs = 'catalog', opts) {
return get(this, 'globalStore').findAll(catalogs, opts);
},
getTemplateFromCache(id) {
return get(this, 'globalStore').getById('template', id);
},
getVersionFromCache(id) {
return get(this, 'globalStore').getById('templateversion', id);
},
fetchTemplate(id, upgrade = false, currentVersion) {
let type, cached, params;
const clusterName = get(this, 'scope.currentCluster.id');
if ( upgrade === true ) {
type = 'templateversions';
cached = this.getVersionFromCache(id);
} else {
type = 'templates';
// we cant check for cached here anylonger because the clusterName is used to build a dynamic versions list of compatible versions for this clusters kube version
params = {
clusterName,
currentVersion
};
}
if ( cached ) {
return resolve(cached);
}
params = {
// currentVersion allows legacy apps to be upgraded
// after Rancher is upgraded to a version higher than the app's max
// supported Rancher version
clusterName,
currentVersion,
}
let url = this._addLimits(`${ get(this, 'app.apiEndpoint') }/${ type }/${ id }`, params);
return get(this, 'globalStore').request({ url });
},
fetchTemplates() {
if ( arguments.length ) {
console.error('Deprecated', new Error("Use a catalogService.filter(globalStore.all('templates'))"));
}
const globalStore = get(this, 'globalStore');
const qp = { 'category_ne': 'system' };
const url = this._addLimits(`${ get(this, 'app.apiEndpoint') }/templates`, qp);
return globalStore.request({ url }).then(() => ({ catalog: this._allTemplates }));
},
cleanVersionsArray(template) {
return Object.keys(template.versionLinks).filter((key) => {
// Filter out empty values for rancher/rancher#5494
return !!template.versionLinks[key];
}).map((key) => {
return {
version: key,
sortVersion: key,
link: template.versionLinks[key]
};
})
},
fetchByUrl(url) {
return get(this, 'store').request({ url });
},
filter(data, project, istio) {
let currentProjectId = project ? project.id : null;
let currentClusterId = project ? project.clusterId : null;
data = data.filter((tpl) => {
if ( tpl.clusterId && tpl.clusterId !== currentClusterId ) {
return false;
}
if ( tpl.projectId && tpl.projectId !== currentProjectId ) {
return false;
}
if ( typeof istio !== undefined ) {
if ( istio !== get(tpl, 'isIstio') ) {
return false;
}
if ( !istio && get(tpl, 'catalogId') === C.CATALOG.SYSTEM_LIBRARY_KEY ) {
return false;
}
}
return true;
});
data = data.sortBy('name');
return data;
},
uniqueCategories(data) {
let out = [];
data.forEach((obj) => {
out.pushObjects(obj.get('categoryArray'));
});
out = uniqKeys(out);
out.unshift('');
return out;
},
_addLimits(url, qp) {
qp = qp || {};
url = addQueryParams(url, qp);
return url;
},
});