@dbos-inc/dbos-cloud 0.8.52-preview.g611df9b955 → 0.8.56-preview
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/applications/delete-app.ts +7 -7
- package/applications/deploy-app-code.ts +24 -8
- package/applications/get-app-logs.ts +22 -13
- package/applications/list-apps.ts +22 -15
- package/applications/register-app.ts +8 -9
- package/applications/types.ts +0 -1
- package/applications/update-app.ts +2 -4
- package/cli.ts +13 -12
- package/cloudutils.ts +19 -2
- package/dist/packages/dbos-cloud/applications/delete-app.js +4 -4
- package/dist/packages/dbos-cloud/applications/delete-app.js.map +1 -1
- package/dist/packages/dbos-cloud/applications/deploy-app-code.d.ts.map +1 -1
- package/dist/packages/dbos-cloud/applications/deploy-app-code.js +19 -5
- package/dist/packages/dbos-cloud/applications/deploy-app-code.js.map +1 -1
- package/dist/packages/dbos-cloud/applications/get-app-logs.d.ts +1 -1
- package/dist/packages/dbos-cloud/applications/get-app-logs.d.ts.map +1 -1
- package/dist/packages/dbos-cloud/applications/get-app-logs.js +20 -9
- package/dist/packages/dbos-cloud/applications/get-app-logs.js.map +1 -1
- package/dist/packages/dbos-cloud/applications/list-apps.d.ts +1 -1
- package/dist/packages/dbos-cloud/applications/list-apps.d.ts.map +1 -1
- package/dist/packages/dbos-cloud/applications/list-apps.js +20 -12
- package/dist/packages/dbos-cloud/applications/list-apps.js.map +1 -1
- package/dist/packages/dbos-cloud/applications/register-app.d.ts +1 -1
- package/dist/packages/dbos-cloud/applications/register-app.d.ts.map +1 -1
- package/dist/packages/dbos-cloud/applications/register-app.js +5 -6
- package/dist/packages/dbos-cloud/applications/register-app.js.map +1 -1
- package/dist/packages/dbos-cloud/applications/types.d.ts +0 -1
- package/dist/packages/dbos-cloud/applications/types.d.ts.map +1 -1
- package/dist/packages/dbos-cloud/applications/update-app.d.ts +1 -1
- package/dist/packages/dbos-cloud/applications/update-app.d.ts.map +1 -1
- package/dist/packages/dbos-cloud/applications/update-app.js +2 -4
- package/dist/packages/dbos-cloud/applications/update-app.js.map +1 -1
- package/dist/packages/dbos-cloud/cli.js +12 -11
- package/dist/packages/dbos-cloud/cli.js.map +1 -1
- package/dist/packages/dbos-cloud/cloudutils.d.ts +3 -0
- package/dist/packages/dbos-cloud/cloudutils.d.ts.map +1 -1
- package/dist/packages/dbos-cloud/cloudutils.js +10 -2
- package/dist/packages/dbos-cloud/cloudutils.js.map +1 -1
- package/dist/packages/dbos-cloud/register.d.ts.map +1 -1
- package/dist/packages/dbos-cloud/register.js +3 -2
- package/dist/packages/dbos-cloud/register.js.map +1 -1
- package/dist/packages/dbos-cloud/userdb.d.ts +3 -3
- package/dist/packages/dbos-cloud/userdb.d.ts.map +1 -1
- package/dist/packages/dbos-cloud/userdb.js +24 -9
- package/dist/packages/dbos-cloud/userdb.js.map +1 -1
- package/package.json +1 -1
- package/register.ts +6 -5
- package/userdb.ts +28 -14
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import axios from "axios";
|
|
2
|
-
import { getCloudCredentials, getLogger } from "../cloudutils";
|
|
1
|
+
import axios, { AxiosError } from "axios";
|
|
2
|
+
import { handleAPIErrors, getCloudCredentials, getLogger } from "../cloudutils";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
|
|
5
5
|
export async function deleteApp(host: string): Promise<number> {
|
|
@@ -24,12 +24,12 @@ export async function deleteApp(host: string): Promise<number> {
|
|
|
24
24
|
logger.info(`Successfully deleted application: ${appName}`);
|
|
25
25
|
return 0;
|
|
26
26
|
} catch (e) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
const errorLabel = `Failed to delete application ${appName}`;
|
|
28
|
+
if (axios.isAxiosError(e) && (e as AxiosError).response) {
|
|
29
|
+
handleAPIErrors(errorLabel, e);
|
|
30
30
|
} else {
|
|
31
|
-
logger.error(
|
|
32
|
-
return 1;
|
|
31
|
+
logger.error(`${errorLabel}: ${(e as Error).message}`);
|
|
33
32
|
}
|
|
33
|
+
return 1;
|
|
34
34
|
}
|
|
35
35
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import axios from "axios";
|
|
1
|
+
import axios, { AxiosError } from "axios";
|
|
2
2
|
import { execSync } from "child_process";
|
|
3
3
|
import { writeFileSync, existsSync } from 'fs';
|
|
4
|
-
import { createDirectory, getCloudCredentials, getLogger, readFileSync, runCommand, sleep } from "../cloudutils";
|
|
4
|
+
import { handleAPIErrors, createDirectory, dbosConfigFilePath, getCloudCredentials, getLogger, readFileSync, runCommand, sleep } from "../cloudutils";
|
|
5
5
|
import path from "path";
|
|
6
6
|
import { Application } from "./types";
|
|
7
7
|
|
|
@@ -42,6 +42,10 @@ export async function deployAppCode(host: string, docker: boolean): Promise<numb
|
|
|
42
42
|
execSync(`zip -ry ${deployDirectoryName}/${appName}.zip ./* -x ${deployDirectoryName}/* > /dev/null`);
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
+
const interpolatedConfig = readInterpolatedConfig(dbosConfigFilePath)
|
|
46
|
+
writeFileSync(`${deployDirectoryName}/${dbosConfigFilePath}`, interpolatedConfig)
|
|
47
|
+
execSync(`zip -j ${deployDirectoryName}/${appName}.zip ${deployDirectoryName}/${dbosConfigFilePath} > /dev/null`);
|
|
48
|
+
|
|
45
49
|
try {
|
|
46
50
|
const zipData = readFileSync(`${deployDirectoryName}/${appName}.zip`, "base64");
|
|
47
51
|
|
|
@@ -70,9 +74,13 @@ export async function deployAppCode(host: string, docker: boolean): Promise<numb
|
|
|
70
74
|
if (count % 5 === 0) {
|
|
71
75
|
logger.info(`Waiting for ${appName} with version ${deployOutput.ApplicationVersion} to be available`);
|
|
72
76
|
if (count > 20) {
|
|
73
|
-
logger.info(`If ${appName} takes too long to become available, check its logs
|
|
77
|
+
logger.info(`If ${appName} takes too long to become available, check its logs with 'npx dbos-cloud applications logs'`);
|
|
74
78
|
}
|
|
75
79
|
}
|
|
80
|
+
if (count > 180) {
|
|
81
|
+
logger.error("Application taking too long to become available")
|
|
82
|
+
return 1;
|
|
83
|
+
}
|
|
76
84
|
|
|
77
85
|
// Retrieve the application status, check if it is "AVAILABLE"
|
|
78
86
|
const list = await axios.get(
|
|
@@ -95,16 +103,24 @@ export async function deployAppCode(host: string, docker: boolean): Promise<numb
|
|
|
95
103
|
logger.info(`Access your application at https://${host}/${userCredentials.userName}/application/${appName}`)
|
|
96
104
|
return 0;
|
|
97
105
|
} catch (e) {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
106
|
+
const errorLabel = `Failed to deploy application ${appName}`;
|
|
107
|
+
if (axios.isAxiosError(e) && (e as AxiosError).response) {
|
|
108
|
+
handleAPIErrors(errorLabel, e);
|
|
101
109
|
} else {
|
|
102
|
-
logger.error(
|
|
103
|
-
return 1;
|
|
110
|
+
logger.error(`${errorLabel}: ${(e as Error).message}`);
|
|
104
111
|
}
|
|
112
|
+
return 1;
|
|
105
113
|
}
|
|
106
114
|
}
|
|
107
115
|
|
|
116
|
+
function readInterpolatedConfig(configFilePath: string): string {
|
|
117
|
+
const configFileContent = readFileSync(configFilePath) as string;
|
|
118
|
+
const regex = /\${([^}]+)}/g; // Regex to match ${VAR_NAME} style placeholders
|
|
119
|
+
return configFileContent.replace(regex, (_, g1: string) => {
|
|
120
|
+
return process.env[g1] || ""; // If the env variable is not set, return an empty string.
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
|
|
108
124
|
async function buildAppInDocker(appName: string): Promise<boolean> {
|
|
109
125
|
const logger = getLogger();
|
|
110
126
|
|
|
@@ -1,8 +1,14 @@
|
|
|
1
|
-
import axios from "axios";
|
|
2
|
-
import { getCloudCredentials, getLogger } from "../cloudutils";
|
|
1
|
+
import axios , { AxiosError } from "axios";
|
|
2
|
+
import { handleAPIErrors, getCloudCredentials, getLogger } from "../cloudutils";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
|
|
5
|
-
export async function getAppLogs(host: string): Promise<number> {
|
|
5
|
+
export async function getAppLogs(host: string, last: number): Promise<number> {
|
|
6
|
+
if (last != undefined && (isNaN(last) || last <= 0)) {
|
|
7
|
+
throw new Error('The --last parmameter must be an integer greater than 0');
|
|
8
|
+
}
|
|
9
|
+
if (last == undefined) {
|
|
10
|
+
last = 0 //internally, 0 means "get all the logs." This is the default.
|
|
11
|
+
}
|
|
6
12
|
const logger = getLogger();
|
|
7
13
|
const userCredentials = getCloudCredentials();
|
|
8
14
|
const bearerToken = "Bearer " + userCredentials.token;
|
|
@@ -13,23 +19,26 @@ export async function getAppLogs(host: string): Promise<number> {
|
|
|
13
19
|
logger.info(`Retrieving logs for application: ${appName}`)
|
|
14
20
|
|
|
15
21
|
try {
|
|
16
|
-
const res = await axios.get(`https://${host}/${userCredentials.userName}/logs/application/${appName}`, {
|
|
22
|
+
const res = await axios.get(`https://${host}/${userCredentials.userName}/logs/application/${appName}?last=${last}`, {
|
|
17
23
|
headers: {
|
|
18
24
|
"Content-Type": "application/json",
|
|
19
25
|
Authorization: bearerToken,
|
|
20
|
-
}
|
|
26
|
+
}
|
|
21
27
|
});
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
28
|
+
if (res.data == "") {
|
|
29
|
+
logger.info(`No logs found for the specified parameters`);
|
|
30
|
+
} else {
|
|
31
|
+
logger.info(`Successfully retrieved logs of application: ${appName}`);
|
|
32
|
+
logger.info(res.data)
|
|
33
|
+
}
|
|
25
34
|
return 0;
|
|
26
35
|
} catch (e) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
36
|
+
const errorLabel = `Failed to retrieve logs of application ${appName}`;
|
|
37
|
+
if (axios.isAxiosError(e) && (e as AxiosError).response) {
|
|
38
|
+
handleAPIErrors(errorLabel, e);
|
|
30
39
|
} else {
|
|
31
|
-
logger.error(
|
|
32
|
-
return 1;
|
|
40
|
+
logger.error(`${errorLabel}: ${(e as Error).message}`);
|
|
33
41
|
}
|
|
42
|
+
return 1;
|
|
34
43
|
}
|
|
35
44
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import axios from "axios";
|
|
2
|
-
import { getCloudCredentials, getLogger } from "../cloudutils";
|
|
1
|
+
import axios, { AxiosError } from "axios";
|
|
2
|
+
import { handleAPIErrors, getCloudCredentials, getLogger } from "../cloudutils";
|
|
3
3
|
import { Application } from "./types";
|
|
4
4
|
|
|
5
|
-
export async function listApps(host: string): Promise<number> {
|
|
5
|
+
export async function listApps(host: string, json: boolean): Promise<number> {
|
|
6
6
|
const logger = getLogger();
|
|
7
7
|
const userCredentials = getCloudCredentials();
|
|
8
8
|
const bearerToken = "Bearer " + userCredentials.token;
|
|
@@ -16,25 +16,32 @@ export async function listApps(host: string): Promise<number> {
|
|
|
16
16
|
},
|
|
17
17
|
}
|
|
18
18
|
);
|
|
19
|
-
const
|
|
20
|
-
if (
|
|
19
|
+
const applications: Application[] = list.data as Application[];
|
|
20
|
+
if (applications.length === 0) {
|
|
21
21
|
logger.info("No applications found");
|
|
22
22
|
return 1;
|
|
23
23
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
if (json) {
|
|
25
|
+
console.log(JSON.stringify(applications));
|
|
26
|
+
} else {
|
|
27
|
+
logger.info(`Listing applications for ${userCredentials.userName}`)
|
|
28
|
+
applications.forEach(app => {
|
|
29
|
+
console.log(`Application Name: ${app.Name}`);
|
|
30
|
+
console.log(`ID: ${app.ID}`);
|
|
31
|
+
console.log(`Database Name: ${app.DatabaseName}`);
|
|
32
|
+
console.log(`Status: ${app.Status}`);
|
|
33
|
+
console.log(`Version: ${app.Version}`);
|
|
34
|
+
console.log('-------------------------');
|
|
35
|
+
});
|
|
27
36
|
}
|
|
28
|
-
logger.info(`Listing applications for ${userCredentials.userName}`)
|
|
29
|
-
console.log(JSON.stringify(formattedData));
|
|
30
37
|
return 0;
|
|
31
38
|
} catch (e) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
39
|
+
const errorLabel = 'Failed to list applications';
|
|
40
|
+
if (axios.isAxiosError(e) && (e as AxiosError).response) {
|
|
41
|
+
handleAPIErrors(errorLabel, e);
|
|
35
42
|
} else {
|
|
36
|
-
logger.error(
|
|
37
|
-
return 1;
|
|
43
|
+
logger.error(`${errorLabel}: ${(e as Error).message}`);
|
|
38
44
|
}
|
|
45
|
+
return 1;
|
|
39
46
|
}
|
|
40
47
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import axios from "axios";
|
|
2
|
-
import { getCloudCredentials, getLogger } from "../cloudutils";
|
|
1
|
+
import axios, { AxiosError } from "axios";
|
|
2
|
+
import { handleAPIErrors, getCloudCredentials, getLogger } from "../cloudutils";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
|
|
5
|
-
export async function registerApp(dbname: string, host: string
|
|
5
|
+
export async function registerApp(dbname: string, host: string): Promise<number> {
|
|
6
6
|
const logger = getLogger();
|
|
7
7
|
const userCredentials = getCloudCredentials();
|
|
8
8
|
const bearerToken = "Bearer " + userCredentials.token;
|
|
@@ -19,7 +19,6 @@ export async function registerApp(dbname: string, host: string, machines: number
|
|
|
19
19
|
{
|
|
20
20
|
name: appName,
|
|
21
21
|
database: dbname,
|
|
22
|
-
max_vms: machines,
|
|
23
22
|
},
|
|
24
23
|
{
|
|
25
24
|
headers: {
|
|
@@ -33,12 +32,12 @@ export async function registerApp(dbname: string, host: string, machines: number
|
|
|
33
32
|
logger.info(`${appName} ID: ${uuid}`);
|
|
34
33
|
return 0;
|
|
35
34
|
} catch (e) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
35
|
+
const errorLabel = `Failed to register application ${appName}`;
|
|
36
|
+
if (axios.isAxiosError(e) && (e as AxiosError).response) {
|
|
37
|
+
handleAPIErrors(errorLabel, e);
|
|
39
38
|
} else {
|
|
40
|
-
logger.error(
|
|
41
|
-
return 1;
|
|
39
|
+
logger.error(`${errorLabel}: ${(e as Error).message}`);
|
|
42
40
|
}
|
|
41
|
+
return 1;
|
|
43
42
|
}
|
|
44
43
|
}
|
package/applications/types.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { getCloudCredentials, getLogger } from "../cloudutils";
|
|
|
3
3
|
import { Application } from "./types";
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
|
|
6
|
-
export async function updateApp(host: string
|
|
6
|
+
export async function updateApp(host: string): Promise<number> {
|
|
7
7
|
const logger = getLogger();
|
|
8
8
|
const userCredentials = getCloudCredentials();
|
|
9
9
|
const bearerToken = "Bearer " + userCredentials.token;
|
|
@@ -15,12 +15,11 @@ export async function updateApp(host: string, machines: number): Promise<number>
|
|
|
15
15
|
logger.info(`Updating application: ${appName}`)
|
|
16
16
|
|
|
17
17
|
try {
|
|
18
|
-
logger.info(`Updating application ${appName}
|
|
18
|
+
logger.info(`Updating application ${appName}`);
|
|
19
19
|
const update = await axios.patch(
|
|
20
20
|
`https://${host}/${userCredentials.userName}/application/${appName}`,
|
|
21
21
|
{
|
|
22
22
|
name: appName,
|
|
23
|
-
max_vms: machines
|
|
24
23
|
},
|
|
25
24
|
{
|
|
26
25
|
headers: {
|
|
@@ -31,7 +30,6 @@ export async function updateApp(host: string, machines: number): Promise<number>
|
|
|
31
30
|
);
|
|
32
31
|
const application: Application = update.data as Application;
|
|
33
32
|
logger.info(`Successfully updated: ${application.Name}`);
|
|
34
|
-
console.log(JSON.stringify({ "Name": application.Name, "ID": application.ID, "Version": application.Version, "MaxVMs": application.MaxVMs }));
|
|
35
33
|
return 0;
|
|
36
34
|
} catch (e) {
|
|
37
35
|
if (axios.isAxiosError(e) && e.response) {
|
package/cli.ts
CHANGED
|
@@ -65,20 +65,18 @@ applicationCommands
|
|
|
65
65
|
.command('register')
|
|
66
66
|
.description('Register a new application')
|
|
67
67
|
.requiredOption('-d, --database <string>', 'Specify the app database name')
|
|
68
|
-
.
|
|
69
|
-
.action(async (options: { database: string, machines: string }) => {
|
|
68
|
+
.action(async (options: { database: string }) => {
|
|
70
69
|
const { host }: { host: string } = applicationCommands.opts()
|
|
71
|
-
const exitCode = await registerApp(options.database, host
|
|
70
|
+
const exitCode = await registerApp(options.database, host);
|
|
72
71
|
process.exit(exitCode);
|
|
73
72
|
});
|
|
74
73
|
|
|
75
74
|
applicationCommands
|
|
76
75
|
.command('update')
|
|
77
76
|
.description('Update an application')
|
|
78
|
-
.
|
|
79
|
-
.action(async (options: { machines: string }) => {
|
|
77
|
+
.action(async () => {
|
|
80
78
|
const { host }: { host: string } = applicationCommands.opts()
|
|
81
|
-
const exitCode = await updateApp(host
|
|
79
|
+
const exitCode = await updateApp(host);
|
|
82
80
|
process.exit(exitCode);
|
|
83
81
|
});
|
|
84
82
|
|
|
@@ -104,18 +102,20 @@ applicationCommands
|
|
|
104
102
|
applicationCommands
|
|
105
103
|
.command('list')
|
|
106
104
|
.description('List all deployed applications')
|
|
107
|
-
.
|
|
105
|
+
.option('--json', 'Emit JSON output')
|
|
106
|
+
.action(async (options: { json: boolean }) => {
|
|
108
107
|
const { host }: { host: string } = applicationCommands.opts()
|
|
109
|
-
const exitCode = await listApps(host);
|
|
108
|
+
const exitCode = await listApps(host, options.json);
|
|
110
109
|
process.exit(exitCode);
|
|
111
110
|
});
|
|
112
111
|
|
|
113
112
|
applicationCommands
|
|
114
113
|
.command('logs')
|
|
115
114
|
.description('Print the microVM logs of a deployed application')
|
|
116
|
-
.
|
|
115
|
+
.option('-l, --last <integer>', 'How far back to query, in seconds from current time. By default, we retrieve all data', parseInt)
|
|
116
|
+
.action(async (options: { last: number}) => {
|
|
117
117
|
const { host }: { host: string } = applicationCommands.opts()
|
|
118
|
-
const exitCode = await getAppLogs(host);
|
|
118
|
+
const exitCode = await getAppLogs(host, options.last);
|
|
119
119
|
process.exit(exitCode);
|
|
120
120
|
});
|
|
121
121
|
|
|
@@ -142,9 +142,10 @@ userdbCommands
|
|
|
142
142
|
userdbCommands
|
|
143
143
|
.command('status')
|
|
144
144
|
.argument('<string>', 'database name')
|
|
145
|
-
.
|
|
145
|
+
.option('--json', 'Emit JSON output')
|
|
146
|
+
.action((async (dbname: string, options: { json: boolean}) => {
|
|
146
147
|
const { host }: { host: string } = userdbCommands.opts()
|
|
147
|
-
await getUserDb(host, dbname)
|
|
148
|
+
await getUserDb(host, dbname, options.json)
|
|
148
149
|
}))
|
|
149
150
|
|
|
150
151
|
userdbCommands
|
package/cloudutils.ts
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import { DBOSCloudCredentials, dbosEnvPath } from "./login";
|
|
2
2
|
import TransportStream = require("winston-transport");
|
|
3
|
-
import fs from "fs";
|
|
4
3
|
import { spawn, StdioOptions } from 'child_process';
|
|
5
4
|
import { transports, createLogger, format, Logger } from "winston";
|
|
5
|
+
import fs from "fs";
|
|
6
|
+
import { AxiosError } from "axios";
|
|
7
|
+
|
|
8
|
+
export const dbosConfigFilePath = "dbos-config.yaml";
|
|
6
9
|
|
|
10
|
+
// FIXME: we should have a global instance of the logger created in cli.ts
|
|
7
11
|
export function getLogger(): Logger {
|
|
8
12
|
const winstonTransports: TransportStream[] = [];
|
|
9
13
|
winstonTransports.push(
|
|
@@ -94,4 +98,17 @@ export type ValuesOf<T> = T[keyof T];
|
|
|
94
98
|
|
|
95
99
|
export function createDirectory(path: string): string | undefined {
|
|
96
100
|
return fs.mkdirSync(path, { recursive: true });
|
|
97
|
-
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
interface CloudAPIErrorResponse {
|
|
104
|
+
message: string,
|
|
105
|
+
statusCode: number,
|
|
106
|
+
requestID: string,
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export function handleAPIErrors(label: string, e: AxiosError) {
|
|
110
|
+
const logger = getLogger();
|
|
111
|
+
const resp: CloudAPIErrorResponse = e.response?.data as CloudAPIErrorResponse;
|
|
112
|
+
logger.error(`[${resp.requestID}] ${label}: ${resp.message}.`);
|
|
113
|
+
}
|
|
114
|
+
|
|
@@ -27,14 +27,14 @@ async function deleteApp(host) {
|
|
|
27
27
|
return 0;
|
|
28
28
|
}
|
|
29
29
|
catch (e) {
|
|
30
|
+
const errorLabel = `Failed to delete application ${appName}`;
|
|
30
31
|
if (axios_1.default.isAxiosError(e) && e.response) {
|
|
31
|
-
|
|
32
|
-
return 1;
|
|
32
|
+
(0, cloudutils_1.handleAPIErrors)(errorLabel, e);
|
|
33
33
|
}
|
|
34
34
|
else {
|
|
35
|
-
logger.error(
|
|
36
|
-
return 1;
|
|
35
|
+
logger.error(`${errorLabel}: ${e.message}`);
|
|
37
36
|
}
|
|
37
|
+
return 1;
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
40
|
exports.deleteApp = deleteApp;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete-app.js","sourceRoot":"","sources":["../../../../applications/delete-app.ts"],"names":[],"mappings":";;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"delete-app.js","sourceRoot":"","sources":["../../../../applications/delete-app.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0C;AAC1C,8CAAgF;AAChF,0DAA6B;AAEtB,KAAK,UAAU,SAAS,CAAC,IAAY;IAC1C,MAAM,MAAM,GAAG,IAAA,sBAAS,GAAE,CAAA;IAC1B,MAAM,eAAe,GAAG,IAAA,gCAAmB,GAAE,CAAC;IAC9C,MAAM,WAAW,GAAG,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC;IAEtD,8DAA8D;IAC9D,MAAM,WAAW,GAAG,OAAO,CAAC,mBAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAqB,CAAC;IAC1F,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC;IACjC,MAAM,CAAC,IAAI,CAAC,8CAA8C,OAAO,EAAE,CAAC,CAAA;IACpE,MAAM,CAAC,IAAI,CAAC,yBAAyB,OAAO,EAAE,CAAC,CAAA;IAE/C,IAAI,CAAC;QACH,MAAM,eAAK,CAAC,MAAM,CAAC,WAAW,IAAI,IAAI,eAAe,CAAC,QAAQ,gBAAgB,OAAO,EAAE,EAAE;YACvF,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,WAAW;aAC3B;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,qCAAqC,OAAO,EAAE,CAAC,CAAC;QAC5D,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,UAAU,GAAG,gCAAgC,OAAO,EAAE,CAAC;QAC7D,IAAI,eAAK,CAAC,YAAY,CAAC,CAAC,CAAC,IAAK,CAAgB,CAAC,QAAQ,EAAE,CAAC;YACxD,IAAA,4BAAe,EAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,GAAG,UAAU,KAAM,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QACzD,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AA9BD,8BA8BC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy-app-code.d.ts","sourceRoot":"","sources":["../../../../applications/deploy-app-code.ts"],"names":[],"mappings":"AAcA,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"deploy-app-code.d.ts","sourceRoot":"","sources":["../../../../applications/deploy-app-code.ts"],"names":[],"mappings":"AAcA,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAmGlF"}
|
|
@@ -36,6 +36,9 @@ async function deployAppCode(host, docker) {
|
|
|
36
36
|
// Zip the current directory and deploy from there. Requires app to have already been built. Only for testing.
|
|
37
37
|
(0, child_process_1.execSync)(`zip -ry ${deployDirectoryName}/${appName}.zip ./* -x ${deployDirectoryName}/* > /dev/null`);
|
|
38
38
|
}
|
|
39
|
+
const interpolatedConfig = readInterpolatedConfig(cloudutils_1.dbosConfigFilePath);
|
|
40
|
+
(0, fs_1.writeFileSync)(`${deployDirectoryName}/${cloudutils_1.dbosConfigFilePath}`, interpolatedConfig);
|
|
41
|
+
(0, child_process_1.execSync)(`zip -j ${deployDirectoryName}/${appName}.zip ${deployDirectoryName}/${cloudutils_1.dbosConfigFilePath} > /dev/null`);
|
|
39
42
|
try {
|
|
40
43
|
const zipData = (0, cloudutils_1.readFileSync)(`${deployDirectoryName}/${appName}.zip`, "base64");
|
|
41
44
|
// Submit the deploy request
|
|
@@ -58,9 +61,13 @@ async function deployAppCode(host, docker) {
|
|
|
58
61
|
if (count % 5 === 0) {
|
|
59
62
|
logger.info(`Waiting for ${appName} with version ${deployOutput.ApplicationVersion} to be available`);
|
|
60
63
|
if (count > 20) {
|
|
61
|
-
logger.info(`If ${appName} takes too long to become available, check its logs
|
|
64
|
+
logger.info(`If ${appName} takes too long to become available, check its logs with 'npx dbos-cloud applications logs'`);
|
|
62
65
|
}
|
|
63
66
|
}
|
|
67
|
+
if (count > 180) {
|
|
68
|
+
logger.error("Application taking too long to become available");
|
|
69
|
+
return 1;
|
|
70
|
+
}
|
|
64
71
|
// Retrieve the application status, check if it is "AVAILABLE"
|
|
65
72
|
const list = await axios_1.default.get(`https://${host}/${userCredentials.userName}/application`, {
|
|
66
73
|
headers: {
|
|
@@ -80,17 +87,24 @@ async function deployAppCode(host, docker) {
|
|
|
80
87
|
return 0;
|
|
81
88
|
}
|
|
82
89
|
catch (e) {
|
|
90
|
+
const errorLabel = `Failed to deploy application ${appName}`;
|
|
83
91
|
if (axios_1.default.isAxiosError(e) && e.response) {
|
|
84
|
-
|
|
85
|
-
return 1;
|
|
92
|
+
(0, cloudutils_1.handleAPIErrors)(errorLabel, e);
|
|
86
93
|
}
|
|
87
94
|
else {
|
|
88
|
-
logger.error(
|
|
89
|
-
return 1;
|
|
95
|
+
logger.error(`${errorLabel}: ${e.message}`);
|
|
90
96
|
}
|
|
97
|
+
return 1;
|
|
91
98
|
}
|
|
92
99
|
}
|
|
93
100
|
exports.deployAppCode = deployAppCode;
|
|
101
|
+
function readInterpolatedConfig(configFilePath) {
|
|
102
|
+
const configFileContent = (0, cloudutils_1.readFileSync)(configFilePath);
|
|
103
|
+
const regex = /\${([^}]+)}/g; // Regex to match ${VAR_NAME} style placeholders
|
|
104
|
+
return configFileContent.replace(regex, (_, g1) => {
|
|
105
|
+
return process.env[g1] || ""; // If the env variable is not set, return an empty string.
|
|
106
|
+
});
|
|
107
|
+
}
|
|
94
108
|
async function buildAppInDocker(appName) {
|
|
95
109
|
const logger = (0, cloudutils_1.getLogger)();
|
|
96
110
|
// Verify Docker is running
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deploy-app-code.js","sourceRoot":"","sources":["../../../../applications/deploy-app-code.ts"],"names":[],"mappings":";;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"deploy-app-code.js","sourceRoot":"","sources":["../../../../applications/deploy-app-code.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare function getAppLogs(host: string): Promise<number>;
|
|
1
|
+
export declare function getAppLogs(host: string, last: number): Promise<number>;
|
|
2
2
|
//# sourceMappingURL=get-app-logs.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-app-logs.d.ts","sourceRoot":"","sources":["../../../../applications/get-app-logs.ts"],"names":[],"mappings":"AAIA,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"get-app-logs.d.ts","sourceRoot":"","sources":["../../../../applications/get-app-logs.ts"],"names":[],"mappings":"AAIA,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAuC5E"}
|
|
@@ -7,7 +7,13 @@ exports.getAppLogs = void 0;
|
|
|
7
7
|
const axios_1 = __importDefault(require("axios"));
|
|
8
8
|
const cloudutils_1 = require("../cloudutils");
|
|
9
9
|
const node_path_1 = __importDefault(require("node:path"));
|
|
10
|
-
async function getAppLogs(host) {
|
|
10
|
+
async function getAppLogs(host, last) {
|
|
11
|
+
if (last != undefined && (isNaN(last) || last <= 0)) {
|
|
12
|
+
throw new Error('The --last parmameter must be an integer greater than 0');
|
|
13
|
+
}
|
|
14
|
+
if (last == undefined) {
|
|
15
|
+
last = 0; //internally, 0 means "get all the logs." This is the default.
|
|
16
|
+
}
|
|
11
17
|
const logger = (0, cloudutils_1.getLogger)();
|
|
12
18
|
const userCredentials = (0, cloudutils_1.getCloudCredentials)();
|
|
13
19
|
const bearerToken = "Bearer " + userCredentials.token;
|
|
@@ -16,25 +22,30 @@ async function getAppLogs(host) {
|
|
|
16
22
|
const appName = packageJson.name;
|
|
17
23
|
logger.info(`Retrieving logs for application: ${appName}`);
|
|
18
24
|
try {
|
|
19
|
-
const res = await axios_1.default.get(`https://${host}/${userCredentials.userName}/logs/application/${appName}`, {
|
|
25
|
+
const res = await axios_1.default.get(`https://${host}/${userCredentials.userName}/logs/application/${appName}?last=${last}`, {
|
|
20
26
|
headers: {
|
|
21
27
|
"Content-Type": "application/json",
|
|
22
28
|
Authorization: bearerToken,
|
|
23
|
-
}
|
|
29
|
+
}
|
|
24
30
|
});
|
|
25
|
-
|
|
26
|
-
|
|
31
|
+
if (res.data == "") {
|
|
32
|
+
logger.info(`No logs found for the specified parameters`);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
logger.info(`Successfully retrieved logs of application: ${appName}`);
|
|
36
|
+
logger.info(res.data);
|
|
37
|
+
}
|
|
27
38
|
return 0;
|
|
28
39
|
}
|
|
29
40
|
catch (e) {
|
|
41
|
+
const errorLabel = `Failed to retrieve logs of application ${appName}`;
|
|
30
42
|
if (axios_1.default.isAxiosError(e) && e.response) {
|
|
31
|
-
|
|
32
|
-
return 1;
|
|
43
|
+
(0, cloudutils_1.handleAPIErrors)(errorLabel, e);
|
|
33
44
|
}
|
|
34
45
|
else {
|
|
35
|
-
logger.error(
|
|
36
|
-
return 1;
|
|
46
|
+
logger.error(`${errorLabel}: ${e.message}`);
|
|
37
47
|
}
|
|
48
|
+
return 1;
|
|
38
49
|
}
|
|
39
50
|
}
|
|
40
51
|
exports.getAppLogs = getAppLogs;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-app-logs.js","sourceRoot":"","sources":["../../../../applications/get-app-logs.ts"],"names":[],"mappings":";;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"get-app-logs.js","sourceRoot":"","sources":["../../../../applications/get-app-logs.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA2C;AAC3C,8CAAgF;AAChF,0DAA6B;AAEtB,KAAK,UAAU,UAAU,CAAC,IAAY,EAAE,IAAY;IACzD,IAAI,IAAI,IAAI,SAAS,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,IAAI,IAAI,SAAS,EAAE,CAAC;QACtB,IAAI,GAAG,CAAC,CAAA,CAAM,8DAA8D;IAC9E,CAAC;IACD,MAAM,MAAM,GAAG,IAAA,sBAAS,GAAE,CAAC;IAC3B,MAAM,eAAe,GAAG,IAAA,gCAAmB,GAAE,CAAC;IAC9C,MAAM,WAAW,GAAG,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC;IAEtD,8DAA8D;IAC9D,MAAM,WAAW,GAAG,OAAO,CAAC,mBAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAqB,CAAC;IAC1F,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC;IACjC,MAAM,CAAC,IAAI,CAAC,oCAAoC,OAAO,EAAE,CAAC,CAAA;IAE1D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,eAAK,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,eAAe,CAAC,QAAQ,qBAAqB,OAAO,SAAS,IAAI,EAAE,EAAE;YAClH,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,WAAW;aAC3B;SACF,CAAC,CAAC;QACH,IAAI,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,+CAA+C,OAAO,EAAE,CAAC,CAAC;YACtE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACvB,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,UAAU,GAAG,0CAA0C,OAAO,EAAE,CAAC;QACvE,IAAI,eAAK,CAAC,YAAY,CAAC,CAAC,CAAC,IAAK,CAAgB,CAAC,QAAQ,EAAE,CAAC;YACxD,IAAA,4BAAe,EAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,GAAG,UAAU,KAAM,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QACzD,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAvCD,gCAuCC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare function listApps(host: string): Promise<number>;
|
|
1
|
+
export declare function listApps(host: string, json: boolean): Promise<number>;
|
|
2
2
|
//# sourceMappingURL=list-apps.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-apps.d.ts","sourceRoot":"","sources":["../../../../applications/list-apps.ts"],"names":[],"mappings":"AAIA,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"list-apps.d.ts","sourceRoot":"","sources":["../../../../applications/list-apps.ts"],"names":[],"mappings":"AAIA,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CA0C3E"}
|
|
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.listApps = void 0;
|
|
7
7
|
const axios_1 = __importDefault(require("axios"));
|
|
8
8
|
const cloudutils_1 = require("../cloudutils");
|
|
9
|
-
async function listApps(host) {
|
|
9
|
+
async function listApps(host, json) {
|
|
10
10
|
const logger = (0, cloudutils_1.getLogger)();
|
|
11
11
|
const userCredentials = (0, cloudutils_1.getCloudCredentials)();
|
|
12
12
|
const bearerToken = "Bearer " + userCredentials.token;
|
|
@@ -16,28 +16,36 @@ async function listApps(host) {
|
|
|
16
16
|
Authorization: bearerToken,
|
|
17
17
|
},
|
|
18
18
|
});
|
|
19
|
-
const
|
|
20
|
-
if (
|
|
19
|
+
const applications = list.data;
|
|
20
|
+
if (applications.length === 0) {
|
|
21
21
|
logger.info("No applications found");
|
|
22
22
|
return 1;
|
|
23
23
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
if (json) {
|
|
25
|
+
console.log(JSON.stringify(applications));
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
logger.info(`Listing applications for ${userCredentials.userName}`);
|
|
29
|
+
applications.forEach(app => {
|
|
30
|
+
console.log(`Application Name: ${app.Name}`);
|
|
31
|
+
console.log(`ID: ${app.ID}`);
|
|
32
|
+
console.log(`Database Name: ${app.DatabaseName}`);
|
|
33
|
+
console.log(`Status: ${app.Status}`);
|
|
34
|
+
console.log(`Version: ${app.Version}`);
|
|
35
|
+
console.log('-------------------------');
|
|
36
|
+
});
|
|
27
37
|
}
|
|
28
|
-
logger.info(`Listing applications for ${userCredentials.userName}`);
|
|
29
|
-
console.log(JSON.stringify(formattedData));
|
|
30
38
|
return 0;
|
|
31
39
|
}
|
|
32
40
|
catch (e) {
|
|
41
|
+
const errorLabel = 'Failed to list applications';
|
|
33
42
|
if (axios_1.default.isAxiosError(e) && e.response) {
|
|
34
|
-
|
|
35
|
-
return 1;
|
|
43
|
+
(0, cloudutils_1.handleAPIErrors)(errorLabel, e);
|
|
36
44
|
}
|
|
37
45
|
else {
|
|
38
|
-
logger.error(
|
|
39
|
-
return 1;
|
|
46
|
+
logger.error(`${errorLabel}: ${e.message}`);
|
|
40
47
|
}
|
|
48
|
+
return 1;
|
|
41
49
|
}
|
|
42
50
|
}
|
|
43
51
|
exports.listApps = listApps;
|