diff --git a/package.json b/package.json index c6fcb01..47fe014 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "build": "npm run format && npm run prebuild", "test": "jest --coverage", "coveralls": "coveralls < coverage/lcov.info", - "pack": "npm run build && nexe --verbose -r ./node_modules/@gyselroth/tubee-sdk-node/swagger.yml -i build/main.js -o dist/tubeectl" + "pack": "npm run build && nexe --verbose -r ./node_modules/@gyselroth/tubee-sdk-node/swagger.yml -i build/main.js -o dist/tubectl" }, "repository": { "type": "git", @@ -28,8 +28,7 @@ }, "homepage": "https://github.com/gyselroth/tubee-client-cli#readme", "dependencies": { - "@gyselroth/tubee-sdk-node": "^0.0.16", - "@types/bluebird": "*", + "@gyselroth/tubee-sdk-node": "^0.0.17", "@types/request": "^2.48.1", "JSONStream": "^1.3.5", "bluebird": "^3.5.3", diff --git a/src/main.ts b/src/main.ts index 9d093d8..de6af5d 100644 --- a/src/main.ts +++ b/src/main.ts @@ -28,12 +28,20 @@ Create.factory(root, client); Sync.factory(root, client); commandpost.exec(root, process.argv).catch(err => { - console.log(err.message + '\n'); + if(err.response.body) { + console.log("%s: %s [code: %s]", err.response.body.error, err.response.body.message, err.response.body.code); + } + + if(err.message) { + console.log(err.message + '\n'); + } - if (err.params.params.option) { - console.log(err.params.params.option.command.helpText()); - } else if (err.params.params.origin) { - console.log(err.params.params.origin.command.helpText()); + if(err.params) { + if (err.params.params.option) { + console.log(err.params.params.option.command.helpText()); + } else if (err.params.params.origin) { + console.log(err.params.params.origin.command.helpText()); + } } process.exit(1); diff --git a/src/operations/create.ts b/src/operations/create.ts index 2ed8276..2897493 100644 --- a/src/operations/create.ts +++ b/src/operations/create.ts @@ -9,8 +9,10 @@ import DataObjects from '../resources/data-objects/create'; import Endpoints from '../resources/endpoints/create'; import Jobs from '../resources/jobs/create'; import Workflows from '../resources/workflows/create'; +import Secrets from '../resources/secrets/create'; +import Users from '../resources/users/create'; -const map = [AccessRoles, AccessRules, Mandators, DataTypes, DataObjects, Endpoints, Jobs, Workflows]; +const map = [AccessRoles, AccessRules, Mandators, DataTypes, DataObjects, Endpoints, Jobs, Workflows, Secrets, Users]; export interface CreateOptions { file: string; diff --git a/src/operations/delete.ts b/src/operations/delete.ts index 45b1003..b1b0a96 100644 --- a/src/operations/delete.ts +++ b/src/operations/delete.ts @@ -9,8 +9,10 @@ import DataObjects from '../resources/data-objects/delete'; import Endpoints from '../resources/endpoints/delete'; import Jobs from '../resources/jobs/delete'; import Workflows from '../resources/workflows/delete'; +import Secrets from '../resources/secrets/delete'; +import Users from '../resources/users/delete'; -const map = [AccessRoles, AccessRules, Mandators, DataTypes, DataObjects, Endpoints, Jobs, Workflows]; +const map = [AccessRoles, AccessRules, Mandators, DataTypes, DataObjects, Endpoints, Jobs, Workflows, Secrets, Users]; export interface DeleteOptions {} diff --git a/src/operations/edit.ts b/src/operations/edit.ts index 43ae232..a1bcb5b 100644 --- a/src/operations/edit.ts +++ b/src/operations/edit.ts @@ -9,8 +9,11 @@ import DataObjects from '../resources/data-objects/edit'; import Endpoints from '../resources/endpoints/edit'; import Jobs from '../resources/jobs/edit'; import Workflows from '../resources/workflows/edit'; +import Secrets from '../resources/secrets/edit'; +import Users from '../resources/users/edit'; -const map = [AccessRoles, AccessRules, Mandators, DataTypes, DataObjects, Endpoints, Jobs, Workflows]; + +const map = [AccessRoles, AccessRules, Mandators, DataTypes, DataObjects, Endpoints, Jobs, Workflows, Secrets, Users]; export interface EditOptions { output: string; diff --git a/src/operations/get.ts b/src/operations/get.ts index 7100b37..f3fe06d 100644 --- a/src/operations/get.ts +++ b/src/operations/get.ts @@ -12,6 +12,9 @@ import Jobs from '../resources/jobs/get'; import Processes from '../resources/processes/get'; import Logs from '../resources/logs/get'; import Workflows from '../resources/workflows/get'; +import Secrets from '../resources/secrets/get'; +import Users from '../resources/users/get'; + const map = [ AccessRoles, @@ -25,6 +28,8 @@ const map = [ Processes, Logs, Workflows, + Secrets, + Users ]; export interface GetOptions { diff --git a/src/operations/login.ts b/src/operations/login.ts index 1699339..d250fce 100644 --- a/src/operations/login.ts +++ b/src/operations/login.ts @@ -68,22 +68,16 @@ export default class Login { var client = new api['DefaultApi'](server + '/api/v1'); var auth = new api.HttpBasicAuth(); auth.username = config.username || 'admin'; - auth.password = config.password; + auth.password = opts.password[0]; client.setDefaultAuthentication(auth); + var result = await client.root(); - try { - var result = await client.root(); - - if (result.response.body.name !== 'tubee') { - throw new Error('server is not a tubee server'); - } - - console.log('Successfully connected to server %s', server); - } catch (Error) { - console.log('Failed connect to server %s', server); - return; + if (result.response.body.name !== 'tubee') { + throw new Error('server is not a tubee server'); } + console.log('Successfully connected to server %s', server); + var writePath = optparse.parsedOpts.config[0] || configPath; var configDir = path.dirname(writePath); if (!fs.existsSync(configDir)) { diff --git a/src/resources/abstract.create.ts b/src/resources/abstract.create.ts index bbe844b..278503f 100644 --- a/src/resources/abstract.create.ts +++ b/src/resources/abstract.create.ts @@ -58,7 +58,7 @@ export default abstract class AbstractCreate extends AbstractOperation { if(opts.fromTemplate[0] !== '') { resourceType = opts.fromTemplate[0]; } -console.log(opts); + SwaggerParser.validate(specPath, async (err, api) => { if (err) { console.error('Failed to retrieve the resource specification', err); diff --git a/src/resources/abstract.edit.ts b/src/resources/abstract.edit.ts index 9946da0..b90da13 100644 --- a/src/resources/abstract.edit.ts +++ b/src/resources/abstract.edit.ts @@ -152,8 +152,6 @@ export default abstract class AbstractEdit extends AbstractOperation { * Get resource data */ protected getData(resource) { - return { - data: resource.data, - }; + return resource; } } diff --git a/src/resources/abstract.get.ts b/src/resources/abstract.get.ts index c3de0fc..60f2132 100644 --- a/src/resources/abstract.get.ts +++ b/src/resources/abstract.get.ts @@ -62,7 +62,6 @@ export default abstract class AbstractGet extends AbstractOperation { * Execute */ public async getObjects(response, opts, fields = ['Name', 'Version', 'Changed', 'Created'], callback = null) { -console.log(response.response.toJSON().body); if (opts.diff[0]) { return this.compare(response.response.toJSON().body, opts); } diff --git a/src/resources/abstract.operation.ts b/src/resources/abstract.operation.ts index 9c8732c..7fa5aa2 100644 --- a/src/resources/abstract.operation.ts +++ b/src/resources/abstract.operation.ts @@ -28,7 +28,7 @@ export default abstract class AbstractOperation { } } } - + query = JSON.stringify(query); } diff --git a/src/resources/abstract.sync.ts b/src/resources/abstract.sync.ts index 4512cc4..bf96f98 100644 --- a/src/resources/abstract.sync.ts +++ b/src/resources/abstract.sync.ts @@ -28,9 +28,7 @@ export default abstract class AbstractSync { resource.data.loadbalance = false; resource.data.ignore = !opts.abortOnError; resource.data.log_level = opts.level[0]; -console.log(resource); var result = await api.addProcess(resource); -console.log(result); this.sync(result, opts); } diff --git a/src/resources/data-objects/edit.ts b/src/resources/data-objects/edit.ts index 9fea6b0..3b31698 100644 --- a/src/resources/data-objects/edit.ts +++ b/src/resources/data-objects/edit.ts @@ -29,9 +29,7 @@ export default class Edit extends AbstractEdit { } this.editObjects(response, opts, async (name, patch) => { - console.log(name, patch); - var r = await api.updateObject(args.mandator, args.datatype, name, patch); - console.log(r); + return await api.updateObject(args.mandator, args.datatype, name, patch); }); } } diff --git a/src/resources/endpoint-objects/get.ts b/src/resources/endpoint-objects/get.ts index 983a7ce..76f211c 100644 --- a/src/resources/endpoint-objects/get.ts +++ b/src/resources/endpoint-objects/get.ts @@ -38,7 +38,7 @@ export default class Get extends AbstractGet { args.endpoint, ...this.getQueryOptions(opts, args), ); - console.log(response); + this.getObjects(response, opts); } } diff --git a/src/resources/endpoints/create.ts b/src/resources/endpoints/create.ts index 21d0456..10eee8b 100644 --- a/src/resources/endpoints/create.ts +++ b/src/resources/endpoints/create.ts @@ -30,9 +30,7 @@ export default class Create extends AbstractCreate { console.log(resource); console.log('add'); - var result = await api.addEndpoint(mandator, datatype, resource); - console.log(result); - return result; + return await api.addEndpoint(mandator, datatype, resource); }); } } diff --git a/src/resources/endpoints/edit.ts b/src/resources/endpoints/edit.ts index 2231cd1..0f0af1d 100644 --- a/src/resources/endpoints/edit.ts +++ b/src/resources/endpoints/edit.ts @@ -29,9 +29,7 @@ export default class Edit extends AbstractEdit { } this.editObjects(response, opts, async (name, patch) => { - console.log(patch); - var resul = await api.updateEndpoint(args.mandator, args.datatype, name, patch); - console.log(resul); + return await api.updateEndpoint(args.mandator, args.datatype, name, patch); }); } } diff --git a/src/resources/secrets/create.ts b/src/resources/secrets/create.ts new file mode 100644 index 0000000..73a7208 --- /dev/null +++ b/src/resources/secrets/create.ts @@ -0,0 +1,29 @@ +import { CreateOptions, CreateArgs } from '../../operations/create'; +import AbstractCreate from '../abstract.create'; + +/** + * Create resources + */ +export default class Create extends AbstractCreate { + /** + * Apply cli options + */ + public applyOptions() { + return this.optparse + .subCommand('secrets [name]') + .alias('ar') + .description('Create new secrets') + .action(this.execute.bind(this)); + } + + /** + * Execute + */ + public async execute(opts, args, rest) { + var api = await this.client.factory('Secrets', this.optparse.parent.parsedOpts); + + this.createObjects('access-role', args, opts, async resource => { + return await api.addSecret(resource); + }); + } +} diff --git a/src/resources/secrets/delete.ts b/src/resources/secrets/delete.ts new file mode 100644 index 0000000..e851472 --- /dev/null +++ b/src/resources/secrets/delete.ts @@ -0,0 +1,27 @@ +import { DeleteOptions, DeleteArgs } from '../../operations/delete'; +import AbstractDelete from '../abstract.delete'; + +/** + * Delete resources + */ +export default class Delete extends AbstractDelete { + /** + * Apply cli options + */ + public applyOptions() { + return this.optparse + .subCommand('secrets ') + .alias('ar') + .description('Delete secret') + .action(this.execute.bind(this)); + } + + /** + * Execute + */ + public async execute(opts, args, rest) { + var api = await this.client.factory('Secrets', this.optparse.parent.parsedOpts); + await api.deleteSecret(args.name); + console.log('resource %s has been deleted', args.name); + } +} diff --git a/src/resources/secrets/edit.ts b/src/resources/secrets/edit.ts new file mode 100644 index 0000000..394ffc7 --- /dev/null +++ b/src/resources/secrets/edit.ts @@ -0,0 +1,35 @@ +import { EditOptions, EditArgs } from '../../operations/edit'; +import AbstractEdit from '../abstract.edit'; + +/** + * Edit resources + */ +export default class Edit extends AbstractEdit { + /** + * Apply cli options + */ + public applyOptions() { + return this.optparse + .subCommand('secrets [name]') + .alias('ar') + .description('Edit secrets') + .action(this.execute.bind(this)); + } + + /** + * Execute + */ + public async execute(opts, args, rest) { + var api = await this.client.factory('Secrets', this.optparse.parent.parsedOpts); + + if (args.name) { + var response = await api.getSecret(args.name, this.getFields(opts)); + } else { + var response = await api.getSecrets(...this.getQueryOptions(opts, args)); + } + + this.editObjects(response, opts, async (name, patch) => { + return await api.updateSecret(name, patch); + }); + } +} diff --git a/src/resources/secrets/get.ts b/src/resources/secrets/get.ts new file mode 100644 index 0000000..68e43ba --- /dev/null +++ b/src/resources/secrets/get.ts @@ -0,0 +1,43 @@ +import { GetOptions, GetArgs } from '../../operations/get'; +import AbstractGet from '../abstract.get'; + +/** + * * Edit resources + * */ +export default class Get extends AbstractGet { + /** + * Apply cli options + */ + public applyOptions() { + return this.optparse + .subCommand('secrets [name]') + .alias('ar') + .description('Get secrets') + .action(this.execute.bind(this)); + } + + /** + * Execute + */ + public async execute(opts, args, rest) { + var category = await this.client.factory('Secrets', this.optparse.parent.parsedOpts); + + if (opts.watch) { + if (args.name) { + var request = category.watchSecrets(...this.getQueryOptions(opts, args)); + this.watchObjects(request, opts); + } else { + var request = category.watchSecrets(...this.getQueryOptions(opts, args)); + this.watchObjects(request, opts); + } + } else { + if (args.name) { + var response = await category.getSecret(args.name, ...this.getFields(opts)); + this.getObjects(response, opts); + } else { + var response = await category.getSecrets(...this.getQueryOptions(opts, args)); + this.getObjects(response, opts); + } + } + } +} diff --git a/src/resources/users/create.ts b/src/resources/users/create.ts new file mode 100644 index 0000000..0495574 --- /dev/null +++ b/src/resources/users/create.ts @@ -0,0 +1,29 @@ +import { CreateOptions, CreateArgs } from '../../operations/create'; +import AbstractCreate from '../abstract.create'; + +/** + * Create resources + */ +export default class Create extends AbstractCreate { + /** + * Apply cli options + */ + public applyOptions() { + return this.optparse + .subCommand('users [name]') + .alias('ar') + .description('Create new users') + .action(this.execute.bind(this)); + } + + /** + * Execute + */ + public async execute(opts, args, rest) { + var api = await this.client.factory('Users', this.optparse.parent.parsedOpts); + + this.createObjects('user', args, opts, async resource => { + return await api.addUser(resource); + }); + } +} diff --git a/src/resources/users/delete.ts b/src/resources/users/delete.ts new file mode 100644 index 0000000..4860c92 --- /dev/null +++ b/src/resources/users/delete.ts @@ -0,0 +1,27 @@ +import { DeleteOptions, DeleteArgs } from '../../operations/delete'; +import AbstractDelete from '../abstract.delete'; + +/** + * Delete resources + */ +export default class Delete extends AbstractDelete { + /** + * Apply cli options + */ + public applyOptions() { + return this.optparse + .subCommand('users ') + .alias('ar') + .description('Delete access role') + .action(this.execute.bind(this)); + } + + /** + * Execute + */ + public async execute(opts, args, rest) { + var api = await this.client.factory('Users', this.optparse.parent.parsedOpts); + await api.deleteUser(args.name); + console.log('resource %s has been deleted', args.name); + } +} diff --git a/src/resources/users/edit.ts b/src/resources/users/edit.ts new file mode 100644 index 0000000..a9719f8 --- /dev/null +++ b/src/resources/users/edit.ts @@ -0,0 +1,35 @@ +import { EditOptions, EditArgs } from '../../operations/edit'; +import AbstractEdit from '../abstract.edit'; + +/** + * Edit resources + */ +export default class Edit extends AbstractEdit { + /** + * Apply cli options + */ + public applyOptions() { + return this.optparse + .subCommand('users [name]') + .alias('ar') + .description('Edit users') + .action(this.execute.bind(this)); + } + + /** + * Execute + */ + public async execute(opts, args, rest) { + var api = await this.client.factory('Users', this.optparse.parent.parsedOpts); + + if (args.name) { + var response = await api.getUser(args.name, this.getFields(opts)); + } else { + var response = await api.getUsers(...this.getQueryOptions(opts, args)); + } + + this.editObjects(response, opts, async (name, patch) => { + return await api.updateUser(name, patch); + }); + } +} diff --git a/src/resources/users/get.ts b/src/resources/users/get.ts new file mode 100644 index 0000000..3b23c52 --- /dev/null +++ b/src/resources/users/get.ts @@ -0,0 +1,43 @@ +import { GetOptions, GetArgs } from '../../operations/get'; +import AbstractGet from '../abstract.get'; + +/** + * * Edit resources + * */ +export default class Get extends AbstractGet { + /** + * Apply cli options + */ + public applyOptions() { + return this.optparse + .subCommand('users [name]') + .alias('ar') + .description('Get users') + .action(this.execute.bind(this)); + } + + /** + * Execute + */ + public async execute(opts, args, rest) { + var category = await this.client.factory('Users', this.optparse.parent.parsedOpts); + + if (opts.watch) { + if (args.name) { + var request = category.watchUsers(...this.getQueryOptions(opts, args)); + this.watchObjects(request, opts); + } else { + var request = category.watchUsers(...this.getQueryOptions(opts, args)); + this.watchObjects(request, opts); + } + } else { + if (args.name) { + var response = await category.getUser(args.name, ...this.getFields(opts)); + this.getObjects(response, opts); + } else { + var response = await category.getUsers(...this.getQueryOptions(opts, args)); + this.getObjects(response, opts); + } + } + } +} diff --git a/src/resources/workflows/create.ts b/src/resources/workflows/create.ts index cface41..e7df28e 100644 --- a/src/resources/workflows/create.ts +++ b/src/resources/workflows/create.ts @@ -23,18 +23,13 @@ export default class Create extends AbstractCreate { var api = await this.client.factory('Workflows', this.optparse.parent.parsedOpts); this.createObjects('workflow', args, opts, async resource => { - console.log(resource); - console.log('1'); let mandator = resource.mandator; delete resource.mandator; let datatype = resource.datatype; delete resource.datatype; let endpoint = resource.endpoint; delete resource.endpoint; - console.log('ADD'); - var res = await api.addWorkflow(mandator, datatype, endpoint, resource); - console.log(res); - return res; + return await api.addWorkflow(mandator, datatype, endpoint, resource); }); } } diff --git a/src/resources/workflows/edit.ts b/src/resources/workflows/edit.ts index 2fefda9..700fef1 100644 --- a/src/resources/workflows/edit.ts +++ b/src/resources/workflows/edit.ts @@ -40,9 +40,7 @@ export default class Edit extends AbstractEdit { } this.editObjects(response, opts, async (name, patch) => { - console.log(patch); - var result = await api.updateWorkflow(args.mandator, args.datatype, args.endpoint, name, patch); - console.log(result); + return await api.updateWorkflow(args.mandator, args.datatype, args.endpoint, name, patch); }); } }