You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

72 lines
2.0 KiB
JavaScript

"use strict";
const Promise = require("bluebird");
const memoizee = require("memoizee");
const DataLoader = require("dataloader");
const mapObj = require("map-obj");
const lvm = require("../../packages/exec-lvm");
const All = require("../../packages/graphql-interface/symbols/all");
// This generates a (memoized) source function for commands that always produce an entire list, that needs to be filtered for the desired item(s)
function makeListCommand({ command, selectResult, selectID }) {
let commandOnce = memoizee(command);
return function (ids) {
return Promise.try(() => {
return commandOnce();
}).then((result) => {
if (selectResult != null) {
return selectResult(result);
} else {
return result;
}
}).then((items) => {
return ids.map((id) => {
if (id === All) {
return items;
} else {
return items.find((item) => selectID(item, id));
}
});
});
};
}
module.exports = function createSources() {
let sources = {
lvmLogicalVolumes: makeListCommand({
command: lvm.getLogicalVolumes,
selectResult: (result) => result.volumes,
selectID: (volume, path) => (volume.path === path)
}),
lvmPhysicalVolumes: makeListCommand({
command: lvm.getPhysicalVolumes,
selectResult: (result) => result.volumes,
selectID: (device, path) => (device.path === path)
}),
lvmVolumeGroups: makeListCommand({
command: lvm.getVolumeGroups,
selectResult: (result) => result.groups,
selectID: (group, name) => (group.name === name)
}),
};
let factoryModules = {
lsblk: require("./lsblk")(),
findmnt: require("./findmnt")(),
smartctlInfo: require("./smartctl/info")(),
smartctlScan: require("./smartctl/scan")(),
smartctlAttributes: require("./smartctl/attributes")(),
nvmeListNamespaces: require("./nvme/list-namespaces")(),
nvmeIdentifyController: require("./nvme/identify-controller")(),
};
return mapObj({ ... sources, ... factoryModules }, (name, factory) => {
return [
name,
new DataLoader(factory)
];
});
};