@aifabrix/builder 2.45.0 → 2.46.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/.cursor/rules/cli-layout.mdc +2 -0
- package/.cursor/rules/cli-product-neutral.mdc +43 -0
- package/.cursor/rules/docs-rules.mdc +3 -1
- package/.cursor/rules/project-rules.mdc +1 -0
- package/README.md +43 -17
- package/integration/hubspot-test/wizard-hubspot-e2e.yaml +1 -1
- package/jest.config.default.js +2 -1
- package/jest.config.isolated.js +2 -1
- package/jest.global-live-fabrix-hooks.js +36 -0
- package/jest.isolated-projects.js +130 -0
- package/jest.projects.js +69 -121
- package/lib/api/agent-metadata-validation.api.js +93 -0
- package/lib/api/api-response-errors.js +124 -0
- package/lib/api/audit-api-helpers.js +68 -0
- package/lib/api/audit.api.js +119 -0
- package/lib/api/auth-cache.api.js +44 -0
- package/lib/api/certificates.api.js +4 -4
- package/lib/api/credential.api.js +2 -2
- package/lib/api/dataplane-health.api.js +137 -0
- package/lib/api/dataplane-sync.api.js +27 -0
- package/lib/api/datasources-core.api.js +21 -18
- package/lib/api/datasources-extended.api.js +22 -22
- package/lib/api/dimensions.api.js +3 -0
- package/lib/api/external-systems.api.js +13 -13
- package/lib/api/governance-scenario-pack.api.js +159 -0
- package/lib/api/governance-scenarios.api.js +39 -0
- package/lib/api/groups.api.js +79 -0
- package/lib/api/index.js +88 -5
- package/lib/api/lifecycle.api.js +77 -0
- package/lib/api/pipeline.api.js +7 -5
- package/lib/api/protection.api.js +157 -0
- package/lib/api/records-bulk.api.js +43 -0
- package/lib/api/records-search-parse.js +49 -0
- package/lib/api/records-search.api.js +29 -0
- package/lib/api/types/agent-metadata-validation.types.js +67 -0
- package/lib/api/types/audit.types.js +72 -0
- package/lib/api/types/dataplane-health.types.js +27 -0
- package/lib/api/types/dimensions.types.js +2 -0
- package/lib/api/types/governance-scenarios.types.js +39 -0
- package/lib/api/types/protection.types.js +69 -0
- package/lib/api/types/records-bulk.types.js +35 -0
- package/lib/api/types/records-search.types.js +28 -0
- package/lib/api/user-groups.api.js +50 -0
- package/lib/api/users.api.js +95 -0
- package/lib/api/validation-run.api.js +3 -3
- package/lib/api/validation-runner.js +5 -3
- package/lib/api/wizard-platform.api.js +3 -3
- package/lib/api/wizard.api.js +21 -21
- package/lib/app/deploy-config.js +4 -1
- package/lib/app/deploy.js +34 -19
- package/lib/app/down.js +20 -1
- package/lib/app/push.js +4 -5
- package/lib/app/register.js +7 -4
- package/lib/app/run-env-compose.js +84 -30
- package/lib/build/index.js +5 -0
- package/lib/certification/sync-system-certification.js +13 -6
- package/lib/cli/index.js +8 -2
- package/lib/cli/infra-guided-auth.js +109 -0
- package/lib/cli/infra-guided.js +91 -69
- package/lib/cli/setup-app.help.js +19 -2
- package/lib/cli/setup-app.js +58 -23
- package/lib/cli/setup-app.test-commands.js +28 -21
- package/lib/cli/setup-auth.js +55 -3
- package/lib/cli/setup-certification-commands.js +147 -0
- package/lib/cli/setup-certification.help.js +141 -0
- package/lib/cli/setup-environment.js +19 -2
- package/lib/cli/setup-external-system-help.js +62 -0
- package/lib/cli/setup-external-system.js +62 -6
- package/lib/cli/setup-infra.js +9 -1
- package/lib/cli/setup-platform.js +6 -1
- package/lib/cli/setup-secrets.js +33 -1
- package/lib/cli/setup-utility-help-after.js +65 -0
- package/lib/cli/setup-utility-repair.js +198 -0
- package/lib/cli/setup-utility-resolve.js +42 -6
- package/lib/cli/setup-utility-validate.js +197 -0
- package/lib/cli/setup-utility.js +41 -258
- package/lib/commands/auth-status-client-tokens.js +214 -0
- package/lib/commands/auth-status-dataplane-version.js +269 -0
- package/lib/commands/auth-status-display.js +94 -0
- package/lib/commands/auth-status.js +111 -53
- package/lib/commands/credential-push.js +10 -5
- package/lib/commands/datasource-load-export-cli.js +178 -0
- package/lib/commands/datasource-test-trust-cli.js +118 -0
- package/lib/commands/datasource-unified-test-cli.js +31 -20
- package/lib/commands/datasource-unified-test-cli.options.js +22 -3
- package/lib/commands/datasource-unified-test-e2e-cli-helpers.js +5 -5
- package/lib/commands/datasource-verify-audit-cli.js +96 -0
- package/lib/commands/datasource.js +68 -1
- package/lib/commands/dev-show-display.js +8 -1
- package/lib/commands/dimension-value.js +43 -13
- package/lib/commands/dimension.js +38 -7
- package/lib/commands/governance-cli-shared.js +94 -0
- package/lib/commands/governance-command-action.js +132 -0
- package/lib/commands/governance-download-external.js +34 -0
- package/lib/commands/governance-generate-external.js +71 -0
- package/lib/commands/governance-upload-external.js +36 -0
- package/lib/commands/governance-verify-external.js +64 -0
- package/lib/commands/governance.js +144 -0
- package/lib/commands/identity-apply-sync.js +131 -0
- package/lib/commands/identity-group-cli.js +146 -0
- package/lib/commands/identity-membership-role-cache.js +175 -0
- package/lib/commands/identity-shared.js +94 -0
- package/lib/commands/identity-user-cli.js +158 -0
- package/lib/commands/identity.js +43 -0
- package/lib/commands/lifecycle-command-action.js +123 -0
- package/lib/commands/lifecycle-external.js +268 -0
- package/lib/commands/login.js +56 -17
- package/lib/commands/protection-cli-leaves.js +286 -0
- package/lib/commands/protection.js +50 -0
- package/lib/commands/repair-auth-apply.js +127 -0
- package/lib/commands/repair-changed-files.js +41 -0
- package/lib/commands/repair-datasource-keys.js +4 -1
- package/lib/commands/repair-datasource-run.js +59 -0
- package/lib/commands/repair-datasource-test-payload.js +259 -0
- package/lib/commands/repair-datasource.js +1 -51
- package/lib/commands/repair-env-template.js +64 -13
- package/lib/commands/repair-external-run.js +216 -0
- package/lib/commands/repair-openapi-sync.js +23 -0
- package/lib/commands/repair-persist.js +4 -0
- package/lib/commands/repair-rbac.js +52 -1
- package/lib/commands/repair-steps.js +145 -0
- package/lib/commands/repair.js +29 -286
- package/lib/commands/secrets-get.js +184 -0
- package/lib/commands/secrets-remove-all.js +3 -1
- package/lib/commands/setup-image-refresh.js +146 -0
- package/lib/commands/setup-modes.js +158 -162
- package/lib/commands/setup-platform-auth.js +76 -0
- package/lib/commands/setup-prompts-admin.js +244 -0
- package/lib/commands/setup-prompts-platform-mode.js +67 -0
- package/lib/commands/setup-prompts-validators.js +36 -0
- package/lib/commands/setup-prompts.js +24 -76
- package/lib/commands/setup-run-context.js +45 -0
- package/lib/commands/setup-spinners.js +39 -0
- package/lib/commands/setup.js +27 -5
- package/lib/commands/teardown.js +39 -0
- package/lib/commands/test-e2e-external.js +61 -14
- package/lib/commands/test-governance-cli-options.js +47 -0
- package/lib/commands/test-governance-external.js +67 -0
- package/lib/commands/test-trust-cli-options.js +32 -0
- package/lib/commands/test-trust-external.js +126 -0
- package/lib/commands/up-common.js +25 -13
- package/lib/commands/up-dataplane.js +50 -13
- package/lib/commands/upload-publish-context.js +75 -0
- package/lib/commands/upload-sidecar-followups.js +89 -0
- package/lib/commands/upload.js +108 -105
- package/lib/commands/verify-governance-combined-external.js +61 -0
- package/lib/commands/verify-governance-command-action.js +64 -0
- package/lib/commands/verify-governance-db.js +102 -0
- package/lib/commands/verify-governance-external.js +77 -0
- package/lib/commands/verify-governance-result-builders.js +71 -0
- package/lib/commands/verify-operations-command-action.js +68 -0
- package/lib/commands/verify-operations-external.js +268 -0
- package/lib/commands/verify-operations-persist.js +75 -0
- package/lib/commands/verify-operations-step-plan.js +68 -0
- package/lib/commands/verify-operations-steps.js +111 -0
- package/lib/commands/verify-trust-command-action.js +70 -0
- package/lib/commands/verify-trust-external.js +67 -0
- package/lib/commands/wizard-config-normalizer.js +43 -23
- package/lib/commands/wizard-core.js +5 -0
- package/lib/core/admin-password-generator.js +38 -0
- package/lib/core/admin-secrets-bundle.js +111 -0
- package/lib/core/admin-secrets-env-overlay.js +62 -0
- package/lib/core/admin-secrets.js +32 -4
- package/lib/core/config-attach-extensions.js +3 -0
- package/lib/core/config-device-dataplane.js +185 -0
- package/lib/core/config-platform-controller.js +44 -0
- package/lib/core/config-setup-installation-profile.js +42 -0
- package/lib/core/config-setup-platform-mode.js +46 -0
- package/lib/core/config.js +46 -36
- package/lib/core/secrets-admin-env.js +6 -2
- package/lib/core/secrets-ensure.js +4 -0
- package/lib/core/secrets-env-content.js +54 -48
- package/lib/core/secrets-env-write.js +10 -1
- package/lib/core/secrets-infra-placeholder-sync.js +2 -0
- package/lib/core/setup-installation-profile.js +43 -0
- package/lib/core/setup-platform-mode.js +55 -0
- package/lib/datasource/agent-trust-debug-log.js +45 -0
- package/lib/datasource/agent-trust-fetch.js +115 -0
- package/lib/datasource/agent-trust-map.js +101 -0
- package/lib/datasource/agent-trust-mock.js +44 -0
- package/lib/datasource/agent-trust-run.js +95 -0
- package/lib/datasource/agent-trust-timeout.js +25 -0
- package/lib/datasource/audit-evidence-display.js +80 -0
- package/lib/datasource/audit-evidence-extract-debug.js +115 -0
- package/lib/datasource/audit-evidence-extract.js +180 -0
- package/lib/datasource/audit-evidence-matrix-rows.js +158 -0
- package/lib/datasource/audit-evidence-operation-aliases.js +63 -0
- package/lib/datasource/audit-evidence-poll.js +109 -0
- package/lib/datasource/audit-evidence-run.js +177 -0
- package/lib/datasource/audit-evidence-verify-helpers.js +167 -0
- package/lib/datasource/audit-evidence-verify-matrix.js +205 -0
- package/lib/datasource/audit-evidence-verify.js +108 -0
- package/lib/datasource/bulk-loader-run-batches.js +100 -0
- package/lib/datasource/bulk-loader-service-retry.js +52 -0
- package/lib/datasource/bulk-loader-service.js +127 -0
- package/lib/datasource/capability/run-capability-dimension.js +2 -1
- package/lib/datasource/datasource-exporter-resolve.js +82 -0
- package/lib/datasource/datasource-exporter-service.js +144 -0
- package/lib/datasource/datasource-identifier.js +148 -0
- package/lib/datasource/datasource-load-export-context.js +95 -0
- package/lib/datasource/integration-context.js +6 -4
- package/lib/datasource/local-data-paths.js +145 -0
- package/lib/datasource/log-cleaner.js +241 -0
- package/lib/datasource/log-viewer.js +111 -6
- package/lib/datasource/record-file-parser.js +85 -0
- package/lib/datasource/record-mapper.js +129 -0
- package/lib/datasource/resolve-app.js +74 -55
- package/lib/datasource/test-e2e.js +29 -2
- package/lib/datasource/unified-validation-run-body.js +3 -1
- package/lib/datasource/unified-validation-run-resolve.js +45 -12
- package/lib/datasource/unified-validation-run.js +47 -18
- package/lib/datasource/validate.js +37 -20
- package/lib/deployment/environment-poll-status.js +138 -0
- package/lib/deployment/environment.js +42 -34
- package/lib/external-system/download.js +21 -20
- package/lib/external-system/generator.js +5 -1
- package/lib/external-system/integration-auth-context.js +45 -0
- package/lib/external-system/test-auth.js +12 -5
- package/lib/external-system/test-system-level.js +25 -4
- package/lib/external-system/test.js +9 -7
- package/lib/generator/external-controller-manifest.js +15 -0
- package/lib/governance/governance-cli-errors.js +96 -0
- package/lib/governance/governance-download-display.js +38 -0
- package/lib/governance/governance-pack-loader.js +70 -0
- package/lib/governance/governance-run-display.js +309 -0
- package/lib/identity/identity-apply-core.js +108 -0
- package/lib/identity/identity-apply-phases.js +244 -0
- package/lib/identity/identity-apply-service.js +77 -0
- package/lib/identity/identity-csv-parser.js +114 -0
- package/lib/infrastructure/admin-secrets-apply.js +84 -0
- package/lib/infrastructure/admin-secrets-ensure.js +130 -0
- package/lib/infrastructure/admin-secrets-resolve.js +95 -0
- package/lib/infrastructure/admin-secrets-sync.js +91 -0
- package/lib/infrastructure/helpers.js +23 -129
- package/lib/infrastructure/index.js +5 -6
- package/lib/infrastructure/orphan-infra-docker-teardown.js +11 -5
- package/lib/internal/fs-real-sync.js +29 -1
- package/lib/lifecycle/certification-progress.js +231 -0
- package/lib/lifecycle/dataplane-ui-url.js +145 -0
- package/lib/lifecycle/exit-codes.js +24 -0
- package/lib/lifecycle/json-envelope.js +25 -0
- package/lib/lifecycle/lifecycle-governance-options.js +51 -0
- package/lib/lifecycle/logger-quiet.js +29 -0
- package/lib/lifecycle/open-api-published.js +59 -0
- package/lib/lifecycle/operations-readiness-metrics.js +101 -0
- package/lib/lifecycle/product-model.js +196 -0
- package/lib/lifecycle/report-display.js +471 -0
- package/lib/lifecycle/scenario-upload.js +191 -0
- package/lib/lifecycle/verify-step-progress.js +87 -0
- package/lib/parameters/infra-kv-discovery.js +27 -2
- package/lib/protection/auth-context.js +51 -0
- package/lib/protection/convert-batch.js +90 -0
- package/lib/protection/load.js +41 -0
- package/lib/protection/paths.js +158 -0
- package/lib/protection/preflight-datasource-ready.js +46 -0
- package/lib/protection/protection-create-probe-lines.js +142 -0
- package/lib/protection/protection-create-probes.js +95 -0
- package/lib/protection/protection-create-scaffold.js +281 -0
- package/lib/protection/protection-display-helpers.js +445 -0
- package/lib/protection/protection-display.js +215 -0
- package/lib/protection/protection-preset-registry.js +97 -0
- package/lib/protection/report-exit.js +62 -0
- package/lib/protection/resolve.js +202 -0
- package/lib/protection/run-commands-validate.js +130 -0
- package/lib/protection/run-commands.js +216 -0
- package/lib/protection/run-protection-create-helpers.js +134 -0
- package/lib/protection/run-protection-create-probes-flow.js +43 -0
- package/lib/protection/run-protection-create.js +191 -0
- package/lib/protection/scope.js +22 -0
- package/lib/protection/sync-after-upload.js +64 -0
- package/lib/protection/upload-batch.js +127 -0
- package/lib/protection/validate-batch.js +113 -0
- package/lib/protection/validate-local.js +65 -0
- package/lib/resolvers/dimension-file.js +29 -4
- package/lib/schema/application-schema.json +1 -1
- package/lib/schema/datasource-test-run.schema.json +89 -6
- package/lib/schema/external-datasource.schema.json +2636 -2588
- package/lib/schema/external-system.schema.json +1089 -761
- package/lib/schema/flag-map-validation-run.json +2 -2
- package/lib/schema/infra.parameter.yaml +45 -0
- package/lib/schema/protection.schema.json +374 -0
- package/lib/schema/type/credential-field-registry.json +642 -0
- package/lib/schema/wizard-config.schema.json +1 -1
- package/lib/utils/agent-trust-run-display.js +231 -0
- package/lib/utils/agent-trust-run-exit.js +59 -0
- package/lib/utils/agent-trust-wait-ui.js +94 -0
- package/lib/utils/aifabrix-test-runtime-guard.js +125 -0
- package/lib/utils/api.js +55 -31
- package/lib/utils/app-relative-path-env.js +112 -0
- package/lib/utils/cli-exit-codes.js +30 -0
- package/lib/utils/cli-secrets-error-format.js +83 -21
- package/lib/utils/cli-sync-options.js +33 -0
- package/lib/utils/cli-utils.js +16 -4
- package/lib/utils/compose-generate-docker-compose.js +4 -0
- package/lib/utils/compose-traefik-ingress-base.js +16 -1
- package/lib/utils/config-secrets-path.js +46 -0
- package/lib/utils/controller-url.js +88 -1
- package/lib/utils/credential-push-ui.js +90 -0
- package/lib/utils/credential-secrets-env.js +137 -9
- package/lib/utils/dataplane-cli-version-gate.js +202 -0
- package/lib/utils/dataplane-cli-version-help.js +74 -0
- package/lib/utils/dataplane-resolver.js +129 -2
- package/lib/utils/datasource-export-display.js +137 -0
- package/lib/utils/datasource-load-display.js +174 -0
- package/lib/utils/datasource-load-export-ui.js +120 -0
- package/lib/utils/datasource-test-run-capability-scope.js +3 -3
- package/lib/utils/datasource-test-run-display.js +3 -3
- package/lib/utils/datasource-test-run-tty-log.js +5 -1
- package/lib/utils/declarative-url-ports.js +3 -3
- package/lib/utils/deployment-auth-mode.js +41 -0
- package/lib/utils/developer-volume-id.js +33 -0
- package/lib/utils/env-copy.js +14 -9
- package/lib/utils/env-kv-orphan-lines.js +43 -0
- package/lib/utils/error-formatters/network-errors.js +13 -4
- package/lib/utils/external-env-template.js +1 -0
- package/lib/utils/external-system-readiness-core.js +10 -0
- package/lib/utils/external-system-readiness-display.js +80 -23
- package/lib/utils/health-check.js +4 -1
- package/lib/utils/help-builder.js +35 -26
- package/lib/utils/keycloak-realm-ready.js +101 -0
- package/lib/utils/load-cip-capacity-display-config.js +61 -15
- package/lib/utils/manifest-source-emit.js +24 -0
- package/lib/utils/pipeline-upload-auth-retry.js +82 -0
- package/lib/utils/platform-controller-url.js +156 -0
- package/lib/utils/postgres-platform-bootstrap.js +199 -0
- package/lib/utils/postgres-wipe.js +9 -2
- package/lib/utils/resolve-env-mode.js +47 -0
- package/lib/utils/secrets-generator.js +31 -25
- package/lib/utils/secrets-missing-error.js +164 -0
- package/lib/utils/semver-compare.js +127 -0
- package/lib/utils/service-url-label.js +81 -0
- package/lib/utils/setup-quiet-output.js +25 -0
- package/lib/utils/template-helpers.js +15 -0
- package/lib/utils/token-manager-client-credentials.js +201 -0
- package/lib/utils/token-manager-messages.js +8 -0
- package/lib/utils/token-manager-refresh.js +12 -2
- package/lib/utils/token-manager.js +86 -105
- package/lib/utils/upload-pipeline-ui.js +98 -0
- package/lib/utils/upload-sync-options.js +42 -0
- package/lib/utils/url-declarative-public-base.js +21 -3
- package/lib/utils/url-declarative-vdir-inactive-env.js +14 -4
- package/lib/utils/validation-poll-ui.js +22 -7
- package/lib/utils/validation-run-stage.js +45 -0
- package/lib/validation/wizard-config-validator.js +58 -19
- package/package.json +1 -1
- package/templates/applications/dataplane/application.yaml +2 -1
- package/templates/applications/dataplane/env.template +36 -1
- package/templates/applications/dataplane/rbac.yaml +4 -0
- package/templates/applications/miso-controller/env.template +16 -0
- package/templates/external-system/README.md.hbs +116 -11
- package/templates/python/docker-compose.hbs +19 -18
- package/templates/typescript/docker-compose.hbs +18 -17
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Shared helpers for governance * CLI commands (424.0).
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
'use strict';
|
|
6
|
+
|
|
7
|
+
const {
|
|
8
|
+
resolveExternalIntegrationContext,
|
|
9
|
+
syncLocalIfRequested
|
|
10
|
+
} = require('./test-e2e-external');
|
|
11
|
+
const { resolveIntegrationAuth } = require('../external-system/integration-auth-context');
|
|
12
|
+
const { cliOptsSkipSync } = require('../utils/cli-sync-options');
|
|
13
|
+
const { fetchDataplaneGeneralHealth } = require('../api/dataplane-health.api');
|
|
14
|
+
const { formatNetworkError } = require('../utils/api-error-handler');
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @param {Object} options
|
|
18
|
+
* @param {string[]} [options.subjectUserIds]
|
|
19
|
+
* @param {string[]} [options.subjectEmails]
|
|
20
|
+
* @returns {Array<{ subjectUserId?: string, subjectEmail?: string }>}
|
|
21
|
+
*/
|
|
22
|
+
function buildSubjectsFromOptions(options) {
|
|
23
|
+
const subjects = [];
|
|
24
|
+
const userIds = options.subjectUserIds || [];
|
|
25
|
+
const emails = options.subjectEmails || [];
|
|
26
|
+
for (const subjectUserId of userIds) {
|
|
27
|
+
const id = String(subjectUserId || '').trim();
|
|
28
|
+
if (id) subjects.push({ subjectUserId: id });
|
|
29
|
+
}
|
|
30
|
+
for (const subjectEmail of emails) {
|
|
31
|
+
const email = String(subjectEmail || '').trim();
|
|
32
|
+
if (email) subjects.push({ subjectEmail: email });
|
|
33
|
+
}
|
|
34
|
+
return subjects;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Fail fast when dataplane health is unreachable (avoids misleading API validation errors).
|
|
39
|
+
* @async
|
|
40
|
+
* @param {string} dataplaneUrl
|
|
41
|
+
* @returns {Promise<void>}
|
|
42
|
+
*/
|
|
43
|
+
async function assertDataplaneReachable(dataplaneUrl) {
|
|
44
|
+
const base = String(dataplaneUrl || '').replace(/\/$/, '');
|
|
45
|
+
const snapshot = await fetchDataplaneGeneralHealth(base, { timeoutMs: 8000 });
|
|
46
|
+
if (snapshot) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const endpointUrl = `${base}/api/v1/health`;
|
|
50
|
+
const err = new Error(`Cannot reach dataplane at ${base}`);
|
|
51
|
+
err.network = true;
|
|
52
|
+
err.serviceLabel = 'dataplane';
|
|
53
|
+
err.endpointUrl = endpointUrl;
|
|
54
|
+
err.formatted = formatNetworkError(err.message, {
|
|
55
|
+
endpointUrl,
|
|
56
|
+
serviceLabel: 'dataplane'
|
|
57
|
+
});
|
|
58
|
+
throw err;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* @async
|
|
63
|
+
* @param {string} systemKey
|
|
64
|
+
* @param {Object} options
|
|
65
|
+
* @returns {Promise<{ resolvedKey: string, keys: string[], authConfig: Object, dataplaneUrl: string }>}
|
|
66
|
+
*/
|
|
67
|
+
async function resolveGovernanceIntegrationContext(systemKey, options) {
|
|
68
|
+
const { systemKey: resolvedKey, keys } = resolveExternalIntegrationContext(systemKey);
|
|
69
|
+
if (options.authConfig && options.dataplaneUrl) {
|
|
70
|
+
return {
|
|
71
|
+
resolvedKey,
|
|
72
|
+
keys,
|
|
73
|
+
authConfig: options.authConfig,
|
|
74
|
+
dataplaneUrl: options.dataplaneUrl
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
if (!cliOptsSkipSync(options)) {
|
|
78
|
+
const uploadCtx = await syncLocalIfRequested(resolvedKey, options);
|
|
79
|
+
if (uploadCtx?.authConfig && uploadCtx?.dataplaneUrl) {
|
|
80
|
+
options.authConfig = uploadCtx.authConfig;
|
|
81
|
+
options.dataplaneUrl = uploadCtx.dataplaneUrl;
|
|
82
|
+
options.silentResolve = true;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
const { authConfig, dataplaneUrl } = await resolveIntegrationAuth(resolvedKey, options);
|
|
86
|
+
await assertDataplaneReachable(dataplaneUrl);
|
|
87
|
+
return { resolvedKey, keys, authConfig, dataplaneUrl };
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
module.exports = {
|
|
91
|
+
buildSubjectsFromOptions,
|
|
92
|
+
assertDataplaneReachable,
|
|
93
|
+
resolveGovernanceIntegrationContext
|
|
94
|
+
};
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview CLI actions for `aifabrix governance *` (424.0).
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
'use strict';
|
|
6
|
+
|
|
7
|
+
const logger = require('../utils/logger');
|
|
8
|
+
const { handleCommandError } = require('../utils/cli-utils');
|
|
9
|
+
const { runGovernanceGenerateForExternalSystem } = require('./governance-generate-external');
|
|
10
|
+
const { runGovernanceVerifyForExternalSystem } = require('./governance-verify-external');
|
|
11
|
+
const { runGovernanceUploadForExternalSystem } = require('./governance-upload-external');
|
|
12
|
+
const { runGovernanceDownloadForExternalSystem } = require('./governance-download-external');
|
|
13
|
+
const { displayVerifyGovernanceTTY } = require('../lifecycle/report-display');
|
|
14
|
+
const { exitCodeFromVerdict } = require('../lifecycle/exit-codes');
|
|
15
|
+
const { buildJsonEnvelope } = require('../lifecycle/json-envelope');
|
|
16
|
+
const { formatSuccessLine } = require('../utils/cli-test-layout-chalk');
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Commander repeatable-option collector. Splits comma-separated values so both
|
|
20
|
+
* `--flag a --flag b` and `--flag a,b` work.
|
|
21
|
+
* @param {string} value
|
|
22
|
+
* @param {string[]} previous
|
|
23
|
+
* @returns {string[]}
|
|
24
|
+
*/
|
|
25
|
+
function collectString(value, previous) {
|
|
26
|
+
const parts = String(value)
|
|
27
|
+
.split(',')
|
|
28
|
+
.map(entry => entry.trim())
|
|
29
|
+
.filter(Boolean);
|
|
30
|
+
return previous.concat(parts.length > 0 ? parts : [String(value).trim()].filter(Boolean));
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function normalizeGovernanceOptions(options, cmd) {
|
|
34
|
+
const parent = cmd && cmd.parent ? cmd.parent.opts() : {};
|
|
35
|
+
return {
|
|
36
|
+
env: options.env || parent.env || 'dev',
|
|
37
|
+
verbose: options.verbose === true || parent.verbose === true,
|
|
38
|
+
noSync: options.noSync === true || parent.noSync === true,
|
|
39
|
+
force: options.force === true || parent.force === true,
|
|
40
|
+
json: options.json === true || parent.json === true,
|
|
41
|
+
pack: options.pack,
|
|
42
|
+
app: options.app,
|
|
43
|
+
scenarioIds: options.scenario || [],
|
|
44
|
+
certificationProfile: options.certificationProfile || 'bronze',
|
|
45
|
+
subjectUserIds: options.subjectUserId || [],
|
|
46
|
+
subjectEmails: options.subjectEmail || [],
|
|
47
|
+
maxSamplesPerPartition: options.maxSamplesPerPartition
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async function governanceGenerateHandler(systemKey, options, cmd) {
|
|
52
|
+
try {
|
|
53
|
+
const opts = normalizeGovernanceOptions(options, cmd);
|
|
54
|
+
const result = await runGovernanceGenerateForExternalSystem(systemKey, opts);
|
|
55
|
+
if (opts.json) {
|
|
56
|
+
logger.log(JSON.stringify(buildJsonEnvelope(result, opts.verbose), null, 2));
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
for (const row of result.results || []) {
|
|
60
|
+
logger.log(
|
|
61
|
+
formatSuccessLine(
|
|
62
|
+
`${row.datasourceKey}: pack v${row.packVersion} (${row.scenarioCount} scenarios)`
|
|
63
|
+
)
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
} catch (error) {
|
|
67
|
+
handleCommandError(error, 'governance generate');
|
|
68
|
+
process.exit(3);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
async function governanceVerifyHandler(systemKey, options, cmd) {
|
|
73
|
+
try {
|
|
74
|
+
const opts = normalizeGovernanceOptions(options, cmd);
|
|
75
|
+
const result = await runGovernanceVerifyForExternalSystem(systemKey, opts);
|
|
76
|
+
if (opts.json) {
|
|
77
|
+
logger.log(JSON.stringify(buildJsonEnvelope(result, opts.verbose), null, 2));
|
|
78
|
+
} else {
|
|
79
|
+
displayVerifyGovernanceTTY(result.systemKey, result, { details: opts.verbose });
|
|
80
|
+
}
|
|
81
|
+
const exitCode = exitCodeFromVerdict(result.verdict);
|
|
82
|
+
if (exitCode !== 0) {
|
|
83
|
+
process.exit(exitCode);
|
|
84
|
+
}
|
|
85
|
+
} catch (error) {
|
|
86
|
+
handleCommandError(error, 'governance verify');
|
|
87
|
+
process.exit(3);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
async function governanceUploadHandler(systemKey, options, cmd) {
|
|
92
|
+
try {
|
|
93
|
+
const opts = normalizeGovernanceOptions(options, cmd);
|
|
94
|
+
const result = await runGovernanceUploadForExternalSystem(systemKey, opts);
|
|
95
|
+
if (opts.json) {
|
|
96
|
+
logger.log(JSON.stringify(buildJsonEnvelope(result, opts.verbose), null, 2));
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
logger.log(formatSuccessLine(`Uploaded ${result.uploaded} scenario pack(s)`));
|
|
100
|
+
} catch (error) {
|
|
101
|
+
if (error.friendlyHint) {
|
|
102
|
+
logger.log(error.friendlyHint);
|
|
103
|
+
}
|
|
104
|
+
handleCommandError(error, 'governance upload');
|
|
105
|
+
process.exit(3);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
async function governanceDownloadHandler(systemKey, options, cmd) {
|
|
110
|
+
try {
|
|
111
|
+
const opts = normalizeGovernanceOptions(options, cmd);
|
|
112
|
+
opts.noSync = true;
|
|
113
|
+
const result = await runGovernanceDownloadForExternalSystem(systemKey, opts);
|
|
114
|
+
if (opts.json) {
|
|
115
|
+
logger.log(JSON.stringify(buildJsonEnvelope(result, opts.verbose), null, 2));
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
logger.log(formatSuccessLine(`Downloaded ${result.written} scenario pack(s)`));
|
|
119
|
+
} catch (error) {
|
|
120
|
+
handleCommandError(error, 'governance download');
|
|
121
|
+
process.exit(3);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
module.exports = {
|
|
126
|
+
collectString,
|
|
127
|
+
normalizeGovernanceOptions,
|
|
128
|
+
governanceGenerateHandler,
|
|
129
|
+
governanceVerifyHandler,
|
|
130
|
+
governanceUploadHandler,
|
|
131
|
+
governanceDownloadHandler
|
|
132
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview governance download — pull packs to integration/<systemKey>/scenarios/ (424.0).
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
'use strict';
|
|
6
|
+
|
|
7
|
+
const { downloadGovernanceScenarioPacks } = require('../lifecycle/scenario-upload');
|
|
8
|
+
const { resolveGovernanceIntegrationContext } = require('./governance-cli-shared');
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @async
|
|
12
|
+
* @param {string} systemKey
|
|
13
|
+
* @param {Object} options
|
|
14
|
+
* @returns {Promise<Object>}
|
|
15
|
+
*/
|
|
16
|
+
async function runGovernanceDownloadForExternalSystem(systemKey, options = {}) {
|
|
17
|
+
const { resolvedKey, keys, authConfig, dataplaneUrl } =
|
|
18
|
+
await resolveGovernanceIntegrationContext(systemKey, options);
|
|
19
|
+
const written = await downloadGovernanceScenarioPacks(
|
|
20
|
+
resolvedKey,
|
|
21
|
+
keys,
|
|
22
|
+
dataplaneUrl,
|
|
23
|
+
authConfig
|
|
24
|
+
);
|
|
25
|
+
return {
|
|
26
|
+
systemKey: resolvedKey,
|
|
27
|
+
command: 'governance download',
|
|
28
|
+
written
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
module.exports = {
|
|
33
|
+
runGovernanceDownloadForExternalSystem
|
|
34
|
+
};
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview governance generate — dataplane POST generate per datasource (424.0).
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
'use strict';
|
|
6
|
+
|
|
7
|
+
const { generateDatasourceGovernancePack } = require('../api/governance-scenario-pack.api');
|
|
8
|
+
const {
|
|
9
|
+
buildSubjectsFromOptions,
|
|
10
|
+
resolveGovernanceIntegrationContext
|
|
11
|
+
} = require('./governance-cli-shared');
|
|
12
|
+
const { runWithVerifyStepProgress } = require('../lifecycle/verify-step-progress');
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @async
|
|
16
|
+
* @param {string} systemKey
|
|
17
|
+
* @param {Object} options
|
|
18
|
+
* @returns {Promise<Object>}
|
|
19
|
+
*/
|
|
20
|
+
async function runGovernanceGenerateForExternalSystem(systemKey, options = {}) {
|
|
21
|
+
const subjects = buildSubjectsFromOptions(options);
|
|
22
|
+
if (subjects.length === 0) {
|
|
23
|
+
throw new Error(
|
|
24
|
+
'At least one --subject-user-id or --subject-email is required for governance generate'
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const { resolvedKey, keys, authConfig, dataplaneUrl } =
|
|
29
|
+
await resolveGovernanceIntegrationContext(systemKey, options);
|
|
30
|
+
|
|
31
|
+
const profile = (options.certificationProfile || 'bronze').trim().toLowerCase();
|
|
32
|
+
const maxSamples = Number(options.maxSamplesPerPartition) || 25;
|
|
33
|
+
|
|
34
|
+
const results = await runWithVerifyStepProgress(
|
|
35
|
+
'Generating governance scenario packs',
|
|
36
|
+
async progress => {
|
|
37
|
+
const rows = [];
|
|
38
|
+
for (let index = 0; index < keys.length; index += 1) {
|
|
39
|
+
const dsKey = keys[index];
|
|
40
|
+
if (typeof progress.setLabel === 'function') {
|
|
41
|
+
progress.setLabel(`Generating pack: ${dsKey} (${index + 1}/${keys.length})`);
|
|
42
|
+
}
|
|
43
|
+
const row = await generateDatasourceGovernancePack(
|
|
44
|
+
dataplaneUrl,
|
|
45
|
+
authConfig,
|
|
46
|
+
dsKey,
|
|
47
|
+
{
|
|
48
|
+
certificationProfile: profile,
|
|
49
|
+
subjects,
|
|
50
|
+
systemKey: resolvedKey,
|
|
51
|
+
maxSamplesPerPartition: maxSamples
|
|
52
|
+
}
|
|
53
|
+
);
|
|
54
|
+
rows.push({ datasourceKey: dsKey, ...row });
|
|
55
|
+
}
|
|
56
|
+
return rows;
|
|
57
|
+
},
|
|
58
|
+
options
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
return {
|
|
62
|
+
systemKey: resolvedKey,
|
|
63
|
+
command: 'governance generate',
|
|
64
|
+
generated: results.length,
|
|
65
|
+
results
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
module.exports = {
|
|
70
|
+
runGovernanceGenerateForExternalSystem
|
|
71
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview governance upload — push integration/<systemKey>/scenarios/*.yaml (424.0).
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
'use strict';
|
|
6
|
+
|
|
7
|
+
const { uploadGovernanceScenarioPacks } = require('../lifecycle/scenario-upload');
|
|
8
|
+
const { resolveGovernanceIntegrationContext } = require('./governance-cli-shared');
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @async
|
|
12
|
+
* @param {string} systemKey
|
|
13
|
+
* @param {Object} options
|
|
14
|
+
* @returns {Promise<Object>}
|
|
15
|
+
*/
|
|
16
|
+
async function runGovernanceUploadForExternalSystem(systemKey, options = {}) {
|
|
17
|
+
const { resolvedKey, authConfig, dataplaneUrl } = await resolveGovernanceIntegrationContext(
|
|
18
|
+
systemKey,
|
|
19
|
+
options
|
|
20
|
+
);
|
|
21
|
+
const uploaded = await uploadGovernanceScenarioPacks(
|
|
22
|
+
resolvedKey,
|
|
23
|
+
dataplaneUrl,
|
|
24
|
+
authConfig,
|
|
25
|
+
{ silent: options.json === true }
|
|
26
|
+
);
|
|
27
|
+
return {
|
|
28
|
+
systemKey: resolvedKey,
|
|
29
|
+
command: 'governance upload',
|
|
30
|
+
uploaded
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
module.exports = {
|
|
35
|
+
runGovernanceUploadForExternalSystem
|
|
36
|
+
};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview governance verify — run persisted packs (424.0).
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
'use strict';
|
|
6
|
+
|
|
7
|
+
const { runVerifyGovernanceFromDbPacks } = require('./verify-governance-db');
|
|
8
|
+
const {
|
|
9
|
+
sumEnforcementScenarios,
|
|
10
|
+
aggregateCoverage,
|
|
11
|
+
buildPackOverrideResult
|
|
12
|
+
} = require('./verify-governance-result-builders');
|
|
13
|
+
const { VERDICT, verdictFromPassed } = require('../lifecycle/product-model');
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @async
|
|
17
|
+
* @param {string} systemKey
|
|
18
|
+
* @param {Object} options
|
|
19
|
+
* @returns {Promise<Object>}
|
|
20
|
+
*/
|
|
21
|
+
async function runGovernanceVerifyForExternalSystem(systemKey, options = {}) {
|
|
22
|
+
const pathsUtil = require('../utils/paths');
|
|
23
|
+
const appType = await pathsUtil.detectAppType(systemKey).catch(() => null);
|
|
24
|
+
if (!appType || appType.baseDir !== 'integration') {
|
|
25
|
+
throw new Error(
|
|
26
|
+
'governance verify applies to external integration folders only (integration/<systemKey>/).'
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (options.pack) {
|
|
31
|
+
const { runTestGovernanceForExternalSystem } = require('./test-governance-external');
|
|
32
|
+
const runPayload = await runTestGovernanceForExternalSystem(systemKey, options);
|
|
33
|
+
return buildPackOverrideResult(systemKey, runPayload, 'governance verify');
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const { resolvedKey, datasourceRows } = await runVerifyGovernanceFromDbPacks(systemKey, options);
|
|
37
|
+
if (datasourceRows.length === 0) {
|
|
38
|
+
return {
|
|
39
|
+
systemKey: resolvedKey,
|
|
40
|
+
command: 'governance verify',
|
|
41
|
+
verdict: VERDICT.FAILED,
|
|
42
|
+
policyCoveragePercent: 0,
|
|
43
|
+
dimensionCoveragePercent: 0,
|
|
44
|
+
enforcementScenarios: { passed: 0, total: 0 },
|
|
45
|
+
datasourceRows: []
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const allVerified = datasourceRows.every(r => r.verdict === VERDICT.VERIFIED);
|
|
50
|
+
const coverage = aggregateCoverage(datasourceRows);
|
|
51
|
+
return {
|
|
52
|
+
systemKey: resolvedKey,
|
|
53
|
+
command: 'governance verify',
|
|
54
|
+
verdict: verdictFromPassed(allVerified),
|
|
55
|
+
policyCoveragePercent: coverage.policy ?? (allVerified ? 100 : 0),
|
|
56
|
+
dimensionCoveragePercent: coverage.dimension ?? (allVerified ? 100 : 0),
|
|
57
|
+
enforcementScenarios: sumEnforcementScenarios(datasourceRows),
|
|
58
|
+
datasourceRows
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
module.exports = {
|
|
63
|
+
runGovernanceVerifyForExternalSystem
|
|
64
|
+
};
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Integration validation scenario packs — governance command family (424.0).
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
'use strict';
|
|
6
|
+
|
|
7
|
+
const {
|
|
8
|
+
collectString,
|
|
9
|
+
governanceGenerateHandler,
|
|
10
|
+
governanceVerifyHandler,
|
|
11
|
+
governanceUploadHandler,
|
|
12
|
+
governanceDownloadHandler
|
|
13
|
+
} = require('./governance-command-action');
|
|
14
|
+
const {
|
|
15
|
+
GOVERNANCE_GENERATE_HELP_AFTER,
|
|
16
|
+
GOVERNANCE_VERIFY_HELP_AFTER,
|
|
17
|
+
GOVERNANCE_UPLOAD_HELP_AFTER,
|
|
18
|
+
GOVERNANCE_DOWNLOAD_HELP_AFTER,
|
|
19
|
+
GOVERNANCE_PARENT_HELP_AFTER
|
|
20
|
+
} = require('../cli/setup-certification.help');
|
|
21
|
+
|
|
22
|
+
const SHARED_OPTS = [
|
|
23
|
+
['-e, --env <env>', 'Environment: dev, tst, or pro', 'dev'],
|
|
24
|
+
['--no-sync', 'Skip publishing local integration files before dataplane calls'],
|
|
25
|
+
[
|
|
26
|
+
'--force',
|
|
27
|
+
'With default sync, pass force to upload (same as aifabrix upload --force)'
|
|
28
|
+
]
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* @param {import('commander').Command} cmd
|
|
33
|
+
*/
|
|
34
|
+
function applySharedGovernanceOpts(cmd) {
|
|
35
|
+
for (const [flags, desc, defaultValue] of SHARED_OPTS) {
|
|
36
|
+
cmd.option(flags, desc, defaultValue);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* @param {import('commander').Command} governance
|
|
42
|
+
*/
|
|
43
|
+
function registerGovernanceGenerate(governance) {
|
|
44
|
+
const cmd = governance
|
|
45
|
+
.command('generate <systemKey>')
|
|
46
|
+
.description('Generate integration validation scenario packs on the dataplane')
|
|
47
|
+
.option(
|
|
48
|
+
'--certification-profile <profile>',
|
|
49
|
+
'Certification profile (bronze, silver, gold, …)',
|
|
50
|
+
'bronze'
|
|
51
|
+
)
|
|
52
|
+
.option(
|
|
53
|
+
'--subject-user-id <id>',
|
|
54
|
+
'Subject user id for generated scenarios (repeatable)',
|
|
55
|
+
collectString,
|
|
56
|
+
[]
|
|
57
|
+
)
|
|
58
|
+
.option(
|
|
59
|
+
'--subject-email <email>',
|
|
60
|
+
'Subject email for generated scenarios (repeatable)',
|
|
61
|
+
collectString,
|
|
62
|
+
[]
|
|
63
|
+
)
|
|
64
|
+
.option(
|
|
65
|
+
'--max-samples-per-partition <n>',
|
|
66
|
+
'Max keys per mustInclude/mustExclude partition',
|
|
67
|
+
'25'
|
|
68
|
+
)
|
|
69
|
+
.option('-v, --verbose', 'Verbose output')
|
|
70
|
+
.option('--json', 'Machine-readable envelope')
|
|
71
|
+
.addHelpText('after', GOVERNANCE_GENERATE_HELP_AFTER)
|
|
72
|
+
.action(governanceGenerateHandler);
|
|
73
|
+
applySharedGovernanceOpts(cmd);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* @param {import('commander').Command} governance
|
|
78
|
+
*/
|
|
79
|
+
function registerGovernanceVerify(governance) {
|
|
80
|
+
const cmd = governance
|
|
81
|
+
.command('verify <systemKey>')
|
|
82
|
+
.description('Run persisted scenario packs (governance:evaluate)')
|
|
83
|
+
.option(
|
|
84
|
+
'--pack <path>',
|
|
85
|
+
'Authoring override: local scenario pack YAML instead of dataplane active pack'
|
|
86
|
+
)
|
|
87
|
+
.option('-a, --app <path>', 'Integration folder override (with --pack)')
|
|
88
|
+
.option('--scenario <id>', 'Scenario subset when using --pack (repeatable)', collectString, [])
|
|
89
|
+
.option('-v, --verbose', 'Per-datasource breakdown')
|
|
90
|
+
.option('--json', 'Machine-readable envelope')
|
|
91
|
+
.addHelpText('after', GOVERNANCE_VERIFY_HELP_AFTER)
|
|
92
|
+
.action(governanceVerifyHandler);
|
|
93
|
+
applySharedGovernanceOpts(cmd);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* @param {import('commander').Command} governance
|
|
98
|
+
*/
|
|
99
|
+
function registerGovernanceUpload(governance) {
|
|
100
|
+
const cmd = governance
|
|
101
|
+
.command('upload <systemKey>')
|
|
102
|
+
.description('Upload integration/<systemKey>/scenarios/*.yaml to the dataplane')
|
|
103
|
+
.option('--json', 'Machine-readable envelope')
|
|
104
|
+
.addHelpText('after', GOVERNANCE_UPLOAD_HELP_AFTER)
|
|
105
|
+
.action(governanceUploadHandler);
|
|
106
|
+
applySharedGovernanceOpts(cmd);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* @param {import('commander').Command} governance
|
|
111
|
+
*/
|
|
112
|
+
function registerGovernanceDownload(governance) {
|
|
113
|
+
const cmd = governance
|
|
114
|
+
.command('download <systemKey>')
|
|
115
|
+
.description('Download active packs to integration/<systemKey>/scenarios/')
|
|
116
|
+
.option('--json', 'Machine-readable envelope')
|
|
117
|
+
.addHelpText('after', GOVERNANCE_DOWNLOAD_HELP_AFTER)
|
|
118
|
+
.action(governanceDownloadHandler);
|
|
119
|
+
applySharedGovernanceOpts(cmd);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* @param {import('commander').Command} program
|
|
124
|
+
*/
|
|
125
|
+
function setupGovernanceCommands(program) {
|
|
126
|
+
const governance = program
|
|
127
|
+
.command('governance')
|
|
128
|
+
.description(
|
|
129
|
+
'Integration validation scenario packs (generate, verify, download, upload)'
|
|
130
|
+
)
|
|
131
|
+
.addHelpText('after', GOVERNANCE_PARENT_HELP_AFTER);
|
|
132
|
+
|
|
133
|
+
applySharedGovernanceOpts(governance);
|
|
134
|
+
|
|
135
|
+
registerGovernanceGenerate(governance);
|
|
136
|
+
registerGovernanceVerify(governance);
|
|
137
|
+
registerGovernanceUpload(governance);
|
|
138
|
+
registerGovernanceDownload(governance);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
module.exports = {
|
|
142
|
+
setupGovernanceCommands,
|
|
143
|
+
collectString
|
|
144
|
+
};
|