@spotinst/spinnaker-deck
Version:
Spinnaker-Deck service, forked with support to Spotinst
112 lines (93 loc) • 4.25 kB
text/typescript
import { IQService, module, noop } from 'angular';
import { cloneDeep, uniq } from 'lodash';
import { Duration } from 'luxon';
import { AccountService } from 'core/account/AccountService';
import { CloudProviderRegistry } from 'core/cloudProvider';
import { SECURITY_GROUP_READER, SecurityGroupReader } from 'core/securityGroup/securityGroupReader.service';
import { ICacheConfig } from './deckCacheFactory';
import { IInfrastructureCacheConfig, INFRASTRUCTURE_CACHE_CONFIG } from './infrastructureCacheConfig';
import { InfrastructureCaches } from './infrastructureCaches';
interface IInitializers {
[key: string]: any[];
securityGroups: any[];
}
export class CacheInitializerService {
private cacheConfig: IInfrastructureCacheConfig = cloneDeep<IInfrastructureCacheConfig>(INFRASTRUCTURE_CACHE_CONFIG);
private initializers: IInitializers = {
securityGroups: [() => this.securityGroupReader.getAllSecurityGroups()],
};
private setConfigDefaults(key: string, config: ICacheConfig) {
config.version = config.version || 1;
config.maxAge = config.maxAge || Duration.fromObject({ days: 2 }).as('milliseconds');
config.initializers = config.initializers || this.initializers[key] || ([] as any[]);
config.onReset = config.onReset || [noop];
}
private extendConfig(): PromiseLike<void> {
Object.keys(this.cacheConfig).forEach((key: string) => {
this.setConfigDefaults(key, this.cacheConfig[key]);
});
return AccountService.listProviders().then((availableProviders: string[]) => {
return CloudProviderRegistry.listRegisteredProviders().forEach((provider: string) => {
if (!availableProviders.includes(provider)) {
return;
}
if (this.providerServiceDelegate.hasDelegate(provider, 'cache.configurer')) {
const providerConfig: any = this.providerServiceDelegate.getDelegate(provider, 'cache.configurer');
Object.keys(providerConfig).forEach((key: string) => {
this.setConfigDefaults(key, providerConfig[key]);
if (!this.cacheConfig[key]) {
this.cacheConfig[key] = providerConfig[key];
}
this.cacheConfig[key].initializers = uniq(
this.cacheConfig[key].initializers.concat(providerConfig[key].initializers),
);
this.cacheConfig[key].onReset = uniq(this.cacheConfig[key].onReset.concat(providerConfig[key].onReset));
this.cacheConfig[key].version = Math.max(this.cacheConfig[key].version, providerConfig[key].version);
this.cacheConfig[key].maxAge = Math.min(this.cacheConfig[key].maxAge, providerConfig[key].maxAge);
});
}
});
});
}
private initializeCache(key: string): PromiseLike<any[]> {
InfrastructureCaches.createCache(key, this.cacheConfig[key]);
if (this.cacheConfig[key].initializers) {
const initializer: any = this.cacheConfig[key].initializers;
const all: Array<PromiseLike<any>> = [];
initializer.forEach((method: Function) => {
all.push(method());
});
return this.$q.all(all);
} else {
return this.$q.resolve(undefined);
}
}
public static $inject = ['$q', 'securityGroupReader', 'providerServiceDelegate'];
constructor(
private $q: IQService,
private securityGroupReader: SecurityGroupReader,
private providerServiceDelegate: any,
) {}
public initialize(): PromiseLike<any[]> {
return this.extendConfig().then(() => {
const all: any[] = [];
Object.keys(this.cacheConfig).forEach((key: string) => {
all.push(this.initializeCache(key));
});
return this.$q.all(all);
});
}
public refreshCache(key: string): PromiseLike<any[]> {
InfrastructureCaches.clearCache(key);
return this.initializeCache(key);
}
public refreshCaches(): PromiseLike<any[]> {
const all: Array<PromiseLike<any[]>> = [];
Object.keys(this.cacheConfig).forEach((key: string) => {
all.push(this.refreshCache(key));
});
return this.$q.all(all);
}
}
export const CACHE_INITIALIZER_SERVICE = 'spinnaker.core.cache.initializer';
module(CACHE_INITIALIZER_SERVICE, [SECURITY_GROUP_READER]).service('cacheInitializer', CacheInitializerService);