clever-tools 3.7.0 → 3.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/bin/clever.js +103 -51
- package/package.json +47 -47
- package/src/command-options.js +19 -0
- package/src/commands/accesslogs.js +114 -34
- package/src/commands/activity.js +64 -12
- package/src/commands/addon.js +152 -57
- package/src/commands/applications.js +83 -1
- package/src/commands/cancel-deploy.js +3 -3
- package/src/commands/config.js +6 -7
- package/src/commands/console.js +16 -4
- package/src/commands/delete.js +16 -6
- package/src/commands/deploy.js +9 -6
- package/src/commands/diag.js +68 -28
- package/src/commands/domain.js +13 -13
- package/src/commands/drain.js +42 -27
- package/src/commands/env.js +53 -24
- package/src/commands/logs.js +3 -3
- package/src/commands/notify-email.js +33 -18
- package/src/commands/open.js +3 -3
- package/src/commands/profile.js +29 -9
- package/src/commands/published-config.js +26 -15
- package/src/commands/restart.js +12 -5
- package/src/commands/scale.js +2 -3
- package/src/commands/service.js +42 -15
- package/src/commands/ssh.js +3 -3
- package/src/commands/status.js +72 -46
- package/src/commands/stop.js +3 -3
- package/src/commands/tcp-redirs.js +54 -18
- package/src/commands/webhooks.js +28 -13
- package/src/logger.js +9 -6
- package/src/models/app_configuration.js +11 -3
- package/src/models/application.js +106 -7
- package/src/models/exit-strategy-option.js +24 -0
- package/src/models/json-array.js +28 -0
- package/src/models/log-v4.js +9 -29
- package/src/models/log.js +9 -2
- package/src/models/namespaces.js +20 -0
- package/src/models/organisation.js +0 -20
- package/src/models/utils.js +8 -1
- package/src/models/accesslogs.js +0 -54
package/src/commands/config.js
CHANGED
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
const application = require('@clevercloud/client/cjs/api/v2/application.js');
|
|
4
4
|
|
|
5
|
-
const AppConfig = require('../models/app_configuration.js');
|
|
6
5
|
const Application = require('../models/application.js');
|
|
7
6
|
const ApplicationConfiguration = require('../models/application_configuration.js');
|
|
8
7
|
|
|
@@ -10,8 +9,8 @@ const { sendToApi } = require('../models/send-to-api.js');
|
|
|
10
9
|
|
|
11
10
|
async function get (params) {
|
|
12
11
|
const [configurationName] = params.args;
|
|
13
|
-
const { alias } = params.options;
|
|
14
|
-
const { ownerId, appId } = await
|
|
12
|
+
const { alias, app: appIdOrName } = params.options;
|
|
13
|
+
const { ownerId, appId } = await Application.resolveId(appIdOrName, alias);
|
|
15
14
|
const app = await Application.get(ownerId, appId);
|
|
16
15
|
|
|
17
16
|
if (configurationName == null) {
|
|
@@ -24,8 +23,8 @@ async function get (params) {
|
|
|
24
23
|
|
|
25
24
|
async function set (params) {
|
|
26
25
|
const [configurationName, configurationValue] = params.args;
|
|
27
|
-
const { alias } = params.options;
|
|
28
|
-
const { ownerId, appId } = await
|
|
26
|
+
const { alias, app: appIdOrName } = params.options;
|
|
27
|
+
const { ownerId, appId } = await Application.resolveId(appIdOrName, alias);
|
|
29
28
|
const config = ApplicationConfiguration.getById(configurationName);
|
|
30
29
|
|
|
31
30
|
if (config != null) {
|
|
@@ -36,8 +35,8 @@ async function set (params) {
|
|
|
36
35
|
}
|
|
37
36
|
|
|
38
37
|
async function update (params) {
|
|
39
|
-
const { alias } = params.options;
|
|
40
|
-
const { ownerId, appId } = await
|
|
38
|
+
const { alias, app: appIdOrName } = params.options;
|
|
39
|
+
const { ownerId, appId } = await Application.resolveId(appIdOrName, alias);
|
|
41
40
|
const options = ApplicationConfiguration.parseOptions(params.options);
|
|
42
41
|
|
|
43
42
|
if (Object.keys(options).length === 0) {
|
package/src/commands/console.js
CHANGED
|
@@ -1,18 +1,30 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
const Application = require('../models/application.js');
|
|
3
4
|
const AppConfig = require('../models/app_configuration.js');
|
|
4
5
|
const Logger = require('../logger.js');
|
|
5
6
|
const openPage = require('open');
|
|
6
7
|
|
|
7
8
|
async function openConsole (params) {
|
|
8
|
-
const { alias } = params.options;
|
|
9
|
+
const { alias, app: appIdOrName } = params.options;
|
|
9
10
|
|
|
10
|
-
const
|
|
11
|
+
const baseUrl = 'https://console.clever-cloud.com';
|
|
11
12
|
|
|
12
|
-
|
|
13
|
+
const { apps } = await AppConfig.loadApplicationConf();
|
|
14
|
+
// If no app is linked or asked, open the Console without any context
|
|
15
|
+
if (apps.length === 0 && !appIdOrName) {
|
|
16
|
+
Logger.println('Opening the Console in your browser');
|
|
17
|
+
await openPage(baseUrl, { wait: false });
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
13
20
|
|
|
21
|
+
const { ownerId, appId } = await Application.resolveId(appIdOrName, alias);
|
|
14
22
|
const prefixPath = (ownerId.startsWith('user_')) ? 'users/me' : `organisations/${ownerId}`;
|
|
15
|
-
const url =
|
|
23
|
+
const url = `${baseUrl}/${prefixPath}/applications/${appId}`;
|
|
24
|
+
|
|
25
|
+
Logger.debug(`URL: ${url}`);
|
|
26
|
+
Logger.println(`Opening the Console in your browser for application ${appId}`);
|
|
27
|
+
|
|
16
28
|
await openPage(url, { wait: false });
|
|
17
29
|
}
|
|
18
30
|
|
package/src/commands/delete.js
CHANGED
|
@@ -5,13 +5,23 @@ const Application = require('../models/application.js');
|
|
|
5
5
|
const Logger = require('../logger.js');
|
|
6
6
|
|
|
7
7
|
async function deleteApp (params) {
|
|
8
|
-
const { alias, yes: skipConfirmation } = params.options;
|
|
9
|
-
const
|
|
8
|
+
const { alias, app: appIdOrName, yes: skipConfirmation } = params.options;
|
|
9
|
+
const { ownerId, appId } = await Application.resolveId(appIdOrName, alias);
|
|
10
10
|
|
|
11
|
-
await Application.
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
const app = await Application.get(ownerId, appId);
|
|
12
|
+
if (app == null) {
|
|
13
|
+
Logger.println('The application doesn\'t exist');
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
// delete app
|
|
17
|
+
await Application.deleteApp(app, skipConfirmation);
|
|
18
|
+
Logger.println('The application has been deleted');
|
|
19
|
+
// unlink app
|
|
20
|
+
const wasUnlinked = await AppConfig.removeLinkedApplication({ appId, alias });
|
|
21
|
+
if (wasUnlinked) {
|
|
22
|
+
Logger.println('The application has been unlinked');
|
|
23
|
+
}
|
|
24
|
+
}
|
|
15
25
|
};
|
|
16
26
|
|
|
17
27
|
module.exports = { deleteApp };
|
package/src/commands/deploy.js
CHANGED
|
@@ -9,11 +9,14 @@ const Log = require('../models/log-v4.js');
|
|
|
9
9
|
const Logger = require('../logger.js');
|
|
10
10
|
const { getAllDeployments } = require('@clevercloud/client/cjs/api/v2/application.js');
|
|
11
11
|
const { sendToApi } = require('../models/send-to-api.js');
|
|
12
|
+
const ExitStrategy = require('../models/exit-strategy-option.js');
|
|
12
13
|
|
|
13
14
|
// Once the API call to redeploy() has been triggered successfully,
|
|
14
15
|
// the rest (waiting for deployment state to evolve and displaying logs) is done with auto retry (resilient to network failures)
|
|
15
16
|
async function deploy (params) {
|
|
16
|
-
const { alias, branch: branchName, tag: tagName, quiet, force, follow, 'same-commit-policy': sameCommitPolicy } = params.options;
|
|
17
|
+
const { alias, branch: branchName, tag: tagName, quiet, force, follow, 'same-commit-policy': sameCommitPolicy, 'exit-on': exitOnDeploy } = params.options;
|
|
18
|
+
|
|
19
|
+
const exitStrategy = ExitStrategy.get(follow, exitOnDeploy);
|
|
17
20
|
|
|
18
21
|
const appData = await AppConfig.getAppDetails({ alias });
|
|
19
22
|
const { ownerId, appId } = appData;
|
|
@@ -36,9 +39,9 @@ async function deploy (params) {
|
|
|
36
39
|
Logger.println(`The clever-cloud application is up-to-date (${colors.green(remoteHeadCommitId)})`);
|
|
37
40
|
return;
|
|
38
41
|
case 'restart':
|
|
39
|
-
return restartOnSameCommit(ownerId, appId, commitIdToPush, quiet,
|
|
42
|
+
return restartOnSameCommit(ownerId, appId, commitIdToPush, quiet, false, exitStrategy);
|
|
40
43
|
case 'rebuild':
|
|
41
|
-
return restartOnSameCommit(ownerId, appId, commitIdToPush, quiet,
|
|
44
|
+
return restartOnSameCommit(ownerId, appId, commitIdToPush, quiet, true, exitStrategy);
|
|
42
45
|
case 'error':
|
|
43
46
|
default: {
|
|
44
47
|
const upToDateMessage = `The clever-cloud application is up-to-date (${colors.green(remoteHeadCommitId)}).\nYou can set a policy with 'same-commit-policy' to handle differently when remote HEAD has the same commit as the one to push.\nOr try this command to restart the application:`;
|
|
@@ -79,12 +82,12 @@ async function deploy (params) {
|
|
|
79
82
|
});
|
|
80
83
|
Logger.println(colors.bold.green('Your source code has been pushed to Clever Cloud.'));
|
|
81
84
|
|
|
82
|
-
return Log.watchDeploymentAndDisplayLogs({ ownerId, appId, commitId: commitIdToPush, knownDeployments, quiet,
|
|
85
|
+
return Log.watchDeploymentAndDisplayLogs({ ownerId, appId, commitId: commitIdToPush, knownDeployments, quiet, exitStrategy });
|
|
83
86
|
}
|
|
84
87
|
|
|
85
|
-
async function restartOnSameCommit (ownerId, appId, commitIdToPush, quiet,
|
|
88
|
+
async function restartOnSameCommit (ownerId, appId, commitIdToPush, quiet, withoutCache, exitStrategy) {
|
|
86
89
|
const restart = await Application.redeploy(ownerId, appId, commitIdToPush, withoutCache);
|
|
87
|
-
return Log.watchDeploymentAndDisplayLogs({ ownerId, appId, deploymentId: restart.deploymentId, quiet,
|
|
90
|
+
return Log.watchDeploymentAndDisplayLogs({ ownerId, appId, deploymentId: restart.deploymentId, quiet, exitStrategy });
|
|
88
91
|
}
|
|
89
92
|
|
|
90
93
|
async function getBranchToDeploy (branchName, tagName) {
|
package/src/commands/diag.js
CHANGED
|
@@ -10,47 +10,87 @@ const pkg = require('../../package.json');
|
|
|
10
10
|
const User = require('../models/user.js');
|
|
11
11
|
const { conf, loadOAuthConf } = require('../models/configuration.js');
|
|
12
12
|
|
|
13
|
-
async function diag () {
|
|
13
|
+
async function diag (params) {
|
|
14
|
+
const { format } = params.options;
|
|
14
15
|
|
|
16
|
+
/** @type {string} */
|
|
15
17
|
const userId = await User.getCurrentId().catch(() => null);
|
|
16
18
|
const authDetails = await loadOAuthConf();
|
|
17
19
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
+
function getAuthState () {
|
|
21
|
+
if (authDetails.token == null) {
|
|
22
|
+
return 'not connected';
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
if (userId == null) {
|
|
26
|
+
return 'authentication failed';
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return 'authenticated';
|
|
30
|
+
}
|
|
20
31
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
32
|
+
const formattedDiag = {
|
|
33
|
+
version: pkg.version,
|
|
34
|
+
nodeVersion: process.version,
|
|
35
|
+
platform: os.platform(),
|
|
36
|
+
release: os.release(),
|
|
37
|
+
arch: process.arch,
|
|
38
|
+
shell: process.env.SHELL,
|
|
39
|
+
isPackaged: process.pkg != null,
|
|
40
|
+
execPath: process.execPath,
|
|
41
|
+
configFile: conf.CONFIGURATION_FILE,
|
|
42
|
+
authSource: authDetails.source,
|
|
43
|
+
oAuthToken: authDetails.token,
|
|
44
|
+
authState: getAuthState(),
|
|
45
|
+
userId,
|
|
46
|
+
};
|
|
24
47
|
|
|
25
|
-
|
|
26
|
-
|
|
48
|
+
const linuxInfos = await getLinuxInfos()
|
|
49
|
+
.then(({ pretty_name, name, id }) => pretty_name || name || id)
|
|
50
|
+
.catch(() => null);
|
|
27
51
|
if (linuxInfos != null) {
|
|
28
|
-
|
|
52
|
+
formattedDiag.linuxInfos = linuxInfos;
|
|
29
53
|
}
|
|
30
54
|
|
|
31
|
-
|
|
55
|
+
switch (format) {
|
|
56
|
+
case 'json': {
|
|
57
|
+
Logger.printJson(formattedDiag);
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
case 'human':
|
|
61
|
+
default: {
|
|
62
|
+
Logger.println('clever-tools ' + colors.green(formattedDiag.version));
|
|
63
|
+
Logger.println('Node.js ' + colors.green(formattedDiag.nodeVersion));
|
|
64
|
+
Logger.println('Platform ' + colors.green(formattedDiag.platform));
|
|
65
|
+
Logger.println('Release ' + colors.green(formattedDiag.release));
|
|
66
|
+
Logger.println('Architecture ' + colors.green(formattedDiag.arch));
|
|
67
|
+
if (formattedDiag.linuxInfos != null) {
|
|
68
|
+
Logger.println('Linux ' + colors.green(formattedDiag.linuxInfos));
|
|
69
|
+
}
|
|
70
|
+
Logger.println('Shell ' + colors.green(formattedDiag.shell));
|
|
71
|
+
Logger.println('Packaged ' + colors.green(formattedDiag.isPackaged));
|
|
72
|
+
Logger.println('Exec path ' + colors.green(formattedDiag.execPath));
|
|
73
|
+
Logger.println('Config file ' + colors.green(formattedDiag.configFile));
|
|
32
74
|
|
|
33
|
-
|
|
34
|
-
Logger.println('Packaged ' + colors.green(isPackaged));
|
|
35
|
-
Logger.println('Exec path ' + colors.green(process.execPath));
|
|
36
|
-
Logger.println('Config file ' + colors.green(conf.CONFIGURATION_FILE));
|
|
37
|
-
Logger.println('Auth source ' + colors.green(authDetails.source));
|
|
75
|
+
Logger.println('Auth source ' + colors.green(formattedDiag.authSource));
|
|
38
76
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
: colors.red('(none)');
|
|
42
|
-
Logger.println('oAuth token ' + oauthToken);
|
|
77
|
+
const token = formattedDiag.oAuthToken == null ? colors.red('(none)') : colors.green(formattedDiag.oAuthToken);
|
|
78
|
+
Logger.println('oAuth token ' + token);
|
|
43
79
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
80
|
+
switch (formattedDiag.authState) {
|
|
81
|
+
case 'authenticated': {
|
|
82
|
+
Logger.println('User ID ' + colors.green(formattedDiag.userId));
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
case 'authentication failed': {
|
|
86
|
+
Logger.println('User ID ' + colors.red('Authentication failed'));
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
case 'not connected': {
|
|
90
|
+
Logger.println('User ID ' + colors.red('Not connected'));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
47
93
|
}
|
|
48
|
-
else {
|
|
49
|
-
Logger.println('User ID ' + colors.red('Authentication failed'));
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
else {
|
|
53
|
-
Logger.println('User ID ' + colors.red('Not connected'));
|
|
54
94
|
}
|
|
55
95
|
}
|
|
56
96
|
|
package/src/commands/domain.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
const
|
|
3
|
+
const Application = require('../models/application.js');
|
|
4
4
|
const Logger = require('../logger.js');
|
|
5
5
|
const {
|
|
6
6
|
get: getApp,
|
|
@@ -26,8 +26,8 @@ function getFavouriteDomain ({ ownerId, appId }) {
|
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
async function list (params) {
|
|
29
|
-
const { alias } = params.options;
|
|
30
|
-
const { ownerId, appId } = await
|
|
29
|
+
const { alias, app: appIdOrName } = params.options;
|
|
30
|
+
const { ownerId, appId } = await Application.resolveId(appIdOrName, alias);
|
|
31
31
|
|
|
32
32
|
const app = await getApp({ id: ownerId, appId }).then(sendToApi);
|
|
33
33
|
const favouriteDomain = await getFavouriteDomain({ ownerId, appId });
|
|
@@ -41,8 +41,8 @@ async function list (params) {
|
|
|
41
41
|
|
|
42
42
|
async function add (params) {
|
|
43
43
|
const [fqdn] = params.args;
|
|
44
|
-
const { alias } = params.options;
|
|
45
|
-
const { ownerId, appId } = await
|
|
44
|
+
const { alias, app: appIdOrName } = params.options;
|
|
45
|
+
const { ownerId, appId } = await Application.resolveId(appIdOrName, alias);
|
|
46
46
|
const encodedFqdn = encodeURIComponent(fqdn);
|
|
47
47
|
|
|
48
48
|
await addDomain({ id: ownerId, appId, domain: encodedFqdn }).then(sendToApi);
|
|
@@ -50,8 +50,8 @@ async function add (params) {
|
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
async function getFavourite (params) {
|
|
53
|
-
const { alias } = params.options;
|
|
54
|
-
const { ownerId, appId } = await
|
|
53
|
+
const { alias, app: appIdOrName } = params.options;
|
|
54
|
+
const { ownerId, appId } = await Application.resolveId(appIdOrName, alias);
|
|
55
55
|
|
|
56
56
|
const favouriteDomain = await getFavouriteDomain({ ownerId, appId });
|
|
57
57
|
|
|
@@ -64,16 +64,16 @@ async function getFavourite (params) {
|
|
|
64
64
|
|
|
65
65
|
async function setFavourite (params) {
|
|
66
66
|
const [fqdn] = params.args;
|
|
67
|
-
const { alias } = params.options;
|
|
68
|
-
const { ownerId, appId } = await
|
|
67
|
+
const { alias, app: appIdOrName } = params.options;
|
|
68
|
+
const { ownerId, appId } = await Application.resolveId(appIdOrName, alias);
|
|
69
69
|
|
|
70
70
|
await markFavouriteDomain({ id: ownerId, appId }, { fqdn }).then(sendToApi);
|
|
71
71
|
Logger.println('Your favourite domain has been successfully set');
|
|
72
72
|
}
|
|
73
73
|
|
|
74
74
|
async function unsetFavourite (params) {
|
|
75
|
-
const { alias } = params.options;
|
|
76
|
-
const { ownerId, appId } = await
|
|
75
|
+
const { alias, app: appIdOrName } = params.options;
|
|
76
|
+
const { ownerId, appId } = await Application.resolveId(appIdOrName, alias);
|
|
77
77
|
|
|
78
78
|
await unmarkFavouriteDomain({ id: ownerId, appId }).then(sendToApi);
|
|
79
79
|
Logger.println('Favourite domain has been successfully unset');
|
|
@@ -81,8 +81,8 @@ async function unsetFavourite (params) {
|
|
|
81
81
|
|
|
82
82
|
async function rm (params) {
|
|
83
83
|
const [fqdn] = params.args;
|
|
84
|
-
const { alias } = params.options;
|
|
85
|
-
const { ownerId, appId } = await
|
|
84
|
+
const { alias, app: appIdOrName } = params.options;
|
|
85
|
+
const { ownerId, appId } = await Application.resolveId(appIdOrName, alias);
|
|
86
86
|
const encodedFqdn = encodeURIComponent(fqdn);
|
|
87
87
|
|
|
88
88
|
await removeDomain({ id: ownerId, appId, domain: encodedFqdn }).then(sendToApi);
|
package/src/commands/drain.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
const
|
|
3
|
+
const Application = require('../models/application.js');
|
|
4
4
|
const { createDrainBody } = require('../models/drain.js');
|
|
5
5
|
const Logger = require('../logger.js');
|
|
6
6
|
|
|
@@ -8,44 +8,59 @@ const { getDrains, createDrain, deleteDrain, updateDrainState } = require('@clev
|
|
|
8
8
|
const { sendToApi } = require('../models/send-to-api.js');
|
|
9
9
|
|
|
10
10
|
// TODO: This could be useful in other commands
|
|
11
|
-
async function getAppOrAddonId ({ alias, addonId }) {
|
|
11
|
+
async function getAppOrAddonId ({ alias, appIdOrName, addonId }) {
|
|
12
12
|
return (addonId != null)
|
|
13
13
|
? addonId
|
|
14
|
-
:
|
|
14
|
+
: await Application.resolveId(appIdOrName, alias).then(({ appId }) => appId);
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
async function list (params) {
|
|
18
|
-
const { alias, addon: addonId } = params.options;
|
|
18
|
+
const { alias, app: appIdOrName, addon: addonId, format } = params.options;
|
|
19
19
|
|
|
20
|
-
const appIdOrAddonId = await getAppOrAddonId({ alias, addonId });
|
|
20
|
+
const appIdOrAddonId = await getAppOrAddonId({ alias, appIdOrName, addonId });
|
|
21
21
|
const drains = await getDrains({ appId: appIdOrAddonId }).then(sendToApi);
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
23
|
+
switch (format) {
|
|
24
|
+
case 'json': {
|
|
25
|
+
const formattedDrains = drains.map((drain) => ({
|
|
26
|
+
id: drain.id,
|
|
27
|
+
target: drain.target,
|
|
28
|
+
state: drain.state,
|
|
29
|
+
}));
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
drainView += `, index: '${indexPrefix}-<YYYY-MM-DD>'`;
|
|
31
|
+
Logger.printJson(formattedDrains);
|
|
32
|
+
break;
|
|
34
33
|
}
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
case 'human':
|
|
35
|
+
default: {
|
|
36
|
+
if (drains.length === 0) {
|
|
37
|
+
Logger.println(`There are no drains for ${appIdOrAddonId}`);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
drains.forEach((drain) => {
|
|
41
|
+
const { id, state, target } = drain;
|
|
42
|
+
const { url, drainType, indexPrefix, structuredDataParameters } = target;
|
|
43
|
+
|
|
44
|
+
let drainView = `${id} -> ${state} for ${url} as ${drainType}`;
|
|
45
|
+
if (indexPrefix != null) {
|
|
46
|
+
drainView += `, index: '${indexPrefix}-<YYYY-MM-DD>'`;
|
|
47
|
+
}
|
|
48
|
+
if (structuredDataParameters != null) {
|
|
49
|
+
drainView += `, sd-params: '${structuredDataParameters}'`;
|
|
50
|
+
}
|
|
51
|
+
Logger.println(drainView);
|
|
52
|
+
});
|
|
37
53
|
}
|
|
38
|
-
|
|
39
|
-
});
|
|
54
|
+
}
|
|
40
55
|
}
|
|
41
56
|
|
|
42
57
|
async function create (params) {
|
|
43
58
|
const [drainTargetType, drainTargetURL] = params.args;
|
|
44
|
-
const { alias, addon: addonId, username, password, 'api-key': apiKey, 'index-prefix': indexPrefix, 'sd-
|
|
59
|
+
const { alias, app: appIdOrName, addon: addonId, username, password, 'api-key': apiKey, 'index-prefix': indexPrefix, 'sd-params': structuredDataParameters } = params.options;
|
|
45
60
|
const drainTargetCredentials = { username, password };
|
|
46
61
|
const drainTargetConfig = { apiKey, indexPrefix, structuredDataParameters };
|
|
47
62
|
|
|
48
|
-
const appIdOrAddonId = await getAppOrAddonId({ alias, addonId });
|
|
63
|
+
const appIdOrAddonId = await getAppOrAddonId({ alias, appIdOrName, addonId });
|
|
49
64
|
const body = createDrainBody(appIdOrAddonId, drainTargetURL, drainTargetType, drainTargetCredentials, drainTargetConfig);
|
|
50
65
|
await createDrain({ appId: appIdOrAddonId }, body).then(sendToApi);
|
|
51
66
|
|
|
@@ -54,9 +69,9 @@ async function create (params) {
|
|
|
54
69
|
|
|
55
70
|
async function rm (params) {
|
|
56
71
|
const [drainId] = params.args;
|
|
57
|
-
const { alias, addon: addonId } = params.options;
|
|
72
|
+
const { alias, app: appIdOrName, addon: addonId } = params.options;
|
|
58
73
|
|
|
59
|
-
const appIdOrAddonId = await getAppOrAddonId({ alias, addonId });
|
|
74
|
+
const appIdOrAddonId = await getAppOrAddonId({ alias, appIdOrName, addonId });
|
|
60
75
|
await deleteDrain({ appId: appIdOrAddonId, drainId }).then(sendToApi);
|
|
61
76
|
|
|
62
77
|
Logger.println('Your drain has been successfully removed');
|
|
@@ -64,9 +79,9 @@ async function rm (params) {
|
|
|
64
79
|
|
|
65
80
|
async function enable (params) {
|
|
66
81
|
const [drainId] = params.args;
|
|
67
|
-
const { alias, addon: addonId } = params.options;
|
|
82
|
+
const { alias, app: appIdOrName, addon: addonId } = params.options;
|
|
68
83
|
|
|
69
|
-
const appIdOrAddonId = await getAppOrAddonId({ alias, addonId });
|
|
84
|
+
const appIdOrAddonId = await getAppOrAddonId({ alias, appIdOrName, addonId });
|
|
70
85
|
await updateDrainState({ appId: appIdOrAddonId, drainId }, { state: 'ENABLED' }).then(sendToApi);
|
|
71
86
|
|
|
72
87
|
Logger.println('Your drain has been enabled');
|
|
@@ -74,9 +89,9 @@ async function enable (params) {
|
|
|
74
89
|
|
|
75
90
|
async function disable (params) {
|
|
76
91
|
const [drainId] = params.args;
|
|
77
|
-
const { alias, addon: addonId } = params.options;
|
|
92
|
+
const { alias, app: appIdOrName, addon: addonId } = params.options;
|
|
78
93
|
|
|
79
|
-
const appIdOrAddonId = await getAppOrAddonId({ alias, addonId });
|
|
94
|
+
const appIdOrAddonId = await getAppOrAddonId({ alias, appIdOrName, addonId });
|
|
80
95
|
await updateDrainState({ appId: appIdOrAddonId, drainId }, { state: 'DISABLED' }).then(sendToApi);
|
|
81
96
|
|
|
82
97
|
Logger.println('Your drain has been disabled');
|
package/src/commands/env.js
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
const
|
|
3
|
+
const Application = require('../models/application.js');
|
|
4
4
|
const Logger = require('../logger.js');
|
|
5
|
+
const colors = require('colors/safe');
|
|
5
6
|
const variables = require('../models/variables.js');
|
|
6
7
|
const { sendToApi } = require('../models/send-to-api.js');
|
|
7
8
|
const { toNameEqualsValueString, validateName } = require('@clevercloud/client/cjs/utils/env-vars.js');
|
|
8
9
|
const application = require('@clevercloud/client/cjs/api/v2/application.js');
|
|
9
10
|
|
|
10
11
|
async function list (params) {
|
|
11
|
-
const { alias, 'add-export':
|
|
12
|
-
const { ownerId, appId } = await
|
|
12
|
+
const { alias, app: appIdOrName, 'add-export': addExportsOption, format } = params.options;
|
|
13
|
+
const { ownerId, appId } = await Application.resolveId(appIdOrName, alias);
|
|
13
14
|
|
|
14
15
|
const [envFromApp, envFromAddons, envFromDeps] = await Promise.all([
|
|
15
16
|
application.getAllEnvVars({ id: ownerId, appId }).then(sendToApi),
|
|
@@ -17,30 +18,58 @@ async function list (params) {
|
|
|
17
18
|
application.getAllEnvVarsForDependencies({ id: ownerId, appId }).then(sendToApi),
|
|
18
19
|
]);
|
|
19
20
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
21
|
+
switch (format) {
|
|
22
|
+
case 'json': {
|
|
23
|
+
Logger.printJson({
|
|
24
|
+
env: envFromApp,
|
|
25
|
+
fromAddons: envFromAddons.map((addon) => ({
|
|
26
|
+
addonId: addon.addon_id,
|
|
27
|
+
addonName: addon.addon_name,
|
|
28
|
+
env: addon.env,
|
|
29
|
+
})),
|
|
30
|
+
fromDependencies: envFromDeps.map((dep) => ({
|
|
31
|
+
addonId: dep.app_id,
|
|
32
|
+
addonName: dep.app_name,
|
|
33
|
+
env: dep.env,
|
|
34
|
+
})),
|
|
35
|
+
});
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
case 'shell':
|
|
39
|
+
case 'human':
|
|
40
|
+
default: {
|
|
41
|
+
if (addExportsOption) {
|
|
42
|
+
Logger.println(colors.yellow('`--add-export` option is deprecated. Use `--format shell` instead.'));
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const addExports = addExportsOption || format === 'shell';
|
|
46
|
+
|
|
47
|
+
Logger.println('# Manually set env variables');
|
|
48
|
+
Logger.println(toNameEqualsValueString(envFromApp, { addExports }));
|
|
49
|
+
|
|
50
|
+
envFromAddons.forEach((addon) => {
|
|
51
|
+
Logger.println('# Addon ' + addon.addon_name);
|
|
52
|
+
Logger.println(toNameEqualsValueString(addon.env, { addExports }));
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
envFromDeps.forEach((dep) => {
|
|
56
|
+
Logger.println('# Dependency ' + dep.app_name);
|
|
57
|
+
Logger.println(toNameEqualsValueString(dep.env, { addExports }));
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
33
62
|
|
|
34
63
|
async function set (params) {
|
|
35
64
|
const [envName, value] = params.args;
|
|
36
|
-
const { alias } = params.options;
|
|
65
|
+
const { alias, app: appIdOrName } = params.options;
|
|
37
66
|
|
|
38
67
|
const nameIsValid = validateName(envName);
|
|
39
68
|
if (!nameIsValid) {
|
|
40
69
|
throw new Error(`Environment variable name ${envName} is invalid`);
|
|
41
70
|
}
|
|
42
71
|
|
|
43
|
-
const { ownerId, appId } = await
|
|
72
|
+
const { ownerId, appId } = await Application.resolveId(appIdOrName, alias);
|
|
44
73
|
|
|
45
74
|
await application.updateEnvVar({ id: ownerId, appId, envName }, { value }).then(sendToApi);
|
|
46
75
|
|
|
@@ -49,8 +78,8 @@ async function set (params) {
|
|
|
49
78
|
|
|
50
79
|
async function rm (params) {
|
|
51
80
|
const [envName] = params.args;
|
|
52
|
-
const { alias } = params.options;
|
|
53
|
-
const { ownerId, appId } = await
|
|
81
|
+
const { alias, app: appIdOrName } = params.options;
|
|
82
|
+
const { ownerId, appId } = await Application.resolveId(appIdOrName, alias);
|
|
54
83
|
|
|
55
84
|
await application.removeEnvVar({ id: ownerId, appId, envName }).then(sendToApi);
|
|
56
85
|
|
|
@@ -58,9 +87,9 @@ async function rm (params) {
|
|
|
58
87
|
};
|
|
59
88
|
|
|
60
89
|
async function importEnv (params) {
|
|
61
|
-
const { alias, json } = params.options;
|
|
90
|
+
const { alias, app: appIdOrName, json } = params.options;
|
|
62
91
|
const format = json ? 'json' : 'name-equals-value';
|
|
63
|
-
const { ownerId, appId } = await
|
|
92
|
+
const { ownerId, appId } = await Application.resolveId(appIdOrName, alias);
|
|
64
93
|
|
|
65
94
|
const envVars = await variables.readVariablesFromStdin(format);
|
|
66
95
|
await application.updateAllEnvVars({ id: ownerId, appId }, envVars).then(sendToApi);
|
|
@@ -70,7 +99,7 @@ async function importEnv (params) {
|
|
|
70
99
|
|
|
71
100
|
async function importVarsFromLocalEnv (params) {
|
|
72
101
|
const [envNames] = params.args;
|
|
73
|
-
const { alias } = params.options;
|
|
102
|
+
const { alias, app: appIdOrName } = params.options;
|
|
74
103
|
|
|
75
104
|
for (const envName of envNames) {
|
|
76
105
|
const nameIsValid = validateName(envName);
|
|
@@ -79,7 +108,7 @@ async function importVarsFromLocalEnv (params) {
|
|
|
79
108
|
}
|
|
80
109
|
}
|
|
81
110
|
|
|
82
|
-
const { ownerId, appId } = await
|
|
111
|
+
const { ownerId, appId } = await Application.resolveId(appIdOrName, alias);
|
|
83
112
|
|
|
84
113
|
for (const envName of envNames) {
|
|
85
114
|
const value = process.env[envName] || '';
|
package/src/commands/logs.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
const
|
|
3
|
+
const Application = require('../models/application.js');
|
|
4
4
|
const LogV2 = require('../models/log.js');
|
|
5
5
|
const Log = require('../models/log-v4.js');
|
|
6
6
|
const Logger = require('../logger.js');
|
|
@@ -9,7 +9,7 @@ const colors = require('colors/safe');
|
|
|
9
9
|
const { resolveAddonId } = require('../models/ids-resolver.js');
|
|
10
10
|
|
|
11
11
|
async function appLogs (params) {
|
|
12
|
-
const { alias, addon: addonIdOrRealId, after: since, before: until, search, 'deployment-id': deploymentId, format } = params.options;
|
|
12
|
+
const { alias, app: appIdOrName, addon: addonIdOrRealId, after: since, before: until, search, 'deployment-id': deploymentId, format } = params.options;
|
|
13
13
|
|
|
14
14
|
// ignore --search ""
|
|
15
15
|
const filter = (search !== '') ? search : null;
|
|
@@ -27,7 +27,7 @@ async function appLogs (params) {
|
|
|
27
27
|
return LogV2.displayLogs({ appAddonId: addonId, since, until, filter, deploymentId });
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
const {
|
|
30
|
+
const { ownerId, appId } = await Application.resolveId(appIdOrName, alias);
|
|
31
31
|
|
|
32
32
|
if (isForHuman) {
|
|
33
33
|
Logger.println(colors.blue('Waiting for application logs…'));
|