From 166130c3df354531c0699205d9f2ef21ffd6bed6 Mon Sep 17 00:00:00 2001 From: myarmolinsky Date: Wed, 24 May 2023 14:18:04 -0400 Subject: [PATCH] Add `balena api-keys` command for listing user/fleet API keys Change-type: minor --- completion/_balena | 2 +- completion/balena-completion.bash | 2 +- lib/commands/api-keys/index.ts | 95 +++++++++++++++++++++++++++++++ 3 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 lib/commands/api-keys/index.ts diff --git a/completion/_balena b/completion/_balena index a8792f51..89e25433 100644 --- a/completion/_balena +++ b/completion/_balena @@ -8,7 +8,7 @@ _balena() { local context state line curcontext="$curcontext" # Valid top-level completions - main_commands=( build deploy envs fleets join keys leave login logout logs note orgs preload push releases scan settings ssh support tags tunnel version whoami api-key config device device devices env fleet fleet internal key key local os release release tag util ) + main_commands=( build deploy envs fleets join keys leave login logout logs note orgs preload push releases scan settings ssh support tags tunnel version whoami api-key api-keys config device device devices env fleet fleet internal key key local os release release tag util ) # Sub-completions api_key_cmds=( generate ) config_cmds=( generate inject read reconfigure write ) diff --git a/completion/balena-completion.bash b/completion/balena-completion.bash index 592f75cd..d91c6aba 100644 --- a/completion/balena-completion.bash +++ b/completion/balena-completion.bash @@ -7,7 +7,7 @@ _balena_complete() local cur prev # Valid top-level completions - main_commands="build deploy envs fleets join keys leave login logout logs note orgs preload push releases scan settings ssh support tags tunnel version whoami api-key config device device devices env fleet fleet internal key key local os release release tag util" + main_commands="build deploy envs fleets join keys leave login logout logs note orgs preload push releases scan settings ssh support tags tunnel version whoami api-key api-keys config device device devices env fleet fleet internal key key local os release release tag util" # Sub-completions api_key_cmds="generate" config_cmds="generate inject read reconfigure write" diff --git a/lib/commands/api-keys/index.ts b/lib/commands/api-keys/index.ts new file mode 100644 index 00000000..2383b4e9 --- /dev/null +++ b/lib/commands/api-keys/index.ts @@ -0,0 +1,95 @@ +/** + * @license + * Copyright 2016-2020 Balena Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { flags } from '@oclif/command'; +import Command from '../../command'; +import * as cf from '../../utils/common-flags'; +import { getBalenaSdk, getVisuals, stripIndent } from '../../utils/lazy'; + +interface FlagsDef { + help: void; + user?: void; + fleet?: string; +} + +export default class ApiKeysCmd extends Command { + public static description = stripIndent` + Print a list of balenaCloud API keys. + + Print a list of balenaCloud API keys. + + Print a list of balenaCloud API keys for the current user or for a specific fleet with the \`--fleet\` option. +`; + public static examples = ['$ balena api-keys']; + + public static args = []; + + public static usage = 'api-keys'; + + public static flags: flags.Input = { + help: cf.help, + user: flags.boolean({ + char: 'u', + description: 'show API keys for your user', + }), + fleet: cf.fleet, + }; + + public static authenticated = true; + + public async run() { + const { flags: options } = this.parse(ApiKeysCmd); + + try { + const { getApplication } = await import('../../utils/sdk'); + const actorId = options.fleet + ? ( + await getApplication(getBalenaSdk(), options.fleet, { + $select: 'actor', + }) + ).actor + : await getBalenaSdk().auth.getUserActorId(); + const keys = await getBalenaSdk().pine.get({ + resource: 'api_key', + options: { + $select: ['id', 'created_at', 'name', 'description', 'expiry_date'], + $filter: { + is_of__actor: actorId, + ...(options.user + ? { + name: { + $ne: null, + }, + } + : {}), + }, + $orderby: 'name asc', + }, + }); + const fields = ['id', 'name', 'created_at', 'description', 'expiry_date']; + const _ = await import('lodash'); + console.log( + getVisuals().table.horizontal( + keys.map((key) => _.mapValues(key, (val) => val ?? 'N/a')), + fields, + ), + ); + } catch (e) { + throw e; + } + } +}