|
|
|
"use strict";
|
|
|
|
|
|
|
|
const Promise = require("bluebird");
|
|
|
|
const graphql = require("graphql");
|
|
|
|
const fs = require("fs");
|
|
|
|
const path = require("path");
|
|
|
|
|
|
|
|
const createGraphQLInterface = require("../graphql/index");
|
|
|
|
const All = require("../graphql/symbols/all");
|
|
|
|
const loadTypes = require("../graphql/type-loader");
|
|
|
|
|
|
|
|
const createLoaders = require("./loaders");
|
|
|
|
|
|
|
|
/* FIXME: This seems to be added into a global registry somehow? How to specify this explicitly on a query without relying on globals? */
|
|
|
|
new graphql.GraphQLScalarType({
|
|
|
|
name: "ByteSize",
|
|
|
|
description: "A value that represents a value on a byte scale",
|
|
|
|
serialize: (value) => {
|
|
|
|
return JSON.stringify(value);
|
|
|
|
},
|
|
|
|
parseValue: (value) => {
|
|
|
|
return JSON.parse(value);
|
|
|
|
},
|
|
|
|
parseLiteral: (value) => {
|
|
|
|
return JSON.parse(value);
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
new graphql.GraphQLScalarType({
|
|
|
|
name: "TimeSize",
|
|
|
|
description: "A value that represents a value on a time scale",
|
|
|
|
serialize: (value) => {
|
|
|
|
return JSON.stringify(value);
|
|
|
|
},
|
|
|
|
parseValue: (value) => {
|
|
|
|
return JSON.parse(value);
|
|
|
|
},
|
|
|
|
parseLiteral: (value) => {
|
|
|
|
return JSON.parse(value);
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
let schema = graphql.buildSchema(fs.readFileSync(path.resolve(__dirname, "../schemas/main.gql"), "utf8"));
|
|
|
|
|
|
|
|
let types = loadTypes({
|
|
|
|
Drive: require("./types/drive"),
|
|
|
|
BlockDevice: require("./types/block-device"),
|
|
|
|
LVMPhysicalVolume: require("./types/lvm-physical-volume"),
|
|
|
|
LVMVolumeGroup: require("./types/lvm-volume-group"),
|
|
|
|
});
|
|
|
|
|
|
|
|
module.exports = function () {
|
|
|
|
return createGraphQLInterface(schema, { loaderFactory: createLoaders }, {
|
|
|
|
hardware: {
|
|
|
|
drives: function ({ paths }, { data }) {
|
|
|
|
return Promise.try(() => {
|
|
|
|
if (paths != null) {
|
|
|
|
return data.smartctlScan.loadMany(paths);
|
|
|
|
} else {
|
|
|
|
return data.smartctlScan.load(All);
|
|
|
|
}
|
|
|
|
}).then((devices) => {
|
|
|
|
return devices.map((device) => {
|
|
|
|
return types.Drive({ path: device.path });
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
},
|
|
|
|
resources: {
|
|
|
|
blockDevices: function ({ names }, { data }) {
|
|
|
|
return Promise.try(() => {
|
|
|
|
if (names != null) {
|
|
|
|
return data.lsblk.loadMany(names);
|
|
|
|
} else {
|
|
|
|
return data.lsblk.load(All);
|
|
|
|
}
|
|
|
|
}).then((devices) => {
|
|
|
|
return devices.map((device) => {
|
|
|
|
return types.BlockDevice({ name: device.name });
|
|
|
|
});
|
|
|
|
});
|
|
|
|
},
|
|
|
|
lvm: {
|
|
|
|
physicalVolumes: function ({ paths }, { data }) {
|
|
|
|
return Promise.try(() => {
|
|
|
|
if (paths != null) {
|
|
|
|
return data.lvmPhysicalVolumes.loadMany(paths);
|
|
|
|
} else {
|
|
|
|
return data.lvmPhysicalVolumes.load(All);
|
|
|
|
}
|
|
|
|
}).then((volumes) => {
|
|
|
|
return volumes.map((volume) => {
|
|
|
|
return types.LVMPhysicalVolume({ path: volume.path });
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
};
|