import {call, put, select} from "redux-saga/effects"; import {addToStore} from "../actions/objects"; import {getDatacenter, getRoomsOfDatacenter} from "../api/routes/datacenters"; import {getPath, getSectionsOfPath} from "../api/routes/paths"; import {getTilesOfRoom} from "../api/routes/rooms"; import {getAllSchedulers} from "../api/routes/schedulers"; import {getSection} from "../api/routes/sections"; import {getPathsOfSimulation, getSimulation} from "../api/routes/simulations"; import { getAllCPUs, getAllGPUs, getAllMemories, getAllStorages, getCoolingItem, getCPU, getFailureModel, getGPU, getMemory, getPSU, getStorage } from "../api/routes/specifications"; import {getMachinesOfRackByTile, getRackByTile} from "../api/routes/tiles"; import {getAllTraces} from "../api/routes/traces"; import {getUser} from "../api/routes/users"; export const OBJECT_SELECTORS = { simulation: state => state.objects.simulation, user: state => state.objects.user, authorization: state => state.objects.authorization, failureModel: state => state.objects.failureModel, cpu: state => state.objects.cpu, gpu: state => state.objects.gpu, memory: state => state.objects.memory, storage: state => state.objects.storage, machine: state => state.objects.machine, rack: state => state.objects.rack, coolingItem: state => state.objects.coolingItem, psu: state => state.objects.psu, tile: state => state.objects.tile, room: state => state.objects.room, datacenter: state => state.objects.datacenter, section: state => state.objects.section, path: state => state.objects.path, }; function* fetchAndStoreObject(objectType, id, apiCall) { const objectStore = yield select(OBJECT_SELECTORS[objectType]); let object = objectStore[id]; if (!object) { object = yield apiCall; yield put(addToStore(objectType, object)); } return object; } function* fetchAndStoreObjects(objectType, apiCall) { const objects = yield apiCall; for (let index in objects) { yield put(addToStore(objectType, objects[index])); } return objects; } export const fetchAndStoreSimulation = (id) => fetchAndStoreObject("simulation", id, call(getSimulation, id)); export const fetchAndStoreUser = (id) => fetchAndStoreObject("user", id, call(getUser, id)); export const fetchAndStoreFailureModel = (id) => fetchAndStoreObject("failureModel", id, call(getFailureModel, id)); export const fetchAndStoreAllCPUs = () => fetchAndStoreObjects("cpu", call(getAllCPUs)); export const fetchAndStoreCPU = (id) => fetchAndStoreObject("cpu", id, call(getCPU, id)); export const fetchAndStoreAllGPUs = () => fetchAndStoreObjects("gpu", call(getAllGPUs)); export const fetchAndStoreGPU = (id) => fetchAndStoreObject("gpu", id, call(getGPU, id)); export const fetchAndStoreAllMemories = () => fetchAndStoreObjects("memory", call(getAllMemories)); export const fetchAndStoreMemory = (id) => fetchAndStoreObject("memory", id, call(getMemory, id)); export const fetchAndStoreAllStorages = () => fetchAndStoreObjects("storage", call(getAllStorages)); export const fetchAndStoreStorage = (id) => fetchAndStoreObject("storage", id, call(getStorage, id)); export const fetchAndStoreMachinesOfTile = (tileId) => fetchAndStoreObjects("machine", call(getMachinesOfRackByTile, tileId)); export const fetchAndStoreRackOnTile = (id, tileId) => fetchAndStoreObject("rack", id, call(getRackByTile, tileId)); export const fetchAndStoreCoolingItem = (id) => fetchAndStoreObject("coolingItem", id, call(getCoolingItem, id)); export const fetchAndStorePSU = (id) => fetchAndStoreObject("psu", id, call(getPSU, id)); export const fetchAndStoreTilesOfRoom = (roomId) => fetchAndStoreObjects("tile", call(getTilesOfRoom, roomId)); export const fetchAndStoreRoomsOfDatacenter = (datacenterId) => fetchAndStoreObjects("room", call(getRoomsOfDatacenter, datacenterId)); export const fetchAndStoreDatacenter = (id) => fetchAndStoreObject("datacenter", id, call(getDatacenter, id)); export const fetchAndStoreSection = (id) => fetchAndStoreObject("section", id, call(getSection, id)); export const fetchAndStoreSectionsOfPath = (pathId) => fetchAndStoreObjects("section", call(getSectionsOfPath, pathId)); export const fetchAndStorePath = (id) => fetchAndStoreObject("path", id, call(getPath, id)); export const fetchAndStorePathsOfSimulation = (simulationId) => fetchAndStoreObjects("path", call(getPathsOfSimulation, simulationId)); export const fetchAndStoreAllTraces = () => fetchAndStoreObjects("trace", call(getAllTraces)); export const fetchAndStoreAllSchedulers = function* () { const objects = yield call(getAllSchedulers); for (let index in objects) { objects[index].id = objects[index].name; yield put(addToStore("scheduler", objects[index])); } return objects; };