/* Copyright (C) 2020 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 DefaultMinionPoolSchemaPlugin from "@src/plugins/default/MinionPoolSchemaPlugin"; import configLoader from "@src/utils/Config"; import { MinionPool, MinionPoolDetails } from "@src/@types/MinionPool"; import { ProviderTypes } from "@src/@types/Providers"; import { Field } from "@src/@types/Field"; import { providerTypes } from "@src/constants"; import { Endpoint, OptionValues } from "@src/@types/Endpoint"; import { MinionPoolAction } from "@src/stores/MinionPoolStore"; import { Execution } from "@src/@types/Execution"; import { SchemaParser } from "./Schemas"; class MinionPoolSource { getMinionPoolDefaultSchema(): Field[] { return [ { name: "endpoint_id", label: "Endpoint", type: "string", }, { name: "platform", type: "string", title: "Pool Platform", }, { name: "name", type: "string", required: true, title: "Pool Name", }, { name: "os_type", type: "string", required: true, title: "Pool OS Type", default: "linux", enum: [ { label: "Linux", value: "linux", }, { label: "Windows", value: "windows", }, ], }, { name: "minimum_minions", type: "integer", minimum: 1, default: 1, }, { name: "maximum_minions", type: "integer", minimum: 1, default: 1, }, { name: "minion_max_idle_time", type: "integer", minimum: 0, default: 3600, }, { name: "minion_retention_strategy", type: "string", default: "delete", enum: [ { value: "delete", label: "Delete", }, { value: "poweroff", label: "Power Off", }, ], }, { name: "skip_allocation", type: "boolean", nullableBoolean: false, }, { name: "notes", type: "string", }, ]; } async loadMinionPools(options?: { skipLog?: boolean; }): Promise { const response = await Api.send({ url: `${configLoader.config.servicesUrls.coriolis}/${Api.projectId}/minion_pools`, skipLog: options?.skipLog, }); const minionPools: MinionPool[] = response.data.minion_pools; minionPools.sort( (a, b) => new Date(b.updated_at || b.created_at || "").getTime() - new Date(a.updated_at || a.created_at || "").getTime() ); return minionPools; } async loadMinionPoolDetails( id: string, options?: { skipLog?: boolean } ): Promise { const response = await Api.send({ url: `${configLoader.config.servicesUrls.coriolis}/${Api.projectId}/minion_pools/${id}`, skipLog: options?.skipLog, }); return response.data.minion_pool; } async loadOptions(config: { optionsType: "source" | "destination"; endpoint: Endpoint; envData: { [prop: string]: any } | null | undefined; useCache?: boolean | null; }): Promise { const { optionsType, endpoint, envData, useCache } = config; const envString = SchemaParser.getMinionPoolToOptionsQuery( envData, endpoint.type ); const callName = optionsType === "source" ? "source-minion-pool-options" : "destination-minion-pool-options"; const fieldName = optionsType === "source" ? "source_minion_pool_options" : "destination_minion_pool_options"; const response = await Api.send({ url: `${configLoader.config.servicesUrls.coriolis}/${Api.projectId}/endpoints/${endpoint.id}/${callName}${envString}`, cache: useCache, cancelId: endpoint.id, }); return response.data[fieldName]; } async loadMinionPoolSchema( providerName: ProviderTypes, platform: "source" | "destination" ): Promise { const providerType = platform === "source" ? providerTypes.SOURCE_MINION_POOL : providerTypes.DESTINATION_MINION_POOL; try { const response = await Api.send({ url: `${configLoader.config.servicesUrls.coriolis}/${Api.projectId}/providers/${providerName}/schemas/${providerType}`, }); const schema = response.data?.schemas?.[`${platform}_minion_pool_environment_schema`]; let fields = []; if (schema) { fields = SchemaParser.minionPoolOptionsSchemaToFields( providerName, schema, `${providerName}-minion-pool` ); } return fields; } catch (err) { console.error(err); return []; } } async add(config: { endpointId: string; data: any; defaultSchema: Field[]; envSchema: Field[]; provider: ProviderTypes; }) { const { endpointId, data, defaultSchema, envSchema, provider } = config; const payload = { minion_pool: { ...new DefaultMinionPoolSchemaPlugin().getMinionPoolEnv( defaultSchema, data ), endpoint_id: endpointId, environment_options: SchemaParser.getMinionPoolEnv( provider, envSchema, data ), }, }; const response = await Api.send({ url: `${configLoader.config.servicesUrls.coriolis}/${Api.projectId}/minion_pools`, method: "POST", data: payload, }); return response.data.minion_pool; } async update(config: { data: any; defaultSchema: Field[]; envSchema: Field[]; provider: ProviderTypes; }) { const { data, defaultSchema, envSchema, provider } = config; const payload = { minion_pool: { ...new DefaultMinionPoolSchemaPlugin().getMinionPoolEnv( defaultSchema, data ), environment_options: SchemaParser.getMinionPoolEnv( provider, envSchema, data ), }, }; const response = await Api.send({ url: `${configLoader.config.servicesUrls.coriolis}/${Api.projectId}/minion_pools/${data.id}`, method: "PUT", data: payload, }); return response.data.minion_pool; } async runAction( minionPoolId: string, minionPoolAction: MinionPoolAction, actionOptions?: any ): Promise { const payload: any = {}; if (actionOptions) { payload[minionPoolAction] = { ...actionOptions }; } else { payload[minionPoolAction] = null; } const response = await Api.send({ url: `${configLoader.config.servicesUrls.coriolis}/${Api.projectId}/minion_pools/${minionPoolId}/actions`, method: "POST", data: payload, }); return response.data.execution; } async deleteMinionPool(minionPoolId: string) { const response = await Api.send({ url: `${configLoader.config.servicesUrls.coriolis}/${Api.projectId}/minion_pools/${minionPoolId}`, method: "DELETE", }); return response.data.execution; } } export default new MinionPoolSource();