@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,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Upload publish preflight: auth resolve, CLI gate, target logging.
|
|
3
|
+
* @author AI Fabrix Team
|
|
4
|
+
* @version 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
'use strict';
|
|
8
|
+
|
|
9
|
+
const chalk = require('chalk');
|
|
10
|
+
const logger = require('../utils/logger');
|
|
11
|
+
const { sectionTitle, headerKeyValue } = require('../utils/cli-test-layout-chalk');
|
|
12
|
+
const { resolveControllerUrl } = require('../utils/controller-url');
|
|
13
|
+
const { requireBearerForDataplanePipeline } = require('../utils/token-manager');
|
|
14
|
+
const { logDataplanePipelineWarning } = require('../utils/dataplane-pipeline-warning');
|
|
15
|
+
const { assertDataplaneCliVersionCompatible } = require('../utils/dataplane-cli-version-gate');
|
|
16
|
+
|
|
17
|
+
const SEP = chalk.gray('────────────────────────────────────────');
|
|
18
|
+
|
|
19
|
+
function logForcePublishWarning() {
|
|
20
|
+
logger.log(
|
|
21
|
+
chalk.yellow(
|
|
22
|
+
'Warning: --force bypasses active-datasource schema replacement guards on publish. '
|
|
23
|
+
+ 'Existing records and ABAC may be inconsistent; run validation/sync after upload.'
|
|
24
|
+
)
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function logUploadTargetSection(environment, dataplaneUrl) {
|
|
29
|
+
logger.log('');
|
|
30
|
+
logger.log(sectionTitle('Target'));
|
|
31
|
+
logger.log(SEP);
|
|
32
|
+
logger.log(headerKeyValue('Environment:', environment));
|
|
33
|
+
logger.log(headerKeyValue('Dataplane:', dataplaneUrl));
|
|
34
|
+
logDataplanePipelineWarning();
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Resolve dataplane auth and run upload preflight checks.
|
|
39
|
+
* @param {Function} resolveDataplaneAndAuth
|
|
40
|
+
* @param {Function} maybeRunVerboseServerValidation
|
|
41
|
+
* @param {string} systemKey
|
|
42
|
+
* @param {Object} options
|
|
43
|
+
* @param {Object} payload
|
|
44
|
+
* @returns {Promise<{ dataplaneUrl: string, authConfig: Object, environment: string }>}
|
|
45
|
+
*/
|
|
46
|
+
async function resolveUploadPublishContext(
|
|
47
|
+
resolveDataplaneAndAuth,
|
|
48
|
+
maybeRunVerboseServerValidation,
|
|
49
|
+
systemKey,
|
|
50
|
+
options,
|
|
51
|
+
payload
|
|
52
|
+
) {
|
|
53
|
+
const resolved = await resolveDataplaneAndAuth(systemKey, {
|
|
54
|
+
silent: options.silentResolve === true
|
|
55
|
+
});
|
|
56
|
+
requireBearerForDataplanePipeline(resolved.authConfig);
|
|
57
|
+
if (options.force === true) {
|
|
58
|
+
logForcePublishWarning();
|
|
59
|
+
}
|
|
60
|
+
const controllerUrl = await resolveControllerUrl();
|
|
61
|
+
await assertDataplaneCliVersionCompatible(resolved.dataplaneUrl, { controllerUrl });
|
|
62
|
+
if (options.minimal !== true) {
|
|
63
|
+
logUploadTargetSection(resolved.environment, resolved.dataplaneUrl);
|
|
64
|
+
}
|
|
65
|
+
if (options.verbose) {
|
|
66
|
+
await maybeRunVerboseServerValidation(resolved.dataplaneUrl, resolved.authConfig, payload);
|
|
67
|
+
}
|
|
68
|
+
return resolved;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
module.exports = {
|
|
72
|
+
logForcePublishWarning,
|
|
73
|
+
logUploadTargetSection,
|
|
74
|
+
resolveUploadPublishContext
|
|
75
|
+
};
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Upload sidecar follow-ups (governance packs, certification sync).
|
|
3
|
+
* @author AI Fabrix Team
|
|
4
|
+
* @version 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
'use strict';
|
|
8
|
+
|
|
9
|
+
const logger = require('../utils/logger');
|
|
10
|
+
const { formatWarningLine } = require('../utils/cli-test-layout-chalk');
|
|
11
|
+
const { unwrapPublicationResult, isPublicationUnchanged } = require('../utils/external-system-readiness-core');
|
|
12
|
+
const { logUploadReadinessSummary } = require('../utils/external-system-readiness-display');
|
|
13
|
+
const { maybeSyncSystemCertificationFromDataplane } = require('../certification/sync-system-certification');
|
|
14
|
+
const { cliOptsSkipCertSync } = require('../certification/cli-cert-sync-skip');
|
|
15
|
+
const { isQuietMinimalSync } = require('../utils/upload-sync-options');
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Sidecar follow-ups that are independent of pipeline publish hash (scenario packs, cert sync).
|
|
19
|
+
* @param {Object} ctx
|
|
20
|
+
* @returns {Promise<void>}
|
|
21
|
+
*/
|
|
22
|
+
async function runUploadSidecarFollowups(ctx) {
|
|
23
|
+
const { systemKey, options, payload, dataplaneUrl, authConfig } = ctx;
|
|
24
|
+
const quietSidecar = isQuietMinimalSync(options);
|
|
25
|
+
const dsKeys = (payload.dataSources || []).map((ds) => ds && ds.key).filter(Boolean);
|
|
26
|
+
try {
|
|
27
|
+
const { uploadGovernanceScenarioPacks } = require('../lifecycle/scenario-upload');
|
|
28
|
+
await uploadGovernanceScenarioPacks(systemKey, dataplaneUrl, authConfig, { silent: quietSidecar });
|
|
29
|
+
} catch (err) {
|
|
30
|
+
if (!quietSidecar) {
|
|
31
|
+
logger.log(formatWarningLine(`Governance scenario upload skipped: ${err.message}`));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
await maybeSyncSystemCertificationFromDataplane({
|
|
35
|
+
label: 'upload',
|
|
36
|
+
noCertSync: cliOptsSkipCertSync(options),
|
|
37
|
+
systemKey,
|
|
38
|
+
dataplaneUrl,
|
|
39
|
+
authConfig,
|
|
40
|
+
datasourceKeys: dsKeys,
|
|
41
|
+
silent: quietSidecar
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* @param {Object} ctx
|
|
47
|
+
* @param {Function} maybeRunUploadProbe
|
|
48
|
+
* @returns {Promise<void>}
|
|
49
|
+
*/
|
|
50
|
+
async function handlePublicationAndFollowups(ctx, maybeRunUploadProbe) {
|
|
51
|
+
const {
|
|
52
|
+
systemKey,
|
|
53
|
+
options,
|
|
54
|
+
manifest,
|
|
55
|
+
payload,
|
|
56
|
+
environment,
|
|
57
|
+
dataplaneUrl,
|
|
58
|
+
authConfig,
|
|
59
|
+
rawRes
|
|
60
|
+
} = ctx;
|
|
61
|
+
const publication = unwrapPublicationResult(rawRes);
|
|
62
|
+
if (!publication) {
|
|
63
|
+
throw new Error(
|
|
64
|
+
'Unexpected response from dataplane upload: missing publication result (uploadId/system/datasources).'
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
if (isPublicationUnchanged(publication)) {
|
|
68
|
+
await runUploadSidecarFollowups({ systemKey, options, payload, dataplaneUrl, authConfig });
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
logUploadReadinessSummary({
|
|
72
|
+
environment,
|
|
73
|
+
dataplaneUrl,
|
|
74
|
+
systemKey,
|
|
75
|
+
publication,
|
|
76
|
+
manifest,
|
|
77
|
+
minimal: !!options.minimal,
|
|
78
|
+
willProbe: !!options.probe
|
|
79
|
+
});
|
|
80
|
+
if (options.probe) {
|
|
81
|
+
await maybeRunUploadProbe(dataplaneUrl, systemKey, authConfig, options.probeTimeout);
|
|
82
|
+
}
|
|
83
|
+
await runUploadSidecarFollowups({ systemKey, options, payload, dataplaneUrl, authConfig });
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
module.exports = {
|
|
87
|
+
runUploadSidecarFollowups,
|
|
88
|
+
handlePublicationAndFollowups
|
|
89
|
+
};
|
package/lib/commands/upload.js
CHANGED
|
@@ -21,10 +21,12 @@ const logger = require('../utils/logger');
|
|
|
21
21
|
|
|
22
22
|
const SEP = chalk.gray('────────────────────────────────────────');
|
|
23
23
|
const { resolveControllerUrl } = require('../utils/controller-url');
|
|
24
|
-
const { getDeploymentAuth
|
|
24
|
+
const { getDeploymentAuth } = require('../utils/token-manager');
|
|
25
25
|
const { resolveDataplaneUrl } = require('../utils/dataplane-resolver');
|
|
26
26
|
const { getIntegrationPath } = require('../utils/paths');
|
|
27
27
|
const { pushCredentialSecrets } = require('../utils/credential-secrets-env');
|
|
28
|
+
const { runWithCredentialPushSpinner } = require('../utils/credential-push-ui');
|
|
29
|
+
const { runWithUploadPipelineSpinner } = require('../utils/upload-pipeline-ui');
|
|
28
30
|
const {
|
|
29
31
|
buildResolvedEnvMapForIntegration,
|
|
30
32
|
resolveConfigurationValues,
|
|
@@ -34,21 +36,24 @@ const { validateExternalSystemComplete } = require('../validation/validate');
|
|
|
34
36
|
const { displayValidationResults } = require('../validation/validate-display');
|
|
35
37
|
const { generateControllerManifest } = require('../generator/external-controller-manifest');
|
|
36
38
|
const {
|
|
37
|
-
uploadApplicationViaPipeline,
|
|
38
39
|
validatePipelineConfig,
|
|
39
40
|
testSystemViaPipeline
|
|
40
41
|
} = require('../api/pipeline.api');
|
|
42
|
+
const { uploadApplicationViaPipelineWithAuthRetry } = require('../utils/pipeline-upload-auth-retry');
|
|
41
43
|
const { formatApiError } = require('../utils/api-error-handler');
|
|
42
|
-
const {
|
|
43
|
-
const { unwrapPublicationResult, unwrapApiData } = require('../utils/external-system-readiness-core');
|
|
44
|
+
const { unwrapPublicationResult, unwrapApiData, isPublicationUnchanged } = require('../utils/external-system-readiness-core');
|
|
44
45
|
const {
|
|
45
|
-
logUploadReadinessSummary,
|
|
46
46
|
logServerValidationWarnings,
|
|
47
47
|
logProbeRuntimeBlock
|
|
48
48
|
} = require('../utils/external-system-readiness-display');
|
|
49
|
-
const { maybeSyncSystemCertificationFromDataplane } = require('../certification/sync-system-certification');
|
|
50
|
-
const { cliOptsSkipCertSync } = require('../certification/cli-cert-sync-skip');
|
|
51
49
|
const { maybeSyncOpenApiFilesForMcp } = require('./repair-openapi-sync');
|
|
50
|
+
const { resolveUploadPublishContext } = require('./upload-publish-context');
|
|
51
|
+
const { syncDeployJsonFromSources } = require('../external-system/sync-deploy-manifest');
|
|
52
|
+
const { isQuietMinimalSync } = require('../utils/upload-sync-options');
|
|
53
|
+
const {
|
|
54
|
+
runUploadSidecarFollowups,
|
|
55
|
+
handlePublicationAndFollowups
|
|
56
|
+
} = require('./upload-sidecar-followups');
|
|
52
57
|
|
|
53
58
|
/**
|
|
54
59
|
* Validates system-key format (same as download).
|
|
@@ -70,13 +75,22 @@ function validateSystemKeyFormat(systemKey) {
|
|
|
70
75
|
* @param {Object} manifest - Controller manifest from generateControllerManifest
|
|
71
76
|
* @returns {Object} { version, application, dataSources, status: "draft" }
|
|
72
77
|
*/
|
|
73
|
-
|
|
74
|
-
|
|
78
|
+
/**
|
|
79
|
+
* @param {Object} manifest - Controller manifest from generateControllerManifest
|
|
80
|
+
* @param {{ force?: boolean }} [opts]
|
|
81
|
+
* @returns {Object}
|
|
82
|
+
*/
|
|
83
|
+
function buildUploadPayload(manifest, opts = {}) {
|
|
84
|
+
const payload = {
|
|
75
85
|
version: manifest.version || '1.0.0',
|
|
76
86
|
application: manifest.system,
|
|
77
87
|
dataSources: manifest.dataSources || [],
|
|
78
88
|
status: 'draft'
|
|
79
89
|
};
|
|
90
|
+
if (opts.force === true) {
|
|
91
|
+
payload.force = true;
|
|
92
|
+
}
|
|
93
|
+
return payload;
|
|
80
94
|
}
|
|
81
95
|
|
|
82
96
|
/**
|
|
@@ -110,11 +124,15 @@ async function resolveDataplaneAndAuth(systemKey, opts = {}) {
|
|
|
110
124
|
* @param {Object} payload - { version, application, dataSources, status: "draft" }
|
|
111
125
|
* @returns {Promise<Object>} Raw API response envelope
|
|
112
126
|
*/
|
|
113
|
-
async function runUploadValidatePublish(dataplaneUrl, authConfig, payload) {
|
|
114
|
-
const res = await
|
|
127
|
+
async function runUploadValidatePublish(dataplaneUrl, authConfig, payload, systemKey) {
|
|
128
|
+
const res = await uploadApplicationViaPipelineWithAuthRetry(
|
|
129
|
+
dataplaneUrl,
|
|
130
|
+
authConfig,
|
|
131
|
+
payload,
|
|
132
|
+
systemKey
|
|
133
|
+
);
|
|
115
134
|
if (res?.success === false) {
|
|
116
|
-
|
|
117
|
-
throw new Error(msg);
|
|
135
|
+
throw new Error(formatApiError(res, dataplaneUrl));
|
|
118
136
|
}
|
|
119
137
|
return res;
|
|
120
138
|
}
|
|
@@ -170,13 +188,17 @@ async function resolvePayloadConfiguration(systemKey, payload) {
|
|
|
170
188
|
* @param {string} systemKey - System key
|
|
171
189
|
* @param {Object} payload - Upload payload
|
|
172
190
|
*/
|
|
173
|
-
async function pushAndLogCredentialSecrets(dataplaneUrl, authConfig, systemKey, payload) {
|
|
191
|
+
async function pushAndLogCredentialSecrets(dataplaneUrl, authConfig, systemKey, payload, uiOpts = {}) {
|
|
174
192
|
const envFilePath = path.join(getIntegrationPath(systemKey), '.env');
|
|
175
|
-
const pushResult = await
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
193
|
+
const pushResult = await runWithCredentialPushSpinner(
|
|
194
|
+
() =>
|
|
195
|
+
pushCredentialSecrets(dataplaneUrl, authConfig, {
|
|
196
|
+
envFilePath,
|
|
197
|
+
appName: systemKey,
|
|
198
|
+
payload
|
|
199
|
+
}),
|
|
200
|
+
{ systemKey, json: uiOpts.json === true }
|
|
201
|
+
);
|
|
180
202
|
if (pushResult.pushed > 0) {
|
|
181
203
|
const keyList = pushResult.keys?.length ? ` (${pushResult.keys.join(', ')})` : '';
|
|
182
204
|
logger.log(
|
|
@@ -262,18 +284,22 @@ async function maybeRunUploadProbe(dataplaneUrl, systemKey, authConfig, probeTim
|
|
|
262
284
|
|
|
263
285
|
/**
|
|
264
286
|
* Local validation, manifest, payload, and configuration resolution.
|
|
265
|
-
*
|
|
287
|
+
* Regenerates integration/<systemKey>/<systemKey>-deploy.json from sources (same as `aifabrix json`).
|
|
266
288
|
*
|
|
267
289
|
* @param {string} systemKey
|
|
268
290
|
* @param {{ dryRun?: boolean }} [_opts] - Reserved for callers (e.g. dry-run); manifest is always built from current disk files
|
|
269
291
|
* @returns {Promise<{ manifest: Object, payload: Object }>}
|
|
270
292
|
*/
|
|
271
|
-
async function buildValidatedUploadManifestPayload(systemKey,
|
|
293
|
+
async function buildValidatedUploadManifestPayload(systemKey, opts = {}) {
|
|
294
|
+
const quiet = opts.minimal === true || opts.quiet === true;
|
|
272
295
|
const validationResult = await validateExternalSystemComplete(systemKey, { type: 'external' });
|
|
273
296
|
throwIfValidationFailed(validationResult);
|
|
274
|
-
|
|
297
|
+
if (!quiet) {
|
|
298
|
+
logger.log(formatSuccessLine('Local validation passed'));
|
|
299
|
+
}
|
|
300
|
+
await syncDeployJsonFromSources(systemKey, { quiet });
|
|
275
301
|
const manifest = await generateControllerManifest(systemKey, { type: 'external' });
|
|
276
|
-
const payload = buildUploadPayload(manifest);
|
|
302
|
+
const payload = buildUploadPayload(manifest, { force: opts.force === true });
|
|
277
303
|
await resolvePayloadConfiguration(systemKey, payload);
|
|
278
304
|
return { manifest, payload };
|
|
279
305
|
}
|
|
@@ -304,58 +330,6 @@ async function logAndSyncLocalOpenApiForUpload(systemKey, manifest) {
|
|
|
304
330
|
}
|
|
305
331
|
}
|
|
306
332
|
|
|
307
|
-
/**
|
|
308
|
-
* @param {Object} ctx
|
|
309
|
-
* @param {string} ctx.systemKey
|
|
310
|
-
* @param {Object} ctx.options
|
|
311
|
-
* @param {Object} ctx.manifest
|
|
312
|
-
* @param {Object} ctx.payload
|
|
313
|
-
* @param {string} ctx.environment
|
|
314
|
-
* @param {string} ctx.dataplaneUrl
|
|
315
|
-
* @param {Object} ctx.authConfig
|
|
316
|
-
* @param {Object} ctx.rawRes
|
|
317
|
-
* @returns {Promise<void>}
|
|
318
|
-
*/
|
|
319
|
-
async function handlePublicationAndFollowups(ctx) {
|
|
320
|
-
const {
|
|
321
|
-
systemKey,
|
|
322
|
-
options,
|
|
323
|
-
manifest,
|
|
324
|
-
payload,
|
|
325
|
-
environment,
|
|
326
|
-
dataplaneUrl,
|
|
327
|
-
authConfig,
|
|
328
|
-
rawRes
|
|
329
|
-
} = ctx;
|
|
330
|
-
const publication = unwrapPublicationResult(rawRes);
|
|
331
|
-
if (!publication) {
|
|
332
|
-
throw new Error(
|
|
333
|
-
'Unexpected response from dataplane upload: missing publication result (uploadId/system/datasources).'
|
|
334
|
-
);
|
|
335
|
-
}
|
|
336
|
-
logUploadReadinessSummary({
|
|
337
|
-
environment,
|
|
338
|
-
dataplaneUrl,
|
|
339
|
-
systemKey,
|
|
340
|
-
publication,
|
|
341
|
-
manifest,
|
|
342
|
-
minimal: !!options.minimal,
|
|
343
|
-
willProbe: !!options.probe
|
|
344
|
-
});
|
|
345
|
-
if (options.probe) {
|
|
346
|
-
await maybeRunUploadProbe(dataplaneUrl, systemKey, authConfig, options.probeTimeout);
|
|
347
|
-
}
|
|
348
|
-
const dsKeys = (payload.dataSources || []).map((ds) => ds && ds.key).filter(Boolean);
|
|
349
|
-
await maybeSyncSystemCertificationFromDataplane({
|
|
350
|
-
label: 'upload',
|
|
351
|
-
noCertSync: cliOptsSkipCertSync(options),
|
|
352
|
-
systemKey,
|
|
353
|
-
dataplaneUrl,
|
|
354
|
-
authConfig,
|
|
355
|
-
datasourceKeys: dsKeys
|
|
356
|
-
});
|
|
357
|
-
}
|
|
358
|
-
|
|
359
333
|
/**
|
|
360
334
|
* Upload path after dry-run check.
|
|
361
335
|
* @param {string} systemKey
|
|
@@ -364,31 +338,55 @@ async function handlePublicationAndFollowups(ctx) {
|
|
|
364
338
|
* @param {Object} payload
|
|
365
339
|
*/
|
|
366
340
|
async function runUploadPublishAndSummary(systemKey, options, manifest, payload) {
|
|
367
|
-
const { dataplaneUrl, authConfig, environment } = await
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
logger.log(sectionTitle('Target'));
|
|
371
|
-
logger.log(SEP);
|
|
372
|
-
logger.log(headerKeyValue('Environment:', environment));
|
|
373
|
-
logger.log(headerKeyValue('Dataplane:', dataplaneUrl));
|
|
374
|
-
logDataplanePipelineWarning();
|
|
375
|
-
if (options.verbose) {
|
|
376
|
-
await maybeRunVerboseServerValidation(dataplaneUrl, authConfig, payload);
|
|
377
|
-
}
|
|
378
|
-
await pushAndLogCredentialSecrets(dataplaneUrl, authConfig, systemKey, payload);
|
|
379
|
-
|
|
380
|
-
const rawRes = await runUploadValidatePublish(dataplaneUrl, authConfig, payload);
|
|
381
|
-
await logAndSyncLocalOpenApiForUpload(systemKey, manifest);
|
|
382
|
-
await handlePublicationAndFollowups({
|
|
341
|
+
const { dataplaneUrl, authConfig, environment } = await resolveUploadPublishContext(
|
|
342
|
+
resolveDataplaneAndAuth,
|
|
343
|
+
maybeRunVerboseServerValidation,
|
|
383
344
|
systemKey,
|
|
384
345
|
options,
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
dataplaneUrl,
|
|
389
|
-
|
|
390
|
-
|
|
346
|
+
payload
|
|
347
|
+
);
|
|
348
|
+
const rawRes = await runWithUploadPipelineSpinner(
|
|
349
|
+
async() => runUploadValidatePublish(dataplaneUrl, authConfig, payload, systemKey),
|
|
350
|
+
{
|
|
351
|
+
systemKey,
|
|
352
|
+
json: options.json === true,
|
|
353
|
+
syncMode: options.syncMode === true,
|
|
354
|
+
suppressPipelineSpinner: options.suppressPipelineSpinner === true
|
|
355
|
+
}
|
|
356
|
+
);
|
|
357
|
+
const publication = unwrapPublicationResult(rawRes);
|
|
358
|
+
if (isPublicationUnchanged(publication)) {
|
|
359
|
+
if (!isQuietMinimalSync(options)) {
|
|
360
|
+
logger.log(formatSuccessLine('Config unchanged on dataplane — upload skipped.'));
|
|
361
|
+
}
|
|
362
|
+
await runUploadSidecarFollowups({
|
|
363
|
+
systemKey,
|
|
364
|
+
options,
|
|
365
|
+
payload,
|
|
366
|
+
dataplaneUrl,
|
|
367
|
+
authConfig
|
|
368
|
+
});
|
|
369
|
+
return { dataplaneUrl, authConfig, environment, uploadSkipped: true };
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
await pushAndLogCredentialSecrets(dataplaneUrl, authConfig, systemKey, payload, {
|
|
373
|
+
json: options.json === true
|
|
391
374
|
});
|
|
375
|
+
await logAndSyncLocalOpenApiForUpload(systemKey, manifest);
|
|
376
|
+
await handlePublicationAndFollowups(
|
|
377
|
+
{
|
|
378
|
+
systemKey,
|
|
379
|
+
options,
|
|
380
|
+
manifest,
|
|
381
|
+
payload,
|
|
382
|
+
environment,
|
|
383
|
+
dataplaneUrl,
|
|
384
|
+
authConfig,
|
|
385
|
+
rawRes
|
|
386
|
+
},
|
|
387
|
+
maybeRunUploadProbe
|
|
388
|
+
);
|
|
389
|
+
return { dataplaneUrl, authConfig, environment, uploadSkipped: false };
|
|
392
390
|
}
|
|
393
391
|
|
|
394
392
|
/**
|
|
@@ -400,26 +398,31 @@ async function runUploadPublishAndSummary(systemKey, options, manifest, payload)
|
|
|
400
398
|
* @param {boolean} [options.probe] - POST validation/run after publish
|
|
401
399
|
* @param {number} [options.probeTimeout] - Probe timeout ms (default 120000)
|
|
402
400
|
* @param {boolean} [options.minimal] - Short summary only
|
|
403
|
-
* @returns {Promise<void>}
|
|
401
|
+
* @returns {Promise<{ dataplaneUrl: string, authConfig: Object, environment: string }|void>}
|
|
404
402
|
* @throws {Error} If validation or API calls fail
|
|
405
403
|
*/
|
|
406
404
|
async function uploadExternalSystem(systemKey, options = {}) {
|
|
407
405
|
validateSystemKeyFormat(systemKey);
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
406
|
+
const minimal = options.minimal === true;
|
|
407
|
+
if (!minimal) {
|
|
408
|
+
logger.log('');
|
|
409
|
+
logger.log(sectionTitle('Upload external system'));
|
|
410
|
+
logger.log(SEP);
|
|
411
|
+
logger.log(headerKeyValue('System:', systemKey));
|
|
412
|
+
}
|
|
412
413
|
const { manifest, payload } = await buildValidatedUploadManifestPayload(systemKey, {
|
|
413
|
-
dryRun: !!options.dryRun
|
|
414
|
+
dryRun: !!options.dryRun,
|
|
415
|
+
force: options.force === true,
|
|
416
|
+
minimal
|
|
414
417
|
});
|
|
415
418
|
if (options.dryRun) {
|
|
416
419
|
logger.log(chalk.yellow('Dry run: would upload payload (no API calls).'));
|
|
417
420
|
logger.log(
|
|
418
421
|
chalk.gray(` System: ${manifest.key}, version: ${payload.version}, datasources: ${payload.dataSources.length}`)
|
|
419
422
|
);
|
|
420
|
-
return;
|
|
423
|
+
return undefined;
|
|
421
424
|
}
|
|
422
|
-
|
|
425
|
+
return runUploadPublishAndSummary(systemKey, options, manifest, payload);
|
|
423
426
|
}
|
|
424
427
|
|
|
425
428
|
module.exports = {
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview verify-governance — sync, generate, verify (424.0 dataplane-first).
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
'use strict';
|
|
6
|
+
|
|
7
|
+
const { runGovernanceGenerateForExternalSystem } = require('./governance-generate-external');
|
|
8
|
+
const { runVerifyGovernanceForExternalSystem } = require('./verify-governance-external');
|
|
9
|
+
const {
|
|
10
|
+
buildSubjectsFromOptions,
|
|
11
|
+
resolveGovernanceIntegrationContext
|
|
12
|
+
} = require('./governance-cli-shared');
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @async
|
|
16
|
+
* @param {string} systemKey
|
|
17
|
+
* @param {Object} options
|
|
18
|
+
* @returns {Promise<Object>}
|
|
19
|
+
*/
|
|
20
|
+
async function runVerifyGovernanceCombined(systemKey, options = {}) {
|
|
21
|
+
if (options.pack) {
|
|
22
|
+
return runVerifyGovernanceForExternalSystem(systemKey, options);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const subjects = buildSubjectsFromOptions(options);
|
|
26
|
+
if (subjects.length === 0) {
|
|
27
|
+
throw new Error(
|
|
28
|
+
'At least one --subject-user-id or --subject-email is required for verify-governance'
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const { resolvedKey, authConfig, dataplaneUrl } = await resolveGovernanceIntegrationContext(
|
|
33
|
+
systemKey,
|
|
34
|
+
options
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
const pipelineOpts = {
|
|
38
|
+
...options,
|
|
39
|
+
noSync: true,
|
|
40
|
+
authConfig,
|
|
41
|
+
dataplaneUrl
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const generateResult = await runGovernanceGenerateForExternalSystem(
|
|
45
|
+
resolvedKey,
|
|
46
|
+
pipelineOpts
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
const verifyResult = await runVerifyGovernanceForExternalSystem(resolvedKey, pipelineOpts);
|
|
50
|
+
|
|
51
|
+
return {
|
|
52
|
+
...verifyResult,
|
|
53
|
+
command: 'verify-governance',
|
|
54
|
+
generated: generateResult.generated,
|
|
55
|
+
generateResults: generateResult.results
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
module.exports = {
|
|
60
|
+
runVerifyGovernanceCombined
|
|
61
|
+
};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview CLI action for `aifabrix verify-governance` (plan 150.0 / 424.0).
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
'use strict';
|
|
6
|
+
|
|
7
|
+
const logger = require('../utils/logger');
|
|
8
|
+
const { handleCommandError } = require('../utils/cli-utils');
|
|
9
|
+
const { runVerifyGovernanceCombined } = require('./verify-governance-combined-external');
|
|
10
|
+
const { normalizeTestGovernanceCliOptions } = require('./test-governance-cli-options');
|
|
11
|
+
const { displayVerifyGovernanceTTY } = require('../lifecycle/report-display');
|
|
12
|
+
const { exitCodeFromVerdict } = require('../lifecycle/exit-codes');
|
|
13
|
+
const { buildJsonEnvelope } = require('../lifecycle/json-envelope');
|
|
14
|
+
const { formatSuccessLine } = require('../utils/cli-test-layout-chalk');
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @param {Object} options
|
|
18
|
+
* @param {import('commander').Command} [cmd]
|
|
19
|
+
* @returns {Object}
|
|
20
|
+
*/
|
|
21
|
+
function normalizeVerifyGovernanceCliOptions(options, cmd) {
|
|
22
|
+
const base = normalizeTestGovernanceCliOptions(options, cmd);
|
|
23
|
+
return {
|
|
24
|
+
...base,
|
|
25
|
+
certificationProfile: options.certificationProfile || 'bronze',
|
|
26
|
+
subjectUserIds: options.subjectUserId || [],
|
|
27
|
+
subjectEmails: options.subjectEmail || [],
|
|
28
|
+
maxSamplesPerPartition: options.maxSamplesPerPartition
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
async function runVerifyGovernanceCommandAction(appName, options, cmd) {
|
|
33
|
+
const opts = normalizeVerifyGovernanceCliOptions(options, cmd);
|
|
34
|
+
const result = await runVerifyGovernanceCombined(appName, opts);
|
|
35
|
+
|
|
36
|
+
if (opts.json) {
|
|
37
|
+
logger.log(JSON.stringify(buildJsonEnvelope(result, opts.verbose), null, 2));
|
|
38
|
+
} else {
|
|
39
|
+
if (opts.verbose && !opts.pack && typeof result.generated === 'number' && result.generated > 0) {
|
|
40
|
+
logger.log(formatSuccessLine(`Generated packs for ${result.generated} datasource(s)`));
|
|
41
|
+
}
|
|
42
|
+
displayVerifyGovernanceTTY(result.systemKey, result, { details: opts.verbose });
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const exitCode = exitCodeFromVerdict(result.verdict);
|
|
46
|
+
if (exitCode !== 0) {
|
|
47
|
+
process.exit(exitCode);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async function verifyGovernanceCommandHandler(appName, options, cmd) {
|
|
52
|
+
try {
|
|
53
|
+
await runVerifyGovernanceCommandAction(appName, options, cmd);
|
|
54
|
+
} catch (error) {
|
|
55
|
+
handleCommandError(error, 'verify-governance');
|
|
56
|
+
process.exit(3);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
module.exports = {
|
|
61
|
+
runVerifyGovernanceCommandAction,
|
|
62
|
+
verifyGovernanceCommandHandler,
|
|
63
|
+
normalizeVerifyGovernanceCliOptions
|
|
64
|
+
};
|