@aifabrix/builder 2.44.6 → 2.45.5
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 +7 -3
- package/.cursor/rules/docs-rules.mdc +3 -1
- 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/integration/hubspot-test/wizard-hubspot-e2e.yaml +1 -1
- package/jest.projects.js +100 -1
- package/lib/api/agent-metadata-validation.api.js +93 -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-scenarios.api.js +39 -0
- package/lib/api/groups.api.js +79 -0
- package/lib/api/index.js +45 -2
- package/lib/api/pipeline.api.js +4 -4
- package/lib/api/protection.api.js +157 -0
- package/lib/api/records-bulk.api.js +30 -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 +3 -3
- package/lib/api/wizard-platform.api.js +3 -3
- package/lib/api/wizard.api.js +21 -21
- package/lib/app/deploy.js +34 -19
- package/lib/app/helpers.js +3 -3
- package/lib/app/index.js +3 -3
- package/lib/app/register.js +7 -6
- package/lib/app/restart-display.js +52 -21
- package/lib/app/rotate-secret.js +7 -6
- package/lib/app/run-helpers.js +15 -8
- package/lib/app/run.js +57 -9
- package/lib/app/show-display.js +7 -0
- package/lib/app/show.js +87 -5
- package/lib/build/index.js +9 -5
- package/lib/cli/index.js +4 -2
- package/lib/cli/infra-guided.js +62 -28
- package/lib/cli/installation-log-command.js +73 -0
- package/lib/cli/setup-app.help.js +50 -2
- package/lib/cli/setup-app.js +44 -25
- package/lib/cli/setup-app.test-commands.js +80 -21
- package/lib/cli/setup-auth.js +124 -52
- package/lib/cli/setup-external-system.js +37 -3
- package/lib/cli/setup-infra-up-dataplane-action.js +111 -0
- package/lib/cli/setup-infra-up-platform-action.js +131 -0
- package/lib/cli/setup-infra.js +60 -119
- package/lib/cli/setup-platform.js +1 -1
- package/lib/cli/setup-utility-help-after.js +45 -0
- package/lib/cli/setup-utility-resolve.js +132 -0
- package/lib/cli/setup-utility.js +148 -116
- package/lib/commands/app-logs.js +81 -33
- package/lib/commands/auth-config.js +116 -18
- package/lib/commands/auth-status-dataplane-version.js +231 -0
- package/lib/commands/auth-status-display.js +94 -0
- package/lib/commands/auth-status.js +70 -6
- 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 +114 -0
- package/lib/commands/datasource-unified-test-cli.js +25 -17
- package/lib/commands/datasource-unified-test-cli.options.js +18 -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/dimension-value.js +43 -13
- package/lib/commands/dimension.js +38 -7
- 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/login.js +46 -16
- package/lib/commands/protection-cli-leaves.js +286 -0
- package/lib/commands/protection.js +50 -0
- package/lib/commands/repair.js +13 -3
- package/lib/commands/setup-modes.js +19 -6
- package/lib/commands/setup-prompts.js +41 -8
- package/lib/commands/setup.js +114 -9
- package/lib/commands/teardown.js +54 -5
- package/lib/commands/test-e2e-external.js +40 -9
- package/lib/commands/test-governance-cli-options.js +47 -0
- package/lib/commands/test-governance-command-action.js +55 -0
- package/lib/commands/test-governance-external.js +88 -0
- package/lib/commands/test-trust-cli-options.js +32 -0
- package/lib/commands/test-trust-command-action.js +118 -0
- package/lib/commands/test-trust-external.js +127 -0
- package/lib/commands/up-common.js +48 -14
- package/lib/commands/up-dataplane.js +21 -18
- package/lib/commands/up-miso.js +12 -8
- package/lib/commands/upload.js +38 -15
- package/lib/commands/wizard-core.js +3 -0
- package/lib/core/audit-logger.js +1 -34
- package/lib/core/config-admin-email.js +56 -0
- package/lib/core/config-device-dataplane.js +185 -0
- package/lib/core/config-normalize.js +60 -0
- package/lib/core/config-registered-controller-urls.js +54 -0
- package/lib/core/config.js +33 -50
- package/lib/core/secrets-ensure-infra.js +1 -1
- package/lib/core/secrets-env-content.js +86 -90
- package/lib/core/secrets-env-declarative-expand.js +170 -0
- package/lib/core/secrets-env-write.js +2 -0
- package/lib/core/secrets-load.js +106 -102
- 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 +93 -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 +103 -0
- package/lib/datasource/audit-evidence-extract.js +177 -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 +177 -0
- package/lib/datasource/audit-evidence-verify.js +108 -0
- package/lib/datasource/bulk-loader-run-batches.js +88 -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 +92 -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 +26 -2
- package/lib/datasource/unified-validation-run-resolve.js +45 -12
- package/lib/datasource/unified-validation-run.js +43 -17
- package/lib/datasource/validate.js +37 -20
- package/lib/external-system/deploy.js +5 -1
- package/lib/external-system/test-system-level.js +25 -4
- package/lib/external-system/test.js +3 -1
- package/lib/governance/governance-pack-loader.js +70 -0
- package/lib/governance/governance-run-display.js +119 -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/internal/fs-real-sync.js +29 -1
- package/lib/internal/node-fs.js +2 -0
- package/lib/protection/auth-context.js +45 -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 +4 -0
- package/lib/schema/external-datasource.schema.json +47 -13
- package/lib/schema/flag-map-validation-run.json +2 -2
- package/lib/schema/infra.parameter.yaml +10 -0
- package/lib/schema/protection.schema.json +374 -0
- package/lib/schema/type/credential-field-registry.json +636 -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/app-config-resolver.js +24 -1
- package/lib/utils/applications-config-defaults.js +206 -0
- package/lib/utils/auth-config-validator.js +2 -12
- package/lib/utils/bash-secret-env.js +1 -1
- package/lib/utils/cli-exit-codes.js +30 -0
- package/lib/utils/cli-sync-options.js +33 -0
- package/lib/utils/compose-generate-docker-compose.js +111 -6
- package/lib/utils/compose-generator.js +17 -8
- package/lib/utils/controller-url.js +50 -7
- package/lib/utils/credential-push-ui.js +90 -0
- package/lib/utils/dataplane-cli-version-gate.js +202 -0
- package/lib/utils/dataplane-cli-version-help.js +74 -0
- 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/env-copy.js +99 -14
- package/lib/utils/env-template.js +5 -1
- package/lib/utils/health-check-url.js +18 -15
- package/lib/utils/health-check.js +7 -5
- package/lib/utils/help-builder.js +30 -24
- package/lib/utils/infra-optional-service-flags.js +69 -0
- package/lib/utils/installation-log-core.js +282 -0
- package/lib/utils/installation-log-record.js +237 -0
- package/lib/utils/installation-log.js +123 -0
- package/lib/utils/log-redaction.js +105 -0
- package/lib/utils/manifest-location.js +164 -0
- package/lib/utils/manifest-source-emit.js +184 -0
- package/lib/utils/paths.js +238 -89
- package/lib/utils/remote-secrets-loader.js +7 -1
- package/lib/utils/run-cli-flags.js +29 -0
- package/lib/utils/secrets-canonical.js +10 -3
- package/lib/utils/secrets-path.js +3 -4
- package/lib/utils/secrets-utils.js +20 -10
- package/lib/utils/semver-compare.js +127 -0
- package/lib/utils/system-builder-root.js +10 -2
- package/lib/utils/upload-pipeline-ui.js +91 -0
- package/lib/utils/url-declarative-public-base.js +80 -12
- package/lib/utils/url-declarative-resolve-build-urls.js +238 -0
- package/lib/utils/url-declarative-resolve-build.js +24 -393
- package/lib/utils/url-declarative-resolve-expand-token.js +189 -0
- package/lib/utils/url-declarative-resolve-load-doc.js +12 -3
- package/lib/utils/url-declarative-resolve-surface-state.js +102 -0
- package/lib/utils/url-declarative-resolve.js +47 -7
- package/lib/utils/url-declarative-runtime-base-path.js +21 -1
- package/lib/utils/urls-local-registry-scan.js +103 -0
- package/lib/utils/urls-local-registry.js +161 -90
- package/lib/utils/validation-poll-ui.js +14 -7
- package/lib/validation/wizard-config-validator.js +58 -19
- package/package.json +3 -1
- package/templates/applications/dataplane/application.yaml +4 -0
- package/templates/applications/dataplane/env.template +13 -1
- package/templates/applications/dataplane/rbac.yaml +4 -0
- package/templates/applications/miso-controller/application.yaml +2 -0
- package/templates/applications/miso-controller/env.template +27 -29
- package/templates/external-system/README.md.hbs +56 -8
- package/.npmrc.token +0 -1
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Protection manifest directory under repo `integration/.protection/`.
|
|
3
|
+
* @author AI Fabrix Team
|
|
4
|
+
* @version 2.0.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
'use strict';
|
|
8
|
+
|
|
9
|
+
const fs = require('fs');
|
|
10
|
+
const path = require('path');
|
|
11
|
+
const {
|
|
12
|
+
getAppsMaterializationParent,
|
|
13
|
+
getCwdIntegrationRoot
|
|
14
|
+
} = require('../utils/paths');
|
|
15
|
+
const { nodeFs } = require('../internal/node-fs');
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Walk upward from cwd for the nearest directory containing `integration/`.
|
|
19
|
+
*
|
|
20
|
+
* @returns {string|null} Absolute path to `integration/` or null
|
|
21
|
+
*/
|
|
22
|
+
function findNearestIntegrationRootFromCwd() {
|
|
23
|
+
const disk = nodeFs();
|
|
24
|
+
let walk = path.resolve(process.cwd());
|
|
25
|
+
for (let i = 0; i < 64; i += 1) {
|
|
26
|
+
const integrationDir = path.join(walk, 'integration');
|
|
27
|
+
try {
|
|
28
|
+
if (disk.existsSync(integrationDir)) {
|
|
29
|
+
const st = disk.statSync(integrationDir);
|
|
30
|
+
if (st && typeof st.isDirectory === 'function' && st.isDirectory()) {
|
|
31
|
+
return integrationDir;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
} catch {
|
|
35
|
+
// ignore
|
|
36
|
+
}
|
|
37
|
+
const parent = path.dirname(walk);
|
|
38
|
+
if (parent === walk) {
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
walk = parent;
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Canonical repo-local protection root: `integration/.protection/`.
|
|
48
|
+
*
|
|
49
|
+
* @returns {string}
|
|
50
|
+
*/
|
|
51
|
+
function getRepoProtectionRoot() {
|
|
52
|
+
const cwdInt = getCwdIntegrationRoot();
|
|
53
|
+
if (cwdInt) {
|
|
54
|
+
return path.join(cwdInt, '.protection');
|
|
55
|
+
}
|
|
56
|
+
const materializationParent = path.resolve(getAppsMaterializationParent());
|
|
57
|
+
const nearest = findNearestIntegrationRootFromCwd();
|
|
58
|
+
if (nearest) {
|
|
59
|
+
const resolvedNearest = path.resolve(nearest);
|
|
60
|
+
if (
|
|
61
|
+
resolvedNearest === materializationParent ||
|
|
62
|
+
resolvedNearest.startsWith(`${materializationParent}${path.sep}`)
|
|
63
|
+
) {
|
|
64
|
+
return path.join(resolvedNearest, '.protection');
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return path.join(materializationParent, 'integration', '.protection');
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* @returns {string}
|
|
72
|
+
*/
|
|
73
|
+
function getLegacyProtectionRoot() {
|
|
74
|
+
return path.join(getAppsMaterializationParent(), '.protection');
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* @param {string} root
|
|
79
|
+
* @returns {boolean}
|
|
80
|
+
*/
|
|
81
|
+
function protectionRootHasManifestFiles(root) {
|
|
82
|
+
if (!root || !fs.existsSync(root)) {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
try {
|
|
86
|
+
return fs.readdirSync(root).some((name) => /\.(yaml|yml|json)$/i.test(name));
|
|
87
|
+
} catch {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* @returns {string} Absolute path to protection manifests directory
|
|
94
|
+
*/
|
|
95
|
+
function getProtectionRoot() {
|
|
96
|
+
const explicit = process.env.AIFABRIX_PROTECTION_ROOT;
|
|
97
|
+
if (explicit && typeof explicit === 'string' && explicit.trim()) {
|
|
98
|
+
return path.resolve(explicit.trim());
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const legacyFlag =
|
|
102
|
+
process.env.AIFABRIX_PROTECTION_LEGACY === '1' ||
|
|
103
|
+
String(process.env.AIFABRIX_PROTECTION_LEGACY || '').toLowerCase() === 'true';
|
|
104
|
+
|
|
105
|
+
const repoRoot = getRepoProtectionRoot();
|
|
106
|
+
const legacyRoot = getLegacyProtectionRoot();
|
|
107
|
+
|
|
108
|
+
if (legacyFlag) {
|
|
109
|
+
return legacyRoot;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const repoHas = protectionRootHasManifestFiles(repoRoot);
|
|
113
|
+
const legacyHas = protectionRootHasManifestFiles(legacyRoot);
|
|
114
|
+
|
|
115
|
+
if (!repoHas && legacyHas && legacyRoot !== repoRoot) {
|
|
116
|
+
return legacyRoot;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return repoRoot;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Human-readable folder label for batch protection TTY output.
|
|
124
|
+
*
|
|
125
|
+
* @returns {{ root: string, label: string, usingLegacy: boolean, migrationHint: string|null }}
|
|
126
|
+
*/
|
|
127
|
+
function describeProtectionRoot() {
|
|
128
|
+
const root = getProtectionRoot();
|
|
129
|
+
const legacyRoot = getLegacyProtectionRoot();
|
|
130
|
+
const repoRoot = getRepoProtectionRoot();
|
|
131
|
+
const usingLegacy = path.resolve(root) === path.resolve(legacyRoot);
|
|
132
|
+
const legacyHas = protectionRootHasManifestFiles(legacyRoot);
|
|
133
|
+
const repoHas = protectionRootHasManifestFiles(repoRoot);
|
|
134
|
+
|
|
135
|
+
let label = 'integration/.protection';
|
|
136
|
+
if (usingLegacy) {
|
|
137
|
+
label = 'work/.protection (legacy)';
|
|
138
|
+
} else if (process.env.AIFABRIX_PROTECTION_ROOT) {
|
|
139
|
+
label = 'custom';
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
let migrationHint = null;
|
|
143
|
+
if (usingLegacy && legacyHas) {
|
|
144
|
+
migrationHint = `Move manifests to ${repoRoot} (git-friendly integration/.protection/).`;
|
|
145
|
+
} else if (!usingLegacy && legacyHas && !repoHas) {
|
|
146
|
+
migrationHint = `Legacy manifests remain under ${legacyRoot}; migrate to ${repoRoot}.`;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return { root, label, usingLegacy, migrationHint };
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
module.exports = {
|
|
153
|
+
getProtectionRoot,
|
|
154
|
+
describeProtectionRoot,
|
|
155
|
+
getRepoProtectionRoot,
|
|
156
|
+
getLegacyProtectionRoot,
|
|
157
|
+
findNearestIntegrationRootFromCwd
|
|
158
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Preflight: datasource must exist on dataplane before protection upload.
|
|
3
|
+
* @author AI Fabrix Team
|
|
4
|
+
* @version 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
'use strict';
|
|
8
|
+
|
|
9
|
+
const { getDatasource } = require('../api/datasources-core.api');
|
|
10
|
+
const { unwrapApiData } = require('../utils/external-system-readiness-core');
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @param {string} dataplaneUrl
|
|
14
|
+
* @param {Object} authConfig
|
|
15
|
+
* @param {string} datasourceKey
|
|
16
|
+
* @returns {Promise<void>}
|
|
17
|
+
*/
|
|
18
|
+
async function assertDatasourceExistsOnDataplane(dataplaneUrl, authConfig, datasourceKey) {
|
|
19
|
+
const key = String(datasourceKey || '').trim();
|
|
20
|
+
if (!key) {
|
|
21
|
+
throw new Error('spec.datasourceKey is required');
|
|
22
|
+
}
|
|
23
|
+
const res = await getDatasource(dataplaneUrl, key, authConfig);
|
|
24
|
+
const row = unwrapApiData(res);
|
|
25
|
+
if (!row || (res && res.success === false)) {
|
|
26
|
+
throw new Error(
|
|
27
|
+
`Datasource "${key}" is not deployed on the dataplane. Run aifabrix deploy <app> first.`
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* @param {string} dataplaneUrl
|
|
34
|
+
* @param {Object} authConfig
|
|
35
|
+
* @param {Object} manifest
|
|
36
|
+
* @returns {Promise<void>}
|
|
37
|
+
*/
|
|
38
|
+
async function preflightDatasourceReady(dataplaneUrl, authConfig, manifest) {
|
|
39
|
+
const ds = String(manifest?.spec?.datasourceKey || '').trim();
|
|
40
|
+
await assertDatasourceExistsOnDataplane(dataplaneUrl, authConfig, ds);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
module.exports = {
|
|
44
|
+
assertDatasourceExistsOnDataplane,
|
|
45
|
+
preflightDatasourceReady
|
|
46
|
+
};
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview TTY line builders for protection create probes (keeps probe async functions small).
|
|
3
|
+
* @author AI Fabrix Team
|
|
4
|
+
* @version 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
'use strict';
|
|
8
|
+
|
|
9
|
+
const chalk = require('chalk');
|
|
10
|
+
const {
|
|
11
|
+
sectionTitle,
|
|
12
|
+
headerKeyValue,
|
|
13
|
+
metadata,
|
|
14
|
+
formatProgress,
|
|
15
|
+
formatSuccessLine
|
|
16
|
+
} = require('../utils/cli-test-layout-chalk');
|
|
17
|
+
|
|
18
|
+
const SEP = chalk.gray('────────────────────────────────────────');
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* @param {string} key
|
|
22
|
+
* @returns {string[]}
|
|
23
|
+
*/
|
|
24
|
+
function startDatasourceProbeLines(key) {
|
|
25
|
+
return [sectionTitle('Datasource (dataplane)'), SEP, formatProgress(`Fetching datasource "${key}"…`)];
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @param {string[]} lines
|
|
30
|
+
* @param {Object} row
|
|
31
|
+
* @param {string} key
|
|
32
|
+
* @param {string} dataplaneUrl
|
|
33
|
+
*/
|
|
34
|
+
function appendDatasourceCoreFields(lines, row, key, dataplaneUrl) {
|
|
35
|
+
lines.push(formatSuccessLine(`Datasource "${key}" found`));
|
|
36
|
+
lines.push(metadata(`Dataplane: ${dataplaneUrl}`));
|
|
37
|
+
lines.push(headerKeyValue('Key:', row.key ?? key));
|
|
38
|
+
lines.push(headerKeyValue('Display name:', row.displayName ?? '—'));
|
|
39
|
+
lines.push(headerKeyValue('System key:', row.systemKey ?? '—'));
|
|
40
|
+
const ver = row.version;
|
|
41
|
+
lines.push(headerKeyValue('Version:', ver !== undefined && ver !== null ? String(ver) : '—'));
|
|
42
|
+
lines.push(headerKeyValue('Enabled:', String(row.enabled !== false)));
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* @param {string[]} lines
|
|
47
|
+
* @param {Object} row
|
|
48
|
+
*/
|
|
49
|
+
function appendDatasourceOptionalTypes(lines, row) {
|
|
50
|
+
if (row.entityType) {
|
|
51
|
+
lines.push(headerKeyValue('Entity type:', String(row.entityType)));
|
|
52
|
+
}
|
|
53
|
+
if (row.resourceType) {
|
|
54
|
+
lines.push(headerKeyValue('Resource type:', String(row.resourceType)));
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* @param {string[]} lines
|
|
60
|
+
* @param {Object} row
|
|
61
|
+
*/
|
|
62
|
+
function appendDatasourceVerboseBlock(lines, row) {
|
|
63
|
+
const pick = ['id', 'key', 'displayName', 'systemKey', 'version', 'enabled', 'entityType', 'resourceType'];
|
|
64
|
+
const extra = {};
|
|
65
|
+
for (const p of pick) {
|
|
66
|
+
if (row[p] !== undefined) {
|
|
67
|
+
extra[p] = row[p];
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
lines.push('');
|
|
71
|
+
lines.push(chalk.gray('Verbose (subset):'));
|
|
72
|
+
lines.push(chalk.gray(JSON.stringify(extra, null, 2)));
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* @param {string[]} lines
|
|
77
|
+
* @param {Object} row
|
|
78
|
+
* @param {string} key
|
|
79
|
+
* @param {string} dataplaneUrl
|
|
80
|
+
* @param {Object} opts
|
|
81
|
+
*/
|
|
82
|
+
function appendDatasourceSuccessDetail(lines, row, key, dataplaneUrl, opts) {
|
|
83
|
+
appendDatasourceCoreFields(lines, row, key, dataplaneUrl);
|
|
84
|
+
appendDatasourceOptionalTypes(lines, row);
|
|
85
|
+
if (opts.verbose && row) {
|
|
86
|
+
appendDatasourceVerboseBlock(lines, row);
|
|
87
|
+
}
|
|
88
|
+
lines.push('');
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* @param {string} key
|
|
93
|
+
* @returns {string[]}
|
|
94
|
+
*/
|
|
95
|
+
function startDimensionProbeLines(key) {
|
|
96
|
+
return [
|
|
97
|
+
sectionTitle('Dimension (Controller catalog)'),
|
|
98
|
+
SEP,
|
|
99
|
+
formatProgress(`Fetching dimension "${key}"…`)
|
|
100
|
+
];
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* @param {string[]} lines
|
|
105
|
+
* @param {Object} row
|
|
106
|
+
* @param {string} controllerUrl
|
|
107
|
+
* @param {Object} opts
|
|
108
|
+
*/
|
|
109
|
+
function appendDimensionSuccessDetail(lines, row, controllerUrl, opts) {
|
|
110
|
+
lines.push(formatSuccessLine(`Dimension "${row.key}" found`));
|
|
111
|
+
lines.push(metadata(`Controller: ${controllerUrl}`));
|
|
112
|
+
lines.push(headerKeyValue('Key:', row.key));
|
|
113
|
+
lines.push(headerKeyValue('Display:', row.displayName ?? '—'));
|
|
114
|
+
lines.push(headerKeyValue('Data type:', row.dataType ?? '—'));
|
|
115
|
+
lines.push(headerKeyValue('Value type:', row.valueType ?? 'static'));
|
|
116
|
+
lines.push(headerKeyValue('Required:', String(row.isRequired === true)));
|
|
117
|
+
if (Array.isArray(row.dimensionValues) && row.dimensionValues.length > 0) {
|
|
118
|
+
lines.push(
|
|
119
|
+
headerKeyValue('Catalog values:', `${row.dimensionValues.length} (static/baseline)`)
|
|
120
|
+
);
|
|
121
|
+
} else if (row.valueType === 'dynamic' || row.valueType === 'both') {
|
|
122
|
+
lines.push(headerKeyValue('Catalog values:', '— (dynamic / projection)'));
|
|
123
|
+
}
|
|
124
|
+
if (opts.verbose && Array.isArray(row.dimensionValues) && row.dimensionValues.length) {
|
|
125
|
+
lines.push('');
|
|
126
|
+
lines.push(chalk.gray('Sample values (first 5):'));
|
|
127
|
+
row.dimensionValues.slice(0, 5).forEach((v) => {
|
|
128
|
+
const val = v && v.value !== undefined && v.value !== null ? String(v.value) : '—';
|
|
129
|
+
const dn = v?.displayName ? ` (${v.displayName})` : '';
|
|
130
|
+
lines.push(chalk.gray(` ${val}${dn}`));
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
lines.push('');
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
module.exports = {
|
|
137
|
+
SEP,
|
|
138
|
+
startDatasourceProbeLines,
|
|
139
|
+
appendDatasourceSuccessDetail,
|
|
140
|
+
startDimensionProbeLines,
|
|
141
|
+
appendDimensionSuccessDetail
|
|
142
|
+
};
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Online probes for `protection create` (dataplane datasource + Controller dimension).
|
|
3
|
+
* @author AI Fabrix Team
|
|
4
|
+
* @version 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
'use strict';
|
|
8
|
+
|
|
9
|
+
const { getDatasource } = require('../api/datasources-core.api');
|
|
10
|
+
const { getDimension } = require('../api/dimensions.api');
|
|
11
|
+
const { unwrapApiData } = require('../utils/external-system-readiness-core');
|
|
12
|
+
const {
|
|
13
|
+
startDatasourceProbeLines,
|
|
14
|
+
appendDatasourceSuccessDetail,
|
|
15
|
+
startDimensionProbeLines,
|
|
16
|
+
appendDimensionSuccessDetail
|
|
17
|
+
} = require('./protection-create-probe-lines');
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @param {*} response
|
|
21
|
+
* @returns {*}
|
|
22
|
+
*/
|
|
23
|
+
function unwrapControllerDimension(response) {
|
|
24
|
+
const d = response?.data?.data ?? response?.data ?? response;
|
|
25
|
+
return d;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @param {string[]} lines
|
|
30
|
+
* @param {string} msg
|
|
31
|
+
* @returns {never}
|
|
32
|
+
*/
|
|
33
|
+
function throwProbe(lines, msg) {
|
|
34
|
+
const err = new Error(msg);
|
|
35
|
+
err.probeLines = lines;
|
|
36
|
+
throw err;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* @param {string} dataplaneUrl
|
|
41
|
+
* @param {Object} authConfig
|
|
42
|
+
* @param {string} datasourceKey
|
|
43
|
+
* @param {Object} opts
|
|
44
|
+
* @returns {Promise<Object>}
|
|
45
|
+
*/
|
|
46
|
+
async function probeDatasourceForProtectionCreate(dataplaneUrl, authConfig, datasourceKey, opts = {}) {
|
|
47
|
+
const key = String(datasourceKey || '').trim();
|
|
48
|
+
const lines = startDatasourceProbeLines(key);
|
|
49
|
+
const res = await getDatasource(dataplaneUrl, key, authConfig);
|
|
50
|
+
if (res && res.success === false) {
|
|
51
|
+
const msg = res.formattedError || res.error || `Datasource "${key}" request failed`;
|
|
52
|
+
throwProbe(lines, typeof msg === 'string' ? msg : 'Datasource probe failed');
|
|
53
|
+
}
|
|
54
|
+
const row = unwrapApiData(res);
|
|
55
|
+
if (!row) {
|
|
56
|
+
throwProbe(
|
|
57
|
+
lines,
|
|
58
|
+
`Datasource "${key}" not found or not readable on the dataplane. Deploy the integration first.`
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
appendDatasourceSuccessDetail(lines, row, key, dataplaneUrl, opts);
|
|
62
|
+
return { row, lines };
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* @param {string} controllerUrl
|
|
67
|
+
* @param {Object} authConfig
|
|
68
|
+
* @param {string} dimensionKey
|
|
69
|
+
* @param {Object} opts
|
|
70
|
+
* @returns {Promise<Object>}
|
|
71
|
+
*/
|
|
72
|
+
async function probeDimensionForProtectionCreate(controllerUrl, authConfig, dimensionKey, opts = {}) {
|
|
73
|
+
const key = String(dimensionKey || '').trim();
|
|
74
|
+
const lines = startDimensionProbeLines(key);
|
|
75
|
+
const res = await getDimension(controllerUrl, authConfig, key, { includeValues: opts.verbose === true });
|
|
76
|
+
if (res && res.success === false) {
|
|
77
|
+
const msg = res.formattedError || res.error || `Dimension "${key}" request failed`;
|
|
78
|
+
throwProbe(lines, typeof msg === 'string' ? msg : 'Dimension probe failed');
|
|
79
|
+
}
|
|
80
|
+
const row = unwrapControllerDimension(res);
|
|
81
|
+
if (!row || !row.key) {
|
|
82
|
+
throwProbe(
|
|
83
|
+
lines,
|
|
84
|
+
`Dimension "${key}" not found in the Controller catalog. Create it with: aifabrix dimension create …`
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
appendDimensionSuccessDetail(lines, row, controllerUrl, opts);
|
|
88
|
+
return { row, lines };
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
module.exports = {
|
|
92
|
+
probeDatasourceForProtectionCreate,
|
|
93
|
+
probeDimensionForProtectionCreate,
|
|
94
|
+
unwrapControllerDimension
|
|
95
|
+
};
|