/*
Copyright (C) 2017 Cloudbase Solutions SRL
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
*/
import Api from "@src/utils/ApiCaller";
import configLoader from "@src/utils/Config";
import DateUtils from "@src/utils/DateUtils";
import type { Schedule } from "@src/@types/Schedule";
class ScheduleSource {
async scheduleSinge(
replicaId: string,
scheduleData: Schedule
): Promise {
const payload: any = {
schedule: {},
expiration_date: null,
enabled: scheduleData.enabled == null ? false : scheduleData.enabled,
shutdown_instance:
scheduleData.shutdown_instances == null
? false
: scheduleData.shutdown_instances,
};
if (scheduleData.expiration_date) {
payload.expiration_date = new Date(
scheduleData.expiration_date
).toISOString();
}
if (scheduleData.schedule != null) {
Object.keys(scheduleData.schedule).forEach(prop => {
const scheduleDataAny: any = scheduleData;
if (
scheduleDataAny.schedule &&
scheduleDataAny.schedule[prop] != null
) {
payload.schedule[prop] = scheduleDataAny.schedule[prop];
}
});
}
const response = await Api.send({
url: `${configLoader.config.servicesUrls.coriolis}/${Api.projectId}/replicas/${replicaId}/schedules`,
method: "POST",
data: payload,
});
return response.data.schedule;
}
async scheduleMultiple(
replicaId: string,
schedules: Schedule[]
): Promise {
const scheduledSchedules: Schedule[] = await Promise.all(
schedules.map(async schedule => {
const scheduledSchedule: Schedule = await this.scheduleSinge(
replicaId,
schedule
);
return scheduledSchedule;
})
);
return scheduledSchedules;
}
async getSchedules(
replicaId: string,
opts?: { skipLog?: boolean }
): Promise {
const response = await Api.send({
url: `${configLoader.config.servicesUrls.coriolis}/${Api.projectId}/replicas/${replicaId}/schedules`,
skipLog: opts && opts.skipLog,
});
const schedules: any[] = response.data.schedules.map((s: any) => ({
...s,
expiration_date: s.expiration_date
? DateUtils.getUtcDate(s.expiration_date).toJSDate()
: undefined,
shutdown_instances:
s.shutdown_instance != null ? s.shutdown_instance : undefined,
}));
schedules.sort(
(a, b) =>
new Date(a.created_at).getTime() - new Date(b.created_at).getTime()
);
return schedules;
}
async addSchedule(replicaId: string, schedule: Schedule): Promise {
const payload: any = {
schedule: { hour: 0, minute: 0 },
enabled: false,
};
if (schedule && schedule.schedule) {
payload.schedule = { ...schedule.schedule };
}
const response = await Api.send({
url: `${configLoader.config.servicesUrls.coriolis}/${Api.projectId}/replicas/${replicaId}/schedules`,
method: "POST",
data: payload,
});
return response.data.schedule;
}
async removeSchedule(replicaId: string, scheduleId: string): Promise {
await Api.send({
url: `${configLoader.config.servicesUrls.coriolis}/${Api.projectId}/replicas/${replicaId}/schedules/${scheduleId}`,
method: "DELETE",
});
}
async updateSchedule(opts: {
replicaId: string;
scheduleId: string;
scheduleData: Schedule;
scheduleOldData: Schedule | null | undefined;
unsavedData: Schedule | null | undefined;
}): Promise {
const {
replicaId,
scheduleId,
scheduleData,
scheduleOldData,
unsavedData,
} = opts;
const payload: any = {};
if (scheduleData.enabled != null) {
payload.enabled = scheduleData.enabled;
}
if (scheduleData.shutdown_instances != null) {
payload.shutdown_instance = scheduleData.shutdown_instances;
}
if (unsavedData?.expiration_date) {
payload.expiration_date = new Date(
unsavedData.expiration_date
).toISOString();
}
if (
unsavedData &&
unsavedData.schedule != null &&
Object.keys(unsavedData.schedule).length
) {
if (scheduleOldData) {
payload.schedule = { ...scheduleOldData.schedule };
}
Object.keys(unsavedData.schedule).forEach(prop => {
const unsavedDataAny: any = unsavedData;
if (unsavedDataAny?.schedule && unsavedDataAny.schedule[prop] != null) {
payload.schedule[prop] = unsavedDataAny.schedule[prop];
} else {
delete payload.schedule[prop];
}
});
}
const response = await Api.send({
url: `${configLoader.config.servicesUrls.coriolis}/${Api.projectId}/replicas/${replicaId}/schedules/${scheduleId}`,
method: "PUT",
data: payload,
});
const s = { ...response.data.schedule };
if (s.expiration_date) {
s.expiration_date = DateUtils.getUtcDate(s.expiration_date);
}
if (s.shutdown_instance) {
s.shutdown_instances = s.shutdown_instance;
}
return s;
}
}
export default new ScheduleSource();