summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/actions/objects.js25
-rw-r--r--src/api/routes/datacenters.js26
-rw-r--r--src/api/routes/paths.js30
-rw-r--r--src/api/routes/room-types.js9
-rw-r--r--src/api/routes/rooms.js45
-rw-r--r--src/api/routes/sections.js5
-rw-r--r--src/api/routes/simulations.js47
-rw-r--r--src/api/routes/specifications.js57
-rw-r--r--src/api/routes/tiles.js146
-rw-r--r--src/api/routes/token-signin.js (renamed from src/api/routes/auth.js)0
-rw-r--r--src/api/routes/users.js25
-rw-r--r--src/api/routes/util.js37
-rw-r--r--src/api/sagas/objects.js10
-rw-r--r--src/api/sagas/simulations.js6
-rw-r--r--src/api/sagas/users.js2
-rw-r--r--src/components/map/MapStage.js4
-rw-r--r--src/components/map/groups/DatacenterGroup.js17
-rw-r--r--src/components/map/groups/RoomGroup.js19
-rw-r--r--src/reducers/objects.js66
19 files changed, 443 insertions, 133 deletions
diff --git a/src/actions/objects.js b/src/actions/objects.js
index 08f3f0bd..0a0e3046 100644
--- a/src/actions/objects.js
+++ b/src/actions/objects.js
@@ -1,24 +1,9 @@
-export const ADD_TO_SIMULATION_STORE = "ADD_TO_SIMULATION_STORE";
-export const ADD_TO_AUTHORIZATION_STORE = "ADD_TO_AUTHORIZATION_STORE";
-export const ADD_TO_USER_STORE = "ADD_TO_USER_STORE";
+export const ADD_TO_STORE = "ADD_TO_STORE";
-export function addToSimulationStore(simulation) {
+export function addToStore(objectType, object) {
return {
- type: ADD_TO_SIMULATION_STORE,
- simulation
+ type: ADD_TO_STORE,
+ objectType,
+ object
};
}
-
-export function addToAuthorizationStore(authorization) {
- return {
- type: ADD_TO_AUTHORIZATION_STORE,
- authorization
- };
-}
-
-export function addToUserStore(user) {
- return {
- type: ADD_TO_USER_STORE,
- user
- }
-}
diff --git a/src/api/routes/datacenters.js b/src/api/routes/datacenters.js
new file mode 100644
index 00000000..df621a62
--- /dev/null
+++ b/src/api/routes/datacenters.js
@@ -0,0 +1,26 @@
+import {sendRequest} from "../index";
+import {getById} from "./util";
+
+export function getDatacenter(datacenterId) {
+ return getById("/datacenters/{datacenterId}", {datacenterId});
+}
+
+export function getRoomsOfDatacenter(datacenterId) {
+ return getById("/datacenters/{datacenterId}/rooms", {datacenterId});
+}
+
+export function addRoomToDatacenter(room) {
+ return sendRequest({
+ path: "/datacenters/{datacenterId}/rooms",
+ method: "POST",
+ parameters: {
+ body: {
+ room
+ },
+ path: {
+ datacenterId: room.datacenterId
+ },
+ query: {}
+ }
+ });
+}
diff --git a/src/api/routes/paths.js b/src/api/routes/paths.js
new file mode 100644
index 00000000..073cbe7e
--- /dev/null
+++ b/src/api/routes/paths.js
@@ -0,0 +1,30 @@
+import {sendRequest} from "../index";
+import {getById} from "./util";
+
+export function getPath(pathId) {
+ return getById("/paths/{pathId}", {pathId});
+}
+
+export function getBranchesOfPath(pathId) {
+ return getById("/paths/{pathId}/branches", {pathId});
+}
+
+export function branchFromPath(pathId, section) {
+ return sendRequest({
+ path: "/paths/{pathId}/branches",
+ method: "POST",
+ parameters: {
+ body: {
+ section
+ },
+ path: {
+ pathId
+ },
+ query: {}
+ }
+ });
+}
+
+export function getSectionsOfPath(pathId) {
+ return getById("/paths/{pathId}/sections", {pathId});
+}
diff --git a/src/api/routes/room-types.js b/src/api/routes/room-types.js
new file mode 100644
index 00000000..339896d2
--- /dev/null
+++ b/src/api/routes/room-types.js
@@ -0,0 +1,9 @@
+import {getAll, getById} from "./util";
+
+export function getAvailableRoomTypes() {
+ return getAll("/room-types");
+}
+
+export function getAllowedObjectsOfRoomType(name) {
+ return getById("/room-types/{name}/allowed-objects", {name});
+}
diff --git a/src/api/routes/rooms.js b/src/api/routes/rooms.js
new file mode 100644
index 00000000..e08cc6e7
--- /dev/null
+++ b/src/api/routes/rooms.js
@@ -0,0 +1,45 @@
+import {sendRequest} from "../index";
+
+export function getRoom(roomId) {
+ return getById("/rooms/{roomId}", {roomId});
+}
+
+export function updateRoom(room) {
+ return sendRequest({
+ path: "/rooms/{roomId}",
+ method: "PUT",
+ parameters: {
+ body: {
+ room
+ },
+ path: {
+ roomId: room.id
+ },
+ query: {}
+ }
+ });
+}
+
+export function deleteRoom(roomId) {
+ return deleteById("/rooms/{roomId}", {roomId});
+}
+
+export function getTilesOfRoom(roomId) {
+ return getById("/rooms/{roomId}/tiles", {roomId});
+}
+
+export function addTileToRoom(tile) {
+ return sendRequest({
+ path: "/rooms/{roomId}/tiles",
+ method: "POST",
+ parameters: {
+ body: {
+ tile
+ },
+ path: {
+ roomId: tile.roomId
+ },
+ query: {}
+ }
+ });
+}
diff --git a/src/api/routes/sections.js b/src/api/routes/sections.js
new file mode 100644
index 00000000..8d71d768
--- /dev/null
+++ b/src/api/routes/sections.js
@@ -0,0 +1,5 @@
+import {getById} from "./util";
+
+export function getSection(sectionId) {
+ return getById("/sections/{sectionId}", {sectionId});
+}
diff --git a/src/api/routes/simulations.js b/src/api/routes/simulations.js
index 3c7c748e..d65460ee 100644
--- a/src/api/routes/simulations.js
+++ b/src/api/routes/simulations.js
@@ -1,4 +1,9 @@
import {sendRequest} from "../index";
+import {deleteById, getById} from "./util";
+
+export function getSimulation(simulationId) {
+ return getById("/simulations/{simulationId}", {simulationId});
+}
export function addSimulation(simulation) {
return sendRequest({
@@ -14,20 +19,6 @@ export function addSimulation(simulation) {
});
}
-export function getSimulation(simulationId) {
- return sendRequest({
- path: "/simulations/{simulationId}",
- method: "GET",
- parameters: {
- body: {},
- path: {
- simulationId
- },
- query: {}
- }
- });
-}
-
export function updateSimulation(simulation) {
return sendRequest({
path: "/simulations/{simulationId}",
@@ -45,29 +36,13 @@ export function updateSimulation(simulation) {
}
export function deleteSimulation(simulationId) {
- return sendRequest({
- path: "/simulations/{simulationId}",
- method: "DELETE",
- parameters: {
- body: {},
- path: {
- simulationId
- },
- query: {}
- }
- });
+ return deleteById("/simulations/{simulationId}", {simulationId});
}
export function getAuthorizationsBySimulation(simulationId) {
- return sendRequest({
- path: "/simulations/{simulationId}/authorizations",
- method: "GET",
- parameters: {
- body: {},
- path: {
- simulationId
- },
- query: {}
- }
- })
+ return getById("/simulations/{simulationId}/authorizations", {simulationId});
+}
+
+export function getPathsOfSimulation(simulationId) {
+ return getById("/simulations/{simulationId}/paths", {simulationId});
}
diff --git a/src/api/routes/specifications.js b/src/api/routes/specifications.js
new file mode 100644
index 00000000..676d9441
--- /dev/null
+++ b/src/api/routes/specifications.js
@@ -0,0 +1,57 @@
+import {getAll, getById} from "./util";
+
+export function getAllCoolingItems() {
+ return getAll("/specifications/cooling-items");
+}
+
+export function getCoolingItem(id) {
+ return getById("/specifications/cooling-items/{id}", {id});
+}
+
+export function getAllCPUs() {
+ return getAll("/specifications/cpus");
+}
+
+export function getCPU(id) {
+ return getById("/specifications/cpus/{id}", {id});
+}
+
+export function getAllFailureModels() {
+ return getAll("/specifications/failure-models");
+}
+
+export function getFailureModel(id) {
+ return getById("/specifications/failure-models/{id}", {id});
+}
+
+export function getAllGPUs() {
+ return getAll("/specifications/gpus");
+}
+
+export function getGPU(id) {
+ return getById("/specifications/gpus/{id}", {id});
+}
+
+export function getAllMemories() {
+ return getAll("/specifications/memories");
+}
+
+export function getMemory(id) {
+ return getById("/specifications/memories/{id}", {id});
+}
+
+export function getAllPSUs() {
+ return getAll("/specifications/psus");
+}
+
+export function getPSU(id) {
+ return getById("/specifications/psus/{id}", {id});
+}
+
+export function getAllStorages() {
+ return getAll("/specifications/storages");
+}
+
+export function getStorage(id) {
+ return getById("/specifications/storages/{id}", {id});
+}
diff --git a/src/api/routes/tiles.js b/src/api/routes/tiles.js
new file mode 100644
index 00000000..927a074b
--- /dev/null
+++ b/src/api/routes/tiles.js
@@ -0,0 +1,146 @@
+import {sendRequest} from "../index";
+import {deleteById, getById} from "./util";
+
+export function getTile(tileId) {
+ return getById("/tiles/{tileId}", {tileId});
+}
+
+export function deleteTile(tileId) {
+ return deleteById("/tiles/{tileId}", {tileId});
+}
+
+export function getRackByTile(tileId) {
+ return getTileObject(tileId, "/rack");
+}
+
+export function addRackToTile(tileId, rack) {
+ return addTileObject(tileId, {rack}, "/rack");
+}
+
+export function updateRackOnTile(tileId, rack) {
+ return updateTileObject(tileId, {rack}, "/rack");
+}
+
+export function deleteRackFromTile(tileId) {
+ return deleteTileObject(tileId, "/rack");
+}
+
+export function getMachinesOfRackByTile(tileId) {
+ return getById("/tiles/{tileId}/rack/machines", {tileId});
+}
+
+export function addMachineToRackOnTile(tileId, machine) {
+ return sendRequest({
+ path: "/tiles/{tileId}/rack/machines",
+ method: "GET",
+ parameters: {
+ body: {
+ machine
+ },
+ path: {
+ tileId
+ },
+ query: {}
+ }
+ });
+}
+
+export function updateMachineInRackOnTile(tileId, position, machine) {
+ return sendRequest({
+ path: "/tiles/{tileId}/rack/machines/{position}",
+ method: "PUT",
+ parameters: {
+ body: {
+ machine
+ },
+ path: {
+ tileId,
+ position
+ },
+ query: {}
+ }
+ });
+}
+
+export function deleteMachineInRackOnTile(tileId, position) {
+ return sendRequest({
+ path: "/tiles/{tileId}/rack/machines/{position}",
+ method: "DELETE",
+ parameters: {
+ body: {},
+ path: {
+ tileId,
+ position
+ },
+ query: {}
+ }
+ });
+}
+
+export function getCoolingItemByTile(tileId) {
+ return getTileObject(tileId, "/cooling-item");
+}
+
+export function addCoolingItemToTile(tileId, coolingItemId) {
+ return addTileObject(tileId, {coolingItemId}, "/cooling-item");
+}
+
+export function updateCoolingItemOnTile(tileId, coolingItemId) {
+ return updateTileObject(tileId, {coolingItemId}, "/cooling-item");
+}
+
+export function deleteCoolingItemFromTile(tileId) {
+ return deleteTileObject(tileId, "/cooling-item");
+}
+
+export function getPSUByTile(tileId) {
+ return getTileObject(tileId, "/psu");
+}
+
+export function addPSUToTile(tileId, psuId) {
+ return addTileObject(tileId, {psuId}, "/psu");
+}
+
+export function updatePSUOnTile(tileId, psuId) {
+ return updateTileObject(tileId, {psuId}, "/psu");
+}
+
+export function deletePSUFromTile(tileId) {
+ return deleteTileObject(tileId, "/psu");
+}
+
+function getTileObject(tileId, endpoint) {
+ return getById("/tiles/{tileId}" + endpoint, {tileId});
+}
+
+function addTileObject(tileId, objectBody, endpoint) {
+ return sendRequest({
+ path: "/tiles/{tileId}" + endpoint,
+ method: "POST",
+ parameters: {
+ body: objectBody,
+ path: {
+ tileId
+ },
+ query: {}
+ }
+ });
+}
+
+function updateTileObject(tileId, objectBody, endpoint) {
+ return sendRequest({
+ path: "/tiles/{tileId}" + endpoint,
+ method: "PUT",
+ parameters: {
+ body: objectBody,
+ path: {
+ tileId
+ },
+ query: {}
+ }
+ });
+}
+
+function deleteTileObject(tileId, endpoint) {
+ return deleteById("/tiles/{tileId}" + endpoint, {tileId});
+}
diff --git a/src/api/routes/auth.js b/src/api/routes/token-signin.js
index 76a39572..76a39572 100644
--- a/src/api/routes/auth.js
+++ b/src/api/routes/token-signin.js
diff --git a/src/api/routes/users.js b/src/api/routes/users.js
index c91e07b2..7b931d66 100644
--- a/src/api/routes/users.js
+++ b/src/api/routes/users.js
@@ -1,4 +1,5 @@
import {sendRequest} from "../index";
+import {deleteById, getById} from "./util";
export function getUserByEmail(email) {
return sendRequest({
@@ -62,29 +63,9 @@ export function updateUser(userId, user) {
}
export function deleteUser(userId) {
- return sendRequest({
- path: "/users/{userId}",
- method: "DELETE",
- parameters: {
- body: {},
- path: {
- userId
- },
- query: {}
- }
- });
+ return deleteById("/users/{userId}", {userId});
}
export function getAuthorizationsByUser(userId) {
- return sendRequest({
- path: "/users/{userId}/authorizations",
- method: "GET",
- parameters: {
- body: {},
- path: {
- userId
- },
- query: {}
- }
- });
+ return getById("/users/{userId}/authorizations", {userId});
}
diff --git a/src/api/routes/util.js b/src/api/routes/util.js
new file mode 100644
index 00000000..ff21d4f4
--- /dev/null
+++ b/src/api/routes/util.js
@@ -0,0 +1,37 @@
+import {sendRequest} from "../index";
+
+export function getAll(path) {
+ return sendRequest({
+ path,
+ method: "GET",
+ parameters: {
+ body: {},
+ path: {},
+ query: {}
+ }
+ });
+}
+
+export function getById(path, pathObject) {
+ return sendRequest({
+ path,
+ method: "GET",
+ parameters: {
+ body: {},
+ path: pathObject,
+ query: {}
+ }
+ });
+}
+
+export function deleteById(path, pathObject) {
+ return sendRequest({
+ path,
+ method: "DELETE",
+ parameters: {
+ body: {},
+ path: pathObject,
+ query: {}
+ }
+ });
+}
diff --git a/src/api/sagas/objects.js b/src/api/sagas/objects.js
index fd7830b3..98c766ec 100644
--- a/src/api/sagas/objects.js
+++ b/src/api/sagas/objects.js
@@ -1,5 +1,5 @@
import {call, put, select} from "redux-saga/effects";
-import {addToSimulationStore, addToUserStore} from "../../actions/objects";
+import {addToStore} from "../../actions/objects";
import {getSimulation} from "../routes/simulations";
import {getUser} from "../routes/users";
@@ -9,16 +9,16 @@ const selectors = {
authorization: state => state.objects.authorization,
};
-function* fetchAndStoreObject(objectType, id, apiCall, addToStore) {
+function* fetchAndStoreObject(objectType, id, apiCall) {
const objectStore = yield select(selectors[objectType]);
if (!objectStore[id]) {
const object = yield apiCall;
- yield put(addToStore(object));
+ yield put(addToStore(objectType, object));
}
}
export const fetchAndStoreSimulation = (id) =>
- fetchAndStoreObject("simulation", id, call(getSimulation, id), addToSimulationStore);
+ fetchAndStoreObject("simulation", id, call(getSimulation, id));
export const fetchAndStoreUser = (id) =>
- fetchAndStoreObject("user", id, call(getUser, id), addToUserStore);
+ fetchAndStoreObject("user", id, call(getUser, id),);
diff --git a/src/api/sagas/simulations.js b/src/api/sagas/simulations.js
index 9c3bd24c..6b7471c0 100644
--- a/src/api/sagas/simulations.js
+++ b/src/api/sagas/simulations.js
@@ -1,19 +1,19 @@
import {call, put} from "redux-saga/effects";
-import {addToAuthorizationStore, addToSimulationStore} from "../../actions/objects";
+import {addToStore} from "../../actions/objects";
import {addSimulationSucceeded, deleteSimulationSucceeded} from "../../actions/simulations";
import {addSimulation, deleteSimulation} from "../routes/simulations";
export function* onSimulationAdd(action) {
try {
const simulation = yield call(addSimulation, {name: action.name});
- yield put(addToSimulationStore(simulation));
+ yield put(addToStore("simulation", simulation));
const authorization = {
simulationId: simulation.id,
userId: action.userId,
authorizationLevel: "OWN"
};
- yield put(addToAuthorizationStore(authorization));
+ yield put(addToStore("authorization", authorization));
yield put(addSimulationSucceeded([authorization.userId, authorization.simulationId]));
} catch (error) {
console.log(error);
diff --git a/src/api/sagas/users.js b/src/api/sagas/users.js
index c1daab30..d3bc3f5f 100644
--- a/src/api/sagas/users.js
+++ b/src/api/sagas/users.js
@@ -3,7 +3,7 @@ import {logInSucceeded} from "../../actions/auth";
import {addToAuthorizationStore} from "../../actions/objects";
import {fetchAuthorizationsOfCurrentUserSucceeded} from "../../actions/users";
import {saveAuthLocalStorage} from "../../auth/index";
-import {performTokenSignIn} from "../routes/auth";
+import {performTokenSignIn} from "../routes/token-signin";
import {addUser, getAuthorizationsByUser} from "../routes/users";
import {fetchAndStoreSimulation, fetchAndStoreUser} from "./objects";
diff --git a/src/components/map/MapStage.js b/src/components/map/MapStage.js
index 38047064..0950d5bd 100644
--- a/src/components/map/MapStage.js
+++ b/src/components/map/MapStage.js
@@ -2,8 +2,8 @@ import React from "react";
import {Group, Layer, Stage} from "react-konva";
import jQuery from "../../util/jquery";
import Backdrop from "./elements/Backdrop";
+import DatacenterGroup from "./groups/DatacenterGroup";
import GridGroup from "./groups/GridGroup";
-import RoomGroup from "./groups/RoomGroup";
import {MAP_SIZE_IN_PIXELS} from "./MapConstants";
class MapStage extends React.Component {
@@ -43,7 +43,7 @@ class MapStage extends React.Component {
<Layer>
<Group draggable={true} dragBoundFunc={this.dragBoundHandler.bind(this)}>
<Backdrop/>
- <RoomGroup/>
+ <DatacenterGroup/>
<GridGroup/>
</Group>
</Layer>
diff --git a/src/components/map/groups/DatacenterGroup.js b/src/components/map/groups/DatacenterGroup.js
new file mode 100644
index 00000000..3b7a086b
--- /dev/null
+++ b/src/components/map/groups/DatacenterGroup.js
@@ -0,0 +1,17 @@
+import React from "react";
+import {Group} from "react-konva";
+import RoomGroup from "./RoomGroup";
+
+const DatacenterGroup = ({datacenter}) => (
+ <Group>
+ {datacenter.rooms.map(room => (
+ <RoomGroup room={room}/>
+ ))}
+ </Group>
+);
+
+DatacenterGroup.propTypes = {
+ datacenter: Shapes.Datacenter,
+};
+
+export default DatacenterGroup;
diff --git a/src/components/map/groups/RoomGroup.js b/src/components/map/groups/RoomGroup.js
index 1a8b18d5..90a58767 100644
--- a/src/components/map/groups/RoomGroup.js
+++ b/src/components/map/groups/RoomGroup.js
@@ -1,16 +1,17 @@
import React from "react";
-import {Group, Rect} from "react-konva";
+import {Group} from "react-konva";
+import TileGroup from "./TileGroup";
-const RoomGroup = () => (
+const RoomGroup = ({room}) => (
<Group>
- <Rect
- x={10}
- y={10}
- width={50}
- height={50}
- fill="green"
- />
+ {room.tiles.map(tile => (
+ <TileGroup tile={tile}/>
+ ))}
</Group>
);
+RoomGroup.propTypes = {
+ room: Shapes.Room,
+};
+
export default RoomGroup;
diff --git a/src/reducers/objects.js b/src/reducers/objects.js
index 6381c8d9..60cd2711 100644
--- a/src/reducers/objects.js
+++ b/src/reducers/objects.js
@@ -1,44 +1,40 @@
import {combineReducers} from "redux";
-import {ADD_TO_AUTHORIZATION_STORE, ADD_TO_SIMULATION_STORE, ADD_TO_USER_STORE} from "../actions/objects";
+import {ADD_TO_STORE} from "../actions/objects";
export const objects = combineReducers({
- simulation,
- authorization,
- user,
+ simulation: object("simulation"),
+ user: object("user"),
+ authorization: objectWithId("authorization", object => [object.userId, object.simulationId]),
+ failureModel: object("failureModel"),
+ cpu: object("cpu"),
+ gpu: object("gpu"),
+ memory: object("memory"),
+ storage: object("storage"),
+ machine: object("machine"),
+ rack: object("rack"),
+ coolingItem: object("coolingItem"),
+ psu: object("psu"),
+ tile: object("tile"),
+ room: object("room"),
+ datacenter: object("datacenter"),
+ section: object("section"),
+ path: object("path"),
});
-function simulation(state = {}, action) {
- switch (action.type) {
- case ADD_TO_SIMULATION_STORE:
- return Object.assign(
- state,
- {[action.simulation.id]: action.simulation}
- );
- default:
- return state;
- }
-}
-
-function authorization(state = {}, action) {
- switch (action.type) {
- case ADD_TO_AUTHORIZATION_STORE:
- return Object.assign(
- state,
- {[[action.authorization.userId, action.authorization.simulationId]]: action.authorization}
- );
- default:
- return state;
- }
+function object(type) {
+ return objectWithId(type, object => object.id);
}
-function user(state = {}, action) {
- switch (action.type) {
- case ADD_TO_USER_STORE:
- return Object.assign(
- state,
- {[action.user.id]: action.user}
- );
- default:
+function objectWithId(type, getId) {
+ return (state = {}, action) => {
+ if (action.type === ADD_TO_STORE) {
+ if (action.objectType === type) {
+ return Object.assign(
+ state,
+ {[getId(action.object)]: action.object}
+ );
+ }
return state;
- }
+ }
+ };
}