@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.
Files changed (48) hide show
  1. package/applications/delete-app.ts +7 -7
  2. package/applications/deploy-app-code.ts +24 -8
  3. package/applications/get-app-logs.ts +22 -13
  4. package/applications/list-apps.ts +22 -15
  5. package/applications/register-app.ts +8 -9
  6. package/applications/types.ts +0 -1
  7. package/applications/update-app.ts +2 -4
  8. package/cli.ts +13 -12
  9. package/cloudutils.ts +19 -2
  10. package/dist/packages/dbos-cloud/applications/delete-app.js +4 -4
  11. package/dist/packages/dbos-cloud/applications/delete-app.js.map +1 -1
  12. package/dist/packages/dbos-cloud/applications/deploy-app-code.d.ts.map +1 -1
  13. package/dist/packages/dbos-cloud/applications/deploy-app-code.js +19 -5
  14. package/dist/packages/dbos-cloud/applications/deploy-app-code.js.map +1 -1
  15. package/dist/packages/dbos-cloud/applications/get-app-logs.d.ts +1 -1
  16. package/dist/packages/dbos-cloud/applications/get-app-logs.d.ts.map +1 -1
  17. package/dist/packages/dbos-cloud/applications/get-app-logs.js +20 -9
  18. package/dist/packages/dbos-cloud/applications/get-app-logs.js.map +1 -1
  19. package/dist/packages/dbos-cloud/applications/list-apps.d.ts +1 -1
  20. package/dist/packages/dbos-cloud/applications/list-apps.d.ts.map +1 -1
  21. package/dist/packages/dbos-cloud/applications/list-apps.js +20 -12
  22. package/dist/packages/dbos-cloud/applications/list-apps.js.map +1 -1
  23. package/dist/packages/dbos-cloud/applications/register-app.d.ts +1 -1
  24. package/dist/packages/dbos-cloud/applications/register-app.d.ts.map +1 -1
  25. package/dist/packages/dbos-cloud/applications/register-app.js +5 -6
  26. package/dist/packages/dbos-cloud/applications/register-app.js.map +1 -1
  27. package/dist/packages/dbos-cloud/applications/types.d.ts +0 -1
  28. package/dist/packages/dbos-cloud/applications/types.d.ts.map +1 -1
  29. package/dist/packages/dbos-cloud/applications/update-app.d.ts +1 -1
  30. package/dist/packages/dbos-cloud/applications/update-app.d.ts.map +1 -1
  31. package/dist/packages/dbos-cloud/applications/update-app.js +2 -4
  32. package/dist/packages/dbos-cloud/applications/update-app.js.map +1 -1
  33. package/dist/packages/dbos-cloud/cli.js +12 -11
  34. package/dist/packages/dbos-cloud/cli.js.map +1 -1
  35. package/dist/packages/dbos-cloud/cloudutils.d.ts +3 -0
  36. package/dist/packages/dbos-cloud/cloudutils.d.ts.map +1 -1
  37. package/dist/packages/dbos-cloud/cloudutils.js +10 -2
  38. package/dist/packages/dbos-cloud/cloudutils.js.map +1 -1
  39. package/dist/packages/dbos-cloud/register.d.ts.map +1 -1
  40. package/dist/packages/dbos-cloud/register.js +3 -2
  41. package/dist/packages/dbos-cloud/register.js.map +1 -1
  42. package/dist/packages/dbos-cloud/userdb.d.ts +3 -3
  43. package/dist/packages/dbos-cloud/userdb.d.ts.map +1 -1
  44. package/dist/packages/dbos-cloud/userdb.js +24 -9
  45. package/dist/packages/dbos-cloud/userdb.js.map +1 -1
  46. package/package.json +1 -1
  47. package/register.ts +6 -5
  48. 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
- if (axios.isAxiosError(e) && e.response) {
28
- logger.error(`Failed to delete application ${appName}: ${e.response?.data}`);
29
- return 1;
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(`Failed to delete application ${appName}: ${(e as Error).message}`);
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 at...`);
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
- if (axios.isAxiosError(e) && e.response) {
99
- logger.error(`Failed to deploy application ${appName}: ${e.response?.data}`);
100
- return 1;
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(`Failed to deploy application ${appName}: ${(e as Error).message}`);
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
- logger.info(`Successfully retrieved logs of application: ${appName}`);
24
- logger.info(res.data)
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
- if (axios.isAxiosError(e) && e.response) {
28
- logger.error(`Failed to retrieve logs of application ${appName}: ${e.response?.data}`);
29
- return 1;
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(`Failed to retrieve logs of application ${appName}: ${(e as Error).message}`);
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 data: Application[] = list.data as Application[];
20
- if (data.length === 0) {
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
- const formattedData: Application[] = []
25
- for (const application of data) {
26
- formattedData.push({ "Name": application.Name, "ID": application.ID, "Version": application.Version, "DatabaseName": application.DatabaseName, "MaxVMs": application.MaxVMs, "Status": application.Status });
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
- if (axios.isAxiosError(e) && e.response) {
33
- logger.error(`Failed to list applications: ${e.response?.data}`);
34
- return 1;
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(`Failed to list applications: ${(e as Error).message}`);
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, machines: number): Promise<number> {
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
- if (axios.isAxiosError(e) && e.response) {
37
- logger.error(`Failed to register application ${appName}: ${e.response?.data}`);
38
- return 1;
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(`Failed to register application ${appName}: ${(e as Error).message}`);
41
- return 1;
39
+ logger.error(`${errorLabel}: ${(e as Error).message}`);
42
40
  }
41
+ return 1;
43
42
  }
44
43
  }
@@ -4,5 +4,4 @@ export type Application = {
4
4
  DatabaseName: string;
5
5
  Status: string;
6
6
  Version: string;
7
- MaxVMs: string;
8
7
  };
@@ -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, machines: number): Promise<number> {
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} to ${machines} machines`);
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
- .option('-m, --machines <string>', 'Number of VMs to deploy', '1')
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, parseInt(options.machines));
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
- .requiredOption('-m, --machines <string>', 'Number of VMs to deploy')
79
- .action(async (options: { machines: string }) => {
77
+ .action(async () => {
80
78
  const { host }: { host: string } = applicationCommands.opts()
81
- const exitCode = await updateApp(host, parseInt(options.machines));
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
- .action(async () => {
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
- .action(async () => {
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
- .action((async (dbname: string) => {
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
- logger.error(`Failed to delete application ${appName}: ${e.response?.data}`);
32
- return 1;
32
+ (0, cloudutils_1.handleAPIErrors)(errorLabel, e);
33
33
  }
34
34
  else {
35
- logger.error(`Failed to delete application ${appName}: ${e.message}`);
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,kDAA0B;AAC1B,8CAA+D;AAC/D,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,IAAI,eAAK,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;YACxC,MAAM,CAAC,KAAK,CAAC,gCAAgC,OAAO,KAAK,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7E,OAAO,CAAC,CAAC;QACX,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,gCAAgC,OAAO,KAAM,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;YACjF,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;AACH,CAAC;AA9BD,8BA8BC"}
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,CA2FlF"}
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 at...`);
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
- logger.error(`Failed to deploy application ${appName}: ${e.response?.data}`);
85
- return 1;
92
+ (0, cloudutils_1.handleAPIErrors)(errorLabel, e);
86
93
  }
87
94
  else {
88
- logger.error(`Failed to deploy application ${appName}: ${e.message}`);
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":"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"}
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,CA8B9D"}
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
- logger.info(`Successfully retrieved logs of application: ${appName}`);
26
- logger.info(res.data);
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
- logger.error(`Failed to retrieve logs of application ${appName}: ${e.response?.data}`);
32
- return 1;
43
+ (0, cloudutils_1.handleAPIErrors)(errorLabel, e);
33
44
  }
34
45
  else {
35
- logger.error(`Failed to retrieve logs of application ${appName}: ${e.message}`);
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,kDAA0B;AAC1B,8CAA+D;AAC/D,0DAA6B;AAEtB,KAAK,UAAU,UAAU,CAAC,IAAY;IAC3C,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,EAAE,EAAE;YACrG,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,WAAW;aAC3B;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,+CAA+C,OAAO,EAAE,CAAC,CAAC;QACtE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACrB,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,eAAK,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;YACxC,MAAM,CAAC,KAAK,CAAC,0CAA0C,OAAO,KAAK,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YACvF,OAAO,CAAC,CAAC;QACX,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,0CAA0C,OAAO,KAAM,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3F,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;AACH,CAAC;AA9BD,gCA8BC"}
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,CAmC5D"}
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 data = list.data;
20
- if (data.length === 0) {
19
+ const applications = list.data;
20
+ if (applications.length === 0) {
21
21
  logger.info("No applications found");
22
22
  return 1;
23
23
  }
24
- const formattedData = [];
25
- for (const application of data) {
26
- formattedData.push({ "Name": application.Name, "ID": application.ID, "Version": application.Version, "DatabaseName": application.DatabaseName, "MaxVMs": application.MaxVMs, "Status": application.Status });
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
- logger.error(`Failed to list applications: ${e.response?.data}`);
35
- return 1;
43
+ (0, cloudutils_1.handleAPIErrors)(errorLabel, e);
36
44
  }
37
45
  else {
38
- logger.error(`Failed to list applications: ${e.message}`);
39
- return 1;
46
+ logger.error(`${errorLabel}: ${e.message}`);
40
47
  }
48
+ return 1;
41
49
  }
42
50
  }
43
51
  exports.listApps = listApps;