8295bd6882
this shall be a progressive process
321 lines
7.5 KiB
JavaScript
321 lines
7.5 KiB
JavaScript
const MachineType = require('../types/machine');
|
|
const DynamicObjectType = require('../types/dynamic-object');
|
|
const api = require('../../api');
|
|
|
|
const {
|
|
GraphQLNonNull,
|
|
GraphQLString,
|
|
GraphQLBoolean,
|
|
GraphQLID,
|
|
GraphQLList
|
|
} = require('graphql');
|
|
|
|
module.exports.createMachine = {
|
|
type: MachineType,
|
|
description: 'Allows you to provision an instance',
|
|
args: {
|
|
name: {
|
|
type: GraphQLString,
|
|
description: 'Friendly name for this instance; default is the first 8 characters of the machine id'
|
|
},
|
|
package: {
|
|
type: new GraphQLNonNull(GraphQLString),
|
|
description: 'Id of the package to use on provisioning, obtained from ListPackages'
|
|
},
|
|
image: {
|
|
type: new GraphQLNonNull(GraphQLString),
|
|
description: 'The image UUID (from images { id })'
|
|
},
|
|
networks: {
|
|
type: new GraphQLList(GraphQLString),
|
|
description: 'Desired networks ids (from networks { id })'
|
|
},
|
|
locality: {
|
|
type: MachineType.locality,
|
|
description: 'Optionally specify which instances the new instance should be near or far from'
|
|
},
|
|
metadata: {
|
|
type: DynamicObjectType,
|
|
description: 'An arbitrary set of metadata key/value pairs can be set at provision time'
|
|
},
|
|
tags: {
|
|
type: DynamicObjectType,
|
|
description: 'An arbitrary set of tags can be set at provision time'
|
|
},
|
|
firewallEnabled: {
|
|
type: GraphQLBoolean,
|
|
description: 'Completely enable or disable firewall for this instance. Default is false'
|
|
}
|
|
},
|
|
resolve: (root, args) => {
|
|
const resolveNames = (obj = {}, namespace) => {
|
|
return Object.keys(obj).reduce((all, name) => {
|
|
return Object.assign(all, {
|
|
[`${namespace}.${name}`]: obj[name]
|
|
});
|
|
}, {});
|
|
};
|
|
|
|
const tags = resolveNames(args.tags, 'tag');
|
|
const metadata = resolveNames(args.tags, 'metadata');
|
|
|
|
const machine = Object.assign(
|
|
{
|
|
name: args.name,
|
|
package: args.package,
|
|
image: args.image,
|
|
networks: args.networks,
|
|
locality: args.locality,
|
|
firewallEnabled: args.firewallEnabled
|
|
},
|
|
tags,
|
|
metadata
|
|
);
|
|
|
|
return api.machines.create(machine);
|
|
}
|
|
};
|
|
|
|
module.exports.startMachine = {
|
|
type: MachineType,
|
|
description: 'Allows you to boot up an instance',
|
|
args: {
|
|
id: {
|
|
type: new GraphQLNonNull(GraphQLID),
|
|
description: 'The machine id'
|
|
}
|
|
},
|
|
resolve: (root, args) => {
|
|
return api.machines.start(args.id).then(machine => {
|
|
if (machine) {
|
|
return machine;
|
|
}
|
|
|
|
return api.machines.get(args);
|
|
});
|
|
}
|
|
};
|
|
|
|
module.exports.startMachineFromSnapshot = {
|
|
type: MachineType,
|
|
description: 'If an instance is in the "stopped" state, you can choose to start the instance from the referenced snapshot',
|
|
args: {
|
|
id: {
|
|
type: new GraphQLNonNull(GraphQLID),
|
|
description: 'The machine id'
|
|
},
|
|
name: {
|
|
type: new GraphQLNonNull(GraphQLID),
|
|
description: 'The snapshot id'
|
|
}
|
|
},
|
|
resolve: (root, args) => {
|
|
return api.machines.startFromSnapshot(args).then(machine => {
|
|
if (machine) {
|
|
return machine;
|
|
}
|
|
|
|
return api.machines.get(args);
|
|
});
|
|
}
|
|
};
|
|
|
|
module.exports.stopMachine = {
|
|
type: MachineType,
|
|
description: 'Allows you to shut down an instance',
|
|
args: {
|
|
id: {
|
|
type: new GraphQLNonNull(GraphQLID),
|
|
description: 'The machine id'
|
|
}
|
|
},
|
|
resolve: (root, args) => {
|
|
return api.machines.stop(args.id).then(machine => {
|
|
if (machine) {
|
|
return machine;
|
|
}
|
|
|
|
return api.machines.get(args);
|
|
});
|
|
}
|
|
};
|
|
|
|
module.exports.rebootMachine = {
|
|
type: MachineType,
|
|
description: 'Allows you to reboot an instance',
|
|
args: {
|
|
id: {
|
|
type: new GraphQLNonNull(GraphQLID),
|
|
description: 'The machine id'
|
|
}
|
|
},
|
|
resolve: (root, args) => {
|
|
return api.machines.reboot(args.id).then(machine => {
|
|
if (machine) {
|
|
return machine;
|
|
}
|
|
|
|
return api.machines.get(args);
|
|
});
|
|
}
|
|
};
|
|
|
|
module.exports.deleteMachine = {
|
|
type: DynamicObjectType,
|
|
description: 'Allows you to completely destroy an instance',
|
|
args: {
|
|
id: {
|
|
type: new GraphQLNonNull(GraphQLID),
|
|
description: 'The machine id'
|
|
}
|
|
},
|
|
resolve: (root, args) => {
|
|
return api.machines.destroy(args.id);
|
|
}
|
|
};
|
|
|
|
module.exports.auditMachine = {
|
|
type: new GraphQLList(DynamicObjectType),
|
|
description: "Provides a list of an instance's accomplished actions. Results are sorted from newest to oldest action",
|
|
args: {
|
|
id: {
|
|
type: new GraphQLNonNull(GraphQLID),
|
|
description: 'The machine id'
|
|
}
|
|
},
|
|
resolve: (root, args) => {
|
|
return api.machines.destroy(args.id);
|
|
}
|
|
};
|
|
|
|
module.exports.setMachineFirewall = {
|
|
type: MachineType,
|
|
description: 'Allows you to set the firewall state for an instance',
|
|
args: {
|
|
id: {
|
|
type: new GraphQLNonNull(GraphQLID),
|
|
description: 'The machine id'
|
|
},
|
|
enabled: {
|
|
type: new GraphQLNonNull(GraphQLBoolean)
|
|
}
|
|
},
|
|
resolve: (root, args) => {
|
|
const { firewall } = api.machines;
|
|
|
|
const fn = args.enabled ? firewall.enable : firewall.disable;
|
|
|
|
return fn(args.id).then(machine => {
|
|
if (machine) {
|
|
return machine;
|
|
}
|
|
|
|
return api.machines.get(args);
|
|
});
|
|
}
|
|
};
|
|
|
|
module.exports.enableMachineFirewall = {
|
|
type: MachineType,
|
|
description: 'Allows you to enable the firewall for an instance',
|
|
args: {
|
|
id: {
|
|
type: new GraphQLNonNull(GraphQLID),
|
|
description: 'The machine id'
|
|
}
|
|
},
|
|
resolve: (root, args) => {
|
|
const { firewall } = api.machines;
|
|
|
|
return firewall.enable(args.id).then(machine => {
|
|
if (machine) {
|
|
return machine;
|
|
}
|
|
|
|
return api.machines.get(args);
|
|
});
|
|
}
|
|
};
|
|
|
|
module.exports.disableMachineFirewall = {
|
|
type: MachineType,
|
|
description: 'Allows you to completely disable the firewall of an instance',
|
|
args: {
|
|
id: {
|
|
type: new GraphQLNonNull(GraphQLID),
|
|
description: 'The machine id'
|
|
}
|
|
},
|
|
resolve: (root, args) => {
|
|
const { firewall } = api.machines;
|
|
|
|
return firewall.disable(args.id).then(machine => {
|
|
if (machine) {
|
|
return machine;
|
|
}
|
|
|
|
return api.machines.get(args);
|
|
});
|
|
}
|
|
};
|
|
|
|
module.exports.addMachineTags = {
|
|
type: DynamicObjectType,
|
|
description: 'Set tags on the given instance',
|
|
args: {
|
|
id: {
|
|
type: new GraphQLNonNull(GraphQLID),
|
|
description: 'The machine id'
|
|
},
|
|
tags: {
|
|
type: new GraphQLNonNull(DynamicObjectType),
|
|
description: 'Tag name/value pairs'
|
|
}
|
|
},
|
|
resolve: (root, args) => {
|
|
const { tags } = api.machines;
|
|
|
|
return tags.add(args);
|
|
}
|
|
};
|
|
|
|
module.exports.replaceMachineTags = {
|
|
type: DynamicObjectType,
|
|
description: 'Fully replace all tags on an instance with the given tags',
|
|
args: {
|
|
id: {
|
|
type: new GraphQLNonNull(GraphQLID),
|
|
description: 'The machine id'
|
|
},
|
|
tags: {
|
|
type: new GraphQLNonNull(DynamicObjectType),
|
|
description: 'Tag name/value pairs'
|
|
}
|
|
},
|
|
resolve: (root, args) => {
|
|
const { tags } = api.machines;
|
|
|
|
return tags.replace(args);
|
|
}
|
|
};
|
|
|
|
module.exports.deleteMachineTags = {
|
|
type: DynamicObjectType,
|
|
description: 'Deletes tags from an instance',
|
|
args: {
|
|
id: {
|
|
type: new GraphQLNonNull(GraphQLID),
|
|
description: 'The machine id'
|
|
},
|
|
tag: {
|
|
type: GraphQLString,
|
|
description: 'Tag name to remove. If value is not supplied, all machine tags are removed'
|
|
}
|
|
},
|
|
resolve: (root, args) => {
|
|
const { tags } = api.machines;
|
|
|
|
return tags.destroy(args);
|
|
}
|
|
};
|