@aifabrix/builder 2.45.5 → 2.47.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/project-rules.mdc +1 -0
- package/.npmrc.token +1 -0
- package/.temp/jest-protection-convert/run-IFN2nv/.protection/hubspot-companies.json +1 -0
- package/.temp/jest-protection-convert/run-IvmKLO/.protection/hubspot-companies.yaml +17 -0
- package/.temp/jest-protection-convert/run-SdvblF/.protection/hubspot-companies.json +1 -0
- package/.temp/jest-protection-convert/run-b51TsW/.protection/hubspot-companies.json +1 -0
- package/.temp/jest-protection-convert/run-fiLmb1/.protection/hubspot-companies.json +1 -0
- package/.temp/jest-protection-convert/run-qYGHMU/.protection/hubspot-companies.yaml +17 -0
- package/.temp/jest-protection-fixtures/hubspot-Mq5re8/hubspot-companies.yaml +17 -0
- package/.temp/jest-protection-fixtures/hubspot-f3u4YL/hubspot-companies.yaml +17 -0
- package/.temp/jest-protection-fixtures/hubspot-iQtd1O/hubspot-companies.yaml +17 -0
- package/.temp/jest-protection-fixtures/hubspot-mdmz5M/hubspot-companies.yaml +17 -0
- package/.temp/jest-protection-fixtures/hubspot-qbKYxQ/hubspot-companies.yaml +17 -0
- package/.temp/jest-protection-fixtures/hubspot-yzlJy6/hubspot-companies.yaml +17 -0
- package/.temp/validation/summary.txt +5 -0
- package/README.md +43 -17
- package/integration/hubspot-test/test-artifacts/wizard-hubspot-credential-real.yaml +1 -1
- package/integration/hubspot-test/test-artifacts/wizard-hubspot-env-vars.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 +146 -0
- package/jest.projects.js +65 -136
- package/lib/api/api-response-errors.js +124 -0
- package/lib/api/dataplane-health.api.js +19 -7
- package/lib/api/governance-scenario-pack.api.js +159 -0
- package/lib/api/index.js +43 -3
- package/lib/api/lifecycle.api.js +98 -0
- package/lib/api/pipeline.api.js +3 -1
- package/lib/api/records-bulk.api.js +14 -1
- package/lib/api/resource-types.api.js +107 -0
- package/lib/api/runtime-configuration.api.js +72 -0
- package/lib/api/types/resource-types.types.js +45 -0
- package/lib/api/user-groups.api.js +9 -9
- package/lib/api/users.api.js +8 -8
- package/lib/api/validation-runner.js +3 -1
- package/lib/api/wizard.api.js +10 -2
- package/lib/app/deploy-config.js +4 -1
- package/lib/app/down.js +78 -27
- package/lib/app/index.js +2 -2
- 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/app/run-resolve-image.js +2 -1
- package/lib/app/run-stop-containers.js +113 -0
- package/lib/app/run.js +1 -31
- package/lib/app/show-display.js +35 -0
- package/lib/app/show.js +32 -1
- package/lib/build/index.js +22 -5
- package/lib/build/miso-controller-npm-sdk-guard.js +25 -0
- package/lib/certification/sync-system-certification.js +13 -6
- package/lib/channels/add-channel.js +348 -0
- package/lib/channels/channel-artifact-generator.js +141 -0
- package/lib/channels/channel-audit.js +101 -0
- package/lib/channels/channel-auth-context.js +37 -0
- package/lib/channels/channel-credential.js +200 -0
- package/lib/channels/channel-display-name.js +64 -0
- package/lib/channels/channel-external-system.js +106 -0
- package/lib/channels/channel-integration-generator.js +274 -0
- package/lib/channels/channel-probe.js +89 -0
- package/lib/channels/channel-runtime-resolver.js +152 -0
- package/lib/channels/channel-status-display.js +141 -0
- package/lib/channels/channel-targets.js +115 -0
- package/lib/cli/index.js +20 -4
- package/lib/cli/infra-guided-auth.js +109 -0
- package/lib/cli/infra-guided.js +84 -81
- package/lib/cli/setup-app.help.js +0 -31
- package/lib/cli/setup-app.js +82 -5
- package/lib/cli/setup-app.test-commands.js +5 -57
- package/lib/cli/setup-auth.js +25 -0
- 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 +25 -3
- package/lib/cli/setup-infra-up-dataplane-action.js +2 -2
- package/lib/cli/setup-infra-up-platform-action.js +2 -1
- 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 +25 -2
- package/lib/cli/setup-utility-repair.js +198 -0
- package/lib/cli/setup-utility-resolve.js +44 -5
- package/lib/cli/setup-utility-validate.js +197 -0
- package/lib/cli/setup-utility.js +4 -239
- package/lib/commands/app-logs.js +54 -26
- package/lib/commands/app.js +41 -0
- package/lib/commands/auth-status-client-tokens.js +214 -0
- package/lib/commands/auth-status-dataplane-version.js +142 -68
- package/lib/commands/auth-status.js +43 -54
- package/lib/commands/channel.js +58 -0
- package/lib/commands/datasource-test-trust-cli.js +27 -23
- package/lib/commands/datasource-unified-test-cli.js +6 -3
- package/lib/commands/datasource-unified-test-cli.options.js +5 -1
- package/lib/commands/datasource.js +8 -8
- package/lib/commands/dev-show-display.js +8 -1
- 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 +49 -8
- package/lib/commands/identity-group-cli.js +66 -26
- package/lib/commands/identity-membership-role-cache.js +58 -37
- package/lib/commands/identity-shared.js +22 -1
- package/lib/commands/identity-user-cli.js +80 -34
- package/lib/commands/lifecycle-command-action.js +123 -0
- package/lib/commands/lifecycle-external.js +268 -0
- package/lib/commands/login.js +11 -2
- package/lib/commands/repair-auth-apply.js +153 -0
- package/lib/commands/repair-auth-config.js +8 -13
- package/lib/commands/repair-changed-files.js +41 -0
- package/lib/commands/repair-datasource-com-v2.js +15 -0
- package/lib/commands/repair-datasource-keys.js +4 -1
- package/lib/commands/repair-datasource-run.js +59 -0
- package/lib/commands/repair-datasource-service-contract.js +206 -0
- package/lib/commands/repair-datasource-test-payload.js +259 -0
- package/lib/commands/repair-datasource.js +49 -64
- package/lib/commands/repair-env-template.js +76 -25
- package/lib/commands/repair-external-run.js +216 -0
- package/lib/commands/repair-openapi-sync.js +49 -4
- package/lib/commands/repair-persist.js +4 -0
- package/lib/commands/repair-rbac.js +52 -1
- package/lib/commands/repair-steps.js +160 -0
- package/lib/commands/repair-system-alignment.js +7 -4
- package/lib/commands/repair.js +29 -296
- package/lib/commands/resource-type.js +371 -0
- 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 +70 -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 +24 -8
- package/lib/commands/test-governance-external.js +3 -24
- package/lib/commands/test-trust-external.js +48 -100
- package/lib/commands/up-common.js +57 -13
- package/lib/commands/up-dataplane.js +56 -15
- package/lib/commands/upload-publish-context.js +75 -0
- package/lib/commands/upload-sidecar-followups.js +89 -0
- package/lib/commands/upload.js +113 -110
- 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 +73 -0
- package/lib/commands/verify-trust-external.js +59 -0
- package/lib/commands/wizard-config-normalizer.js +43 -23
- package/lib/commands/wizard-core.js +2 -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-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 +90 -0
- package/lib/datasource/agent-trust-debug-log.js +1 -1
- package/lib/datasource/agent-trust-run.js +5 -3
- package/lib/datasource/audit-evidence-extract-debug.js +30 -18
- package/lib/datasource/audit-evidence-extract.js +7 -4
- package/lib/datasource/audit-evidence-verify-matrix.js +54 -26
- package/lib/datasource/bulk-loader-run-batches.js +15 -3
- package/lib/datasource/capability/capability-diff-slice.js +2 -2
- package/lib/datasource/capability/capability-manifest.js +254 -0
- package/lib/datasource/capability/capability-resolve.js +3 -4
- package/lib/datasource/capability/copy-operations.js +5 -3
- package/lib/datasource/capability/remove-operations.js +2 -1
- package/lib/datasource/capability/run-capability-copy.js +32 -4
- package/lib/datasource/capability/run-capability-diff.js +3 -3
- package/lib/datasource/capability/run-capability-dimension.js +2 -4
- package/lib/datasource/capability/run-capability-edit.js +4 -7
- package/lib/datasource/capability/run-capability-relate.js +2 -4
- package/lib/datasource/capability/run-capability-remove.js +2 -4
- package/lib/datasource/capability/validate-capability-slice.js +2 -1
- package/lib/datasource/datasource-identifier.js +2 -1
- package/lib/datasource/datasource-load-export-context.js +3 -0
- package/lib/datasource/datasource-validate-display.js +1 -1
- package/lib/datasource/field-reference-validator.js +24 -3
- package/lib/datasource/log-cleaner.js +2 -2
- package/lib/datasource/log-viewer.js +8 -8
- package/lib/datasource/orphan-profiles-validator.js +98 -0
- package/lib/datasource/test-e2e.js +4 -1
- package/lib/datasource/unified-validation-run-body.js +3 -1
- package/lib/datasource/unified-validation-run.js +5 -2
- package/lib/datasource/validate.js +41 -23
- package/lib/deployment/environment-poll-status.js +138 -0
- package/lib/deployment/environment.js +42 -34
- package/lib/external-system/download-helpers.js +87 -0
- package/lib/external-system/download.js +78 -138
- package/lib/external-system/generator.js +1 -55
- package/lib/external-system/integration-auth-context.js +45 -0
- package/lib/external-system/test-auth.js +12 -5
- package/lib/external-system/test.js +16 -21
- package/lib/generator/builders.js +11 -1
- package/lib/generator/external-controller-manifest.js +18 -0
- package/lib/generator/split.js +3 -1
- package/lib/generator/wizard.js +1 -28
- package/lib/governance/governance-cli-errors.js +96 -0
- package/lib/governance/governance-download-display.js +38 -0
- package/lib/governance/governance-run-display.js +215 -25
- package/lib/identity/fk-reference.js +65 -0
- package/lib/identity/identity-apply-core.js +13 -58
- package/lib/identity/identity-apply-phases.js +5 -1
- package/lib/identity/identity-display.js +243 -0
- package/lib/identity/identity-response-helpers.js +52 -0
- package/lib/identity/identity-sync-errors.js +62 -0
- package/lib/identity/resolve-user-id.js +129 -0
- package/lib/identity/username-default.js +31 -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/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-trust.js +70 -0
- package/lib/lifecycle/report-display.js +472 -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 +10 -4
- package/lib/resolvers/datasource-resolver.js +2 -3
- package/lib/resolvers/resource-type-file.js +159 -0
- package/lib/schema/application-schema.json +17 -1
- package/lib/schema/datasource-test-run.schema.json +89 -6
- package/lib/schema/deployment-rules.yaml +2 -1
- package/lib/schema/external-datasource.schema.json +2947 -2619
- package/lib/schema/external-system.schema.json +1418 -761
- package/lib/schema/infra.parameter.yaml +45 -0
- package/lib/schema/type/credential-field-registry.json +103 -97
- package/lib/schema/type/document-storage.json +9 -5
- 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/app-run-containers.js +25 -2
- package/lib/utils/authentication-shape.js +224 -0
- package/lib/utils/build-copy.js +36 -5
- package/lib/utils/build-resolve-image.js +66 -12
- package/lib/utils/celery-companion-apps.js +53 -0
- package/lib/utils/cli-secrets-error-format.js +83 -21
- package/lib/utils/cli-utils.js +20 -4
- package/lib/utils/compose-celery-worker.js +23 -0
- package/lib/utils/compose-generate-docker-compose.js +13 -1
- package/lib/utils/compose-traefik-ingress-base.js +16 -1
- package/lib/utils/config-secrets-path.js +46 -0
- package/lib/utils/configuration-env-resolver.js +36 -0
- package/lib/utils/controller-url.js +88 -1
- package/lib/utils/credential-secrets-env-kv.js +216 -0
- package/lib/utils/credential-secrets-env.js +175 -257
- package/lib/utils/dataplane-resolver.js +18 -2
- package/lib/utils/declarative-url-ports.js +27 -4
- package/lib/utils/deployment-auth-mode.js +41 -0
- package/lib/utils/developer-volume-id.js +33 -0
- package/lib/utils/docker-build.js +1 -4
- 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 +11 -3
- package/lib/utils/external-system-readiness-core.js +10 -0
- package/lib/utils/external-system-readiness-display.js +80 -23
- package/lib/utils/external-system-validators.js +8 -2
- package/lib/utils/health-check.js +4 -1
- package/lib/utils/help-builder.js +13 -8
- 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 +2 -0
- package/lib/utils/paths.js +25 -0
- package/lib/utils/pipeline-upload-auth-retry.js +82 -0
- package/lib/utils/platform-controller-url.js +157 -0
- package/lib/utils/platform-kv-ref.js +57 -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/runtime-configuration-download.js +189 -0
- package/lib/utils/runtime-configuration-values.js +119 -0
- package/lib/utils/schema-loader.js +19 -4
- package/lib/utils/secrets-generator.js +31 -25
- package/lib/utils/secrets-missing-error.js +164 -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 +12 -5
- 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 +8 -0
- package/lib/utils/validation-run-stage.js +45 -0
- package/lib/utils/worker-sidecars.js +142 -0
- package/lib/validation/external-manifest-validator.js +2 -0
- package/lib/validation/runtime-configuration-rules.js +98 -0
- package/lib/validation/validate-display-dimensions.js +154 -0
- package/lib/validation/validate-display-sections.js +276 -0
- package/lib/validation/validate-display-steps.js +67 -0
- package/lib/validation/validate-display.js +24 -402
- package/package.json +1 -1
- package/templates/applications/dataplane/application.yaml +7 -1
- package/templates/applications/dataplane/env.template +50 -14
- package/templates/applications/dataplane/rbac.yaml +108 -1
- package/templates/applications/miso-controller/application.yaml +2 -2
- package/templates/applications/miso-controller/env.template +53 -122
- package/templates/applications/miso-controller/rbac.yaml +28 -13
- package/templates/channels/chatgpt/install.template.md.hbs +49 -0
- package/templates/channels/chatgpt/manifest.template.json.hbs +9 -0
- package/templates/channels/microsoft-copilot/install.template.md.hbs +49 -0
- package/templates/channels/microsoft-copilot/manifest.template.json.hbs +8 -0
- package/templates/channels/slack/install.template.md.hbs +49 -0
- package/templates/channels/slack/manifest.template.json.hbs +66 -0
- package/templates/channels/teams-bot/install.template.md.hbs +49 -0
- package/templates/channels/teams-bot/manifest.template.json.hbs +13 -0
- package/templates/channels/web-embed/install.template.md.hbs +49 -0
- package/templates/channels/web-embed/manifest.template.json.hbs +8 -0
- package/templates/external-system/README.md.hbs +74 -17
- package/templates/python/docker-compose.hbs +75 -18
- package/templates/typescript/docker-compose.hbs +70 -17
- package/lib/commands/test-governance-command-action.js +0 -55
- package/lib/commands/test-trust-command-action.js +0 -118
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
const {
|
|
2
2
|
formatSuccessLine,
|
|
3
|
-
formatSuccessParagraph,
|
|
4
|
-
sectionTitle,
|
|
5
|
-
headerKeyValue,
|
|
6
3
|
metadata,
|
|
7
4
|
formatProgress,
|
|
8
5
|
formatWarningLine
|
|
@@ -36,83 +33,18 @@ const { getExternalSystemConfig } = require('../api/external-systems.api');
|
|
|
36
33
|
const { getDeploymentAuth, requireBearerForDataplanePipeline } = require('../utils/token-manager');
|
|
37
34
|
const { getConfig } = require('../core/config');
|
|
38
35
|
const { getIntegrationPath } = require('../utils/paths');
|
|
39
|
-
const { retemplateConfigurationForDownload } = require('../utils/configuration-env-resolver');
|
|
36
|
+
const { retemplateConfigurationForDownload, retemplateAllVariableDefinitions } = require('../utils/configuration-env-resolver');
|
|
37
|
+
const { syncRuntimeConfigurationFromDataplane } = require('../utils/runtime-configuration-download');
|
|
40
38
|
const logger = require('../utils/logger');
|
|
41
39
|
const { resolveControllerUrl } = require('../utils/controller-url');
|
|
42
40
|
const generator = require('../generator');
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
function validateSystemType(application) {
|
|
51
|
-
if (!application || typeof application !== 'object') {
|
|
52
|
-
throw new Error('Application configuration is required');
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
const validTypes = ['openapi', 'mcp', 'custom'];
|
|
56
|
-
const systemType = application.type;
|
|
57
|
-
|
|
58
|
-
if (!systemType || !validTypes.includes(systemType)) {
|
|
59
|
-
throw new Error(`Invalid system type: ${systemType}. Must be one of: ${validTypes.join(', ')}`);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
return systemType;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Validates downloaded data structure before writing files
|
|
67
|
-
* @param {Object} application - External system configuration
|
|
68
|
-
* @param {Array} dataSources - Array of datasource configurations
|
|
69
|
-
* @throws {Error} If validation fails
|
|
70
|
-
*/
|
|
71
|
-
/**
|
|
72
|
-
* Validates application configuration
|
|
73
|
-
* @function validateApplicationConfig
|
|
74
|
-
* @param {Object} application - Application configuration
|
|
75
|
-
* @throws {Error} If validation fails
|
|
76
|
-
*/
|
|
77
|
-
function validateApplicationConfig(application) {
|
|
78
|
-
if (!application || typeof application !== 'object') {
|
|
79
|
-
throw new Error('Application configuration is required');
|
|
80
|
-
}
|
|
81
|
-
if (!application.key || typeof application.key !== 'string') {
|
|
82
|
-
throw new Error('Application key is required');
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Validates datasource configuration
|
|
88
|
-
* @function validateDatasourceConfig
|
|
89
|
-
* @param {Object} datasource - Datasource configuration
|
|
90
|
-
* @param {string} applicationKey - Application key
|
|
91
|
-
* @throws {Error} If validation fails
|
|
92
|
-
*/
|
|
93
|
-
function validateDatasourceConfig(datasource, applicationKey) {
|
|
94
|
-
if (!datasource.key || typeof datasource.key !== 'string') {
|
|
95
|
-
throw new Error('Datasource key is required for all datasources');
|
|
96
|
-
}
|
|
97
|
-
if (!datasource.systemKey || typeof datasource.systemKey !== 'string') {
|
|
98
|
-
throw new Error('Datasource systemKey is required for all datasources');
|
|
99
|
-
}
|
|
100
|
-
if (datasource.systemKey !== applicationKey) {
|
|
101
|
-
throw new Error(`Datasource systemKey (${datasource.systemKey}) does not match application key (${applicationKey})`);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
function validateDownloadedData(application, dataSources) {
|
|
106
|
-
validateApplicationConfig(application);
|
|
107
|
-
|
|
108
|
-
if (!Array.isArray(dataSources)) {
|
|
109
|
-
throw new Error('DataSources must be an array');
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
for (const datasource of dataSources) {
|
|
113
|
-
validateDatasourceConfig(datasource, application.key);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
41
|
+
const {
|
|
42
|
+
validateSystemType,
|
|
43
|
+
validateDownloadedData,
|
|
44
|
+
logDownloadCommandHeader,
|
|
45
|
+
displayDownloadSuccess,
|
|
46
|
+
runConvertToJsonIfRequested
|
|
47
|
+
} = require('./download-helpers');
|
|
116
48
|
|
|
117
49
|
/**
|
|
118
50
|
* Setup authentication and get dataplane URL
|
|
@@ -354,10 +286,9 @@ async function applyRetemplateToSystemFile(systemKey, systemFilePath) {
|
|
|
354
286
|
const systemContent = await fs.readFile(systemFilePath, 'utf8');
|
|
355
287
|
const systemObj = yaml.load(systemContent);
|
|
356
288
|
if (!Array.isArray(systemObj?.configuration)) return;
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
}
|
|
289
|
+
retemplateAllVariableDefinitions(systemObj.configuration);
|
|
290
|
+
await retemplateConfigurationForDownload(systemKey, systemObj.configuration);
|
|
291
|
+
await fs.writeFile(systemFilePath, yaml.dump(systemObj, { indent: 2, lineWidth: -1 }), 'utf8');
|
|
361
292
|
}
|
|
362
293
|
|
|
363
294
|
/**
|
|
@@ -397,70 +328,75 @@ async function processDownloadedSystem(systemKey, manifest, splitOptions = {}) {
|
|
|
397
328
|
}
|
|
398
329
|
|
|
399
330
|
/**
|
|
400
|
-
*
|
|
401
|
-
* @param {
|
|
402
|
-
* @param {string}
|
|
403
|
-
* @param {
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
`Downloaded ${systemKey} (${datasourceCount} datasource${datasourceCount === 1 ? '' : 's'})`
|
|
409
|
-
)
|
|
410
|
-
);
|
|
411
|
-
logger.log(headerKeyValue('Location:', finalPath));
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
/**
|
|
415
|
-
* After YAML split, convert integration files to JSON when --format json.
|
|
416
|
-
* @async
|
|
417
|
-
* @param {string} systemKey
|
|
331
|
+
* Post-split download steps: governance packs, optional JSON convert, runtime config sync.
|
|
332
|
+
* @param {Object} params
|
|
333
|
+
* @param {string} params.systemKey
|
|
334
|
+
* @param {Object} params.manifest
|
|
335
|
+
* @param {string} params.finalPath
|
|
336
|
+
* @param {string} params.dataplaneUrl
|
|
337
|
+
* @param {Object} params.authConfig
|
|
338
|
+
* @param {string} params.format
|
|
418
339
|
* @returns {Promise<void>}
|
|
419
340
|
*/
|
|
420
|
-
async function
|
|
421
|
-
|
|
341
|
+
async function finalizeDownloadArtifacts({
|
|
342
|
+
systemKey,
|
|
343
|
+
manifest,
|
|
344
|
+
finalPath,
|
|
345
|
+
dataplaneUrl,
|
|
346
|
+
authConfig,
|
|
347
|
+
format
|
|
348
|
+
}) {
|
|
349
|
+
const { downloadGovernanceScenarioPacksFromManifest } = require('../lifecycle/scenario-upload');
|
|
350
|
+
await downloadGovernanceScenarioPacksFromManifest(
|
|
351
|
+
systemKey,
|
|
352
|
+
manifest,
|
|
353
|
+
dataplaneUrl,
|
|
354
|
+
authConfig
|
|
355
|
+
);
|
|
356
|
+
if (format === 'json') {
|
|
357
|
+
await runConvertToJsonIfRequested(systemKey);
|
|
358
|
+
}
|
|
422
359
|
try {
|
|
423
|
-
await
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
360
|
+
const configSync = await syncRuntimeConfigurationFromDataplane({
|
|
361
|
+
dataplaneUrl,
|
|
362
|
+
authConfig,
|
|
363
|
+
systemKey,
|
|
364
|
+
integrationPath: finalPath,
|
|
365
|
+
dataSources: manifest.dataSources
|
|
366
|
+
});
|
|
367
|
+
if (configSync.merged > 0) {
|
|
368
|
+
const nameList = configSync.names.length ? ` (${configSync.names.join(', ')})` : '';
|
|
369
|
+
logger.log(
|
|
370
|
+
formatSuccessLine(
|
|
371
|
+
`Merged ${configSync.merged} runtime configuration variable(s) into env.template${nameList}.`
|
|
372
|
+
)
|
|
373
|
+
);
|
|
374
|
+
}
|
|
375
|
+
} catch (syncErr) {
|
|
376
|
+
logger.log(formatWarningLine(`Runtime configuration sync skipped: ${syncErr.message}`));
|
|
427
377
|
}
|
|
378
|
+
displayDownloadSuccess(systemKey, finalPath, manifest.dataSources.length);
|
|
428
379
|
}
|
|
429
380
|
|
|
430
381
|
/**
|
|
431
|
-
*
|
|
432
|
-
*/
|
|
433
|
-
function logDownloadCommandHeader(systemKey) {
|
|
434
|
-
logger.log('');
|
|
435
|
-
logger.log(sectionTitle('Download'));
|
|
436
|
-
logger.log(headerKeyValue('System:', systemKey));
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
/**
|
|
440
|
-
* Downloads external system from dataplane to local development structure
|
|
382
|
+
* Downloads external system from dataplane to local development structure.
|
|
441
383
|
* @async
|
|
442
|
-
* @
|
|
443
|
-
* @param {
|
|
444
|
-
* @
|
|
445
|
-
* @param {string} [options.format] - Output format: 'yaml' (default) or 'json' (runs convert after split)
|
|
446
|
-
* @param {string} [options.environment] - Environment (dev, tst, pro)
|
|
447
|
-
* @param {string} [options.controller] - Controller URL
|
|
448
|
-
* @param {boolean} [options.dryRun] - Show what would be downloaded without actually downloading
|
|
449
|
-
* @param {boolean} [options.force] - Overwrite existing README.md without prompting
|
|
450
|
-
* @returns {Promise<void>} Resolves when download completes
|
|
451
|
-
* @throws {Error} If download fails
|
|
384
|
+
* @param {string} systemKey
|
|
385
|
+
* @param {Object} [options]
|
|
386
|
+
* @returns {Promise<void>}
|
|
452
387
|
*/
|
|
453
388
|
async function downloadExternalSystem(systemKey, options = {}) {
|
|
454
389
|
validateSystemKeyFormat(systemKey);
|
|
455
|
-
|
|
456
390
|
const format = (options.format || 'yaml').toLowerCase();
|
|
457
391
|
|
|
458
392
|
try {
|
|
459
393
|
logDownloadCommandHeader(systemKey);
|
|
460
|
-
|
|
461
394
|
const config = await getConfig();
|
|
462
|
-
const { authConfig, dataplaneUrl } = await setupAuthenticationAndDataplane(
|
|
463
|
-
|
|
395
|
+
const { authConfig, dataplaneUrl } = await setupAuthenticationAndDataplane(
|
|
396
|
+
systemKey,
|
|
397
|
+
options,
|
|
398
|
+
config
|
|
399
|
+
);
|
|
464
400
|
if (options.dryRun) {
|
|
465
401
|
handleDryRun(systemKey, dataplaneUrl);
|
|
466
402
|
return;
|
|
@@ -468,16 +404,20 @@ async function downloadExternalSystem(systemKey, options = {}) {
|
|
|
468
404
|
|
|
469
405
|
const manifest = await downloadFullManifest(dataplaneUrl, systemKey, authConfig);
|
|
470
406
|
validateAndLogDownloadedData(manifest.application, manifest.dataSources);
|
|
471
|
-
|
|
472
407
|
const finalPath = getIntegrationPath(systemKey);
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
408
|
+
await processDownloadedSystem(
|
|
409
|
+
systemKey,
|
|
410
|
+
manifest,
|
|
411
|
+
await resolveDownloadSplitOptions(finalPath, options)
|
|
412
|
+
);
|
|
413
|
+
await finalizeDownloadArtifacts({
|
|
414
|
+
systemKey,
|
|
415
|
+
manifest,
|
|
416
|
+
finalPath,
|
|
417
|
+
dataplaneUrl,
|
|
418
|
+
authConfig,
|
|
419
|
+
format
|
|
420
|
+
});
|
|
481
421
|
} catch (error) {
|
|
482
422
|
throw new Error(`Failed to download external system: ${error.message}`);
|
|
483
423
|
}
|
|
@@ -16,66 +16,12 @@ const handlebars = require('handlebars');
|
|
|
16
16
|
const logger = require('../utils/logger');
|
|
17
17
|
const { resolveApplicationConfigPath } = require('../utils/app-config-resolver');
|
|
18
18
|
const { loadConfigFile, writeConfigFile } = require('../utils/config-format');
|
|
19
|
-
const {
|
|
19
|
+
const { buildAuthenticationFromMethod } = require('../utils/authentication-shape');
|
|
20
20
|
|
|
21
21
|
// Register Handlebars helper for equality check
|
|
22
22
|
handlebars.registerHelper('eq', (a, b) => a === b);
|
|
23
23
|
handlebars.registerHelper('json', (obj) => JSON.stringify(obj));
|
|
24
24
|
|
|
25
|
-
/**
|
|
26
|
-
* Build authentication object per schema authenticationVariablesByMethod.
|
|
27
|
-
* Security values use canonical kv://<systemKey>/<segment> paths (segment from getKvPathSegmentForSecurityKey).
|
|
28
|
-
* @param {string} systemKey - External system key
|
|
29
|
-
* @param {string} authType - Auth method (oauth2, aad, apikey, basic, queryParam, oidc, hmac, none)
|
|
30
|
-
* @returns {{ method: string, variables: Object, security: Object }} Authentication object
|
|
31
|
-
*/
|
|
32
|
-
function buildAuthenticationFromMethod(systemKey, authType) {
|
|
33
|
-
const kvPath = (securityKey) => {
|
|
34
|
-
const segment = getKvPathSegmentForSecurityKey(securityKey);
|
|
35
|
-
return segment ? `kv://${systemKey}/${segment}` : null;
|
|
36
|
-
};
|
|
37
|
-
const method = authType || 'apikey';
|
|
38
|
-
const base = 'https://api.example.com';
|
|
39
|
-
|
|
40
|
-
const authMap = {
|
|
41
|
-
oauth2: {
|
|
42
|
-
variables: { baseUrl: base, tokenUrl: `${base}/oauth/token`, authorizationUrl: `${base}/oauth/authorize` },
|
|
43
|
-
security: { clientId: kvPath('clientId'), clientSecret: kvPath('clientSecret') }
|
|
44
|
-
},
|
|
45
|
-
aad: {
|
|
46
|
-
variables: { baseUrl: base, tokenUrl: 'https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token', tenantId: '{tenant-id}' },
|
|
47
|
-
security: { clientId: kvPath('clientId'), clientSecret: kvPath('clientSecret') }
|
|
48
|
-
},
|
|
49
|
-
apikey: {
|
|
50
|
-
variables: { baseUrl: base, headerName: 'X-API-Key' },
|
|
51
|
-
security: { apiKey: kvPath('apiKey') }
|
|
52
|
-
},
|
|
53
|
-
basic: {
|
|
54
|
-
variables: { baseUrl: base },
|
|
55
|
-
security: { username: kvPath('username'), password: kvPath('password') }
|
|
56
|
-
},
|
|
57
|
-
queryParam: {
|
|
58
|
-
variables: { baseUrl: base, paramName: 'api_key' },
|
|
59
|
-
security: { paramValue: kvPath('paramValue') }
|
|
60
|
-
},
|
|
61
|
-
oidc: {
|
|
62
|
-
variables: { openIdConfigUrl: 'https://example.com/.well-known/openid-configuration', clientId: 'app-id' },
|
|
63
|
-
security: {}
|
|
64
|
-
},
|
|
65
|
-
hmac: {
|
|
66
|
-
variables: { baseUrl: base, algorithm: 'sha256', signatureHeader: 'X-Signature' },
|
|
67
|
-
security: { signingSecret: kvPath('signingSecret') }
|
|
68
|
-
},
|
|
69
|
-
none: {
|
|
70
|
-
variables: {},
|
|
71
|
-
security: {}
|
|
72
|
-
}
|
|
73
|
-
};
|
|
74
|
-
|
|
75
|
-
const auth = authMap[method] || authMap.apikey;
|
|
76
|
-
return { method, variables: auth.variables, security: auth.security };
|
|
77
|
-
}
|
|
78
|
-
|
|
79
25
|
/** Target extension for format */
|
|
80
26
|
const FORMAT_EXT = { yaml: '.yaml', json: '.json' };
|
|
81
27
|
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reuse dataplane auth resolved during sync/upload across verify and test commands.
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview Integration auth context helpers
|
|
5
|
+
* @author AI Fabrix Team
|
|
6
|
+
* @version 1.0.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const { setupIntegrationTestAuth } = require('./test-auth');
|
|
12
|
+
const { getConfig } = require('../core/config');
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @param {Object} options
|
|
16
|
+
* @returns {Object}
|
|
17
|
+
*/
|
|
18
|
+
function integrationAuthOptions(options) {
|
|
19
|
+
const base = {
|
|
20
|
+
environment: options.env,
|
|
21
|
+
silentResolve: options.silentResolve === true
|
|
22
|
+
};
|
|
23
|
+
if (options.authConfig && options.dataplaneUrl) {
|
|
24
|
+
return { ...base, authConfig: options.authConfig, dataplaneUrl: options.dataplaneUrl };
|
|
25
|
+
}
|
|
26
|
+
return base;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* @param {string} systemKey
|
|
31
|
+
* @param {Object} options
|
|
32
|
+
* @returns {Promise<{ authConfig: Object, dataplaneUrl: string }>}
|
|
33
|
+
*/
|
|
34
|
+
async function resolveIntegrationAuth(systemKey, options) {
|
|
35
|
+
if (options.authConfig && options.dataplaneUrl) {
|
|
36
|
+
return { authConfig: options.authConfig, dataplaneUrl: options.dataplaneUrl };
|
|
37
|
+
}
|
|
38
|
+
const configObj = await getConfig();
|
|
39
|
+
return setupIntegrationTestAuth(systemKey, integrationAuthOptions(options), configObj);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
module.exports = {
|
|
43
|
+
integrationAuthOptions,
|
|
44
|
+
resolveIntegrationAuth
|
|
45
|
+
};
|
|
@@ -26,9 +26,14 @@ const { resolveControllerUrl } = require('../utils/controller-url');
|
|
|
26
26
|
* @throws {Error} If authentication fails
|
|
27
27
|
*/
|
|
28
28
|
async function setupIntegrationTestAuth(appName, options, _config) {
|
|
29
|
+
const opts = options && typeof options === 'object' ? options : {};
|
|
30
|
+
if (opts.authConfig && opts.dataplaneUrl) {
|
|
31
|
+
return { authConfig: opts.authConfig, dataplaneUrl: opts.dataplaneUrl };
|
|
32
|
+
}
|
|
33
|
+
|
|
29
34
|
const { resolveEnvironment } = require('../core/config');
|
|
30
|
-
const environment = (
|
|
31
|
-
?
|
|
35
|
+
const environment = (opts.environment && typeof opts.environment === 'string' && opts.environment.trim())
|
|
36
|
+
? opts.environment.trim()
|
|
32
37
|
: await resolveEnvironment();
|
|
33
38
|
const controllerUrl = await resolveControllerUrl();
|
|
34
39
|
const authConfig = await getDeploymentAuth(controllerUrl, environment, appName);
|
|
@@ -38,10 +43,12 @@ async function setupIntegrationTestAuth(appName, options, _config) {
|
|
|
38
43
|
}
|
|
39
44
|
|
|
40
45
|
let dataplaneUrl;
|
|
41
|
-
if (
|
|
42
|
-
dataplaneUrl =
|
|
46
|
+
if (opts.dataplane && typeof opts.dataplane === 'string' && opts.dataplane.trim()) {
|
|
47
|
+
dataplaneUrl = opts.dataplane.trim();
|
|
43
48
|
} else {
|
|
44
|
-
dataplaneUrl = await resolveDataplaneUrl(controllerUrl, environment, authConfig
|
|
49
|
+
dataplaneUrl = await resolveDataplaneUrl(controllerUrl, environment, authConfig, {
|
|
50
|
+
silent: opts.silentResolve === true
|
|
51
|
+
});
|
|
45
52
|
}
|
|
46
53
|
|
|
47
54
|
return { authConfig, dataplaneUrl };
|
|
@@ -7,7 +7,6 @@
|
|
|
7
7
|
*/
|
|
8
8
|
/* eslint-disable max-lines,max-lines-per-function,max-statements,complexity,max-depth -- Integration test flow with system-level and per-datasource paths */
|
|
9
9
|
|
|
10
|
-
const fs = require('fs').promises;
|
|
11
10
|
const fsSync = require('fs');
|
|
12
11
|
const path = require('path');
|
|
13
12
|
const chalk = require('chalk');
|
|
@@ -38,6 +37,7 @@ const {
|
|
|
38
37
|
} = require('./test-execution');
|
|
39
38
|
const { runSystemLevelTest } = require('./test-system-level');
|
|
40
39
|
const { shouldUseSystemLevelIntegrationCall } = require('./integration-test-dispatch');
|
|
40
|
+
const { cliOptsSkipSync } = require('../utils/cli-sync-options');
|
|
41
41
|
|
|
42
42
|
/**
|
|
43
43
|
* Loads and parses application config file
|
|
@@ -68,15 +68,15 @@ async function loadVariablesYamlFile(variablesPath) {
|
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
/**
|
|
71
|
-
* Loads a single JSON
|
|
71
|
+
* Loads a single integration config file (JSON, YAML, or YML).
|
|
72
72
|
* @async
|
|
73
|
-
* @function
|
|
74
|
-
* @param {string} filePath - Path to
|
|
73
|
+
* @function loadIntegrationConfigFile
|
|
74
|
+
* @param {string} filePath - Path to config file
|
|
75
75
|
* @param {string} fileName - File name for error messages
|
|
76
|
-
* @returns {Promise<Object>} Parsed
|
|
77
|
-
* @throws {Error} If file not found or invalid
|
|
76
|
+
* @returns {Promise<Object>} Parsed config object
|
|
77
|
+
* @throws {Error} If file not found or invalid format
|
|
78
78
|
*/
|
|
79
|
-
async function
|
|
79
|
+
async function loadIntegrationConfigFile(filePath, fileName) {
|
|
80
80
|
if (!fsSync.existsSync(filePath)) {
|
|
81
81
|
// Use "System file not found" for system files to match test expectations
|
|
82
82
|
if (fileName.includes('system') || fileName.includes('deploy')) {
|
|
@@ -85,12 +85,8 @@ async function loadJsonFile(filePath, fileName) {
|
|
|
85
85
|
throw new Error(`${fileName} not found: ${filePath}`);
|
|
86
86
|
}
|
|
87
87
|
|
|
88
|
-
const
|
|
89
|
-
|
|
90
|
-
return JSON.parse(content);
|
|
91
|
-
} catch (error) {
|
|
92
|
-
throw new Error(`Invalid JSON syntax in ${fileName}: ${error.message}`);
|
|
93
|
-
}
|
|
88
|
+
const { loadConfigFile } = require('../utils/config-format');
|
|
89
|
+
return loadConfigFile(filePath);
|
|
94
90
|
}
|
|
95
91
|
|
|
96
92
|
/**
|
|
@@ -120,7 +116,7 @@ async function loadSystemFiles(systemFiles, schemaBasePath, appPath) {
|
|
|
120
116
|
const systemJsonFiles = [];
|
|
121
117
|
for (const systemFile of systemFiles) {
|
|
122
118
|
const systemPath = resolveFilePath(schemaBasePath, appPath, systemFile);
|
|
123
|
-
const systemJson = await
|
|
119
|
+
const systemJson = await loadIntegrationConfigFile(systemPath, systemFile);
|
|
124
120
|
systemJsonFiles.push({ path: systemPath, data: systemJson });
|
|
125
121
|
}
|
|
126
122
|
return systemJsonFiles;
|
|
@@ -139,7 +135,7 @@ async function loadDatasourceFiles(datasourceFiles, schemaBasePath, appPath) {
|
|
|
139
135
|
const datasourceJsonFiles = [];
|
|
140
136
|
for (const datasourceFile of datasourceFiles) {
|
|
141
137
|
const datasourcePath = resolveFilePath(schemaBasePath, appPath, datasourceFile);
|
|
142
|
-
const datasourceJson = await
|
|
138
|
+
const datasourceJson = await loadIntegrationConfigFile(datasourcePath, datasourceFile);
|
|
143
139
|
datasourceJsonFiles.push({ path: datasourcePath, data: datasourceJson });
|
|
144
140
|
}
|
|
145
141
|
return datasourceJsonFiles;
|
|
@@ -412,7 +408,8 @@ function determineDatasourcesToTest(datasourceFiles, datasourceFilter) {
|
|
|
412
408
|
* @param {string} [options.controller] - Controller URL
|
|
413
409
|
* @param {boolean} [options.verbose] - Show detailed test output
|
|
414
410
|
* @param {number} [options.timeout] - Request timeout in milliseconds
|
|
415
|
-
* @param {boolean} [options.
|
|
411
|
+
* @param {boolean} [options.noSync] - When true, skip publish (exercise dataplane config already deployed)
|
|
412
|
+
* @param {boolean} [options.sync] - Legacy explicit sync; ignored when `noSync` / `--no-sync` is set
|
|
416
413
|
* @returns {Promise<Object>} Integration test results
|
|
417
414
|
* @throws {Error} If testing fails
|
|
418
415
|
*/
|
|
@@ -457,13 +454,11 @@ async function testExternalSystemIntegration(appName, options = {}) {
|
|
|
457
454
|
|
|
458
455
|
const { systemKey, authConfig, dataplaneUrl, datasourcesToTest, customPayload } = await prepareIntegrationTestEnvironment(appName, options);
|
|
459
456
|
|
|
460
|
-
if (options
|
|
457
|
+
if (!cliOptsSkipSync(options)) {
|
|
461
458
|
logger.log(chalk.cyan('Syncing local config to dataplane…'));
|
|
462
459
|
const { uploadExternalSystem } = require('../commands/upload');
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
minimal: true
|
|
466
|
-
});
|
|
460
|
+
const { buildMinimalUploadSyncOptions } = require('../utils/upload-sync-options');
|
|
461
|
+
await uploadExternalSystem(systemKey, buildMinimalUploadSyncOptions(options));
|
|
467
462
|
logger.log(formatSuccessLine('Sync complete'));
|
|
468
463
|
}
|
|
469
464
|
|
|
@@ -267,6 +267,15 @@ function validateBuildFields(build) {
|
|
|
267
267
|
if (build.dockerfile && build.dockerfile.trim()) {
|
|
268
268
|
buildConfig.dockerfile = build.dockerfile;
|
|
269
269
|
}
|
|
270
|
+
if (build.worker === true) {
|
|
271
|
+
buildConfig.worker = true;
|
|
272
|
+
}
|
|
273
|
+
if (typeof build.imageRunWorker === 'string' && build.imageRunWorker.trim()) {
|
|
274
|
+
buildConfig.imageRunWorker = build.imageRunWorker.trim();
|
|
275
|
+
}
|
|
276
|
+
if (typeof build.imageRunBeat === 'string' && build.imageRunBeat.trim()) {
|
|
277
|
+
buildConfig.imageRunBeat = build.imageRunBeat.trim();
|
|
278
|
+
}
|
|
270
279
|
|
|
271
280
|
return Object.keys(buildConfig).length > 0 ? buildConfig : null;
|
|
272
281
|
}
|
|
@@ -390,6 +399,7 @@ module.exports = {
|
|
|
390
399
|
buildOptionalFields,
|
|
391
400
|
buildManifestStructure,
|
|
392
401
|
filterConfigurationByRegistryMode,
|
|
393
|
-
sanitizeAuthType
|
|
402
|
+
sanitizeAuthType,
|
|
403
|
+
validateBuildFields
|
|
394
404
|
};
|
|
395
405
|
|
|
@@ -22,6 +22,22 @@ const { loadVariables, loadRbac } = require('./helpers');
|
|
|
22
22
|
* @param {Object} systemJson - System JSON object
|
|
23
23
|
* @param {Object|null} rbac - RBAC configuration
|
|
24
24
|
*/
|
|
25
|
+
/**
|
|
26
|
+
* Maps legacy integration auth method names to schema 1.3.0 values before upload/deploy.
|
|
27
|
+
* @param {Object} systemJson - System JSON object (mutated in place)
|
|
28
|
+
*/
|
|
29
|
+
function normalizeLegacyAuthMethod(systemJson) {
|
|
30
|
+
const { getAuthCredentialTemplate } = require('../utils/authentication-shape');
|
|
31
|
+
const auth = systemJson && systemJson.authentication;
|
|
32
|
+
if (!auth || typeof auth !== 'object') return;
|
|
33
|
+
const credential = getAuthCredentialTemplate(auth);
|
|
34
|
+
if (!credential) return;
|
|
35
|
+
const method = String(credential.method || '').trim().toLowerCase();
|
|
36
|
+
if (method === 'bearerkey') {
|
|
37
|
+
credential.method = 'bearerToken';
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
25
41
|
function mergeRbacIntoSystemJson(systemJson, rbac) {
|
|
26
42
|
if (!rbac) {
|
|
27
43
|
return;
|
|
@@ -78,6 +94,7 @@ function extractAppMetadata(variables, appName) {
|
|
|
78
94
|
*/
|
|
79
95
|
async function loadSystemWithRbac(appPath, schemaBasePath, systemFile) {
|
|
80
96
|
const systemJson = await loadSystemFile(appPath, schemaBasePath, systemFile);
|
|
97
|
+
normalizeLegacyAuthMethod(systemJson);
|
|
81
98
|
const rbacPath = resolveRbacPath(appPath);
|
|
82
99
|
const rbac = rbacPath ? loadRbac(rbacPath) : null;
|
|
83
100
|
mergeRbacIntoSystemJson(systemJson, rbac);
|
|
@@ -187,6 +204,7 @@ function toDeployJsonShape(manifest) {
|
|
|
187
204
|
}
|
|
188
205
|
|
|
189
206
|
module.exports = {
|
|
207
|
+
normalizeLegacyAuthMethod,
|
|
190
208
|
generateControllerManifest,
|
|
191
209
|
toDeployJsonShape
|
|
192
210
|
};
|
package/lib/generator/split.js
CHANGED
package/lib/generator/wizard.js
CHANGED
|
@@ -32,34 +32,7 @@ function toKeySegment(str) {
|
|
|
32
32
|
return sanitized || 'default';
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
* Align authentication.security kv:// namespaces and credentialKey with the final system key.
|
|
37
|
-
* Dataplane normalizes this before respond; when appName overrides a spec-derived key (e.g.
|
|
38
|
-
* OpenAPI title "Companies"), the builder still must rewrite nested auth so it matches env.template.
|
|
39
|
-
*
|
|
40
|
-
* @param {Object|null|undefined} authentication - authentication block from dataplane
|
|
41
|
-
* @param {string} systemKey - Final external system key (integration app name)
|
|
42
|
-
* @param {string} [authDisplayName] - Credential display name (typically title-cased app name)
|
|
43
|
-
*/
|
|
44
|
-
function normalizeAuthenticationToSystemKey(authentication, systemKey, authDisplayName) {
|
|
45
|
-
if (!authentication || typeof authentication !== 'object') return;
|
|
46
|
-
authentication.credentialKey = `${systemKey}-cred`;
|
|
47
|
-
const security = authentication.security;
|
|
48
|
-
if (security && typeof security === 'object') {
|
|
49
|
-
for (const k of Object.keys(security)) {
|
|
50
|
-
const v = security[k];
|
|
51
|
-
if (typeof v === 'string' && v.startsWith('kv://')) {
|
|
52
|
-
const rest = v.slice(5);
|
|
53
|
-
const idx = rest.indexOf('/');
|
|
54
|
-
const suffix = idx >= 0 ? rest.slice(idx + 1) : '';
|
|
55
|
-
security[k] = suffix ? `kv://${systemKey}/${suffix}` : `kv://${systemKey}`;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
if (authDisplayName) {
|
|
60
|
-
authentication.displayName = authDisplayName;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
35
|
+
const { normalizeAuthenticationToSystemKey } = require('../utils/authentication-shape');
|
|
63
36
|
|
|
64
37
|
/**
|
|
65
38
|
* Generate files from dataplane-generated wizard configurations
|