Compare commits
1 Commits
developmen
...
feature/AR
Author | SHA1 | Date |
---|---|---|
Kerkesni | 1bb8e86679 |
|
@ -0,0 +1,166 @@
|
||||||
|
type status = {
|
||||||
|
paused: boolean,
|
||||||
|
scheduledResume: string|null,
|
||||||
|
};
|
||||||
|
|
||||||
|
type serviceStatus = {
|
||||||
|
crr: status|null,
|
||||||
|
ingestion: status|null,
|
||||||
|
lifecycle: status|null,
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class to manage a location's pause/resume state on its
|
||||||
|
* different services.
|
||||||
|
* Current supported services are : crr, ingestion, lifecycle
|
||||||
|
*/
|
||||||
|
export default class LocationStatus {
|
||||||
|
_data: serviceStatus;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @constructor
|
||||||
|
* @param services services to init
|
||||||
|
* @param locationStatus initial location status values
|
||||||
|
*/
|
||||||
|
constructor(services: string[], locationStatus?: {
|
||||||
|
crr: serviceStatus|null,
|
||||||
|
ingestion: serviceStatus|null,
|
||||||
|
lifecycle: serviceStatus|null,
|
||||||
|
} | serviceStatus) {
|
||||||
|
this._data = this._initStatus(services);
|
||||||
|
if (locationStatus) {
|
||||||
|
const data = locationStatus instanceof LocationStatus ?
|
||||||
|
locationStatus._data : locationStatus;
|
||||||
|
Object.keys(this._data).forEach(svc => {
|
||||||
|
this._data[svc] = {
|
||||||
|
paused: data[svc]?.paused || false,
|
||||||
|
scheduledResume: data[svc]?.scheduledResume || null
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes the status of all services
|
||||||
|
* The default status of a service is unpaused
|
||||||
|
* @returns {LocationServiceStatus}
|
||||||
|
*/
|
||||||
|
_initStatus(servicesToInit: string[]): serviceStatus {
|
||||||
|
const initStatus = {
|
||||||
|
paused: false,
|
||||||
|
scheduledResume: null,
|
||||||
|
};
|
||||||
|
return {
|
||||||
|
crr: servicesToInit.includes('crr') ? initStatus : null,
|
||||||
|
ingestion: servicesToInit.includes('ingestion') ? initStatus : null,
|
||||||
|
lifecycle: servicesToInit.includes('lifecycle') ? initStatus : null,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* initializes a service status
|
||||||
|
* @param service service name
|
||||||
|
*/
|
||||||
|
_initService(service: string) {
|
||||||
|
this._data[service] = {
|
||||||
|
paused: false,
|
||||||
|
scheduledResume: null,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param service service name
|
||||||
|
* @param paused true if paused
|
||||||
|
*/
|
||||||
|
setServicePauseStatus(service: string, paused: boolean) {
|
||||||
|
if (Object.keys(this._data).includes(service)) {
|
||||||
|
if (!this._data[service]) {
|
||||||
|
this._initService(service);
|
||||||
|
}
|
||||||
|
this._data[service].paused = paused;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param service service name
|
||||||
|
* @returns true if paused
|
||||||
|
*/
|
||||||
|
getServicePauseStatus(service: string) : boolean | null {
|
||||||
|
if (!this._data[service]) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return this._data[service].paused;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param service service name
|
||||||
|
*/
|
||||||
|
setServiceResumeSchedule(service: string, date: Date | null) {
|
||||||
|
if (this._data[service]) {
|
||||||
|
if (date !== null) {
|
||||||
|
this._data[service].scheduledResume = date.toString();
|
||||||
|
} else {
|
||||||
|
this._data[service].scheduledResume = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param service service name
|
||||||
|
* @returns scheduled resume date
|
||||||
|
*/
|
||||||
|
getServiceResumeSchedule(service: string) : Date | null {
|
||||||
|
const schedule = this._data[service].scheduledResume;
|
||||||
|
if (!schedule) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return new Date(schedule);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param service service(s) name
|
||||||
|
*/
|
||||||
|
pauseLocation(service: string | string[]) {
|
||||||
|
const servicesList = Array.isArray(service) ?
|
||||||
|
service : [service];
|
||||||
|
servicesList.forEach(svc => {
|
||||||
|
if (!this.getServicePauseStatus(svc)) {
|
||||||
|
this.setServicePauseStatus(svc, true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param service service(s) name
|
||||||
|
* @param schedule date to resume service(s)
|
||||||
|
*/
|
||||||
|
resumeLocation(service: string | string[], schedule?: Date) {
|
||||||
|
const servicesList = Array.isArray(service) ?
|
||||||
|
service : [service];
|
||||||
|
servicesList.forEach(svc => {
|
||||||
|
if (!this.getServicePauseStatus(svc)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let shouldPause = false;
|
||||||
|
if (schedule) {
|
||||||
|
shouldPause = true
|
||||||
|
}
|
||||||
|
this.setServicePauseStatus(svc, shouldPause);
|
||||||
|
this.setServiceResumeSchedule(svc, schedule||null);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return location status object
|
||||||
|
*/
|
||||||
|
getValue() : serviceStatus{
|
||||||
|
return this._data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @returns serialized location status data
|
||||||
|
*/
|
||||||
|
getSerialized() : string {
|
||||||
|
return JSON.stringify(this.getValue());
|
||||||
|
}
|
||||||
|
}
|
|
@ -5,6 +5,7 @@ export { default as BucketInfo } from './BucketInfo';
|
||||||
export { default as BucketPolicy } from './BucketPolicy';
|
export { default as BucketPolicy } from './BucketPolicy';
|
||||||
export { default as LifecycleConfiguration } from './LifecycleConfiguration';
|
export { default as LifecycleConfiguration } from './LifecycleConfiguration';
|
||||||
export { default as LifecycleRule } from './LifecycleRule';
|
export { default as LifecycleRule } from './LifecycleRule';
|
||||||
|
export { default as LocationStatus } from './LocationStatus';
|
||||||
export { default as NotificationConfiguration } from './NotificationConfiguration';
|
export { default as NotificationConfiguration } from './NotificationConfiguration';
|
||||||
export { default as ObjectLockConfiguration } from './ObjectLockConfiguration';
|
export { default as ObjectLockConfiguration } from './ObjectLockConfiguration';
|
||||||
export { default as ObjectMD } from './ObjectMD';
|
export { default as ObjectMD } from './ObjectMD';
|
||||||
|
|
|
@ -0,0 +1,108 @@
|
||||||
|
const assert = require('assert');
|
||||||
|
|
||||||
|
const LocationStatus = require('../../../lib/models/LocationStatus').default;
|
||||||
|
|
||||||
|
const locationStatusObj = {
|
||||||
|
crr: {
|
||||||
|
paused: true,
|
||||||
|
scheduledResume: null,
|
||||||
|
},
|
||||||
|
ingestion: {
|
||||||
|
paused: false,
|
||||||
|
scheduledResume: null,
|
||||||
|
},
|
||||||
|
lifecycle: {
|
||||||
|
paused: true,
|
||||||
|
scheduledResume: 'Fri Jan 27 2023 13:56:12 GMT+0100',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
describe('LocationStatus', () => {
|
||||||
|
let locationStatus = null;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
locationStatus = new LocationStatus(['crr', 'ingestion', 'lifecycle'], locationStatusObj);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should init location service status as unpaused', () => {
|
||||||
|
const ls = new LocationStatus(['crr', 'ingestion', 'lifecycle']);
|
||||||
|
Object.keys(ls._data).forEach(service => {
|
||||||
|
assert.strictEqual(ls._data[service].paused, false);
|
||||||
|
assert.strictEqual(ls._data[service].scheduledResume, null);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should copy data from LocationStatus', () => {
|
||||||
|
const lsToCopy = new LocationStatus(['crr', 'ingestion', 'lifecycle'], locationStatusObj);
|
||||||
|
const ls = new LocationStatus(['crr', 'ingestion', 'lifecycle'], lsToCopy);
|
||||||
|
Object.keys(locationStatusObj).forEach(service => {
|
||||||
|
assert.strictEqual(ls._data[service].paused, lsToCopy._data[service].paused);
|
||||||
|
assert.strictEqual(ls._data[service].scheduledResume, lsToCopy._data[service].scheduledResume);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should copy data from object', () => {
|
||||||
|
const ls = new LocationStatus(['crr', 'ingestion', 'lifecycle'], locationStatusObj);
|
||||||
|
Object.keys(locationStatusObj).forEach(service => {
|
||||||
|
assert.strictEqual(ls._data[service].paused, locationStatusObj[service].paused);
|
||||||
|
assert.strictEqual(ls._data[service].scheduledResume, locationStatusObj[service].scheduledResume);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should initialize non specified services', () => {
|
||||||
|
const tmpLocStatus = Object.assign({}, locationStatusObj);
|
||||||
|
delete tmpLocStatus.ingestion;
|
||||||
|
const ls = new LocationStatus(['crr', 'ingestion', 'lifecycle'], tmpLocStatus);
|
||||||
|
assert.strictEqual(ls._data.ingestion.paused, false);
|
||||||
|
assert.strictEqual(ls._data.ingestion.scheduledResume, null);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should set service status', () => {
|
||||||
|
locationStatus.setServicePauseStatus('ingestion', true);
|
||||||
|
assert.strictEqual(locationStatus._data.ingestion.paused, true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should get service status', () => {
|
||||||
|
const isPaused = locationStatus.getServicePauseStatus('lifecycle');
|
||||||
|
assert.strictEqual(isPaused, locationStatusObj.lifecycle.paused);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should set service resume schedule', () => {
|
||||||
|
const date = new Date();
|
||||||
|
locationStatus.setServiceResumeSchedule('crr', date);
|
||||||
|
assert.strictEqual(locationStatus._data.crr.scheduledResume, date.toString());
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should get service resume schedule', () => {
|
||||||
|
const schedule = locationStatus.getServiceResumeSchedule('lifecycle');
|
||||||
|
assert.deepEqual(schedule, new Date(locationStatusObj.lifecycle.scheduledResume));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should get null service resume schedule', () => {
|
||||||
|
const schedule = locationStatus.getServiceResumeSchedule('crr');
|
||||||
|
assert.strictEqual(schedule, null);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should pause services', () => {
|
||||||
|
locationStatus.pauseLocation('ingestion');
|
||||||
|
assert.strictEqual(locationStatus._data.ingestion.paused, true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should resume services', () => {
|
||||||
|
locationStatus.resumeLocation('lifecycle');
|
||||||
|
assert.strictEqual(locationStatus._data.lifecycle.paused, false);
|
||||||
|
assert.strictEqual(locationStatus._data.lifecycle.scheduledResume, null);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should set resume shedule', () => {
|
||||||
|
const date = new Date();
|
||||||
|
locationStatus.resumeLocation('crr', date);
|
||||||
|
assert.strictEqual(locationStatus._data.crr.paused, true);
|
||||||
|
assert.strictEqual(locationStatus._data.crr.scheduledResume, date.toString());
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return serialized location status data', () => {
|
||||||
|
const data = locationStatus.getValue();
|
||||||
|
assert.deepEqual(data, locationStatusObj);
|
||||||
|
});
|
||||||
|
});
|
Loading…
Reference in New Issue