mirror of
https://github.com/yldio/copilot.git
synced 2024-11-28 14:10:04 +02:00
Initial commit
This commit is contained in:
commit
dd718e1135
13
triton-graphql/.eslintrc
Normal file
13
triton-graphql/.eslintrc
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"extends": "semistandard",
|
||||||
|
"rules": {
|
||||||
|
"no-unused-vars": "error",
|
||||||
|
"space-before-function-paren": [2, "never"],
|
||||||
|
"object-curly-newline": ["error", {
|
||||||
|
"minProperties": 1
|
||||||
|
}],
|
||||||
|
"sort-vars": ["error", {
|
||||||
|
"ignoreCase": true
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
}
|
50
triton-graphql/.gitignore
vendored
Normal file
50
triton-graphql/.gitignore
vendored
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
|
||||||
|
# Runtime data
|
||||||
|
pids
|
||||||
|
*.pid
|
||||||
|
*.seed
|
||||||
|
*.pid.lock
|
||||||
|
|
||||||
|
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||||
|
lib-cov
|
||||||
|
|
||||||
|
# Coverage directory used by tools like istanbul
|
||||||
|
coverage
|
||||||
|
|
||||||
|
# nyc test coverage
|
||||||
|
.nyc_output
|
||||||
|
|
||||||
|
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
|
||||||
|
.grunt
|
||||||
|
|
||||||
|
# node-waf configuration
|
||||||
|
.lock-wscript
|
||||||
|
|
||||||
|
# Compiled binary addons (http://nodejs.org/api/addons.html)
|
||||||
|
build/Release
|
||||||
|
|
||||||
|
# Dependency directories
|
||||||
|
node_modules
|
||||||
|
jspm_packages
|
||||||
|
|
||||||
|
# Optional npm cache directory
|
||||||
|
.npm
|
||||||
|
|
||||||
|
# Optional eslint cache
|
||||||
|
.eslintcache
|
||||||
|
|
||||||
|
# Optional REPL history
|
||||||
|
.node_repl_history
|
||||||
|
|
||||||
|
# Output of 'npm pack'
|
||||||
|
*.tgz
|
||||||
|
|
||||||
|
# Vim files:
|
||||||
|
*.sw*
|
||||||
|
|
||||||
|
# Mac OS dirty files
|
||||||
|
.DS_Store
|
144
triton-graphql/README.md
Normal file
144
triton-graphql/README.md
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
# triton-graphql
|
||||||
|
|
||||||
|
Proof-of-Concept of the Triton API running on GraphQL.
|
||||||
|
|
||||||
|
### install dependencies
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ npm install
|
||||||
|
```
|
||||||
|
|
||||||
|
### setup credentials
|
||||||
|
|
||||||
|
Edit `credentials.json`
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"url": "https://us-sw-1.api.joyentcloud.com",
|
||||||
|
"keyId": "", //public key fingerprint ex: 35:jh:42:56...
|
||||||
|
"account": "", // account ex: raoulmillais
|
||||||
|
"user": "" // sub-account ex: ramitos
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## api
|
||||||
|
|
||||||
|
- [x] Account
|
||||||
|
- [x] GetAccount
|
||||||
|
- [x] UpdateAccount
|
||||||
|
- [x] Keys
|
||||||
|
- [x] ListKeys
|
||||||
|
- [x] GetKey
|
||||||
|
- [x] CreateKey
|
||||||
|
- [x] DeleteKey
|
||||||
|
- [x] Users
|
||||||
|
- [x] ListUsers
|
||||||
|
- [x] GetUser
|
||||||
|
- [x] CreateUser
|
||||||
|
- [x] UpdateUser
|
||||||
|
- [-] ChangeUserPassword
|
||||||
|
- [x] DeleteUser
|
||||||
|
- [x] Roles
|
||||||
|
- [x] ListRoles
|
||||||
|
- [x] GetRole
|
||||||
|
- [x] CreateRole
|
||||||
|
- [x] UpdateRole
|
||||||
|
- [x] DeleteRole
|
||||||
|
- [x] Role Tags
|
||||||
|
- [x] SetRoleTags
|
||||||
|
- [x] Policies
|
||||||
|
- [x] ListPolicies
|
||||||
|
- [x] GetPolicy
|
||||||
|
- [x] CreatePolicy
|
||||||
|
- [x] UpdatePolicy
|
||||||
|
- [x] DeletePolicy
|
||||||
|
- [x] User SSH Keys
|
||||||
|
- [x] ListUserKeys
|
||||||
|
- [x] GetUserKey
|
||||||
|
- [x] CreateUserKey
|
||||||
|
- [x] DeleteUserKey
|
||||||
|
- [-] Config
|
||||||
|
- [-] GetConfig
|
||||||
|
- [-] UpdateConfig
|
||||||
|
- [x] Datacenters
|
||||||
|
- [x] ListDatacenters
|
||||||
|
- [x] GetDatacenter
|
||||||
|
- [x] Services
|
||||||
|
- [x] ListServices
|
||||||
|
- [x] Images
|
||||||
|
- [x] ListImages
|
||||||
|
- [x] GetImage
|
||||||
|
- [x] DeleteImage
|
||||||
|
- [x] ExportImage
|
||||||
|
- [x] CreateImageFromMachine
|
||||||
|
- [-] UpdateImage
|
||||||
|
- [x] Packages
|
||||||
|
- [x] ListPackages
|
||||||
|
- [x] GetPackage
|
||||||
|
- [x] Instances
|
||||||
|
- [x] ListMachines
|
||||||
|
- [x] GetMachine
|
||||||
|
- [x] CreateMachine
|
||||||
|
- [x] StopMachine
|
||||||
|
- [x] StartMachine
|
||||||
|
- [x] RebootMachine
|
||||||
|
- [-] ResizeMachine
|
||||||
|
- [-] RenameMachine
|
||||||
|
- [x] EnableMachineFirewall
|
||||||
|
- [x] DisableMachineFirewall
|
||||||
|
- [x] CreateMachineSnapshot
|
||||||
|
- [x] StartMachineFromSnapshot
|
||||||
|
- [x] ListMachineSnapshots
|
||||||
|
- [x] GetMachineSnapshot
|
||||||
|
- [x] DeleteMachineSnapshot
|
||||||
|
- [-] UpdateMachineMetadata
|
||||||
|
- [-] ListMachineMetadata
|
||||||
|
- [-] GetMachineMetadata
|
||||||
|
- [-] DeleteMachineMetadata
|
||||||
|
- [-] DeleteAllMachineMetadata
|
||||||
|
- [x] AddMachineTags
|
||||||
|
- [x] ReplaceMachineTags
|
||||||
|
- [ ] ListMachineTags
|
||||||
|
- [x] GetMachineTag
|
||||||
|
- [x] DeleteMachineTag
|
||||||
|
- [x] DeleteMachineTags
|
||||||
|
- [x] DeleteMachine
|
||||||
|
- [x] MachineAudit
|
||||||
|
- [-] Analytics
|
||||||
|
- [-] DescribeAnalytics
|
||||||
|
- [-] ListInstrumentations
|
||||||
|
- [-] GetInstrumentation
|
||||||
|
- [-] GetInstrumentationValue
|
||||||
|
- [-] GetInstrumentationHeatmap
|
||||||
|
- [-] GetInstrumentationHeatmapDetails
|
||||||
|
- [-] CreateInstrumentation
|
||||||
|
- [-] DeleteInstrumentation
|
||||||
|
- [x] FirewallRules
|
||||||
|
- [x] Firewall Rule Syntax
|
||||||
|
- [x] ListFirewallRules
|
||||||
|
- [x] GetFirewallRule
|
||||||
|
- [x] CreateFirewallRule
|
||||||
|
- [x] UpdateFirewallRule
|
||||||
|
- [x] EnableFirewallRule
|
||||||
|
- [x] DisableFirewallRule
|
||||||
|
- [x] DeleteFirewallRule
|
||||||
|
- [x] ListMachineFirewallRules
|
||||||
|
- [x] ListFirewallRuleMachines
|
||||||
|
- [-] Fabrics
|
||||||
|
- [-] ListFabricVLANs
|
||||||
|
- [-] CreateFabricVLAN
|
||||||
|
- [-] GetFabricVLAN
|
||||||
|
- [-] UpdateFabricVLAN
|
||||||
|
- [-] DeleteFabricVLAN
|
||||||
|
- [-] ListFabricNetworks
|
||||||
|
- [-] CreateFabricNetwork
|
||||||
|
- [-] GetFabricNetwork
|
||||||
|
- [-] DeleteFabricNetwork
|
||||||
|
- [x] Networks
|
||||||
|
- [x] ListNetworks
|
||||||
|
- [x] GetNetwork
|
||||||
|
- [-] Nics
|
||||||
|
- [-] ListNics
|
||||||
|
- [-] GetNic
|
||||||
|
- [-] AddNic
|
||||||
|
- [-] RemoveNic
|
25
triton-graphql/package.json
Normal file
25
triton-graphql/package.json
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"name": "triton-graphql",
|
||||||
|
"private": true,
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"main": "src/index.js",
|
||||||
|
"dependencies": {
|
||||||
|
"bunyan": "^1.8.1",
|
||||||
|
"express": "^4.14.0",
|
||||||
|
"express-graphql": "^0.5.4",
|
||||||
|
"got": "^6.5.0",
|
||||||
|
"graphql": "^0.7.1",
|
||||||
|
"moment": "^2.15.1",
|
||||||
|
"smartdc-auth": "^2.5.2",
|
||||||
|
"triton": "^4.14.0",
|
||||||
|
"user-home": "^2.0.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"eslint": "3.7.0",
|
||||||
|
"eslint-config-semistandard": "^7.0.0",
|
||||||
|
"eslint-config-standard": "^6.2.0",
|
||||||
|
"eslint-plugin-promise": "^2.0.1",
|
||||||
|
"eslint-plugin-standard": "^2.0.1"
|
||||||
|
}
|
||||||
|
}
|
9
triton-graphql/src/api/account.js
Normal file
9
triton-graphql/src/api/account.js
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
const request = require('./request');
|
||||||
|
|
||||||
|
module.exports.get = () => {
|
||||||
|
return request('getAccount');
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.update = (ctx) => {
|
||||||
|
return request('updateAccount', ctx);
|
||||||
|
};
|
5
triton-graphql/src/api/config.js
Normal file
5
triton-graphql/src/api/config.js
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
// const request = require('./request');
|
||||||
|
|
||||||
|
module.exports.get = (ctx) => {
|
||||||
|
// return request('', ctx);
|
||||||
|
};
|
5
triton-graphql/src/api/datacenters.js
Normal file
5
triton-graphql/src/api/datacenters.js
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
const request = require('./request');
|
||||||
|
|
||||||
|
module.exports = () => {
|
||||||
|
return request('listDatacenters');
|
||||||
|
};
|
9
triton-graphql/src/api/fabrics.js
Normal file
9
triton-graphql/src/api/fabrics.js
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
const request = require('./request');
|
||||||
|
|
||||||
|
module.exports.list = () => {
|
||||||
|
return request('listFirewallRules', {});
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.get = (ctx) => {
|
||||||
|
return request('getFirewallRule', ctx);
|
||||||
|
};
|
37
triton-graphql/src/api/firewall-rules.js
Normal file
37
triton-graphql/src/api/firewall-rules.js
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
const request = require('./request');
|
||||||
|
|
||||||
|
module.exports.list = () => {
|
||||||
|
return request('listFirewallRules', {});
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.listByMachine = (ctx) => {
|
||||||
|
return request('listMachineFirewallRules', ctx);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.listMachines = (ctx) => {
|
||||||
|
return request('listFirewallRuleMachines', ctx);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.get = (ctx) => {
|
||||||
|
return request('getFirewallRule', ctx);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.create = (ctx) => {
|
||||||
|
return request('createFirewallRule', ctx);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.update = (ctx) => {
|
||||||
|
return request('updateFirewallRule', ctx);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.enable = (ctx) => {
|
||||||
|
return request('enableFirewallRule', ctx);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.disable = (ctx) => {
|
||||||
|
return request('disableFirewallRule', ctx);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.destroy = (ctx) => {
|
||||||
|
return request('deleteFirewallRule', ctx);
|
||||||
|
};
|
25
triton-graphql/src/api/images.js
Normal file
25
triton-graphql/src/api/images.js
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
const request = require('./request');
|
||||||
|
|
||||||
|
module.exports.list = (ctx) => {
|
||||||
|
return request('listImages', ctx);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.get = (ctx) => {
|
||||||
|
return request('getImage', ctx);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.create = (ctx) => {
|
||||||
|
return request('createImageFromMachine', ctx);
|
||||||
|
};
|
||||||
|
|
||||||
|
// module.exports.update = (ctx) => {
|
||||||
|
// return request('UpdateImage', ctx);
|
||||||
|
// };
|
||||||
|
|
||||||
|
module.exports.destroy = (uuid) => {
|
||||||
|
return request('deleteImage', uuid);
|
||||||
|
};
|
||||||
|
|
||||||
|
// module.exports.xport = (uuid) => {
|
||||||
|
// return request('deleteImage', uuid);
|
||||||
|
// };
|
16
triton-graphql/src/api/index.js
Normal file
16
triton-graphql/src/api/index.js
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
module.exports = {
|
||||||
|
account: require('./account'),
|
||||||
|
users: require('./users'),
|
||||||
|
policies: require('./policies'),
|
||||||
|
roles: require('./roles'),
|
||||||
|
keys: require('./keys'),
|
||||||
|
datacenters: require('./datacenters'),
|
||||||
|
services: require('./services'),
|
||||||
|
images: require('./images'),
|
||||||
|
packages: require('./packages'),
|
||||||
|
machines: require('./machines'),
|
||||||
|
firewallRules: require('./firewall-rules'),
|
||||||
|
// fabrics: require('./fabrics'),
|
||||||
|
networks: require('./networks'),
|
||||||
|
nics: require('./nics')
|
||||||
|
};
|
35
triton-graphql/src/api/keys.js
Normal file
35
triton-graphql/src/api/keys.js
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
const request = require('./request');
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
user: {
|
||||||
|
list: (ctx) => {
|
||||||
|
return request('listUserKeys', ctx);
|
||||||
|
},
|
||||||
|
get: (ctx) => {
|
||||||
|
return request('getUserKey', ctx);
|
||||||
|
},
|
||||||
|
create: (ctx) => {
|
||||||
|
return request('createUserKey', ctx);
|
||||||
|
},
|
||||||
|
destroy: (ctx) => {
|
||||||
|
return request('deleteUserKey', ctx);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
account: {
|
||||||
|
list: () => {
|
||||||
|
return request('listKeys', {});
|
||||||
|
},
|
||||||
|
|
||||||
|
get: (ctx) => {
|
||||||
|
return request('getKey', ctx);
|
||||||
|
},
|
||||||
|
|
||||||
|
create: (ctx) => {
|
||||||
|
return request('createKey', ctx);
|
||||||
|
},
|
||||||
|
|
||||||
|
destroy: (ctx) => {
|
||||||
|
return request('deleteKey', ctx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
108
triton-graphql/src/api/machines.js
Normal file
108
triton-graphql/src/api/machines.js
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
const request = require('./request');
|
||||||
|
|
||||||
|
const snapshots = {
|
||||||
|
list: (ctx) => {
|
||||||
|
return request('listMachineSnapshots', ctx);
|
||||||
|
},
|
||||||
|
get: (ctx) => {
|
||||||
|
return request('getMachineSnapshot', ctx);
|
||||||
|
},
|
||||||
|
create: (ctx) => {
|
||||||
|
return request('createMachineSnapshot', ctx);
|
||||||
|
},
|
||||||
|
destroy: (ctx) => {
|
||||||
|
return request('deleteMachineSnapshot', ctx);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const metadata = {
|
||||||
|
list: (ctx) => {
|
||||||
|
return request('', ctx);
|
||||||
|
},
|
||||||
|
get: (ctx) => {
|
||||||
|
return request('', ctx);
|
||||||
|
},
|
||||||
|
update: (ctx) => {
|
||||||
|
return request('', ctx);
|
||||||
|
},
|
||||||
|
destroy: (ctx) => {
|
||||||
|
return request('', ctx);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const firewall = {
|
||||||
|
enable: (ctx) => {
|
||||||
|
return request('enableMachineFirewall', ctx);
|
||||||
|
},
|
||||||
|
disable: (ctx) => {
|
||||||
|
return request('disableMachineFirewall', ctx);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const tags = {
|
||||||
|
list: (ctx) => {
|
||||||
|
return request('listMachineTags', ctx);
|
||||||
|
},
|
||||||
|
get: (ctx) => {
|
||||||
|
return request('getMachineTag', ctx);
|
||||||
|
},
|
||||||
|
add: (ctx) => {
|
||||||
|
return request('addMachineTags', ctx);
|
||||||
|
},
|
||||||
|
replace: (ctx) => {
|
||||||
|
return request('replaceMachineTags', ctx);
|
||||||
|
},
|
||||||
|
destroy: (ctx) => {
|
||||||
|
const method = ctx.tag ? 'deleteMachineTag' : 'deleteMachineTags';
|
||||||
|
return request(method, ctx);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.list = (ctx) => {
|
||||||
|
return request('listMachines', ctx);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.get = (ctx) => {
|
||||||
|
return request('getMachine', ctx);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.create = (ctx) => {
|
||||||
|
return request('createMachine', ctx);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.stop = (ctx) => {
|
||||||
|
return request('stopMachine', ctx);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.start = (uuid) => {
|
||||||
|
return request('startMachine', uuid);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.startFromSnapshot = (ctx) => {
|
||||||
|
return request('startMachineFromSnapshot', ctx);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.reboot = (ctx) => {
|
||||||
|
return request('rebootMachine', ctx);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.resize = (ctx) => {
|
||||||
|
return request('', ctx);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.rename = (ctx) => {
|
||||||
|
return request('', ctx);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.destroy = (ctx) => {
|
||||||
|
return request('deleteMachine', ctx);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.audit = (ctx) => {
|
||||||
|
return request('machineAudit', ctx);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.snapshots = snapshots;
|
||||||
|
module.exports.metadata = metadata;
|
||||||
|
module.exports.firewall = firewall;
|
||||||
|
module.exports.tags = tags;
|
9
triton-graphql/src/api/networks.js
Normal file
9
triton-graphql/src/api/networks.js
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
const request = require('./request');
|
||||||
|
|
||||||
|
module.exports.list = () => {
|
||||||
|
return request('listNetworks');
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.get = (ctx) => {
|
||||||
|
return request('getNetwork', ctx);
|
||||||
|
};
|
9
triton-graphql/src/api/nics.js
Normal file
9
triton-graphql/src/api/nics.js
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
const request = require('./request');
|
||||||
|
|
||||||
|
module.exports.list = () => {
|
||||||
|
return request('listNics');
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.get = (ctx) => {
|
||||||
|
return request('getNic', ctx);
|
||||||
|
};
|
9
triton-graphql/src/api/packages.js
Normal file
9
triton-graphql/src/api/packages.js
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
const request = require('./request');
|
||||||
|
|
||||||
|
module.exports.list = (ctx) => {
|
||||||
|
return request('listPackages', ctx);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.get = (ctx) => {
|
||||||
|
return request('getPackage', ctx);
|
||||||
|
};
|
21
triton-graphql/src/api/policies.js
Normal file
21
triton-graphql/src/api/policies.js
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
const request = require('./request');
|
||||||
|
|
||||||
|
module.exports.list = (ctx) => {
|
||||||
|
return request('listPolicies');
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.get = (ctx) => {
|
||||||
|
return request('getPolicy', ctx);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.create = (ctx) => {
|
||||||
|
return request('createPolicy', ctx);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.update = (ctx) => {
|
||||||
|
return request('updatePolicy', ctx);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.destroy = (ctx) => {
|
||||||
|
return request('deletePolicy', ctx);
|
||||||
|
};
|
40
triton-graphql/src/api/request.js
Normal file
40
triton-graphql/src/api/request.js
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
const credentials = require('../../credentials.json');
|
||||||
|
|
||||||
|
const auth = require('smartdc-auth');
|
||||||
|
const cloudapi = require('triton/lib/cloudapi2');
|
||||||
|
const bunyan = require('bunyan');
|
||||||
|
|
||||||
|
var log = bunyan.createLogger({
|
||||||
|
name: 'triton-graphql'
|
||||||
|
});
|
||||||
|
|
||||||
|
var client = cloudapi.createClient({
|
||||||
|
log: log,
|
||||||
|
url: credentials.url,
|
||||||
|
account: credentials.account,
|
||||||
|
user: credentials.user,
|
||||||
|
sign: auth.cliSigner({
|
||||||
|
log: log,
|
||||||
|
keyId: credentials.keyId,
|
||||||
|
user: credentials.account,
|
||||||
|
subuser: credentials.user
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = (method, args) => {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const fn = client[method].bind(client);
|
||||||
|
|
||||||
|
const cb = (err, res) => {
|
||||||
|
if (err) {
|
||||||
|
return reject(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
resolve(res);
|
||||||
|
};
|
||||||
|
|
||||||
|
return args ? fn(args, cb) : fn(cb);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.client = client;
|
31
triton-graphql/src/api/roles.js
Normal file
31
triton-graphql/src/api/roles.js
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
const request = require('./request');
|
||||||
|
|
||||||
|
module.exports.list = (ctx) => {
|
||||||
|
return request('listRoles');
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.get = (ctx) => {
|
||||||
|
return request('getRole', ctx);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.create = (ctx) => {
|
||||||
|
return request('createRole', ctx);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.set = (ctx) => {
|
||||||
|
const id = ctx.id ? `/${id}` : '';
|
||||||
|
const resource = `/${request.client.account}/${ctx.resource}${id}`;
|
||||||
|
|
||||||
|
return request('setRoleTags', {
|
||||||
|
roleTags: ctx.role,
|
||||||
|
resource
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.update = (ctx) => {
|
||||||
|
return request('updateRole', ctx);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.destroy = (ctx) => {
|
||||||
|
return request('deleteRole', ctx);
|
||||||
|
};
|
5
triton-graphql/src/api/services.js
Normal file
5
triton-graphql/src/api/services.js
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
const request = require('./request');
|
||||||
|
|
||||||
|
module.exports = () => {
|
||||||
|
return request('listServices');
|
||||||
|
};
|
21
triton-graphql/src/api/users.js
Normal file
21
triton-graphql/src/api/users.js
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
const request = require('./request');
|
||||||
|
|
||||||
|
module.exports.list = () => {
|
||||||
|
return request('listUsers');
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.get = (ctx) => {
|
||||||
|
return request('getUser', ctx);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.create = (ctx) => {
|
||||||
|
return request('createUser', ctx);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.destroy = (ctx) => {
|
||||||
|
return request('deleteUser', ctx);
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.update = (ctx) => {
|
||||||
|
return request('updateUser', ctx);
|
||||||
|
};
|
20
triton-graphql/src/index.js
Normal file
20
triton-graphql/src/index.js
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
const express = require('express');
|
||||||
|
const graphqlHTTP = require('express-graphql');
|
||||||
|
const schema = require('./schema');
|
||||||
|
|
||||||
|
const app = express();
|
||||||
|
|
||||||
|
app.use('/graphql', graphqlHTTP(() => ({
|
||||||
|
schema: schema,
|
||||||
|
graphiql: true,
|
||||||
|
pretty: true
|
||||||
|
})));
|
||||||
|
|
||||||
|
app.listen(3000, (err) => {
|
||||||
|
if (err) {
|
||||||
|
console.log(err);
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('Listening at localhost:3000');
|
||||||
|
});
|
12
triton-graphql/src/schema/index.js
Normal file
12
triton-graphql/src/schema/index.js
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
const graphql = require('graphql');
|
||||||
|
const mutation = require('./mutations');
|
||||||
|
const query = require('./queries');
|
||||||
|
|
||||||
|
const {
|
||||||
|
GraphQLSchema
|
||||||
|
} = graphql;
|
||||||
|
|
||||||
|
module.exports = new GraphQLSchema({
|
||||||
|
query,
|
||||||
|
mutation
|
||||||
|
});
|
57
triton-graphql/src/schema/mutations/account.js
Normal file
57
triton-graphql/src/schema/mutations/account.js
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
const AccountType = require('../types/login');
|
||||||
|
const api = require('../../api');
|
||||||
|
|
||||||
|
const {
|
||||||
|
GraphQLBoolean,
|
||||||
|
GraphQLString
|
||||||
|
} = require('graphql');
|
||||||
|
|
||||||
|
module.exports.updateAccount = {
|
||||||
|
type: AccountType,
|
||||||
|
description: 'Update your account details',
|
||||||
|
args: {
|
||||||
|
email: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
company_name: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
first_name: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
last_name: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
address: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
postal_code: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
city: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
state: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
country: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
phone: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
cns_enabled: {
|
||||||
|
type: GraphQLBoolean
|
||||||
|
}
|
||||||
|
},
|
||||||
|
resolve: (root, args) => {
|
||||||
|
return api.account.get().then((account) => {
|
||||||
|
return api.account.update(Object.assign(account, args, {
|
||||||
|
firstName: args.first_name || account.firstName,
|
||||||
|
lastName: args.first_name || account.lastName,
|
||||||
|
companyName: args.company_name || account.companyName,
|
||||||
|
postalCode: args.postal_code || account.postalCode
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
102
triton-graphql/src/schema/mutations/firewall-rules.js
Normal file
102
triton-graphql/src/schema/mutations/firewall-rules.js
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
const FirewallRuleType = require('../types/firewall-rule');
|
||||||
|
const api = require('../../api');
|
||||||
|
|
||||||
|
const {
|
||||||
|
GraphQLID,
|
||||||
|
GraphQLBoolean,
|
||||||
|
GraphQLString
|
||||||
|
} = require('graphql');
|
||||||
|
|
||||||
|
module.exports.createFirewallRule = {
|
||||||
|
type: FirewallRuleType,
|
||||||
|
description: 'Adds a new firewall rule for the specified account. This rule will be added to all the account\'s instances where it may be necessary',
|
||||||
|
args: {
|
||||||
|
enabled: {
|
||||||
|
type: GraphQLBoolean,
|
||||||
|
description: 'Indicates if the rule is enabled (optional, false by default)'
|
||||||
|
},
|
||||||
|
rule: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'Firewall rule text'
|
||||||
|
},
|
||||||
|
description: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'Human-readable description for the rule (optional)'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
resolve: (root, args) => {
|
||||||
|
return api.firewallRules.create({
|
||||||
|
rule: args.rule,
|
||||||
|
description: args.description,
|
||||||
|
enabled: !!args.enabled
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.updateFirewallRule = {
|
||||||
|
type: FirewallRuleType,
|
||||||
|
description: 'Updates the given rule record and -- depending on rule contents -- adds/removes/updates the rule on all the required instances',
|
||||||
|
args: {
|
||||||
|
id: {
|
||||||
|
type: GraphQLID,
|
||||||
|
description: 'Firewall rule id'
|
||||||
|
},
|
||||||
|
enabled: {
|
||||||
|
type: GraphQLBoolean,
|
||||||
|
description: 'Indicates if the rule is enabled (optional, false by default)'
|
||||||
|
},
|
||||||
|
rule: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'Firewall rule text'
|
||||||
|
},
|
||||||
|
description: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'Human-readable description for the rule (optional)'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
resolve: (root, args) => {
|
||||||
|
return api.firewallRules.update(args);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.enableFirewallRule = {
|
||||||
|
type: FirewallRuleType,
|
||||||
|
description: 'Enables the given firewall rule if it is disabled',
|
||||||
|
args: {
|
||||||
|
id: {
|
||||||
|
type: GraphQLID,
|
||||||
|
description: 'Firewall rule id'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
resolve: (root, args) => {
|
||||||
|
return api.firewallRules.enable(args);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.disableFirewallRule = {
|
||||||
|
type: FirewallRuleType,
|
||||||
|
description: 'Disables the given firewall rule if it is enabled',
|
||||||
|
args: {
|
||||||
|
id: {
|
||||||
|
type: GraphQLID,
|
||||||
|
description: 'Firewall rule id'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
resolve: (root, args) => {
|
||||||
|
return api.firewallRules.disable(args);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.deleteFirewallRule = {
|
||||||
|
type: FirewallRuleType,
|
||||||
|
description: 'Removes the given firewall rule from all the required instances',
|
||||||
|
args: {
|
||||||
|
id: {
|
||||||
|
type: GraphQLID,
|
||||||
|
description: 'Firewall rule id'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
resolve: (root, args) => {
|
||||||
|
return api.firewallRules.destroy(args);
|
||||||
|
}
|
||||||
|
};
|
56
triton-graphql/src/schema/mutations/images.js
Normal file
56
triton-graphql/src/schema/mutations/images.js
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
const AccountType = require('../types/login');
|
||||||
|
const DynamicObjectType = require('../types/dynamic-object');
|
||||||
|
const api = require('../../api');
|
||||||
|
|
||||||
|
const {
|
||||||
|
GraphQLString,
|
||||||
|
GraphQLList,
|
||||||
|
GraphQLNonNull,
|
||||||
|
GraphQLID
|
||||||
|
} = require('graphql');
|
||||||
|
|
||||||
|
module.exports.createImage = {
|
||||||
|
type: AccountType,
|
||||||
|
description: 'Create a new custom image from an instance',
|
||||||
|
args: {
|
||||||
|
machine: {
|
||||||
|
type: new GraphQLNonNull(GraphQLID),
|
||||||
|
description: 'The prepared and stopped instance UUID from which the image is to be created'
|
||||||
|
},
|
||||||
|
name: {
|
||||||
|
type: new GraphQLNonNull(GraphQLString),
|
||||||
|
description: 'The name of the custom image, e.g. "my-image". Maximum 512 characters. However, typical names should be much shorter, e.g. 5-20 characters'
|
||||||
|
},
|
||||||
|
version: {
|
||||||
|
type: new GraphQLNonNull(GraphQLString),
|
||||||
|
description: 'The version of the custom image, e.g. "1.0.0". Maximum 128 characters'
|
||||||
|
},
|
||||||
|
description: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'A short prose description of this image. Maximum 512 characters'
|
||||||
|
},
|
||||||
|
homepage: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'Homepage URL where users can find more information about the image. Maximum 128 characters'
|
||||||
|
},
|
||||||
|
eula: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'URL of the End User License Agreement (EULA) for the image. Maximum 128 characters'
|
||||||
|
},
|
||||||
|
acl: {
|
||||||
|
type: new GraphQLList(GraphQLID),
|
||||||
|
description: 'An array of user/account UUIDs to which to give read access to a private image. I.e. this is only relevant for images with public === false'
|
||||||
|
},
|
||||||
|
tags: {
|
||||||
|
type: DynamicObjectType,
|
||||||
|
description: 'An object of key/value pairs that allows clients to categorize images by any given criteria'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
resolve: (root, args) => {
|
||||||
|
const {
|
||||||
|
create
|
||||||
|
} = api.images;
|
||||||
|
|
||||||
|
return create(args);
|
||||||
|
}
|
||||||
|
};
|
18
triton-graphql/src/schema/mutations/index.js
Normal file
18
triton-graphql/src/schema/mutations/index.js
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
const {
|
||||||
|
GraphQLObjectType
|
||||||
|
} = require('graphql');
|
||||||
|
|
||||||
|
module.exports = new GraphQLObjectType({
|
||||||
|
name: 'RootMutationType',
|
||||||
|
fields: Object.assign(
|
||||||
|
require('./account'),
|
||||||
|
require('./keys'),
|
||||||
|
require('./users'),
|
||||||
|
require('./roles'),
|
||||||
|
require('./policies'),
|
||||||
|
require('./machines'),
|
||||||
|
require('./images'),
|
||||||
|
require('./firewall-rules'),
|
||||||
|
require('./snapshots')
|
||||||
|
)
|
||||||
|
});
|
53
triton-graphql/src/schema/mutations/keys.js
Normal file
53
triton-graphql/src/schema/mutations/keys.js
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
const KeyType = require('../types/key');
|
||||||
|
const api = require('../../api');
|
||||||
|
|
||||||
|
const {
|
||||||
|
GraphQLNonNull,
|
||||||
|
GraphQLString,
|
||||||
|
GraphQLID
|
||||||
|
} = require('graphql');
|
||||||
|
|
||||||
|
module.exports.createKey = {
|
||||||
|
type: KeyType,
|
||||||
|
description: 'Uploads a new OpenSSH key to Triton for use in HTTP signing and SSH',
|
||||||
|
args: {
|
||||||
|
name: {
|
||||||
|
type: new GraphQLNonNull(GraphQLString)
|
||||||
|
},
|
||||||
|
key: {
|
||||||
|
type: new GraphQLNonNull(GraphQLString)
|
||||||
|
},
|
||||||
|
userId: {
|
||||||
|
type: GraphQLID,
|
||||||
|
description: 'UserId to add this key to. Leaving this in blank will add the key to the account'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
resolve: (root, args) => {
|
||||||
|
const _api = args.userId ? api.keys.user : api.keys.account;
|
||||||
|
return _api.create(args);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.deleteKey = {
|
||||||
|
type: GraphQLID,
|
||||||
|
description: 'Deletes a single SSH key, by name or fingerprint',
|
||||||
|
args: {
|
||||||
|
name: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
fingerprint: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
userId: {
|
||||||
|
type: GraphQLID,
|
||||||
|
description: 'UserId who this key belongs to. Leaving this in blank will delete an account key'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
resolve: (root, args) => {
|
||||||
|
const _api = args.userId ? api.keys.user : api.keys.account;
|
||||||
|
|
||||||
|
return _api.destroy(args).then(() => {
|
||||||
|
return args.name || args.fingerprint;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
328
triton-graphql/src/schema/mutations/machines.js
Normal file
328
triton-graphql/src/schema/mutations/machines.js
Normal file
@ -0,0 +1,328 @@
|
|||||||
|
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'
|
||||||
|
},
|
||||||
|
firewall_enabled: {
|
||||||
|
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,
|
||||||
|
firewall_enabled: args.firewall_enabled
|
||||||
|
}, 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);
|
||||||
|
}
|
||||||
|
};
|
71
triton-graphql/src/schema/mutations/policies.js
Normal file
71
triton-graphql/src/schema/mutations/policies.js
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
const PolicyType = require('../types/policy');
|
||||||
|
const api = require('../../api');
|
||||||
|
|
||||||
|
const {
|
||||||
|
GraphQLNonNull,
|
||||||
|
GraphQLString,
|
||||||
|
GraphQLID,
|
||||||
|
GraphQLList
|
||||||
|
} = require('graphql');
|
||||||
|
|
||||||
|
module.exports.createPolicy = {
|
||||||
|
type: PolicyType,
|
||||||
|
description: 'Creates a new account policy',
|
||||||
|
args: {
|
||||||
|
name: {
|
||||||
|
type: new GraphQLNonNull(GraphQLString),
|
||||||
|
description: 'The policy name'
|
||||||
|
},
|
||||||
|
rules: {
|
||||||
|
type: new GraphQLNonNull(new GraphQLList(GraphQLString)),
|
||||||
|
description: 'One or more Aperture sentences to be added to the current policy'
|
||||||
|
},
|
||||||
|
description: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'A description for this policy (Optional)'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
resolve: (root, args) => {
|
||||||
|
return api.policies.create(args);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.updatePolicy = {
|
||||||
|
type: PolicyType,
|
||||||
|
description: 'Upgrades an existing account policy. Everything but id can be modified',
|
||||||
|
args: {
|
||||||
|
id: {
|
||||||
|
type: new GraphQLNonNull(GraphQLID)
|
||||||
|
},
|
||||||
|
name: {
|
||||||
|
type: new GraphQLNonNull(GraphQLString),
|
||||||
|
description: 'The policy name'
|
||||||
|
},
|
||||||
|
rules: {
|
||||||
|
type: new GraphQLNonNull(new GraphQLList(GraphQLString)),
|
||||||
|
description: 'One or more Aperture sentences to be added to the current policy'
|
||||||
|
},
|
||||||
|
description: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'A description for this policy (Optional)'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
resolve: (root, args) => {
|
||||||
|
return api.policies.update(args);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.deletePolicy = {
|
||||||
|
type: GraphQLID,
|
||||||
|
description: 'Delete an RBAC policy',
|
||||||
|
args: {
|
||||||
|
id: {
|
||||||
|
type: new GraphQLNonNull(GraphQLID)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
resolve: (root, args) => {
|
||||||
|
return api.policies.destroy(args).then(() => {
|
||||||
|
return args.id;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
105
triton-graphql/src/schema/mutations/roles.js
Normal file
105
triton-graphql/src/schema/mutations/roles.js
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
const RoleType = require('../types/role');
|
||||||
|
const api = require('../../api');
|
||||||
|
|
||||||
|
const {
|
||||||
|
GraphQLNonNull,
|
||||||
|
GraphQLString,
|
||||||
|
GraphQLID,
|
||||||
|
GraphQLList
|
||||||
|
} = require('graphql');
|
||||||
|
|
||||||
|
module.exports.createRole = {
|
||||||
|
type: RoleType,
|
||||||
|
description: 'Create a new role for your account',
|
||||||
|
args: {
|
||||||
|
name: {
|
||||||
|
type: new GraphQLNonNull(GraphQLString),
|
||||||
|
description: 'The role\'s name'
|
||||||
|
},
|
||||||
|
policies: {
|
||||||
|
type: new GraphQLList(GraphQLString),
|
||||||
|
description: 'This account\'s policies to be given to this role (Optional)'
|
||||||
|
},
|
||||||
|
members: {
|
||||||
|
type: new GraphQLList(GraphQLString),
|
||||||
|
description: 'This account\'s user logins to be added to this role (Optional)'
|
||||||
|
},
|
||||||
|
default_members: {
|
||||||
|
type: new GraphQLList(GraphQLString),
|
||||||
|
description: 'This account\'s user logins to be added to this role and have it enabled by default (Optional)'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
resolve: (root, args) => {
|
||||||
|
return api.roles.create(args);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.updateRole = {
|
||||||
|
type: RoleType,
|
||||||
|
description: 'Modifies an account role. Anything but id can be modified',
|
||||||
|
args: {
|
||||||
|
id: {
|
||||||
|
type: new GraphQLNonNull(GraphQLID)
|
||||||
|
},
|
||||||
|
name: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'The role\'s name'
|
||||||
|
},
|
||||||
|
policies: {
|
||||||
|
type: new GraphQLList(GraphQLString),
|
||||||
|
description: 'This account\'s policies to be given to this role (Optional)'
|
||||||
|
},
|
||||||
|
members: {
|
||||||
|
type: new GraphQLList(GraphQLString),
|
||||||
|
description: 'This account\'s user logins to be added to this role (Optional)'
|
||||||
|
},
|
||||||
|
default_members: {
|
||||||
|
type: new GraphQLList(GraphQLString),
|
||||||
|
description: 'This account\'s user logins to be added to this role and have it enabled by default (Optional)'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
resolve: (root, args) => {
|
||||||
|
return api.roles.update(args);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.deleteRole = {
|
||||||
|
type: GraphQLID,
|
||||||
|
description: 'Remove a role',
|
||||||
|
args: {
|
||||||
|
id: {
|
||||||
|
type: new GraphQLNonNull(GraphQLID)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
resolve: (root, args) => {
|
||||||
|
return api.roles.destroy(args).then(() => {
|
||||||
|
return args.id;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.setRoleTags = {
|
||||||
|
type: RoleType.tag,
|
||||||
|
description: 'Sets the given role tags to the provided resource path. resource_path can be the path to any of the CloudAPI resources described in this document: account, keys, users, roles, policies, user\'s ssh keys, datacenters, images, packages, instances, analytics, instrumentations, firewall rules and networks.',
|
||||||
|
args: {
|
||||||
|
resource: {
|
||||||
|
type: new GraphQLNonNull(GraphQLString),
|
||||||
|
description: 'The resource type e.g. `machines`, `policies`...'
|
||||||
|
},
|
||||||
|
id: {
|
||||||
|
type: GraphQLID,
|
||||||
|
description: 'The resource id'
|
||||||
|
},
|
||||||
|
role: {
|
||||||
|
type: new GraphQLNonNull(new GraphQLList(GraphQLString)),
|
||||||
|
description: 'The list role-tags to be added to this resource'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
resolve: (root, args) => {
|
||||||
|
const {
|
||||||
|
set
|
||||||
|
} = api.roles;
|
||||||
|
|
||||||
|
return set(args);
|
||||||
|
}
|
||||||
|
};
|
73
triton-graphql/src/schema/mutations/snapshots.js
Normal file
73
triton-graphql/src/schema/mutations/snapshots.js
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
const SnapshotType = require('../types/snapshot');
|
||||||
|
const api = require('../../api');
|
||||||
|
|
||||||
|
const {
|
||||||
|
GraphQLNonNull,
|
||||||
|
GraphQLString,
|
||||||
|
GraphQLID
|
||||||
|
} = require('graphql');
|
||||||
|
|
||||||
|
module.exports.createSnapshot = {
|
||||||
|
type: SnapshotType,
|
||||||
|
description: 'Allows you to take a snapshot of a machine instance',
|
||||||
|
args: {
|
||||||
|
machine: {
|
||||||
|
type: new GraphQLNonNull(GraphQLID),
|
||||||
|
description: 'The machine id'
|
||||||
|
},
|
||||||
|
name: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'The name to assign to the new snapshot'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
resolve: (root, args) => {
|
||||||
|
const {
|
||||||
|
snapshot: {
|
||||||
|
create,
|
||||||
|
get
|
||||||
|
}
|
||||||
|
} = api.machines;
|
||||||
|
|
||||||
|
const newArgs = {
|
||||||
|
id: args.machine,
|
||||||
|
name: args.name
|
||||||
|
};
|
||||||
|
|
||||||
|
return create(newArgs).then((snapshot) => {
|
||||||
|
if (snapshot) {
|
||||||
|
return snapshot;
|
||||||
|
}
|
||||||
|
|
||||||
|
return get(newArgs);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.deleteSnapshot = {
|
||||||
|
type: GraphQLID,
|
||||||
|
description: 'Deletes the specified snapshot of an instance',
|
||||||
|
args: {
|
||||||
|
machine: {
|
||||||
|
type: new GraphQLNonNull(GraphQLID),
|
||||||
|
description: 'The machine id'
|
||||||
|
},
|
||||||
|
name: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'The name to assign to the new snapshot'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
resolve: (root, args) => {
|
||||||
|
const {
|
||||||
|
snapshot: {
|
||||||
|
destroy
|
||||||
|
}
|
||||||
|
} = api.machines;
|
||||||
|
|
||||||
|
const newArgs = {
|
||||||
|
id: args.machine,
|
||||||
|
name: args.name
|
||||||
|
};
|
||||||
|
|
||||||
|
return destroy(newArgs).then(() => args.name);
|
||||||
|
}
|
||||||
|
};
|
144
triton-graphql/src/schema/mutations/users.js
Normal file
144
triton-graphql/src/schema/mutations/users.js
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
const UserType = require('../types/login');
|
||||||
|
const api = require('../../api');
|
||||||
|
|
||||||
|
const {
|
||||||
|
GraphQLNonNull,
|
||||||
|
GraphQLString,
|
||||||
|
GraphQLID
|
||||||
|
} = require('graphql');
|
||||||
|
|
||||||
|
module.exports.createUser = {
|
||||||
|
type: UserType,
|
||||||
|
description: 'Creates a new user under an account',
|
||||||
|
args: {
|
||||||
|
login: {
|
||||||
|
type: new GraphQLNonNull(GraphQLString)
|
||||||
|
},
|
||||||
|
email: {
|
||||||
|
type: new GraphQLNonNull(GraphQLString)
|
||||||
|
},
|
||||||
|
password: {
|
||||||
|
type: new GraphQLNonNull(GraphQLString)
|
||||||
|
},
|
||||||
|
company_name: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
first_name: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
last_name: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
address: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
postal_code: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
city: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
state: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
country: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
phone: {
|
||||||
|
type: GraphQLString
|
||||||
|
}
|
||||||
|
},
|
||||||
|
resolve: (root, args) => {
|
||||||
|
return api.users.create(Object.assign(args, {
|
||||||
|
firstName: args.first_name,
|
||||||
|
lastName: args.first_name,
|
||||||
|
companyName: args.company_name,
|
||||||
|
postalCode: args.postal_code
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.deleteUser = {
|
||||||
|
type: GraphQLID,
|
||||||
|
description: 'Remove a user',
|
||||||
|
args: {
|
||||||
|
id: {
|
||||||
|
type: new GraphQLNonNull(GraphQLID)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
resolve: (root, args) => {
|
||||||
|
return api.users.destroy(args).then(() => {
|
||||||
|
return args.id;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports.updateUser = {
|
||||||
|
type: UserType,
|
||||||
|
description: 'Update a user\'s modifiable properties',
|
||||||
|
args: {
|
||||||
|
id: {
|
||||||
|
type: new GraphQLNonNull(GraphQLID)
|
||||||
|
},
|
||||||
|
login: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
email: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
company_name: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
first_name: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
last_name: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
address: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
postal_code: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
city: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
state: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
country: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
phone: {
|
||||||
|
type: GraphQLString
|
||||||
|
}
|
||||||
|
},
|
||||||
|
resolve: (root, args) => {
|
||||||
|
return api.users.update(Object.assign(args, {
|
||||||
|
firstName: args.first_name,
|
||||||
|
lastName: args.first_name,
|
||||||
|
companyName: args.company_name,
|
||||||
|
postalCode: args.postal_code
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// module.exports.changeUserPassword = {
|
||||||
|
// type: UserType,
|
||||||
|
// description: 'This is a separate rule for password changes, so different policies can be used for an user trying to modify other data, or only their own password',
|
||||||
|
// args: {
|
||||||
|
// id: {
|
||||||
|
// type: new GraphQLNonNull(GraphQLID)
|
||||||
|
// },
|
||||||
|
// password: {
|
||||||
|
// type: GraphQLString
|
||||||
|
// },
|
||||||
|
// password_confirmation: {
|
||||||
|
// type: GraphQLString
|
||||||
|
// }
|
||||||
|
// },
|
||||||
|
// resolve: (root, args) => {
|
||||||
|
// return api.users.updatePassword(args);
|
||||||
|
// }
|
||||||
|
// };
|
13
triton-graphql/src/schema/queries/account.js
Normal file
13
triton-graphql/src/schema/queries/account.js
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
const AccountType = require('../types/login');
|
||||||
|
const api = require('../../api');
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
type: AccountType,
|
||||||
|
resolve() {
|
||||||
|
return api.account.get().then((account) => {
|
||||||
|
return Object.assign(account, {
|
||||||
|
isUser: false
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
21
triton-graphql/src/schema/queries/datacenters.js
Normal file
21
triton-graphql/src/schema/queries/datacenters.js
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
const DatacenterType = require('../types/datacenter');
|
||||||
|
const graphql = require('graphql');
|
||||||
|
const api = require('../../api');
|
||||||
|
|
||||||
|
const {
|
||||||
|
GraphQLList
|
||||||
|
} = graphql;
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
type: new GraphQLList(DatacenterType),
|
||||||
|
resolve() {
|
||||||
|
return api.datacenters().then((datacenters) => {
|
||||||
|
return Object.keys(datacenters).map((name) => {
|
||||||
|
return {
|
||||||
|
url: datacenters[name],
|
||||||
|
name
|
||||||
|
};
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
14
triton-graphql/src/schema/queries/fabrics.js
Normal file
14
triton-graphql/src/schema/queries/fabrics.js
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
const FabricType = require('../types/fabrics');
|
||||||
|
const graphql = require('graphql');
|
||||||
|
const api = require('../../api');
|
||||||
|
|
||||||
|
const {
|
||||||
|
GraphQLList
|
||||||
|
} = graphql;
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
type: new GraphQLList(FabricType),
|
||||||
|
resolve() {
|
||||||
|
return api.fabrics.list();
|
||||||
|
}
|
||||||
|
};
|
26
triton-graphql/src/schema/queries/firewall-rules.js
Normal file
26
triton-graphql/src/schema/queries/firewall-rules.js
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
const FirewallRuleType = require('../types/firewall-rule');
|
||||||
|
const graphql = require('graphql');
|
||||||
|
const api = require('../../api');
|
||||||
|
|
||||||
|
const {
|
||||||
|
GraphQLList,
|
||||||
|
GraphQLID
|
||||||
|
} = graphql;
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
type: new GraphQLList(FirewallRuleType),
|
||||||
|
args: {
|
||||||
|
id: {
|
||||||
|
type: GraphQLID,
|
||||||
|
description: 'Filter on id'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
resolve(root, args) {
|
||||||
|
const {
|
||||||
|
list,
|
||||||
|
get
|
||||||
|
} = api.firewallRules;
|
||||||
|
|
||||||
|
return !args.id ? list() : get(args.id).then((rule) => [rule]);
|
||||||
|
}
|
||||||
|
};
|
58
triton-graphql/src/schema/queries/images.js
Normal file
58
triton-graphql/src/schema/queries/images.js
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
const ImageType = require('../types/image');
|
||||||
|
const graphql = require('graphql');
|
||||||
|
const api = require('../../api');
|
||||||
|
|
||||||
|
const {
|
||||||
|
GraphQLList,
|
||||||
|
GraphQLBoolean,
|
||||||
|
GraphQLString,
|
||||||
|
GraphQLID
|
||||||
|
} = graphql;
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
type: new GraphQLList(ImageType),
|
||||||
|
args: {
|
||||||
|
id: {
|
||||||
|
type: GraphQLID,
|
||||||
|
description: 'Filter on id'
|
||||||
|
},
|
||||||
|
name: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'Filter on "friendly" name'
|
||||||
|
},
|
||||||
|
os: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'Filter on the underlying operating system'
|
||||||
|
},
|
||||||
|
version: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'Filter on the version'
|
||||||
|
},
|
||||||
|
'public': {
|
||||||
|
type: GraphQLBoolean,
|
||||||
|
description: 'Filter public/private images'
|
||||||
|
},
|
||||||
|
state: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'Filter on image state. By default only active images are shown. Use "all" to list all images'
|
||||||
|
},
|
||||||
|
owner: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'Filter on owner UUID'
|
||||||
|
},
|
||||||
|
type: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'Filter on image type'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
resolve(root, args) {
|
||||||
|
const {
|
||||||
|
list,
|
||||||
|
get
|
||||||
|
} = api.images;
|
||||||
|
|
||||||
|
return args.id ? get({
|
||||||
|
id: args.id
|
||||||
|
}).then((img) => [img]) : list(args);
|
||||||
|
}
|
||||||
|
};
|
22
triton-graphql/src/schema/queries/index.js
Normal file
22
triton-graphql/src/schema/queries/index.js
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
const {
|
||||||
|
GraphQLObjectType
|
||||||
|
} = require('graphql');
|
||||||
|
|
||||||
|
module.exports = new GraphQLObjectType({
|
||||||
|
name: 'RootQueryType',
|
||||||
|
fields: {
|
||||||
|
account: require('./account'),
|
||||||
|
users: require('./users'),
|
||||||
|
policies: require('./policies'),
|
||||||
|
roles: require('./roles'),
|
||||||
|
datacenters: require('./datacenters'),
|
||||||
|
services: require('./services'),
|
||||||
|
images: require('./images'),
|
||||||
|
packages: require('./packages'),
|
||||||
|
machines: require('./machines'),
|
||||||
|
firewallRules: require('./firewall-rules'),
|
||||||
|
// fabrics: require('./fabrics')
|
||||||
|
networks: require('./networks')
|
||||||
|
// nics: require('./nics')
|
||||||
|
}
|
||||||
|
});
|
83
triton-graphql/src/schema/queries/machines.js
Normal file
83
triton-graphql/src/schema/queries/machines.js
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
const MachineType = require('../types/machine');
|
||||||
|
const graphql = require('graphql');
|
||||||
|
const api = require('../../api');
|
||||||
|
|
||||||
|
const {
|
||||||
|
GraphQLInt,
|
||||||
|
GraphQLList,
|
||||||
|
GraphQLString,
|
||||||
|
GraphQLID
|
||||||
|
} = graphql;
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
type: new GraphQLList(MachineType),
|
||||||
|
args: {
|
||||||
|
id: {
|
||||||
|
type: GraphQLID
|
||||||
|
},
|
||||||
|
brand: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'Filter on the type of instance (e.g. lx)'
|
||||||
|
},
|
||||||
|
name: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'Machine name to find (will make your list size 1, or 0 if nothing found)'
|
||||||
|
},
|
||||||
|
image: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'Image id; returns instances provisioned with that image'
|
||||||
|
},
|
||||||
|
state: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'Filter on the current state (e.g. running)'
|
||||||
|
},
|
||||||
|
memory: {
|
||||||
|
type: GraphQLInt,
|
||||||
|
description: 'Filter on the current size of the RAM deployed (in MiB)'
|
||||||
|
},
|
||||||
|
tombstone: {
|
||||||
|
type: GraphQLInt,
|
||||||
|
description: 'Filter on instances destroyed in the last N minutes'
|
||||||
|
},
|
||||||
|
first: {
|
||||||
|
type: GraphQLInt,
|
||||||
|
description: 'Return a max of N instances; default is 1000 (which is also the maximum allowable result set size)'
|
||||||
|
},
|
||||||
|
after: {
|
||||||
|
type: GraphQLInt,
|
||||||
|
description: 'Get a `first` number of instances starting at this offset'
|
||||||
|
},
|
||||||
|
tags: {
|
||||||
|
type: new GraphQLList(GraphQLString),
|
||||||
|
description: 'Filter on existing tags'
|
||||||
|
},
|
||||||
|
docker: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'Whether to only list Docker instances, or only non-Docker instances, if present. Defaults to showing all instances.'
|
||||||
|
},
|
||||||
|
credentials: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'Whether to include the generated credentials for instances, if present. Defaults to false'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
resolve(root, args, ctx) {
|
||||||
|
const {
|
||||||
|
list,
|
||||||
|
get
|
||||||
|
} = api.machines;
|
||||||
|
|
||||||
|
const {
|
||||||
|
after,
|
||||||
|
first
|
||||||
|
} = args;
|
||||||
|
|
||||||
|
const newArgs = Object.assign(args, {
|
||||||
|
limit: first,
|
||||||
|
offset: after
|
||||||
|
});
|
||||||
|
|
||||||
|
return args.id ? get({
|
||||||
|
id: args.id
|
||||||
|
}).then((machine) => [machine]) : list(newArgs);
|
||||||
|
}
|
||||||
|
};
|
25
triton-graphql/src/schema/queries/networks.js
Normal file
25
triton-graphql/src/schema/queries/networks.js
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
const NetworkType = require('../types/network');
|
||||||
|
const graphql = require('graphql');
|
||||||
|
const api = require('../../api');
|
||||||
|
|
||||||
|
const {
|
||||||
|
GraphQLList,
|
||||||
|
GraphQLID
|
||||||
|
} = graphql;
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
type: new GraphQLList(NetworkType),
|
||||||
|
args: {
|
||||||
|
id: {
|
||||||
|
type: GraphQLID
|
||||||
|
}
|
||||||
|
},
|
||||||
|
resolve(root, args) {
|
||||||
|
const {
|
||||||
|
list,
|
||||||
|
get
|
||||||
|
} = api.networks;
|
||||||
|
|
||||||
|
return !args.id ? list() : get(args).then((network) => [network]);
|
||||||
|
}
|
||||||
|
};
|
25
triton-graphql/src/schema/queries/nics.js
Normal file
25
triton-graphql/src/schema/queries/nics.js
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
const NicType = require('../types/nic');
|
||||||
|
const graphql = require('graphql');
|
||||||
|
const api = require('../../api');
|
||||||
|
|
||||||
|
const {
|
||||||
|
GraphQLList,
|
||||||
|
GraphQLString
|
||||||
|
} = graphql;
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
type: new GraphQLList(NicType),
|
||||||
|
args: {
|
||||||
|
mac: {
|
||||||
|
type: GraphQLString
|
||||||
|
}
|
||||||
|
},
|
||||||
|
resolve(root, args) {
|
||||||
|
const {
|
||||||
|
list,
|
||||||
|
get
|
||||||
|
} = api.nics;
|
||||||
|
|
||||||
|
return !args.id ? list() : get(args).then((nic) => [nic]);
|
||||||
|
}
|
||||||
|
};
|
62
triton-graphql/src/schema/queries/packages.js
Normal file
62
triton-graphql/src/schema/queries/packages.js
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
const PackageType = require('../types/package');
|
||||||
|
const graphql = require('graphql');
|
||||||
|
const api = require('../../api');
|
||||||
|
|
||||||
|
const {
|
||||||
|
GraphQLInt,
|
||||||
|
GraphQLList,
|
||||||
|
GraphQLString,
|
||||||
|
GraphQLID
|
||||||
|
} = graphql;
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
type: new GraphQLList(PackageType),
|
||||||
|
args: {
|
||||||
|
id: {
|
||||||
|
type: GraphQLID,
|
||||||
|
description: 'Filter on package id'
|
||||||
|
},
|
||||||
|
name: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'Filter on the "friendly" name'
|
||||||
|
},
|
||||||
|
memory: {
|
||||||
|
type: GraphQLInt,
|
||||||
|
description: 'Filter on how much memory will by available (in MiB)'
|
||||||
|
},
|
||||||
|
disk: {
|
||||||
|
type: GraphQLInt,
|
||||||
|
description: 'Filter on how much disk space will be available (in MiB)'
|
||||||
|
},
|
||||||
|
swap: {
|
||||||
|
type: GraphQLInt,
|
||||||
|
description: 'Filter on how much swap space will be available (in MiB)'
|
||||||
|
},
|
||||||
|
lwps: {
|
||||||
|
type: GraphQLInt,
|
||||||
|
description: 'Filter on maximum number of light-weight processes (threads) allowed'
|
||||||
|
},
|
||||||
|
vcpus: {
|
||||||
|
type: GraphQLInt,
|
||||||
|
description: 'Filter on number of vCPUs'
|
||||||
|
},
|
||||||
|
version: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'Filter on the version'
|
||||||
|
},
|
||||||
|
group: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'Filter on the group belonging to'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
resolve(root, args) {
|
||||||
|
const {
|
||||||
|
list,
|
||||||
|
get
|
||||||
|
} = api.packages;
|
||||||
|
|
||||||
|
return args.id ? get({
|
||||||
|
id: args.id
|
||||||
|
}).then((pkg) => [pkg]) : list(args);
|
||||||
|
}
|
||||||
|
};
|
26
triton-graphql/src/schema/queries/policies.js
Normal file
26
triton-graphql/src/schema/queries/policies.js
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
const PolicyType = require('../types/policy');
|
||||||
|
const graphql = require('graphql');
|
||||||
|
const api = require('../../api');
|
||||||
|
|
||||||
|
const {
|
||||||
|
GraphQLList,
|
||||||
|
GraphQLID
|
||||||
|
} = graphql;
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
type: new GraphQLList(PolicyType),
|
||||||
|
args: {
|
||||||
|
id: {
|
||||||
|
type: GraphQLID,
|
||||||
|
description: '`id` of the `PolicyType` to filter'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
resolve(root, args) {
|
||||||
|
const {
|
||||||
|
list,
|
||||||
|
get
|
||||||
|
} = api.policies;
|
||||||
|
|
||||||
|
return !args.id ? list() : get(args).then((policy) => [policy]);
|
||||||
|
}
|
||||||
|
};
|
26
triton-graphql/src/schema/queries/roles.js
Normal file
26
triton-graphql/src/schema/queries/roles.js
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
const RoleType = require('../types/role');
|
||||||
|
const graphql = require('graphql');
|
||||||
|
const api = require('../../api');
|
||||||
|
|
||||||
|
const {
|
||||||
|
GraphQLList,
|
||||||
|
GraphQLID
|
||||||
|
} = graphql;
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
type: new GraphQLList(RoleType),
|
||||||
|
args: {
|
||||||
|
id: {
|
||||||
|
type: GraphQLID,
|
||||||
|
description: '`id` or `name` of the `RoleType` to filter'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
resolve(root, args) {
|
||||||
|
const {
|
||||||
|
list,
|
||||||
|
get
|
||||||
|
} = api.roles;
|
||||||
|
|
||||||
|
return !args.id ? list() : get(args).then((role) => [role]);
|
||||||
|
}
|
||||||
|
};
|
21
triton-graphql/src/schema/queries/services.js
Normal file
21
triton-graphql/src/schema/queries/services.js
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
const ServiceType = require('../types/service');
|
||||||
|
const graphql = require('graphql');
|
||||||
|
const api = require('../../api');
|
||||||
|
|
||||||
|
const {
|
||||||
|
GraphQLList
|
||||||
|
} = graphql;
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
type: new GraphQLList(ServiceType),
|
||||||
|
resolve() {
|
||||||
|
return api.services().then((services) => {
|
||||||
|
return Object.keys(services).map((name) => {
|
||||||
|
return {
|
||||||
|
url: services[name],
|
||||||
|
name
|
||||||
|
};
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
30
triton-graphql/src/schema/queries/users.js
Normal file
30
triton-graphql/src/schema/queries/users.js
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
const UserType = require('../types/login');
|
||||||
|
const graphql = require('graphql');
|
||||||
|
const api = require('../../api');
|
||||||
|
|
||||||
|
const {
|
||||||
|
GraphQLList,
|
||||||
|
GraphQLID
|
||||||
|
} = graphql;
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
type: new GraphQLList(UserType),
|
||||||
|
args: {
|
||||||
|
id: {
|
||||||
|
type: GraphQLID,
|
||||||
|
description: '`id` or `login` of the `UserType` to filter'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
resolve(root, args, ctx) {
|
||||||
|
const {
|
||||||
|
list,
|
||||||
|
get
|
||||||
|
} = api.users;
|
||||||
|
|
||||||
|
return !args.id ? list() : get(args).then((user) => [user]).then((user) => {
|
||||||
|
return Object.assign(user, {
|
||||||
|
isUser: true
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
58
triton-graphql/src/schema/types/audit.js
Normal file
58
triton-graphql/src/schema/types/audit.js
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
const DynamicObjectType = require('./dynamic-object');
|
||||||
|
|
||||||
|
const {
|
||||||
|
GraphQLString,
|
||||||
|
GraphQLObjectType,
|
||||||
|
GraphQLBoolean
|
||||||
|
} = require('graphql');
|
||||||
|
|
||||||
|
const CallerType = new GraphQLObjectType({
|
||||||
|
name: 'CallerType',
|
||||||
|
fields: {
|
||||||
|
type: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'Authentication type for the action request. One of "basic", "operator", "signature" or "token"'
|
||||||
|
},
|
||||||
|
user: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'When the authentication type is "basic", this member will be present and include user login'
|
||||||
|
},
|
||||||
|
ip: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'The IP addresses this from which the action was requested. Not present if type is "operator"'
|
||||||
|
},
|
||||||
|
keyId: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'When authentication type is either "signature" or "token", SSH key identifier'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = new GraphQLObjectType({
|
||||||
|
name: 'AuditType',
|
||||||
|
fields: {
|
||||||
|
action: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'The name of the action'
|
||||||
|
},
|
||||||
|
parameters: {
|
||||||
|
type: DynamicObjectType,
|
||||||
|
description: 'The original set of parameters sent when the action was requested'
|
||||||
|
},
|
||||||
|
success: {
|
||||||
|
type: GraphQLBoolean,
|
||||||
|
description: '`true` or `false`, depending on the action\'s success',
|
||||||
|
resolve: (root) => {
|
||||||
|
return root.success === 'yes';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
caller: {
|
||||||
|
type: CallerType,
|
||||||
|
description: 'Account requesting the action'
|
||||||
|
},
|
||||||
|
time: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'When the action finished'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
17
triton-graphql/src/schema/types/datacenter.js
Normal file
17
triton-graphql/src/schema/types/datacenter.js
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
const {
|
||||||
|
GraphQLString,
|
||||||
|
GraphQLObjectType
|
||||||
|
} = require('graphql');
|
||||||
|
|
||||||
|
module.exports = new GraphQLObjectType({
|
||||||
|
name: 'DatacenterType',
|
||||||
|
fields: {
|
||||||
|
name: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'location of the datacenter'
|
||||||
|
},
|
||||||
|
url: {
|
||||||
|
type: GraphQLString
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
44
triton-graphql/src/schema/types/dynamic-object.js
Normal file
44
triton-graphql/src/schema/types/dynamic-object.js
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
const {
|
||||||
|
GraphQLScalarType,
|
||||||
|
Kind
|
||||||
|
} = require('graphql');
|
||||||
|
|
||||||
|
const kinds = {
|
||||||
|
[Kind.STRING]: (ast) => {
|
||||||
|
return ast.value;
|
||||||
|
},
|
||||||
|
[Kind.BOOLEAN]: (ast) => {
|
||||||
|
return kinds[Kind.STRING](ast);
|
||||||
|
},
|
||||||
|
[Kind.INT]: (ast) => {
|
||||||
|
return Number(ast.value);
|
||||||
|
},
|
||||||
|
[Kind.FLOAT]: (ast) => {
|
||||||
|
return kinds[Kind.INT](ast);
|
||||||
|
},
|
||||||
|
[Kind.OBJECT]: (ast) => {
|
||||||
|
const value = Object.create(null);
|
||||||
|
ast.fields.forEach(field => {
|
||||||
|
value[field.name.value] = parseLiteral(field.value);
|
||||||
|
});
|
||||||
|
|
||||||
|
return value;
|
||||||
|
},
|
||||||
|
[Kind.LIST]: (ast) => {
|
||||||
|
return ast.values.map(parseLiteral);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// https://github.com/taion/graphql-type-json/blob/master/src/index.js
|
||||||
|
const parseLiteral = (ast) => {
|
||||||
|
const kind = kinds[ast.kind];
|
||||||
|
return kind ? kinds[ast.kind](ast) : null;
|
||||||
|
};
|
||||||
|
|
||||||
|
// from http://stackoverflow.com/a/34229603
|
||||||
|
module.exports = new GraphQLScalarType({
|
||||||
|
name: 'DynamicObjectType',
|
||||||
|
serialize: v => v,
|
||||||
|
parseValue: v => v,
|
||||||
|
parseLiteral: parseLiteral
|
||||||
|
});
|
23
triton-graphql/src/schema/types/fabric.js
Normal file
23
triton-graphql/src/schema/types/fabric.js
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
const {
|
||||||
|
GraphQLString,
|
||||||
|
GraphQLObjectType,
|
||||||
|
GraphQLInt
|
||||||
|
} = require('graphql');
|
||||||
|
|
||||||
|
module.exports = new GraphQLObjectType({
|
||||||
|
name: 'FabricsType',
|
||||||
|
fields: {
|
||||||
|
name: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'A unique name to identify the VLAN'
|
||||||
|
},
|
||||||
|
vlan_id: {
|
||||||
|
type: GraphQLInt,
|
||||||
|
description: 'A number from 0-4095 that indicates the VLAN\'s id'
|
||||||
|
},
|
||||||
|
description: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'An optional description of the VLAN'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
93
triton-graphql/src/schema/types/firewall-rule.js
Normal file
93
triton-graphql/src/schema/types/firewall-rule.js
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
const MachineType = require('../types/machine');
|
||||||
|
const api = require('../../api');
|
||||||
|
|
||||||
|
console.log(MachineType);
|
||||||
|
|
||||||
|
const {
|
||||||
|
GraphQLString,
|
||||||
|
GraphQLBoolean,
|
||||||
|
GraphQLObjectType,
|
||||||
|
GraphQLList,
|
||||||
|
GraphQLID,
|
||||||
|
GraphQLInt
|
||||||
|
} = require('graphql');
|
||||||
|
|
||||||
|
const FirewallRuleSyntaxType = new GraphQLObjectType({
|
||||||
|
name: 'FirewallRuleSyntaxType',
|
||||||
|
fields: {
|
||||||
|
text: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
'from': {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
'to': {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
action: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
protocol: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
port: {
|
||||||
|
type: GraphQLInt
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = new GraphQLObjectType({
|
||||||
|
name: 'FirewallRuleType',
|
||||||
|
fields: {
|
||||||
|
id: {
|
||||||
|
type: GraphQLID,
|
||||||
|
description: 'Unique identifier for this rule'
|
||||||
|
},
|
||||||
|
enabled: {
|
||||||
|
type: GraphQLBoolean,
|
||||||
|
description: 'Indicates if the rule is enabled',
|
||||||
|
resolve: (root) => {
|
||||||
|
return !!root.enabled;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
rule: {
|
||||||
|
type: FirewallRuleSyntaxType,
|
||||||
|
description: 'Firewall rule',
|
||||||
|
resolve: ({
|
||||||
|
rule
|
||||||
|
}) => {
|
||||||
|
const regex = /from (.*?) to (.*?) (allow|deny) (.*?) port (\d*)/i;
|
||||||
|
const tokens = rule.match(regex);
|
||||||
|
|
||||||
|
return {
|
||||||
|
'from': tokens[1],
|
||||||
|
'to': tokens[2],
|
||||||
|
action: tokens[3],
|
||||||
|
protocol: tokens[4],
|
||||||
|
port: tokens[5],
|
||||||
|
text: rule
|
||||||
|
};
|
||||||
|
}
|
||||||
|
},
|
||||||
|
global: {
|
||||||
|
type: GraphQLBoolean,
|
||||||
|
description: 'Indicates if the rule is global',
|
||||||
|
resolve: (root) => {
|
||||||
|
return !!root.global;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
description: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'Human-readable description for the rule'
|
||||||
|
}
|
||||||
|
// machines: {
|
||||||
|
// type: new GraphQLList(MachineType),
|
||||||
|
// description: 'Lists all instances a firewall rule is applied to',
|
||||||
|
// resolve: (root) => {
|
||||||
|
// return api.firewallRules.listMachines({
|
||||||
|
// id: root.id
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
});
|
116
triton-graphql/src/schema/types/image.js
Normal file
116
triton-graphql/src/schema/types/image.js
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
const DynamicObjectType = require('./dynamic-object');
|
||||||
|
|
||||||
|
const {
|
||||||
|
GraphQLBoolean,
|
||||||
|
GraphQLString,
|
||||||
|
GraphQLObjectType,
|
||||||
|
GraphQLInt,
|
||||||
|
GraphQLList,
|
||||||
|
GraphQLID
|
||||||
|
} = require('graphql');
|
||||||
|
|
||||||
|
const ErrorType = new GraphQLObjectType({
|
||||||
|
name: 'ErrorType',
|
||||||
|
fields: {
|
||||||
|
code: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'A CamelCase string code for this error, e.g. "PrepareImageDidNotRun". See GetImage docs for a table of error.code values'
|
||||||
|
},
|
||||||
|
message: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'A short description of the image creation failure'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const ImageFileType = new GraphQLObjectType({
|
||||||
|
name: 'ImageFileType',
|
||||||
|
fields: {
|
||||||
|
compression: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'The type of file compression used for the image file. One of "bzip2", "gzip", "none"'
|
||||||
|
},
|
||||||
|
sha1: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'SHA-1 hex digest of the file content. Used for corruption checking'
|
||||||
|
},
|
||||||
|
size: {
|
||||||
|
type: GraphQLInt,
|
||||||
|
description: 'File size in bytes'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = new GraphQLObjectType({
|
||||||
|
name: 'ImageType',
|
||||||
|
description: 'An image contains the software packages that will be available on newly-provisioned instance. In the case of hardware virtual machines, the image also includes the operating system',
|
||||||
|
fields: {
|
||||||
|
id: {
|
||||||
|
type: GraphQLID,
|
||||||
|
description: 'Unique id for this image'
|
||||||
|
},
|
||||||
|
name: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'The "friendly" name for this image'
|
||||||
|
},
|
||||||
|
os: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'The underlying operating system for this image'
|
||||||
|
},
|
||||||
|
version: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'The version for this image'
|
||||||
|
},
|
||||||
|
type: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'What kind of image this is. The values differ after v8.0.0+'
|
||||||
|
},
|
||||||
|
requirements: {
|
||||||
|
type: DynamicObjectType,
|
||||||
|
description: 'Contains a grouping of various minimum requirements for provisioning an instance with this image. For example "password" indicates that a password must be provided'
|
||||||
|
},
|
||||||
|
homepage: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'The URL for a web page with more detailed information for this image'
|
||||||
|
},
|
||||||
|
files: {
|
||||||
|
type: new GraphQLList(ImageFileType),
|
||||||
|
description: 'An array of image files that make up each image. Currently only a single file per image is supported'
|
||||||
|
},
|
||||||
|
published_at: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'The time this image has been made publicly available'
|
||||||
|
},
|
||||||
|
owner: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'The UUID of the user who owns this image'
|
||||||
|
},
|
||||||
|
'public': {
|
||||||
|
type: GraphQLBoolean,
|
||||||
|
description: 'Indicates if this image is publicly available',
|
||||||
|
resolve: (root) => {
|
||||||
|
return !!root['public'];
|
||||||
|
}
|
||||||
|
},
|
||||||
|
state: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'The current state of the image. One of "active", "unactivated", "disabled", "creating", "failed"'
|
||||||
|
},
|
||||||
|
tags: {
|
||||||
|
type: DynamicObjectType,
|
||||||
|
description: 'An object of key/value pairs that allows clients to categorize images by any given criteria'
|
||||||
|
},
|
||||||
|
eula: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'URL of the End User License Agreement (EULA) for the image'
|
||||||
|
},
|
||||||
|
acl: {
|
||||||
|
type: new GraphQLList(GraphQLString),
|
||||||
|
description: 'Access Control List. An array of account UUIDs given access to a private image. The field is only relevant to private images'
|
||||||
|
},
|
||||||
|
error: {
|
||||||
|
type: ErrorType,
|
||||||
|
description: 'If state=="failed", resulting from CreateImageFromMachine failure, then there may be an error object of the form {"code": "<string error code>", "message": "<string desc>"}'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
19
triton-graphql/src/schema/types/key.js
Normal file
19
triton-graphql/src/schema/types/key.js
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
const {
|
||||||
|
GraphQLString,
|
||||||
|
GraphQLObjectType
|
||||||
|
} = require('graphql');
|
||||||
|
|
||||||
|
module.exports = new GraphQLObjectType({
|
||||||
|
name: 'KeyType',
|
||||||
|
fields: {
|
||||||
|
name: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
fingerprint: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
key: {
|
||||||
|
type: GraphQLString
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
111
triton-graphql/src/schema/types/login.js
Normal file
111
triton-graphql/src/schema/types/login.js
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
const KeyType = require('./key');
|
||||||
|
const api = require('../../api');
|
||||||
|
|
||||||
|
const {
|
||||||
|
GraphQLBoolean,
|
||||||
|
GraphQLString,
|
||||||
|
GraphQLList,
|
||||||
|
GraphQLObjectType,
|
||||||
|
GraphQLID
|
||||||
|
} = require('graphql');
|
||||||
|
|
||||||
|
module.exports = new GraphQLObjectType({
|
||||||
|
name: 'LoginType',
|
||||||
|
fields: {
|
||||||
|
id: {
|
||||||
|
type: GraphQLID,
|
||||||
|
description: 'Unique id for this user/account'
|
||||||
|
},
|
||||||
|
login: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'Account/Sub-user login name'
|
||||||
|
},
|
||||||
|
email: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'Email address'
|
||||||
|
},
|
||||||
|
company_name: {
|
||||||
|
type: GraphQLString,
|
||||||
|
resolve: (root) => {
|
||||||
|
return !!root.company_name || root.companyName;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
first_name: {
|
||||||
|
type: GraphQLString,
|
||||||
|
resolve: (root) => {
|
||||||
|
return !!root.first_name || root.firstName;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
last_name: {
|
||||||
|
type: GraphQLString,
|
||||||
|
resolve: (root) => {
|
||||||
|
return !!root.last_name || root.lastName;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
address: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
postal_code: {
|
||||||
|
type: GraphQLString,
|
||||||
|
resolve: (root) => {
|
||||||
|
return !!root.postal_code || root.postalCode;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
city: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
state: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
country: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
phone: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
cns_enabled: {
|
||||||
|
type: GraphQLBoolean,
|
||||||
|
description: 'true if Triton CNS is enabled for account',
|
||||||
|
resolve: (root) => {
|
||||||
|
return root.isUser ? null : !!root.triton_cns_enabled;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
keys: {
|
||||||
|
type: new GraphQLList(KeyType),
|
||||||
|
description: 'Get keys for user/account',
|
||||||
|
args: {
|
||||||
|
name: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'Filter on key name'
|
||||||
|
},
|
||||||
|
fingerprint: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'Filter on key fingerprint'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
resolve(root, args) {
|
||||||
|
const _api = root.isUser ? api.keys.user : api.keys.account;
|
||||||
|
|
||||||
|
const {
|
||||||
|
list,
|
||||||
|
get
|
||||||
|
} = _api;
|
||||||
|
|
||||||
|
const newArgs = Object.assign(args, {
|
||||||
|
userId: root.id
|
||||||
|
});
|
||||||
|
|
||||||
|
const filtered = args.name || args.fingerprint;
|
||||||
|
return !filtered ? list(newArgs) : get(newArgs).then((key) => [key]);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
updated: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'When this user/account\'s details was last updated'
|
||||||
|
},
|
||||||
|
created: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'When this user/account was created'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
169
triton-graphql/src/schema/types/machine.js
Normal file
169
triton-graphql/src/schema/types/machine.js
Normal file
@ -0,0 +1,169 @@
|
|||||||
|
const FirewallRuleType = require('./firewall-rule');
|
||||||
|
const DynamicObjectType = require('./dynamic-object');
|
||||||
|
const SnapshotType = require('./snapshot');
|
||||||
|
const api = require('../../api');
|
||||||
|
|
||||||
|
const {
|
||||||
|
GraphQLBoolean,
|
||||||
|
GraphQLString,
|
||||||
|
GraphQLInputObjectType,
|
||||||
|
GraphQLObjectType,
|
||||||
|
GraphQLInt,
|
||||||
|
GraphQLList,
|
||||||
|
GraphQLID
|
||||||
|
} = require('graphql');
|
||||||
|
|
||||||
|
module.exports = new GraphQLObjectType({
|
||||||
|
name: 'MachineType',
|
||||||
|
description: 'An image contains the software packages that will be available on newly-provisioned instance. In the case of hardware virtual machines, the image also includes the operating system',
|
||||||
|
fields: {
|
||||||
|
id: {
|
||||||
|
type: GraphQLID,
|
||||||
|
description: 'Unique id for this instance'
|
||||||
|
},
|
||||||
|
name: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'The "friendly" name for this instance'
|
||||||
|
},
|
||||||
|
brand: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'The type of instance (e.g. lx)'
|
||||||
|
},
|
||||||
|
state: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'The current state of this instance (e.g. running)'
|
||||||
|
},
|
||||||
|
image: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'The image id this instance was provisioned with'
|
||||||
|
},
|
||||||
|
memory: {
|
||||||
|
type: GraphQLInt,
|
||||||
|
description: 'The amount of RAM this instance has (in MiB)'
|
||||||
|
},
|
||||||
|
disk: {
|
||||||
|
type: GraphQLInt,
|
||||||
|
description: 'The amount of disk this instance has (in MiB)'
|
||||||
|
},
|
||||||
|
metadata: {
|
||||||
|
type: DynamicObjectType,
|
||||||
|
description: 'Any additional metadata this instance has'
|
||||||
|
},
|
||||||
|
tags: {
|
||||||
|
type: DynamicObjectType,
|
||||||
|
description: 'Any tags this instance has',
|
||||||
|
args: {
|
||||||
|
name: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'Filter on the name of the tag'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
resolve: (root, args) => {
|
||||||
|
const {
|
||||||
|
tags: {
|
||||||
|
get
|
||||||
|
}
|
||||||
|
} = api.machines;
|
||||||
|
|
||||||
|
return !args.name ? root.tags : get({
|
||||||
|
id: root.id,
|
||||||
|
tag: args.name
|
||||||
|
}).then((value) => {
|
||||||
|
return {
|
||||||
|
[args.name]: value
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'When this instance was created'
|
||||||
|
},
|
||||||
|
updated: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'When this instance\'s details was last updated'
|
||||||
|
},
|
||||||
|
docker: {
|
||||||
|
type: GraphQLBoolean,
|
||||||
|
description: 'Whether this instance is a Docker container, if present',
|
||||||
|
resolve: (root) => {
|
||||||
|
return !!root.docker;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
ips: {
|
||||||
|
type: new GraphQLList(GraphQLString),
|
||||||
|
description: 'The IP addresses this instance has'
|
||||||
|
},
|
||||||
|
networks: {
|
||||||
|
type: new GraphQLList(GraphQLString),
|
||||||
|
description: 'The network UUIDs of the nics this instance has'
|
||||||
|
},
|
||||||
|
primaryIp: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'IP address of the primary nic of this instance'
|
||||||
|
},
|
||||||
|
firewall_enabled: {
|
||||||
|
type: GraphQLBoolean,
|
||||||
|
description: 'Whether firewall rules are enforced on this instance',
|
||||||
|
resolve: (root) => {
|
||||||
|
return !!root.firewall_enabled;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
firewall_rules: {
|
||||||
|
type: new GraphQLList(FirewallRuleType),
|
||||||
|
description: 'List of FirewallRules affecting this machine',
|
||||||
|
resolve: (root) => {
|
||||||
|
return api.firewallRules.listByMachine(root.id);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
compute_node: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'UUID of the server on which the instance is located'
|
||||||
|
},
|
||||||
|
'package': {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'The id or name of the package used to create this instance'
|
||||||
|
},
|
||||||
|
snapshots: {
|
||||||
|
type: new GraphQLList(SnapshotType),
|
||||||
|
description: 'The snapshots based on this instance',
|
||||||
|
args: {
|
||||||
|
name: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'Filter on the name of the snapshot'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
resolve: (root, args) => {
|
||||||
|
const {
|
||||||
|
snapshot: {
|
||||||
|
list,
|
||||||
|
get
|
||||||
|
}
|
||||||
|
} = api.machines;
|
||||||
|
|
||||||
|
return !args.id ? list(root) : get({
|
||||||
|
id: root.id,
|
||||||
|
name: args.name
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports.locality = new GraphQLInputObjectType({
|
||||||
|
name: 'LocalityType',
|
||||||
|
fields: {
|
||||||
|
strict: {
|
||||||
|
type: GraphQLBoolean,
|
||||||
|
resolve: (root) => {
|
||||||
|
return !!root.strict;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
near: {
|
||||||
|
type: new GraphQLList(GraphQLID)
|
||||||
|
},
|
||||||
|
far: {
|
||||||
|
type: new GraphQLList(GraphQLID)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
73
triton-graphql/src/schema/types/network.js
Normal file
73
triton-graphql/src/schema/types/network.js
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
const DynamicObjectType = require('./dynamic-object');
|
||||||
|
|
||||||
|
const {
|
||||||
|
GraphQLBoolean,
|
||||||
|
GraphQLString,
|
||||||
|
GraphQLObjectType,
|
||||||
|
GraphQLList,
|
||||||
|
GraphQLID
|
||||||
|
} = require('graphql');
|
||||||
|
|
||||||
|
module.exports = new GraphQLObjectType({
|
||||||
|
name: 'NetworkType',
|
||||||
|
description: 'Logical networks in Triton model core network configurations to enable Triton to define Virtual Network Interfaces and IP addresses for instances',
|
||||||
|
fields: {
|
||||||
|
id: {
|
||||||
|
type: GraphQLID,
|
||||||
|
description: 'Unique id for this network'
|
||||||
|
},
|
||||||
|
name: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'The network name'
|
||||||
|
},
|
||||||
|
'public': {
|
||||||
|
type: GraphQLBoolean,
|
||||||
|
description: 'Whether this a public or private (rfc1918) network',
|
||||||
|
resolve: (root) => {
|
||||||
|
return !!root['public'];
|
||||||
|
}
|
||||||
|
},
|
||||||
|
fabric: {
|
||||||
|
type: GraphQLBoolean,
|
||||||
|
description: 'Whether this network is created on a fabric',
|
||||||
|
resolve: (root) => {
|
||||||
|
return !!root.fabric;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
description: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'Description of this network'
|
||||||
|
},
|
||||||
|
subnet: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'A CIDR formatted string that describes the network'
|
||||||
|
},
|
||||||
|
provision_start_ip: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'The first IP on the network that may be assigned'
|
||||||
|
},
|
||||||
|
provision_end_ip: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'The last IP on the network that may be assigned'
|
||||||
|
},
|
||||||
|
gateway: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'Optional Gateway IP address'
|
||||||
|
},
|
||||||
|
resolvers: {
|
||||||
|
type: new GraphQLList(GraphQLString),
|
||||||
|
description: 'Optional Resolver IP addresses'
|
||||||
|
},
|
||||||
|
routes: {
|
||||||
|
type: DynamicObjectType,
|
||||||
|
description: 'Optional Static routes for hosts on this network'
|
||||||
|
},
|
||||||
|
internet_nat: {
|
||||||
|
type: GraphQLBoolean,
|
||||||
|
description: 'Provision internet NAT zone on gateway address',
|
||||||
|
resolve: (root) => {
|
||||||
|
return !!root.internet_nat;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
43
triton-graphql/src/schema/types/nic.js
Normal file
43
triton-graphql/src/schema/types/nic.js
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
const {
|
||||||
|
GraphQLBoolean,
|
||||||
|
GraphQLObjectType,
|
||||||
|
GraphQLString
|
||||||
|
} = require('graphql');
|
||||||
|
|
||||||
|
module.exports = new GraphQLObjectType({
|
||||||
|
name: 'NicType',
|
||||||
|
description: 'Logical networks are used both on head nodes and compute nodes, and are associated with physical interfaces by using a system called NIC Tags',
|
||||||
|
fields: {
|
||||||
|
ip: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'NIC\'s IPv4 address'
|
||||||
|
},
|
||||||
|
mac: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'NIC\'s MAC address'
|
||||||
|
},
|
||||||
|
primary: {
|
||||||
|
type: GraphQLBoolean,
|
||||||
|
description: 'Whether this is the instance\'s primary NIC',
|
||||||
|
resolve: (root) => {
|
||||||
|
return root.primary;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
netmask: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'IPv4 netmask'
|
||||||
|
},
|
||||||
|
gateway: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'IPv4 gateway'
|
||||||
|
},
|
||||||
|
state: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'Describes the state of the NIC (e.g. provisioning, running, or stopped)'
|
||||||
|
},
|
||||||
|
network: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'The NIC\'s network id (see ListNetworks)'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
52
triton-graphql/src/schema/types/package.js
Normal file
52
triton-graphql/src/schema/types/package.js
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
const {
|
||||||
|
GraphQLString,
|
||||||
|
GraphQLObjectType,
|
||||||
|
GraphQLInt,
|
||||||
|
GraphQLID
|
||||||
|
} = require('graphql');
|
||||||
|
|
||||||
|
module.exports = new GraphQLObjectType({
|
||||||
|
name: 'PackageType',
|
||||||
|
fields: {
|
||||||
|
id: {
|
||||||
|
type: GraphQLID,
|
||||||
|
description: 'Unique id for this package'
|
||||||
|
},
|
||||||
|
name: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'The "friendly" name for this package'
|
||||||
|
},
|
||||||
|
memory: {
|
||||||
|
type: GraphQLInt,
|
||||||
|
description: 'How much memory will by available (in MiB)'
|
||||||
|
},
|
||||||
|
disk: {
|
||||||
|
type: GraphQLInt,
|
||||||
|
description: 'How much disk space will be available (in MiB)'
|
||||||
|
},
|
||||||
|
swap: {
|
||||||
|
type: GraphQLInt,
|
||||||
|
description: 'How much swap space will be available (in MiB)'
|
||||||
|
},
|
||||||
|
lwps: {
|
||||||
|
type: GraphQLInt,
|
||||||
|
description: 'Maximum number of light-weight processes (threads) allowed'
|
||||||
|
},
|
||||||
|
vcpus: {
|
||||||
|
type: GraphQLInt,
|
||||||
|
description: 'Number of vCPUs for this package'
|
||||||
|
},
|
||||||
|
version: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'The version of this package'
|
||||||
|
},
|
||||||
|
group: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'The group this package belongs to'
|
||||||
|
},
|
||||||
|
description: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'A human-friendly description about this package'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
29
triton-graphql/src/schema/types/policy.js
Normal file
29
triton-graphql/src/schema/types/policy.js
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
const {
|
||||||
|
GraphQLString,
|
||||||
|
GraphQLObjectType,
|
||||||
|
GraphQLList,
|
||||||
|
GraphQLID
|
||||||
|
} = require('graphql');
|
||||||
|
|
||||||
|
module.exports = new GraphQLObjectType({
|
||||||
|
name: 'PolicyType',
|
||||||
|
description: 'Policies are lists of rules that describe access to resources',
|
||||||
|
fields: {
|
||||||
|
id: {
|
||||||
|
type: GraphQLID,
|
||||||
|
description: 'Unique id for this policy'
|
||||||
|
},
|
||||||
|
name: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'The policy name'
|
||||||
|
},
|
||||||
|
rules: {
|
||||||
|
type: new GraphQLList(GraphQLString),
|
||||||
|
description: 'One or more Aperture sentences applying to the policy'
|
||||||
|
},
|
||||||
|
description: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'A description for this policy'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
50
triton-graphql/src/schema/types/role.js
Normal file
50
triton-graphql/src/schema/types/role.js
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
const {
|
||||||
|
GraphQLString,
|
||||||
|
GraphQLObjectType,
|
||||||
|
GraphQLList,
|
||||||
|
GraphQLID
|
||||||
|
} = require('graphql');
|
||||||
|
|
||||||
|
module.exports = new GraphQLObjectType({
|
||||||
|
name: 'RoleType',
|
||||||
|
description: 'Roles are lists of users and policies. Roles describe which users are allowed access according to the policies',
|
||||||
|
fields: {
|
||||||
|
id: {
|
||||||
|
type: GraphQLID,
|
||||||
|
description: 'Unique id for this role'
|
||||||
|
},
|
||||||
|
name: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'The role name'
|
||||||
|
},
|
||||||
|
policies: {
|
||||||
|
type: new GraphQLList(GraphQLString),
|
||||||
|
description: 'This account\'s policies which this role obeys (Optional)'
|
||||||
|
},
|
||||||
|
members: {
|
||||||
|
type: new GraphQLList(GraphQLString),
|
||||||
|
description: 'This account\'s user logins this role applies to (Optional)'
|
||||||
|
},
|
||||||
|
default_members: {
|
||||||
|
type: new GraphQLList(GraphQLString),
|
||||||
|
description: 'This account\'s user logins this role applies to by default (Optional)'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports.tag = new GraphQLObjectType({
|
||||||
|
name: 'RoleTagType',
|
||||||
|
fields: {
|
||||||
|
name: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'Path to the resource'
|
||||||
|
},
|
||||||
|
role_tag: {
|
||||||
|
type: new GraphQLList(GraphQLString),
|
||||||
|
description: 'The role name',
|
||||||
|
resolve: (root) => {
|
||||||
|
return root['role-tag'] || root.role_tag;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
16
triton-graphql/src/schema/types/service.js
Normal file
16
triton-graphql/src/schema/types/service.js
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
const {
|
||||||
|
GraphQLString,
|
||||||
|
GraphQLObjectType
|
||||||
|
} = require('graphql');
|
||||||
|
|
||||||
|
module.exports = new GraphQLObjectType({
|
||||||
|
name: 'ServiceType',
|
||||||
|
fields: {
|
||||||
|
name: {
|
||||||
|
type: GraphQLString
|
||||||
|
},
|
||||||
|
url: {
|
||||||
|
type: GraphQLString
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
20
triton-graphql/src/schema/types/snapshot.js
Normal file
20
triton-graphql/src/schema/types/snapshot.js
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
const {
|
||||||
|
GraphQLString,
|
||||||
|
GraphQLObjectType,
|
||||||
|
GraphQLID
|
||||||
|
} = require('graphql');
|
||||||
|
|
||||||
|
module.exports = new GraphQLObjectType({
|
||||||
|
name: 'SnapshotType',
|
||||||
|
description: 'Policies are lists of rules that describe access to resources',
|
||||||
|
fields: {
|
||||||
|
name: {
|
||||||
|
type: GraphQLID,
|
||||||
|
description: 'The name of this snapshot'
|
||||||
|
},
|
||||||
|
state: {
|
||||||
|
type: GraphQLString,
|
||||||
|
description: 'The current state of the snapshot'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
0
triton-graphql/static/.gitkeep
Normal file
0
triton-graphql/static/.gitkeep
Normal file
Loading…
Reference in New Issue
Block a user