/* * Copyright (c) 2015 Joyent Inc. All rights reserved. * * `triton profiles ...` */ var common = require('./common'); var errors = require('./errors'); var mod_config = require('./config'); var tabula = require('tabula'); var sortDefault = 'name'; var columnsDefault = 'name,curr,account,url'; var columnsDefaultLong = 'name,curr,account,url,insecure,keyId'; function _listProfiles(opts, args, cb) { var columns = columnsDefault; if (opts.o) { columns = opts.o; } else if (opts.long) { columns = columnsDefaultLong; } columns = columns.split(','); var sort = opts.s.split(','); // Load all the profiles. "env" is a special one managed by the CLI. var profiles; try { profiles = mod_config.loadAllProfiles({ configDir: this.tritonapi.config._configDir, log: this.log }); } catch (e) { return cb(e); } // Current profile: Set 'curr' field. Apply CLI overrides. for (i = 0; i < profiles.length; i++) { var profile = profiles[i]; if (profile.name === this.tritonapi.profile.name) { this._applyProfileOverrides(profile); if (opts.json) { profile.curr = true; } else { profile.curr = '*'; // tabular } } else { if (opts.json) { profile.curr = false; } else { profile.curr = ''; // tabular } } } // Display. var i; if (opts.json) { common.jsonStream(profiles); } else { tabula(profiles, { skipHeader: opts.H, columns: columns, sort: sort }); } cb(); } function _currentProfile(opts, args, cb) { var profile = mod_config.loadProfile({ configDir: this.configDir, name: opts.current }); if (this.tritonapi.profile.name === profile.name) { console.log('"%s" is already the current profile', profile.name); return cb(); } mod_config.setConfigVar({ configDir: this.configDir, name: 'profile', value: profile.name }, function (err) { if (err) { return cb(err); } console.log('Switched to "%s" profile', profile.name); cb(); }); } // TODO: finish the implementation //function _addProfile(profile, opts, cb) { //} // //function _editProfile(profile, opts, cb) { //} // //function _deleteProfile(profile, opts, cb) { //} function do_profiles(subcmd, opts, args, cb) { if (opts.help) { this.do_help('help', {}, [subcmd], cb); return; } // Which action? var actions = []; if (opts.add) { actions.push('add'); } if (opts.current) { actions.push('current'); } if (opts.edit) { actions.push('edit'); } if (opts['delete']) { actions.push('delete'); } var action; if (actions.length === 0) { action = 'list'; } else if (actions.length > 1) { return cb(new errors.UsageError( 'only one action option may be used at once')); } else { action = actions[0]; } // Arg count validation. switch (action) { //case 'add': // if (args.length === 1) { // name = args[0]; // } else if (args.length > 1) { // return cb(new errors.UsageError('too many args')); // } // break; case 'list': case 'current': //case 'edit': //case 'delete': if (args.length > 0) { return cb(new errors.UsageError('too many args')); } break; default: throw new Error('unknown action: ' + action); } var func = { list: _listProfiles, current: _currentProfile // TODO: finish the implementation //add: _addProfile, //edit: _editProfile, //'delete': _deleteProfile }[action].bind(this); func(opts, args, cb); } do_profiles.options = [ { names: ['help', 'h'], type: 'bool', help: 'Show this help.' }, { group: 'Action Options' }, { names: ['current', 'c'], type: 'string', helpArg: 'NAME', help: 'Switch to the given profile.' } // TODO: finish the implementation //{ // names: ['add', 'a'], // type: 'bool', // help: 'Add a new profile.' //}, //{ // names: ['edit', 'e'], // type: 'string', // helpArg: 'NAME', // help: 'Edit profile NAME in your $EDITOR.' //}, //{ // names: ['delete', 'd'], // type: 'string', // helpArg: 'NAME', // help: 'Delete profile NAME.' //} ].concat(common.getCliTableOptions({ includeLong: true, sortDefault: sortDefault })); do_profiles.help = [ 'List and update `triton` CLI profiles.', '', 'A profile is a configured Triton CloudAPI endpoint. I.e. the', 'url, account, key, etc. information required to call a CloudAPI.', 'You can then switch between profiles with `triton -p PROFILE`', 'or the TRITON_PROFILE environment variable.', '', 'The "CURR" column indicates which profile is the current one.', '', 'Usage:', ' {{name}} profiles # list profiles', ' {{name}} profiles -c|--current NAME # set NAME as current profile', // TODO: finish the implementation //' {{name}} profiles -a|--add [NAME] # add a new profile', //' {{name}} profiles -e|--edit NAME # edit a profile in $EDITOR', //' {{name}} profiles -d|--delete NAME # delete a profile', '', '{{options}}' ].join('\n'); do_profiles.hidden = true; // TODO: until -a,-e,-d are implemented module.exports = do_profiles;