@datadog/datadog-ci 3.11.0 → 3.13.0
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 +1 -1
- package/dist/commands/aas/common.d.ts +3 -4
- package/dist/commands/aas/common.js +28 -10
- package/dist/commands/aas/common.js.map +1 -1
- package/dist/commands/aas/instrument.d.ts +7 -2
- package/dist/commands/aas/instrument.js +51 -10
- package/dist/commands/aas/instrument.js.map +1 -1
- package/dist/commands/aas/interfaces.d.ts +3 -0
- package/dist/commands/cloud-run/cli.js +1 -1
- package/dist/commands/cloud-run/cli.js.map +1 -1
- package/dist/commands/cloud-run/constants.d.ts +2 -0
- package/dist/commands/cloud-run/constants.js +3 -1
- package/dist/commands/cloud-run/constants.js.map +1 -1
- package/dist/commands/cloud-run/flare.d.ts +2 -4
- package/dist/commands/cloud-run/flare.js +5 -3
- package/dist/commands/cloud-run/flare.js.map +1 -1
- package/dist/commands/cloud-run/instrument.d.ts +19 -6
- package/dist/commands/cloud-run/instrument.js +350 -32
- package/dist/commands/cloud-run/instrument.js.map +1 -1
- package/dist/commands/cloud-run/interfaces.d.ts +0 -18
- package/dist/commands/cloud-run/prompt.d.ts +5 -0
- package/dist/commands/cloud-run/prompt.js +86 -0
- package/dist/commands/cloud-run/prompt.js.map +1 -0
- package/dist/commands/cloud-run/renderer.d.ts +9 -2
- package/dist/commands/cloud-run/renderer.js +44 -11
- package/dist/commands/cloud-run/renderer.js.map +1 -1
- package/dist/commands/cloud-run/types.d.ts +50 -0
- package/dist/commands/cloud-run/types.js +5 -0
- package/dist/commands/cloud-run/types.js.map +1 -0
- package/dist/commands/cloud-run/uninstrument.d.ts +21 -0
- package/dist/commands/cloud-run/uninstrument.js +187 -0
- package/dist/commands/cloud-run/uninstrument.js.map +1 -0
- package/dist/commands/cloud-run/utils.d.ts +10 -0
- package/dist/commands/cloud-run/utils.js +81 -1
- package/dist/commands/cloud-run/utils.js.map +1 -1
- package/dist/commands/coverage/renderer.d.ts +2 -1
- package/dist/commands/coverage/renderer.js +12 -7
- package/dist/commands/coverage/renderer.js.map +1 -1
- package/dist/commands/coverage/upload.js +6 -6
- package/dist/commands/coverage/upload.js.map +1 -1
- package/dist/commands/coverage/utils.d.ts +8 -2
- package/dist/commands/coverage/utils.js +119 -4
- package/dist/commands/coverage/utils.js.map +1 -1
- package/dist/commands/dora/api.js +6 -0
- package/dist/commands/dora/api.js.map +1 -1
- package/dist/commands/dora/deployment.d.ts +2 -0
- package/dist/commands/dora/deployment.js +12 -0
- package/dist/commands/dora/deployment.js.map +1 -1
- package/dist/commands/dora/interfaces.d.ts +2 -0
- package/dist/commands/dsyms/interfaces.d.ts +5 -5
- package/dist/commands/dsyms/interfaces.js +1 -1
- package/dist/commands/dsyms/interfaces.js.map +1 -1
- package/dist/commands/dsyms/renderer.d.ts +2 -2
- package/dist/commands/dsyms/renderer.js +6 -6
- package/dist/commands/dsyms/renderer.js.map +1 -1
- package/dist/commands/dsyms/upload.d.ts +17 -12
- package/dist/commands/dsyms/upload.js +177 -145
- package/dist/commands/dsyms/upload.js.map +1 -1
- package/dist/commands/elf-symbols/elf.js +4 -10
- package/dist/commands/elf-symbols/elf.js.map +1 -1
- package/dist/commands/junit/utils.d.ts +2 -2
- package/dist/commands/junit/utils.js +9 -11
- package/dist/commands/junit/utils.js.map +1 -1
- package/dist/commands/lambda/constants.d.ts +0 -7
- package/dist/commands/lambda/constants.js +3 -15
- package/dist/commands/lambda/constants.js.map +1 -1
- package/dist/commands/lambda/flare.js +1 -0
- package/dist/commands/lambda/flare.js.map +1 -1
- package/dist/commands/lambda/functions/instrument.js +9 -9
- package/dist/commands/lambda/functions/instrument.js.map +1 -1
- package/dist/commands/lambda/functions/uninstrument.js +6 -6
- package/dist/commands/lambda/functions/uninstrument.js.map +1 -1
- package/dist/commands/lambda/instrument.d.ts +0 -3
- package/dist/commands/lambda/instrument.js +4 -51
- package/dist/commands/lambda/instrument.js.map +1 -1
- package/dist/commands/react-native/xcode.d.ts +23 -0
- package/dist/commands/react-native/xcode.js +166 -10
- package/dist/commands/react-native/xcode.js.map +1 -1
- package/dist/commands/sarif/renderer.js +2 -2
- package/dist/commands/sarif/renderer.js.map +1 -1
- package/dist/commands/sbom/api.js +2 -2
- package/dist/commands/sbom/api.js.map +1 -1
- package/dist/commands/sbom/language.js +3 -0
- package/dist/commands/sbom/language.js.map +1 -1
- package/dist/commands/sbom/renderer.js +3 -3
- package/dist/commands/sbom/renderer.js.map +1 -1
- package/dist/commands/sbom/types.d.ts +2 -1
- package/dist/commands/sbom/types.js +1 -0
- package/dist/commands/sbom/types.js.map +1 -1
- package/dist/commands/synthetics/api.d.ts +7 -3
- package/dist/commands/synthetics/api.js +20 -3
- package/dist/commands/synthetics/api.js.map +1 -1
- package/dist/commands/synthetics/base-command.d.ts +8 -2
- package/dist/commands/synthetics/base-command.js +34 -32
- package/dist/commands/synthetics/base-command.js.map +1 -1
- package/dist/commands/synthetics/batch.d.ts +4 -3
- package/dist/commands/synthetics/batch.js +27 -14
- package/dist/commands/synthetics/batch.js.map +1 -1
- package/dist/commands/synthetics/errors.d.ts +1 -1
- package/dist/commands/synthetics/errors.js +1 -1
- package/dist/commands/synthetics/errors.js.map +1 -1
- package/dist/commands/synthetics/interfaces.d.ts +50 -19
- package/dist/commands/synthetics/interfaces.js.map +1 -1
- package/dist/commands/synthetics/reporters/default.js +16 -2
- package/dist/commands/synthetics/reporters/default.js.map +1 -1
- package/dist/commands/synthetics/reporters/junit.d.ts +1 -0
- package/dist/commands/synthetics/reporters/junit.js +2 -0
- package/dist/commands/synthetics/reporters/junit.js.map +1 -1
- package/dist/commands/synthetics/run-tests-lib.js +17 -3
- package/dist/commands/synthetics/run-tests-lib.js.map +1 -1
- package/dist/commands/synthetics/test.d.ts +2 -2
- package/dist/commands/synthetics/test.js +15 -2
- package/dist/commands/synthetics/test.js.map +1 -1
- package/dist/commands/synthetics/utils/internal.d.ts +2 -2
- package/dist/commands/synthetics/utils/internal.js.map +1 -1
- package/dist/commands/synthetics/utils/public.js +9 -2
- package/dist/commands/synthetics/utils/public.js.map +1 -1
- package/dist/constants.d.ts +10 -0
- package/dist/constants.js +17 -1
- package/dist/constants.js.map +1 -1
- package/dist/helpers/app.d.ts +1 -0
- package/dist/helpers/app.js +7 -1
- package/dist/helpers/app.js.map +1 -1
- package/dist/helpers/flare.d.ts +2 -0
- package/dist/helpers/flare.js +13 -1
- package/dist/helpers/flare.js.map +1 -1
- package/dist/helpers/git/instrument-helpers.d.ts +13 -0
- package/dist/helpers/git/instrument-helpers.js +60 -0
- package/dist/helpers/git/instrument-helpers.js.map +1 -0
- package/dist/helpers/version.d.ts +1 -0
- package/dist/helpers/version.js +17 -1
- package/dist/helpers/version.js.map +1 -1
- package/package.json +6 -3
|
@@ -1,23 +1,36 @@
|
|
|
1
|
+
import type { IContainer, IService, ServicesClient as IServicesClient } from './types';
|
|
1
2
|
import { Command } from 'clipanion';
|
|
2
3
|
export declare class InstrumentCommand extends Command {
|
|
4
|
+
static paths: string[][];
|
|
3
5
|
static usage: import("clipanion").Usage;
|
|
4
|
-
private configPath;
|
|
5
6
|
private dryRun;
|
|
6
7
|
private environment;
|
|
7
8
|
private extraTags;
|
|
8
9
|
private project;
|
|
9
10
|
private services;
|
|
10
11
|
private interactive;
|
|
11
|
-
private logging;
|
|
12
|
-
private logLevel;
|
|
13
|
-
private regExPattern;
|
|
14
12
|
private region;
|
|
15
|
-
private
|
|
13
|
+
private logLevel;
|
|
16
14
|
private sourceCodeIntegration;
|
|
17
15
|
private uploadGitMetadata;
|
|
18
16
|
private tracing;
|
|
19
17
|
private version;
|
|
20
18
|
private llmobs;
|
|
21
|
-
private
|
|
19
|
+
private healthCheckPort;
|
|
20
|
+
private sidecarImage;
|
|
21
|
+
private sidecarName;
|
|
22
|
+
private sharedVolumeName;
|
|
23
|
+
private sharedVolumePath;
|
|
24
|
+
private logsPath;
|
|
25
|
+
private sidecarCpus;
|
|
26
|
+
private sidecarMemory;
|
|
27
|
+
private fips;
|
|
28
|
+
private fipsIgnoreError;
|
|
29
|
+
private fipsConfig;
|
|
22
30
|
execute(): Promise<0 | 1>;
|
|
31
|
+
instrumentSidecar(project: string, services: string[], region: string, ddService: string | undefined): Promise<void>;
|
|
32
|
+
instrumentService(client: IServicesClient, existingService: IService, serviceName: string, ddService: string): Promise<void>;
|
|
33
|
+
createInstrumentedServiceConfig(service: IService, ddService: string): IService;
|
|
34
|
+
buildSidecarContainer(existingSidecarContainer: IContainer | undefined, ddService: string): IContainer;
|
|
35
|
+
private updateAppContainer;
|
|
23
36
|
}
|
|
@@ -15,54 +15,372 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
15
15
|
exports.InstrumentCommand = void 0;
|
|
16
16
|
const chalk_1 = __importDefault(require("chalk"));
|
|
17
17
|
const clipanion_1 = require("clipanion");
|
|
18
|
-
const
|
|
19
|
-
const
|
|
18
|
+
const constants_1 = require("../../constants");
|
|
19
|
+
const apikey_1 = require("../../helpers/apikey");
|
|
20
|
+
const env_1 = require("../../helpers/env");
|
|
21
|
+
const fips_1 = require("../../helpers/fips");
|
|
22
|
+
const instrument_helpers_1 = require("../../helpers/git/instrument-helpers");
|
|
23
|
+
const renderer_1 = require("../../helpers/renderer");
|
|
24
|
+
const utils_1 = require("../../helpers/utils");
|
|
25
|
+
const validation_1 = require("../../helpers/validation");
|
|
26
|
+
const constants_2 = require("./constants");
|
|
27
|
+
const prompt_1 = require("./prompt");
|
|
28
|
+
const renderer_2 = require("./renderer");
|
|
29
|
+
const utils_2 = require("./utils");
|
|
30
|
+
// XXX temporary workaround for @google-cloud/run ESM/CJS module issues
|
|
31
|
+
const { ServicesClient } = require('@google-cloud/run');
|
|
32
|
+
// equivalent to google.cloud.run.v2.EmptyDirVolumeSource.Medium.MEMORY
|
|
33
|
+
const EMPTY_DIR_VOLUME_SOURCE_MEMORY = 1;
|
|
34
|
+
const DEFAULT_VOLUME_PATH = '/shared-volume';
|
|
35
|
+
const DEFAULT_LOGS_PATH = '/shared-volume/logs/*.log';
|
|
36
|
+
const DEFAULT_HEALTH_CHECK_PORT = 5555;
|
|
37
|
+
const DEFAULT_SIDECAR_IMAGE = 'gcr.io/datadoghq/serverless-init:latest';
|
|
38
|
+
const DEFAULT_ENV_VARS = [
|
|
39
|
+
{ name: constants_1.SITE_ENV_VAR, value: constants_1.DATADOG_SITE_US1 },
|
|
40
|
+
{ name: constants_1.LOGS_INJECTION_ENV_VAR, value: 'true' },
|
|
41
|
+
{ name: constants_1.DD_TRACE_ENABLED_ENV_VAR, value: 'true' },
|
|
42
|
+
{ name: constants_1.HEALTH_PORT_ENV_VAR, value: DEFAULT_HEALTH_CHECK_PORT.toString() },
|
|
43
|
+
];
|
|
20
44
|
class InstrumentCommand extends clipanion_1.Command {
|
|
21
45
|
constructor() {
|
|
22
|
-
|
|
23
|
-
// public static paths = [['cloud-run', 'instrument']]
|
|
46
|
+
var _a, _b;
|
|
24
47
|
super(...arguments);
|
|
25
|
-
|
|
26
|
-
this.dryRun = clipanion_1.Option.Boolean('-d,--dry,--dry-run', false);
|
|
27
|
-
this.environment = clipanion_1.Option.String('--env');
|
|
28
|
-
this.extraTags = clipanion_1.Option.String('--extra-tags,--extraTags');
|
|
29
|
-
this.project = clipanion_1.Option.String('-p,--project'
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
this.
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
this.
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
this.
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
this.
|
|
42
|
-
this.
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
48
|
+
// private configPath = Option.String('--config') implement if requested by customers
|
|
49
|
+
this.dryRun = clipanion_1.Option.Boolean('-d,--dry,--dry-run', false);
|
|
50
|
+
this.environment = clipanion_1.Option.String('--env');
|
|
51
|
+
this.extraTags = clipanion_1.Option.String('--extra-tags,--extraTags');
|
|
52
|
+
this.project = clipanion_1.Option.String('-p,--project', {
|
|
53
|
+
description: 'GCP project ID',
|
|
54
|
+
});
|
|
55
|
+
this.services = clipanion_1.Option.Array('-s,--service,--services', [], {
|
|
56
|
+
description: 'Cloud Run service(s) to instrument',
|
|
57
|
+
});
|
|
58
|
+
this.interactive = clipanion_1.Option.Boolean('-i,--interactive', false, {
|
|
59
|
+
description: 'Prompt for flags one at a time',
|
|
60
|
+
});
|
|
61
|
+
this.region = clipanion_1.Option.String('-r,--region', {
|
|
62
|
+
description: 'GCP region your service(s) are deployed in',
|
|
63
|
+
});
|
|
64
|
+
this.logLevel = clipanion_1.Option.String('--log-level,--logLevel');
|
|
65
|
+
this.sourceCodeIntegration = clipanion_1.Option.Boolean('--source-code-integration,--sourceCodeIntegration', true);
|
|
66
|
+
this.uploadGitMetadata = clipanion_1.Option.Boolean('-u,--upload-git-metadata,--uploadGitMetadata', true);
|
|
67
|
+
this.tracing = clipanion_1.Option.String('--tracing');
|
|
68
|
+
this.version = clipanion_1.Option.String('--version');
|
|
69
|
+
this.llmobs = clipanion_1.Option.String('--llmobs');
|
|
70
|
+
this.healthCheckPort = clipanion_1.Option.String('--port,--health-check-port,--healthCheckPort');
|
|
71
|
+
this.sidecarImage = clipanion_1.Option.String('--image,--sidecar-image', DEFAULT_SIDECAR_IMAGE, {
|
|
72
|
+
description: `The image to use for the sidecar container. Defaults to '${DEFAULT_SIDECAR_IMAGE}'`,
|
|
73
|
+
});
|
|
74
|
+
this.sidecarName = clipanion_1.Option.String('--sidecar-name', constants_2.DEFAULT_SIDECAR_NAME, {
|
|
75
|
+
description: `(Not recommended) The name to use for the sidecar container. Defaults to '${constants_2.DEFAULT_SIDECAR_NAME}'`,
|
|
76
|
+
});
|
|
77
|
+
this.sharedVolumeName = clipanion_1.Option.String('--shared-volume-name', constants_2.DEFAULT_VOLUME_NAME, {
|
|
78
|
+
description: `(Not recommended) The name to use for the shared volume. Defaults to '${constants_2.DEFAULT_VOLUME_NAME}'`,
|
|
79
|
+
});
|
|
80
|
+
this.sharedVolumePath = clipanion_1.Option.String('--shared-volume-path', DEFAULT_VOLUME_PATH, {
|
|
81
|
+
description: `(Not recommended) The path to use for the shared volume. Defaults to '${DEFAULT_VOLUME_PATH}'`,
|
|
82
|
+
});
|
|
83
|
+
this.logsPath = clipanion_1.Option.String('--logs-path', DEFAULT_LOGS_PATH, {
|
|
84
|
+
description: `(Not recommended) The path to use for the logs. Defaults to '${DEFAULT_LOGS_PATH}'. Must begin with the shared volume path.`,
|
|
85
|
+
});
|
|
86
|
+
this.sidecarCpus = clipanion_1.Option.String('--sidecar-cpus', '1', {
|
|
87
|
+
description: `The number of CPUs to allocate to the sidecar container. Defaults to 1.`,
|
|
88
|
+
});
|
|
89
|
+
this.sidecarMemory = clipanion_1.Option.String('--sidecar-memory', '512Mi', {
|
|
90
|
+
description: `The number of CPUs to allocate to the sidecar container. Defaults to '512Mi'.`,
|
|
91
|
+
});
|
|
92
|
+
this.fips = clipanion_1.Option.Boolean('--fips', false);
|
|
93
|
+
this.fipsIgnoreError = clipanion_1.Option.Boolean('--fips-ignore-error', false);
|
|
94
|
+
this.fipsConfig = {
|
|
95
|
+
fips: (_a = (0, env_1.toBoolean)(process.env[constants_1.FIPS_ENV_VAR])) !== null && _a !== void 0 ? _a : false,
|
|
96
|
+
fipsIgnoreError: (_b = (0, env_1.toBoolean)(process.env[constants_1.FIPS_IGNORE_ERROR_ENV_VAR])) !== null && _b !== void 0 ? _b : false,
|
|
46
97
|
};
|
|
47
98
|
}
|
|
48
99
|
execute() {
|
|
100
|
+
var _a, _b;
|
|
49
101
|
return __awaiter(this, void 0, void 0, function* () {
|
|
50
|
-
|
|
51
|
-
this.context.stdout.write((0,
|
|
52
|
-
//
|
|
102
|
+
(0, fips_1.enableFips)(this.fips || this.fipsConfig.fips, this.fipsIgnoreError || this.fipsConfig.fipsIgnoreError);
|
|
103
|
+
this.context.stdout.write(`\n${(0, renderer_2.dryRunPrefix)(this.dryRun)}🐶 ${chalk_1.default.bold('Instrumenting Cloud Run service(s)')}\n\n`);
|
|
104
|
+
// Verify DD API Key
|
|
105
|
+
const isApiKeyValid = yield (0, apikey_1.newApiKeyValidator)({
|
|
106
|
+
apiKey: process.env.DD_API_KEY,
|
|
107
|
+
datadogSite: (_a = process.env.DD_SITE) !== null && _a !== void 0 ? _a : constants_1.DATADOG_SITE_US1,
|
|
108
|
+
}).validateApiKey();
|
|
109
|
+
if (!isApiKeyValid) {
|
|
110
|
+
this.context.stdout.write((0, renderer_1.renderSoftWarning)(`Invalid API Key stored in the environment variable ${chalk_1.default.bold('DD_API_KEY')}: ${(0, utils_1.maskString)((_b = process.env.DD_API_KEY) !== null && _b !== void 0 ? _b : '')}\nEnsure you copied the value and not the Key ID.`));
|
|
111
|
+
return 1;
|
|
112
|
+
}
|
|
113
|
+
if (this.interactive) {
|
|
114
|
+
if (!this.project) {
|
|
115
|
+
this.project = yield (0, prompt_1.requestGCPProject)();
|
|
116
|
+
}
|
|
117
|
+
if (!this.region) {
|
|
118
|
+
this.region = yield (0, prompt_1.requestGCPRegion)();
|
|
119
|
+
}
|
|
120
|
+
if (this.services.length === 0) {
|
|
121
|
+
const serviceName = yield (0, prompt_1.requestServiceName)();
|
|
122
|
+
this.services = [serviceName];
|
|
123
|
+
}
|
|
124
|
+
const envSite = process.env[constants_1.CI_SITE_ENV_VAR];
|
|
125
|
+
if (!(0, validation_1.isValidDatadogSite)(envSite)) {
|
|
126
|
+
process.env[constants_1.CI_SITE_ENV_VAR] = yield (0, prompt_1.requestSite)();
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// Validate required variables
|
|
130
|
+
if (!this.project) {
|
|
131
|
+
this.context.stdout.write(chalk_1.default.yellow('Invalid or missing project. Please use the --project flag.\n'));
|
|
132
|
+
}
|
|
133
|
+
if (this.services.length === 0) {
|
|
134
|
+
this.context.stdout.write(chalk_1.default.yellow('Invalid or missing service(s). Please use the --service flag.\n'));
|
|
135
|
+
}
|
|
136
|
+
if (!this.region) {
|
|
137
|
+
this.context.stdout.write(chalk_1.default.yellow('Invalid or missing region. Please use the --region flag.\n'));
|
|
138
|
+
}
|
|
139
|
+
const ddService = process.env[constants_1.SERVICE_ENV_VAR];
|
|
140
|
+
if (!ddService) {
|
|
141
|
+
this.context.stdout.write((0, renderer_1.renderSoftWarning)('No DD_SERVICE env var found. Will default to the service name.'));
|
|
142
|
+
}
|
|
143
|
+
if (this.extraTags && !this.extraTags.match(constants_1.EXTRA_TAGS_REG_EXP)) {
|
|
144
|
+
this.context.stderr.write((0, renderer_1.renderError)('Extra tags do not comply with the <key>:<value> array.\n'));
|
|
145
|
+
return 1;
|
|
146
|
+
}
|
|
147
|
+
if (!this.project || !this.services || !this.services.length || !this.region) {
|
|
148
|
+
return 1;
|
|
149
|
+
}
|
|
150
|
+
this.context.stdout.write(chalk_1.default.green('✔ Required flags verified\n'));
|
|
53
151
|
// Verify GCP credentials
|
|
54
152
|
this.context.stdout.write(chalk_1.default.bold('\n🔑 Verifying GCP credentials...\n'));
|
|
55
|
-
const authenticated = yield (0,
|
|
153
|
+
const authenticated = yield (0, utils_2.checkAuthentication)();
|
|
56
154
|
if (!authenticated) {
|
|
57
|
-
this.context.stderr.write((0,
|
|
155
|
+
this.context.stderr.write((0, renderer_2.renderAuthenticationInstructions)());
|
|
58
156
|
return 1;
|
|
59
157
|
}
|
|
60
|
-
this.context.stdout.write('GCP credentials verified!\n');
|
|
61
|
-
|
|
158
|
+
this.context.stdout.write(chalk_1.default.green('✔ GCP credentials verified!\n\n'));
|
|
159
|
+
// Source code integration
|
|
160
|
+
if (this.sourceCodeIntegration) {
|
|
161
|
+
try {
|
|
162
|
+
const gitData = yield (0, instrument_helpers_1.getGitData)();
|
|
163
|
+
if (this.uploadGitMetadata) {
|
|
164
|
+
yield (0, instrument_helpers_1.uploadGitData)(this.context);
|
|
165
|
+
}
|
|
166
|
+
if (this.extraTags) {
|
|
167
|
+
this.extraTags += `,git.commit.sha:${gitData.commitSha},git.repository_url:${gitData.gitRemote}`;
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
this.extraTags = `git.commit.sha:${gitData.commitSha},git.repository_url:${gitData.gitRemote}`;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
catch (err) {
|
|
174
|
+
this.context.stdout.write((0, renderer_1.renderSoftWarning)(`Couldn't add source code integration, continuing without it. ${err}`));
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// Instrument services with sidecar
|
|
178
|
+
try {
|
|
179
|
+
yield this.instrumentSidecar(this.project, this.services, this.region, ddService);
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
this.context.stderr.write((0, renderer_2.dryRunPrefix)(this.dryRun) + (0, renderer_1.renderError)(`Uninstrumentation failed: ${error}\n`));
|
|
183
|
+
return 1;
|
|
184
|
+
}
|
|
185
|
+
if (!this.dryRun) {
|
|
186
|
+
this.context.stdout.write('\n✅ Cloud Run instrumentation completed successfully!\n');
|
|
187
|
+
}
|
|
188
|
+
return 0;
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
instrumentSidecar(project, services, region, ddService) {
|
|
192
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
193
|
+
const client = new ServicesClient();
|
|
194
|
+
this.context.stdout.write(chalk_1.default.bold(`\n${(0, renderer_2.dryRunPrefix)(this.dryRun)}⬇️ Fetching existing service configurations from Cloud Run...\n`));
|
|
195
|
+
const existingServiceConfigs = yield (0, utils_2.fetchServiceConfigs)(client, project, region, services);
|
|
196
|
+
this.context.stdout.write(chalk_1.default.bold(`\n${(0, renderer_2.dryRunPrefix)(this.dryRun)}🚀 Instrumenting Cloud Run services with sidecar...\n`));
|
|
197
|
+
for (let i = 0; i < existingServiceConfigs.length; i++) {
|
|
198
|
+
const serviceConfig = existingServiceConfigs[i];
|
|
199
|
+
const serviceName = services[i];
|
|
200
|
+
try {
|
|
201
|
+
const actualDDService = ddService !== null && ddService !== void 0 ? ddService : serviceName;
|
|
202
|
+
yield this.instrumentService(client, serviceConfig, serviceName, actualDDService);
|
|
203
|
+
}
|
|
204
|
+
catch (error) {
|
|
205
|
+
this.context.stderr.write((0, renderer_2.dryRunPrefix)(this.dryRun) + (0, renderer_1.renderError)(`Failed to instrument service ${serviceName}: ${error}\n`));
|
|
206
|
+
throw error;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
instrumentService(client, existingService, serviceName, ddService) {
|
|
212
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
213
|
+
const updatedService = this.createInstrumentedServiceConfig(existingService, ddService);
|
|
214
|
+
this.context.stdout.write((0, utils_2.generateConfigDiff)(existingService, updatedService));
|
|
215
|
+
if (this.dryRun) {
|
|
216
|
+
this.context.stdout.write(`\n\n${(0, renderer_2.dryRunPrefix)(this.dryRun)}Would have updated service ${chalk_1.default.bold(serviceName)} with the above changes.\n`);
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
else if (this.interactive) {
|
|
220
|
+
const confirmed = yield (0, prompt_1.requestConfirmation)('\nDo you want to apply the changes?');
|
|
221
|
+
if (!confirmed) {
|
|
222
|
+
throw new Error('Instrumentation cancelled by user.');
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
yield (0, renderer_2.withSpinner)(`Instrumenting service ${chalk_1.default.bold(serviceName)}...`, () => __awaiter(this, void 0, void 0, function* () {
|
|
226
|
+
const [operation] = yield client.updateService({
|
|
227
|
+
service: updatedService,
|
|
228
|
+
});
|
|
229
|
+
yield operation.promise();
|
|
230
|
+
}), `Instrumented service ${chalk_1.default.bold(serviceName)}`);
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
createInstrumentedServiceConfig(service, ddService) {
|
|
234
|
+
const template = service.template || {};
|
|
235
|
+
const containers = template.containers || [];
|
|
236
|
+
const volumes = template.volumes || [];
|
|
237
|
+
const existingSidecarContainer = containers.find((c) => c.name === this.sidecarName);
|
|
238
|
+
const newSidecarContainer = this.buildSidecarContainer(existingSidecarContainer, ddService);
|
|
239
|
+
// Update all app containers to add volume mounts and env vars if they don't have them
|
|
240
|
+
const updatedContainers = containers.map((container) => {
|
|
241
|
+
if (container.name === this.sidecarName) {
|
|
242
|
+
return newSidecarContainer;
|
|
243
|
+
}
|
|
244
|
+
return this.updateAppContainer(container, ddService);
|
|
62
245
|
});
|
|
246
|
+
// Add sidecar if it doesn't exist
|
|
247
|
+
if (!existingSidecarContainer) {
|
|
248
|
+
updatedContainers.push(newSidecarContainer);
|
|
249
|
+
}
|
|
250
|
+
// Add shared volume if it doesn't exist
|
|
251
|
+
const hasSharedVolume = volumes.some((volume) => volume.name === this.sharedVolumeName);
|
|
252
|
+
const updatedVolumes = hasSharedVolume
|
|
253
|
+
? volumes
|
|
254
|
+
: [
|
|
255
|
+
...volumes,
|
|
256
|
+
{
|
|
257
|
+
name: this.sharedVolumeName,
|
|
258
|
+
emptyDir: {
|
|
259
|
+
medium: EMPTY_DIR_VOLUME_SOURCE_MEMORY,
|
|
260
|
+
},
|
|
261
|
+
},
|
|
262
|
+
];
|
|
263
|
+
return Object.assign(Object.assign({}, service), { template: Object.assign(Object.assign({}, template), { containers: updatedContainers, volumes: updatedVolumes,
|
|
264
|
+
// Let GCR generate the next revision name
|
|
265
|
+
revision: undefined }) });
|
|
266
|
+
}
|
|
267
|
+
buildSidecarContainer(existingSidecarContainer, ddService) {
|
|
268
|
+
var _a, _b, _c;
|
|
269
|
+
const newEnvVars = {};
|
|
270
|
+
for (const envVar of (_a = existingSidecarContainer === null || existingSidecarContainer === void 0 ? void 0 : existingSidecarContainer.env) !== null && _a !== void 0 ? _a : []) {
|
|
271
|
+
newEnvVars[envVar.name] = envVar.value;
|
|
272
|
+
}
|
|
273
|
+
// Add these env vars to the container if they don't already exist,
|
|
274
|
+
// but leave them unchanged if they already exist in the container.
|
|
275
|
+
for (const { name, value } of DEFAULT_ENV_VARS) {
|
|
276
|
+
if (!(name in newEnvVars)) {
|
|
277
|
+
newEnvVars[name] = value;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
// Overwrite existing env vars with these if they already exist
|
|
281
|
+
// and add them to the container if they don't exist yet.
|
|
282
|
+
newEnvVars[constants_1.API_KEY_ENV_VAR] = (_b = process.env[constants_1.API_KEY_ENV_VAR]) !== null && _b !== void 0 ? _b : '';
|
|
283
|
+
newEnvVars[constants_1.SERVICE_ENV_VAR] = ddService;
|
|
284
|
+
if (process.env[constants_1.SITE_ENV_VAR]) {
|
|
285
|
+
newEnvVars[constants_1.SITE_ENV_VAR] = process.env[constants_1.SITE_ENV_VAR];
|
|
286
|
+
}
|
|
287
|
+
if (this.tracing) {
|
|
288
|
+
newEnvVars[constants_1.DD_TRACE_ENABLED_ENV_VAR] = this.tracing;
|
|
289
|
+
}
|
|
290
|
+
if (this.environment) {
|
|
291
|
+
newEnvVars[constants_1.ENVIRONMENT_ENV_VAR] = this.environment;
|
|
292
|
+
}
|
|
293
|
+
if (this.version) {
|
|
294
|
+
newEnvVars[constants_1.VERSION_ENV_VAR] = this.version;
|
|
295
|
+
}
|
|
296
|
+
if (this.logLevel) {
|
|
297
|
+
newEnvVars[constants_1.DD_LOG_LEVEL_ENV_VAR] = this.logLevel;
|
|
298
|
+
}
|
|
299
|
+
if (this.extraTags) {
|
|
300
|
+
newEnvVars[constants_1.DD_TAGS_ENV_VAR] = this.extraTags;
|
|
301
|
+
}
|
|
302
|
+
newEnvVars[constants_1.LOGS_PATH_ENV_VAR] = this.logsPath;
|
|
303
|
+
// If port is specified, overwrite any existing value
|
|
304
|
+
// If port is not specified but already exists, leave the existing value unchanged
|
|
305
|
+
// If port is not specified and does not exist, default to 5555
|
|
306
|
+
let healthCheckPort = (_c = newEnvVars[constants_1.HEALTH_PORT_ENV_VAR]) !== null && _c !== void 0 ? _c : DEFAULT_HEALTH_CHECK_PORT.toString();
|
|
307
|
+
if (this.healthCheckPort) {
|
|
308
|
+
const newHealthCheckPort = Number(this.healthCheckPort);
|
|
309
|
+
if (!Number.isNaN(newHealthCheckPort)) {
|
|
310
|
+
healthCheckPort = newHealthCheckPort.toString();
|
|
311
|
+
newEnvVars[constants_1.HEALTH_PORT_ENV_VAR] = healthCheckPort;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
const newEnv = Object.entries(newEnvVars).map(([name, value]) => ({ name, value }));
|
|
315
|
+
// Create sidecar container with volume mount and environment variables
|
|
316
|
+
return {
|
|
317
|
+
name: this.sidecarName,
|
|
318
|
+
image: this.sidecarImage,
|
|
319
|
+
volumeMounts: [
|
|
320
|
+
{
|
|
321
|
+
name: this.sharedVolumeName,
|
|
322
|
+
mountPath: this.sharedVolumePath,
|
|
323
|
+
},
|
|
324
|
+
],
|
|
325
|
+
env: newEnv,
|
|
326
|
+
startupProbe: {
|
|
327
|
+
tcpSocket: {
|
|
328
|
+
port: healthCheckPort,
|
|
329
|
+
},
|
|
330
|
+
initialDelaySeconds: 0,
|
|
331
|
+
periodSeconds: 10,
|
|
332
|
+
failureThreshold: 3,
|
|
333
|
+
timeoutSeconds: 1,
|
|
334
|
+
},
|
|
335
|
+
resources: {
|
|
336
|
+
limits: {
|
|
337
|
+
memory: this.sidecarMemory,
|
|
338
|
+
cpu: this.sidecarCpus,
|
|
339
|
+
},
|
|
340
|
+
},
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
// Add volume mount and update required env vars
|
|
344
|
+
updateAppContainer(appContainer, ddService) {
|
|
345
|
+
var _a;
|
|
346
|
+
const existingVolumeMounts = appContainer.volumeMounts || [];
|
|
347
|
+
const hasSharedVolumeMount = existingVolumeMounts.some((mount) => mount.name === this.sharedVolumeName);
|
|
348
|
+
const existingEnvVars = appContainer.env || [];
|
|
349
|
+
const updatedContainer = Object.assign({}, appContainer);
|
|
350
|
+
if (!hasSharedVolumeMount) {
|
|
351
|
+
updatedContainer.volumeMounts = [
|
|
352
|
+
...existingVolumeMounts,
|
|
353
|
+
{
|
|
354
|
+
name: this.sharedVolumeName,
|
|
355
|
+
mountPath: this.sharedVolumePath,
|
|
356
|
+
},
|
|
357
|
+
];
|
|
358
|
+
}
|
|
359
|
+
// Update environment variables
|
|
360
|
+
const newEnvVars = {};
|
|
361
|
+
for (const { name, value } of existingEnvVars) {
|
|
362
|
+
newEnvVars[name] = value;
|
|
363
|
+
}
|
|
364
|
+
// Default to DD_LOGS_INJECTION=true, but don't overwrite existing value
|
|
365
|
+
if (!(constants_1.LOGS_INJECTION_ENV_VAR in newEnvVars)) {
|
|
366
|
+
newEnvVars[constants_1.LOGS_INJECTION_ENV_VAR] = 'true';
|
|
367
|
+
}
|
|
368
|
+
// Replace or add other env vars
|
|
369
|
+
newEnvVars[constants_1.SERVICE_ENV_VAR] = ddService;
|
|
370
|
+
newEnvVars[constants_1.API_KEY_ENV_VAR] = (_a = process.env[constants_1.API_KEY_ENV_VAR]) !== null && _a !== void 0 ? _a : '';
|
|
371
|
+
if (this.llmobs) {
|
|
372
|
+
newEnvVars[constants_1.DD_LLMOBS_ENABLED_ENV_VAR] = 'true';
|
|
373
|
+
newEnvVars[constants_1.DD_LLMOBS_ML_APP_ENV_VAR] = this.llmobs;
|
|
374
|
+
// serverless-init is installed, so agentless mode should be false
|
|
375
|
+
newEnvVars[constants_1.DD_LLMOBS_AGENTLESS_ENABLED_ENV_VAR] = 'false';
|
|
376
|
+
}
|
|
377
|
+
updatedContainer.env = Object.entries(newEnvVars).map(([name, value]) => ({ name, value }));
|
|
378
|
+
return updatedContainer;
|
|
63
379
|
}
|
|
64
380
|
}
|
|
65
381
|
exports.InstrumentCommand = InstrumentCommand;
|
|
382
|
+
// TODO add to docs: https://github.com/DataDog/datadog-ci#cloud-run
|
|
383
|
+
InstrumentCommand.paths = [['cloud-run', 'instrument']];
|
|
66
384
|
InstrumentCommand.usage = clipanion_1.Command.Usage({
|
|
67
385
|
category: 'Serverless',
|
|
68
386
|
description: 'Apply Datadog instrumentation to a Cloud Run app.',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrument.js","sourceRoot":"","sources":["../../../src/commands/cloud-run/instrument.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"instrument.js","sourceRoot":"","sources":["../../../src/commands/cloud-run/instrument.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAEA,kDAAyB;AACzB,yCAAyC;AAEzC,+CAoBwB;AACxB,iDAAuD;AACvD,2CAA2C;AAC3C,6CAA6C;AAC7C,6EAA8E;AAC9E,qDAAqE;AACrE,+CAA8C;AAC9C,yDAA2D;AAE3D,2CAAqE;AACrE,qCAAkH;AAClH,yCAAsF;AACtF,mCAAoF;AAEpF,uEAAuE;AACvE,MAAM,EAAC,cAAc,EAAC,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAA;AAErD,uEAAuE;AACvE,MAAM,8BAA8B,GAAG,CAAC,CAAA;AAExC,MAAM,mBAAmB,GAAG,gBAAgB,CAAA;AAC5C,MAAM,iBAAiB,GAAG,2BAA2B,CAAA;AACrD,MAAM,yBAAyB,GAAG,IAAI,CAAA;AACtC,MAAM,qBAAqB,GAAG,yCAAyC,CAAA;AAEvE,MAAM,gBAAgB,GAAc;IAClC,EAAC,IAAI,EAAE,wBAAY,EAAE,KAAK,EAAE,4BAAgB,EAAC;IAC7C,EAAC,IAAI,EAAE,kCAAsB,EAAE,KAAK,EAAE,MAAM,EAAC;IAC7C,EAAC,IAAI,EAAE,oCAAwB,EAAE,KAAK,EAAE,MAAM,EAAC;IAC/C,EAAC,IAAI,EAAE,+BAAmB,EAAE,KAAK,EAAE,yBAAyB,CAAC,QAAQ,EAAE,EAAC;CACzE,CAAA;AAED,MAAa,iBAAkB,SAAQ,mBAAO;IAA9C;;;QASE,qFAAqF;QAC7E,WAAM,GAAG,kBAAM,CAAC,OAAO,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAA;QACpD,gBAAW,GAAG,kBAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACpC,cAAS,GAAG,kBAAM,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAA;QACrD,YAAO,GAAG,kBAAM,CAAC,MAAM,CAAC,cAAc,EAAE;YAC9C,WAAW,EAAE,gBAAgB;SAC9B,CAAC,CAAA;QACM,aAAQ,GAAG,kBAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE,EAAE;YAC7D,WAAW,EAAE,oCAAoC;SAClD,CAAC,CAAA;QACM,gBAAW,GAAG,kBAAM,CAAC,OAAO,CAAC,kBAAkB,EAAE,KAAK,EAAE;YAC9D,WAAW,EAAE,gCAAgC;SAC9C,CAAC,CAAA;QACM,WAAM,GAAG,kBAAM,CAAC,MAAM,CAAC,aAAa,EAAE;YAC5C,WAAW,EAAE,4CAA4C;SAC1D,CAAC,CAAA;QACM,aAAQ,GAAG,kBAAM,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAA;QAClD,0BAAqB,GAAG,kBAAM,CAAC,OAAO,CAAC,mDAAmD,EAAE,IAAI,CAAC,CAAA;QACjG,sBAAiB,GAAG,kBAAM,CAAC,OAAO,CAAC,8CAA8C,EAAE,IAAI,CAAC,CAAA;QACxF,YAAO,GAAG,kBAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;QACpC,YAAO,GAAG,kBAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;QACpC,WAAM,GAAG,kBAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;QAClC,oBAAe,GAAG,kBAAM,CAAC,MAAM,CAAC,8CAA8C,CAAC,CAAA;QAC/E,iBAAY,GAAG,kBAAM,CAAC,MAAM,CAAC,yBAAyB,EAAE,qBAAqB,EAAE;YACrF,WAAW,EAAE,4DAA4D,qBAAqB,GAAG;SAClG,CAAC,CAAA;QACM,gBAAW,GAAG,kBAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,gCAAoB,EAAE;YAC1E,WAAW,EAAE,6EAA6E,gCAAoB,GAAG;SAClH,CAAC,CAAA;QACM,qBAAgB,GAAG,kBAAM,CAAC,MAAM,CAAC,sBAAsB,EAAE,+BAAmB,EAAE;YACpF,WAAW,EAAE,yEAAyE,+BAAmB,GAAG;SAC7G,CAAC,CAAA;QACM,qBAAgB,GAAG,kBAAM,CAAC,MAAM,CAAC,sBAAsB,EAAE,mBAAmB,EAAE;YACpF,WAAW,EAAE,yEAAyE,mBAAmB,GAAG;SAC7G,CAAC,CAAA;QACM,aAAQ,GAAG,kBAAM,CAAC,MAAM,CAAC,aAAa,EAAE,iBAAiB,EAAE;YACjE,WAAW,EAAE,gEAAgE,iBAAiB,4CAA4C;SAC3I,CAAC,CAAA;QACM,gBAAW,GAAG,kBAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,GAAG,EAAE;YACzD,WAAW,EAAE,yEAAyE;SACvF,CAAC,CAAA;QACM,kBAAa,GAAG,kBAAM,CAAC,MAAM,CAAC,kBAAkB,EAAE,OAAO,EAAE;YACjE,WAAW,EAAE,+EAA+E;SAC7F,CAAC,CAAA;QACM,SAAI,GAAG,kBAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;QACtC,oBAAe,GAAG,kBAAM,CAAC,OAAO,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAA;QAE9D,eAAU,GAAG;YACnB,IAAI,EAAE,MAAA,IAAA,eAAS,EAAC,OAAO,CAAC,GAAG,CAAC,wBAAY,CAAC,CAAC,mCAAI,KAAK;YACnD,eAAe,EAAE,MAAA,IAAA,eAAS,EAAC,OAAO,CAAC,GAAG,CAAC,qCAAyB,CAAC,CAAC,mCAAI,KAAK;SAC5E,CAAA;IAgWH,CAAC;IA9Vc,OAAO;;;YAClB,IAAA,iBAAU,EAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,CAAA;YAEtG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACvB,KAAK,IAAA,uBAAY,EAAC,IAAI,CAAC,MAAM,CAAC,MAAM,eAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,MAAM,CAC3F,CAAA;YAED,oBAAoB;YACpB,MAAM,aAAa,GAAG,MAAM,IAAA,2BAAkB,EAAC;gBAC7C,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;gBAC9B,WAAW,EAAE,MAAA,OAAO,CAAC,GAAG,CAAC,OAAO,mCAAI,4BAAgB;aACrD,CAAC,CAAC,cAAc,EAAE,CAAA;YACnB,IAAI,CAAC,aAAa,EAAE;gBAClB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACvB,IAAA,4BAAiB,EACf,sDAAsD,eAAK,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,IAAA,kBAAU,EAC3F,MAAA,OAAO,CAAC,GAAG,CAAC,UAAU,mCAAI,EAAE,CAC7B,mDAAmD,CACrD,CACF,CAAA;gBAED,OAAO,CAAC,CAAA;aACT;YAED,IAAI,IAAI,CAAC,WAAW,EAAE;gBACpB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;oBACjB,IAAI,CAAC,OAAO,GAAG,MAAM,IAAA,0BAAiB,GAAE,CAAA;iBACzC;gBAED,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;oBAChB,IAAI,CAAC,MAAM,GAAG,MAAM,IAAA,yBAAgB,GAAE,CAAA;iBACvC;gBAED,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;oBAC9B,MAAM,WAAW,GAAG,MAAM,IAAA,2BAAkB,GAAE,CAAA;oBAC9C,IAAI,CAAC,QAAQ,GAAG,CAAC,WAAW,CAAC,CAAA;iBAC9B;gBAED,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,2BAAe,CAAC,CAAA;gBAC5C,IAAI,CAAC,IAAA,+BAAkB,EAAC,OAAO,CAAC,EAAE;oBAChC,OAAO,CAAC,GAAG,CAAC,2BAAe,CAAC,GAAG,MAAM,IAAA,oBAAW,GAAE,CAAA;iBACnD;aACF;YAED,8BAA8B;YAC9B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;gBACjB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAK,CAAC,MAAM,CAAC,8DAA8D,CAAC,CAAC,CAAA;aACxG;YACD,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC9B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAK,CAAC,MAAM,CAAC,iEAAiE,CAAC,CAAC,CAAA;aAC3G;YACD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;gBAChB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAK,CAAC,MAAM,CAAC,4DAA4D,CAAC,CAAC,CAAA;aACtG;YAED,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,2BAAe,CAAC,CAAA;YAC9C,IAAI,CAAC,SAAS,EAAE;gBACd,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,4BAAiB,EAAC,gEAAgE,CAAC,CAAC,CAAA;aAC/G;YAED,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,8BAAkB,CAAC,EAAE;gBAC/D,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,sBAAW,EAAC,0DAA0D,CAAC,CAAC,CAAA;gBAElG,OAAO,CAAC,CAAA;aACT;YAED,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;gBAC5E,OAAO,CAAC,CAAA;aACT;YACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAK,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAA;YAErE,yBAAyB;YACzB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC,CAAA;YAC5E,MAAM,aAAa,GAAG,MAAM,IAAA,2BAAmB,GAAE,CAAA;YACjD,IAAI,CAAC,aAAa,EAAE;gBAClB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,2CAAgC,GAAE,CAAC,CAAA;gBAE7D,OAAO,CAAC,CAAA;aACT;YACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAA;YAEzE,0BAA0B;YAC1B,IAAI,IAAI,CAAC,qBAAqB,EAAE;gBAC9B,IAAI;oBACF,MAAM,OAAO,GAAG,MAAM,IAAA,+BAAU,GAAE,CAAA;oBAClC,IAAI,IAAI,CAAC,iBAAiB,EAAE;wBAC1B,MAAM,IAAA,kCAAa,EAAC,IAAI,CAAC,OAAO,CAAC,CAAA;qBAClC;oBACD,IAAI,IAAI,CAAC,SAAS,EAAE;wBAClB,IAAI,CAAC,SAAS,IAAI,mBAAmB,OAAO,CAAC,SAAS,uBAAuB,OAAO,CAAC,SAAS,EAAE,CAAA;qBACjG;yBAAM;wBACL,IAAI,CAAC,SAAS,GAAG,kBAAkB,OAAO,CAAC,SAAS,uBAAuB,OAAO,CAAC,SAAS,EAAE,CAAA;qBAC/F;iBACF;gBAAC,OAAO,GAAG,EAAE;oBACZ,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACvB,IAAA,4BAAiB,EAAC,gEAAgE,GAAG,EAAE,CAAC,CACzF,CAAA;iBACF;aACF;YAED,mCAAmC;YACnC,IAAI;gBACF,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;aAClF;YAAC,OAAO,KAAK,EAAE;gBACd,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,uBAAY,EAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAA,sBAAW,EAAC,6BAA6B,KAAK,IAAI,CAAC,CAAC,CAAA;gBAE1G,OAAO,CAAC,CAAA;aACT;YAED,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;gBAChB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAA;aACrF;YAED,OAAO,CAAC,CAAA;;KACT;IAEY,iBAAiB,CAAC,OAAe,EAAE,QAAkB,EAAE,MAAc,EAAE,SAA6B;;YAC/G,MAAM,MAAM,GAAoB,IAAI,cAAc,EAAE,CAAA;YAEpD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACvB,eAAK,CAAC,IAAI,CAAC,KAAK,IAAA,uBAAY,EAAC,IAAI,CAAC,MAAM,CAAC,iEAAiE,CAAC,CAC5G,CAAA;YACD,MAAM,sBAAsB,GAAG,MAAM,IAAA,2BAAmB,EAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAA;YAE3F,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACvB,eAAK,CAAC,IAAI,CAAC,KAAK,IAAA,uBAAY,EAAC,IAAI,CAAC,MAAM,CAAC,uDAAuD,CAAC,CAClG,CAAA;YACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,sBAAsB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACtD,MAAM,aAAa,GAAG,sBAAsB,CAAC,CAAC,CAAC,CAAA;gBAC/C,MAAM,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;gBAC/B,IAAI;oBACF,MAAM,eAAe,GAAG,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,WAAW,CAAA;oBAChD,MAAM,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,CAAC,CAAA;iBAClF;gBAAC,OAAO,KAAK,EAAE;oBACd,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACvB,IAAA,uBAAY,EAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAA,sBAAW,EAAC,gCAAgC,WAAW,KAAK,KAAK,IAAI,CAAC,CACnG,CAAA;oBACD,MAAM,KAAK,CAAA;iBACZ;aACF;QACH,CAAC;KAAA;IAEY,iBAAiB,CAC5B,MAAuB,EACvB,eAAyB,EACzB,WAAmB,EACnB,SAAiB;;YAEjB,MAAM,cAAc,GAAG,IAAI,CAAC,+BAA+B,CAAC,eAAe,EAAE,SAAS,CAAC,CAAA;YACvF,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,0BAAkB,EAAC,eAAe,EAAE,cAAc,CAAC,CAAC,CAAA;YAC9E,IAAI,IAAI,CAAC,MAAM,EAAE;gBACf,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CACvB,OAAO,IAAA,uBAAY,EAAC,IAAI,CAAC,MAAM,CAAC,8BAA8B,eAAK,CAAC,IAAI,CACtE,WAAW,CACZ,4BAA4B,CAC9B,CAAA;gBAED,OAAM;aACP;iBAAM,IAAI,IAAI,CAAC,WAAW,EAAE;gBAC3B,MAAM,SAAS,GAAG,MAAM,IAAA,4BAAmB,EAAC,qCAAqC,CAAC,CAAA;gBAClF,IAAI,CAAC,SAAS,EAAE;oBACd,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;iBACtD;aACF;YAED,MAAM,IAAA,sBAAW,EACf,yBAAyB,eAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EACrD,GAAS,EAAE;gBACT,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;oBAC7C,OAAO,EAAE,cAAc;iBACxB,CAAC,CAAA;gBACF,MAAM,SAAS,CAAC,OAAO,EAAE,CAAA;YAC3B,CAAC,CAAA,EACD,wBAAwB,eAAK,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAClD,CAAA;QACH,CAAC;KAAA;IAEM,+BAA+B,CAAC,OAAiB,EAAE,SAAiB;QACzE,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAA;QACvC,MAAM,UAAU,GAAiB,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAA;QAC1D,MAAM,OAAO,GAAc,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAA;QAEjD,MAAM,wBAAwB,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,CAAC,CAAA;QACpF,MAAM,mBAAmB,GAAG,IAAI,CAAC,qBAAqB,CAAC,wBAAwB,EAAE,SAAS,CAAC,CAAA;QAE3F,sFAAsF;QACtF,MAAM,iBAAiB,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;YACrD,IAAI,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE;gBACvC,OAAO,mBAAmB,CAAA;aAC3B;YAED,OAAO,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;QACtD,CAAC,CAAC,CAAA;QAEF,kCAAkC;QAClC,IAAI,CAAC,wBAAwB,EAAE;YAC7B,iBAAiB,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;SAC5C;QAED,wCAAwC;QACxC,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,gBAAgB,CAAC,CAAA;QACvF,MAAM,cAAc,GAAG,eAAe;YACpC,CAAC,CAAC,OAAO;YACT,CAAC,CAAC;gBACE,GAAG,OAAO;gBACV;oBACE,IAAI,EAAE,IAAI,CAAC,gBAAgB;oBAC3B,QAAQ,EAAE;wBACR,MAAM,EAAE,8BAA8B;qBACvC;iBACF;aACF,CAAA;QAEL,uCACK,OAAO,KACV,QAAQ,kCACH,QAAQ,KACX,UAAU,EAAE,iBAAiB,EAC7B,OAAO,EAAE,cAAc;gBACvB,0CAA0C;gBAC1C,QAAQ,EAAE,SAAS,OAEtB;IACH,CAAC;IAEM,qBAAqB,CAAC,wBAAgD,EAAE,SAAiB;;QAC9F,MAAM,UAAU,GAA2B,EAAE,CAAA;QAC7C,KAAK,MAAM,MAAM,IAAI,MAAA,wBAAwB,aAAxB,wBAAwB,uBAAxB,wBAAwB,CAAE,GAAG,mCAAI,EAAE,EAAE;YACxD,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAA;SACvC;QAED,mEAAmE;QACnE,mEAAmE;QACnE,KAAK,MAAM,EAAC,IAAI,EAAE,KAAK,EAAC,IAAI,gBAAgB,EAAE;YAC5C,IAAI,CAAC,CAAC,IAAI,IAAI,UAAU,CAAC,EAAE;gBACzB,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,CAAA;aACzB;SACF;QAED,+DAA+D;QAC/D,yDAAyD;QACzD,UAAU,CAAC,2BAAe,CAAC,GAAG,MAAA,OAAO,CAAC,GAAG,CAAC,2BAAe,CAAC,mCAAI,EAAE,CAAA;QAChE,UAAU,CAAC,2BAAe,CAAC,GAAG,SAAS,CAAA;QACvC,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAY,CAAC,EAAE;YAC7B,UAAU,CAAC,wBAAY,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAY,CAAC,CAAA;SACrD;QACD,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,UAAU,CAAC,oCAAwB,CAAC,GAAG,IAAI,CAAC,OAAO,CAAA;SACpD;QACD,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,UAAU,CAAC,+BAAmB,CAAC,GAAG,IAAI,CAAC,WAAW,CAAA;SACnD;QACD,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,UAAU,CAAC,2BAAe,CAAC,GAAG,IAAI,CAAC,OAAO,CAAA;SAC3C;QACD,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,UAAU,CAAC,gCAAoB,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAA;SACjD;QACD,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,UAAU,CAAC,2BAAe,CAAC,GAAG,IAAI,CAAC,SAAS,CAAA;SAC7C;QACD,UAAU,CAAC,6BAAiB,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAA;QAE7C,qDAAqD;QACrD,kFAAkF;QAClF,+DAA+D;QAC/D,IAAI,eAAe,GAAG,MAAA,UAAU,CAAC,+BAAmB,CAAC,mCAAI,yBAAyB,CAAC,QAAQ,EAAE,CAAA;QAC7F,IAAI,IAAI,CAAC,eAAe,EAAE;YACxB,MAAM,kBAAkB,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;YACvD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE;gBACrC,eAAe,GAAG,kBAAkB,CAAC,QAAQ,EAAE,CAAA;gBAC/C,UAAU,CAAC,+BAAmB,CAAC,GAAG,eAAe,CAAA;aAClD;SACF;QAED,MAAM,MAAM,GAAc,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAC,IAAI,EAAE,KAAK,EAAC,CAAC,CAAC,CAAA;QAE5F,uEAAuE;QACvE,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,WAAW;YACtB,KAAK,EAAE,IAAI,CAAC,YAAY;YACxB,YAAY,EAAE;gBACZ;oBACE,IAAI,EAAE,IAAI,CAAC,gBAAgB;oBAC3B,SAAS,EAAE,IAAI,CAAC,gBAAgB;iBACjC;aACF;YACD,GAAG,EAAE,MAAM;YACX,YAAY,EAAE;gBACZ,SAAS,EAAE;oBACT,IAAI,EAAE,eAAe;iBACtB;gBACD,mBAAmB,EAAE,CAAC;gBACtB,aAAa,EAAE,EAAE;gBACjB,gBAAgB,EAAE,CAAC;gBACnB,cAAc,EAAE,CAAC;aAClB;YACD,SAAS,EAAE;gBACT,MAAM,EAAE;oBACN,MAAM,EAAE,IAAI,CAAC,aAAa;oBAC1B,GAAG,EAAE,IAAI,CAAC,WAAW;iBACtB;aACF;SACF,CAAA;IACH,CAAC;IAED,gDAAgD;IACxC,kBAAkB,CAAC,YAAwB,EAAE,SAAiB;;QACpE,MAAM,oBAAoB,GAAG,YAAY,CAAC,YAAY,IAAI,EAAE,CAAA;QAC5D,MAAM,oBAAoB,GAAG,oBAAoB,CAAC,IAAI,CACpD,CAAC,KAAmB,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,gBAAgB,CAC9D,CAAA;QACD,MAAM,eAAe,GAAG,YAAY,CAAC,GAAG,IAAI,EAAE,CAAA;QAE9C,MAAM,gBAAgB,qBAAO,YAAY,CAAC,CAAA;QAC1C,IAAI,CAAC,oBAAoB,EAAE;YACzB,gBAAgB,CAAC,YAAY,GAAG;gBAC9B,GAAG,oBAAoB;gBACvB;oBACE,IAAI,EAAE,IAAI,CAAC,gBAAgB;oBAC3B,SAAS,EAAE,IAAI,CAAC,gBAAgB;iBACjC;aACF,CAAA;SACF;QAED,+BAA+B;QAC/B,MAAM,UAAU,GAA2B,EAAE,CAAA;QAC7C,KAAK,MAAM,EAAC,IAAI,EAAE,KAAK,EAAC,IAAI,eAAe,EAAE;YAC3C,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,CAAA;SACzB;QAED,wEAAwE;QACxE,IAAI,CAAC,CAAC,kCAAsB,IAAI,UAAU,CAAC,EAAE;YAC3C,UAAU,CAAC,kCAAsB,CAAC,GAAG,MAAM,CAAA;SAC5C;QAED,gCAAgC;QAChC,UAAU,CAAC,2BAAe,CAAC,GAAG,SAAS,CAAA;QACvC,UAAU,CAAC,2BAAe,CAAC,GAAG,MAAA,OAAO,CAAC,GAAG,CAAC,2BAAe,CAAC,mCAAI,EAAE,CAAA;QAChE,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,UAAU,CAAC,qCAAyB,CAAC,GAAG,MAAM,CAAA;YAC9C,UAAU,CAAC,oCAAwB,CAAC,GAAG,IAAI,CAAC,MAAM,CAAA;YAClD,kEAAkE;YAClE,UAAU,CAAC,+CAAmC,CAAC,GAAG,OAAO,CAAA;SAC1D;QAED,gBAAgB,CAAC,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAC,IAAI,EAAE,KAAK,EAAC,CAAC,CAAC,CAAA;QAEzF,OAAO,gBAAgB,CAAA;IACzB,CAAC;;AA1ZH,8CA2ZC;AA1ZC,oEAAoE;AACtD,uBAAK,GAAG,CAAC,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,AAAhC,CAAgC;AAErC,uBAAK,GAAG,mBAAO,CAAC,KAAK,CAAC;IAClC,QAAQ,EAAE,YAAY;IACtB,WAAW,EAAE,mDAAmD;CACjE,CAAC,AAHiB,CAGjB"}
|
|
@@ -25,24 +25,6 @@ export interface LogConfig {
|
|
|
25
25
|
fileName: string;
|
|
26
26
|
severityFilter?: string;
|
|
27
27
|
}
|
|
28
|
-
/**
|
|
29
|
-
* Configuration options provided by the user through
|
|
30
|
-
* the CLI in order to instrument properly.
|
|
31
|
-
*/
|
|
32
|
-
export interface CloudRunConfigOptions {
|
|
33
|
-
environment?: string;
|
|
34
|
-
extraTags?: string;
|
|
35
|
-
services: string[];
|
|
36
|
-
interactive?: boolean;
|
|
37
|
-
logging?: string;
|
|
38
|
-
logLevel?: string;
|
|
39
|
-
profile?: string;
|
|
40
|
-
region?: string;
|
|
41
|
-
service?: string;
|
|
42
|
-
tracing?: string;
|
|
43
|
-
version?: string;
|
|
44
|
-
llmobs?: string;
|
|
45
|
-
}
|
|
46
28
|
/**
|
|
47
29
|
* Interface for Unified Service Tagging.
|
|
48
30
|
*
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare const requestGCPProject: () => Promise<string>;
|
|
2
|
+
export declare const requestGCPRegion: (defaultRegion?: string) => Promise<string>;
|
|
3
|
+
export declare const requestServiceName: () => Promise<string>;
|
|
4
|
+
export declare const requestSite: () => Promise<string>;
|
|
5
|
+
export declare const requestConfirmation: (message: string, defaultValue?: boolean) => Promise<boolean>;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.requestConfirmation = exports.requestSite = exports.requestServiceName = exports.requestGCPRegion = exports.requestGCPProject = void 0;
|
|
16
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
17
|
+
const constants_1 = require("../../constants");
|
|
18
|
+
const checkboxPlusPrompt = require('inquirer-checkbox-plus-prompt');
|
|
19
|
+
inquirer_1.default.registerPrompt('checkbox-plus', checkboxPlusPrompt);
|
|
20
|
+
const requestGCPProject = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
21
|
+
const answer = yield inquirer_1.default.prompt({
|
|
22
|
+
message: 'Enter GCP Project ID:',
|
|
23
|
+
name: 'project',
|
|
24
|
+
type: 'input',
|
|
25
|
+
validate: (value) => {
|
|
26
|
+
if (!value || value.trim().length === 0) {
|
|
27
|
+
return 'Project ID is required.';
|
|
28
|
+
}
|
|
29
|
+
return true;
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
return answer.project;
|
|
33
|
+
});
|
|
34
|
+
exports.requestGCPProject = requestGCPProject;
|
|
35
|
+
const requestGCPRegion = (defaultRegion) => __awaiter(void 0, void 0, void 0, function* () {
|
|
36
|
+
const answer = yield inquirer_1.default.prompt({
|
|
37
|
+
default: defaultRegion || 'us-central1',
|
|
38
|
+
message: 'Enter GCP Region:',
|
|
39
|
+
name: 'region',
|
|
40
|
+
type: 'input',
|
|
41
|
+
validate: (value) => {
|
|
42
|
+
if (!value || value.trim().length === 0) {
|
|
43
|
+
return 'Region is required.';
|
|
44
|
+
}
|
|
45
|
+
return true;
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
return answer.region;
|
|
49
|
+
});
|
|
50
|
+
exports.requestGCPRegion = requestGCPRegion;
|
|
51
|
+
const requestServiceName = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
52
|
+
const answer = yield inquirer_1.default.prompt({
|
|
53
|
+
message: 'Enter Cloud Run service name:',
|
|
54
|
+
name: 'serviceName',
|
|
55
|
+
type: 'input',
|
|
56
|
+
validate: (value) => {
|
|
57
|
+
if (!value || value.trim().length === 0) {
|
|
58
|
+
return 'Service name is required.';
|
|
59
|
+
}
|
|
60
|
+
return true;
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
return answer.serviceName;
|
|
64
|
+
});
|
|
65
|
+
exports.requestServiceName = requestServiceName;
|
|
66
|
+
const requestSite = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
67
|
+
const answer = yield inquirer_1.default.prompt({
|
|
68
|
+
choices: constants_1.DATADOG_SITES,
|
|
69
|
+
message: 'Select a Datadog Site:',
|
|
70
|
+
name: 'site',
|
|
71
|
+
type: 'list',
|
|
72
|
+
});
|
|
73
|
+
return answer.site;
|
|
74
|
+
});
|
|
75
|
+
exports.requestSite = requestSite;
|
|
76
|
+
const requestConfirmation = (message, defaultValue = true) => __awaiter(void 0, void 0, void 0, function* () {
|
|
77
|
+
const confirmationAnswer = yield inquirer_1.default.prompt({
|
|
78
|
+
message,
|
|
79
|
+
name: 'confirmation',
|
|
80
|
+
type: 'confirm',
|
|
81
|
+
default: defaultValue,
|
|
82
|
+
});
|
|
83
|
+
return confirmationAnswer.confirmation !== false;
|
|
84
|
+
});
|
|
85
|
+
exports.requestConfirmation = requestConfirmation;
|
|
86
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../../src/commands/cloud-run/prompt.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,wDAA+B;AAE/B,+CAA6C;AAE7C,MAAM,kBAAkB,GAAG,OAAO,CAAC,+BAA+B,CAAC,CAAA;AACnE,kBAAQ,CAAC,cAAc,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAA;AAErD,MAAM,iBAAiB,GAAG,GAA0B,EAAE;IAC3D,MAAM,MAAM,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;QACnC,OAAO,EAAE,uBAAuB;QAChC,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,OAAO;QACb,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;YAC1B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE;gBACvC,OAAO,yBAAyB,CAAA;aACjC;YAED,OAAO,IAAI,CAAA;QACb,CAAC;KACF,CAAC,CAAA;IAEF,OAAO,MAAM,CAAC,OAAO,CAAA;AACvB,CAAC,CAAA,CAAA;AAfY,QAAA,iBAAiB,qBAe7B;AAEM,MAAM,gBAAgB,GAAG,CAAO,aAAsB,EAAmB,EAAE;IAChF,MAAM,MAAM,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;QACnC,OAAO,EAAE,aAAa,IAAI,aAAa;QACvC,OAAO,EAAE,mBAAmB;QAC5B,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,OAAO;QACb,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;YAC1B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE;gBACvC,OAAO,qBAAqB,CAAA;aAC7B;YAED,OAAO,IAAI,CAAA;QACb,CAAC;KACF,CAAC,CAAA;IAEF,OAAO,MAAM,CAAC,MAAM,CAAA;AACtB,CAAC,CAAA,CAAA;AAhBY,QAAA,gBAAgB,oBAgB5B;AAEM,MAAM,kBAAkB,GAAG,GAA0B,EAAE;IAC5D,MAAM,MAAM,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;QACnC,OAAO,EAAE,+BAA+B;QACxC,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,OAAO;QACb,QAAQ,EAAE,CAAC,KAAa,EAAE,EAAE;YAC1B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE;gBACvC,OAAO,2BAA2B,CAAA;aACnC;YAED,OAAO,IAAI,CAAA;QACb,CAAC;KACF,CAAC,CAAA;IAEF,OAAO,MAAM,CAAC,WAAW,CAAA;AAC3B,CAAC,CAAA,CAAA;AAfY,QAAA,kBAAkB,sBAe9B;AAEM,MAAM,WAAW,GAAG,GAA0B,EAAE;IACrD,MAAM,MAAM,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;QACnC,OAAO,EAAE,yBAAa;QACtB,OAAO,EAAE,wBAAwB;QACjC,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,MAAM;KACb,CAAC,CAAA;IAEF,OAAO,MAAM,CAAC,IAAI,CAAA;AACpB,CAAC,CAAA,CAAA;AATY,QAAA,WAAW,eASvB;AAEM,MAAM,mBAAmB,GAAG,CAAO,OAAe,EAAE,YAAY,GAAG,IAAI,EAAE,EAAE;IAChF,MAAM,kBAAkB,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;QAC/C,OAAO;QACP,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,YAAY;KACtB,CAAC,CAAA;IAEF,OAAO,kBAAkB,CAAC,YAAY,KAAK,KAAK,CAAA;AAClD,CAAC,CAAA,CAAA;AATY,QAAA,mBAAmB,uBAS/B"}
|
|
@@ -1,6 +1,13 @@
|
|
|
1
|
-
import { InstrumentCommand } from './instrument';
|
|
2
1
|
/**
|
|
3
2
|
* @returns instructions on how to authenticate with GCP.
|
|
4
3
|
*/
|
|
5
4
|
export declare const renderAuthenticationInstructions: () => string;
|
|
6
|
-
export declare const
|
|
5
|
+
export declare const dryRunPrefix: (isDryRun: boolean) => string;
|
|
6
|
+
/**
|
|
7
|
+
* Executes an async operation with a spinner
|
|
8
|
+
* @param text - The text to display while spinning
|
|
9
|
+
* @param operation - The async operation to execute
|
|
10
|
+
* @param successText - Success message
|
|
11
|
+
* @returns Promise that resolves with the operation result
|
|
12
|
+
*/
|
|
13
|
+
export declare const withSpinner: <T>(text: string, operation: () => Promise<T>, successText: string) => Promise<T>;
|