@fabricorg/databricks-testkit 0.7.2 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -0
- package/dist/index.cjs +1230 -168
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +62 -1
- package/dist/index.d.ts +62 -1
- package/dist/index.js +1201 -169
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -747,7 +747,7 @@ async function runLiveSuite(spec, runtime = {}) {
|
|
|
747
747
|
const startedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
748
748
|
const ownedWarehouse = runtime.warehouse === void 0;
|
|
749
749
|
const client = runtime.client ?? createClientFromEnv(env);
|
|
750
|
-
const
|
|
750
|
+
const warehouse3 = runtime.warehouse ?? (hasWarehouseConfig(env) ? await createWorkspaceContext({ env, client }) : unavailableWarehouseContext());
|
|
751
751
|
const results = [];
|
|
752
752
|
try {
|
|
753
753
|
for (const check of spec.checks) {
|
|
@@ -762,7 +762,7 @@ async function runLiveSuite(spec, runtime = {}) {
|
|
|
762
762
|
}
|
|
763
763
|
const before = performance.now();
|
|
764
764
|
try {
|
|
765
|
-
const details = await check.run({ env, warehouse:
|
|
765
|
+
const details = await check.run({ env, warehouse: warehouse3, client });
|
|
766
766
|
results.push({
|
|
767
767
|
id: check.id,
|
|
768
768
|
description: check.description,
|
|
@@ -781,7 +781,7 @@ async function runLiveSuite(spec, runtime = {}) {
|
|
|
781
781
|
}
|
|
782
782
|
}
|
|
783
783
|
} finally {
|
|
784
|
-
if (ownedWarehouse) await
|
|
784
|
+
if (ownedWarehouse) await warehouse3.close();
|
|
785
785
|
}
|
|
786
786
|
const success = required3.every(
|
|
787
787
|
(id) => results.find((result) => result.id === id)?.status === "pass"
|
|
@@ -896,8 +896,8 @@ function sqlRoundTripCheck() {
|
|
|
896
896
|
id: "sql",
|
|
897
897
|
description: "SQL Statement Execution round-trip",
|
|
898
898
|
configured: (env) => Boolean(env.DATABRICKS_WAREHOUSE_ID || env.DATABRICKS_HTTP_PATH),
|
|
899
|
-
async run({ warehouse:
|
|
900
|
-
const rows = await
|
|
899
|
+
async run({ warehouse: warehouse3 }) {
|
|
900
|
+
const rows = await warehouse3.query("SELECT 1 AS dbx_test_ok");
|
|
901
901
|
if (Number(rows[0]?.dbx_test_ok) !== 1)
|
|
902
902
|
throw new Error("SQL round-trip returned an unexpected value");
|
|
903
903
|
return { rows: rows.length };
|
|
@@ -941,9 +941,9 @@ function deltaContractCheck(tableEnv = "DBX_TEST_DELTA_TABLE", columns = []) {
|
|
|
941
941
|
id: "delta-contract",
|
|
942
942
|
description: "Delta table schema contract",
|
|
943
943
|
configured: (env) => Boolean(env[tableEnv]),
|
|
944
|
-
async run({ env, warehouse:
|
|
944
|
+
async run({ env, warehouse: warehouse3 }) {
|
|
945
945
|
const table = env[tableEnv];
|
|
946
|
-
const rows = await
|
|
946
|
+
const rows = await warehouse3.query(`DESCRIBE TABLE ${table}`);
|
|
947
947
|
assertDeltaContract(table, rows, columns);
|
|
948
948
|
return { table, columns: rows.length };
|
|
949
949
|
}
|
|
@@ -954,10 +954,10 @@ function unityCatalogAccessCheck() {
|
|
|
954
954
|
id: "uc-grants",
|
|
955
955
|
description: "Unity Catalog allow/deny access assertions",
|
|
956
956
|
configured: (env) => Boolean(env.DBX_TEST_UC_ALLOWED_TABLE && env.DBX_TEST_UC_DENIED_TABLE),
|
|
957
|
-
async run({ env, warehouse:
|
|
958
|
-
await
|
|
957
|
+
async run({ env, warehouse: warehouse3 }) {
|
|
958
|
+
await warehouse3.query(`SELECT * FROM ${env.DBX_TEST_UC_ALLOWED_TABLE} LIMIT 1`);
|
|
959
959
|
try {
|
|
960
|
-
await
|
|
960
|
+
await warehouse3.query(`SELECT * FROM ${env.DBX_TEST_UC_DENIED_TABLE} LIMIT 1`);
|
|
961
961
|
} catch (error) {
|
|
962
962
|
if (/permission.?denied|insufficient.?priv|403|unauthoriz/i.test(String(error))) {
|
|
963
963
|
return { allowed: env.DBX_TEST_UC_ALLOWED_TABLE, denied: env.DBX_TEST_UC_DENIED_TABLE };
|
|
@@ -1325,9 +1325,9 @@ function secretScopeCheck() {
|
|
|
1325
1325
|
scope
|
|
1326
1326
|
});
|
|
1327
1327
|
const actual = new Set((response.secrets ?? []).map((secret) => secret.key).filter(Boolean));
|
|
1328
|
-
const
|
|
1329
|
-
if (
|
|
1330
|
-
throw new Error(`Secret scope ${scope} is missing keys: ${
|
|
1328
|
+
const missing2 = expected.filter((key) => !actual.has(key));
|
|
1329
|
+
if (missing2.length > 0) {
|
|
1330
|
+
throw new Error(`Secret scope ${scope} is missing keys: ${missing2.join(", ")}`);
|
|
1331
1331
|
}
|
|
1332
1332
|
return { scope, expectedKeys: expected.length };
|
|
1333
1333
|
}
|
|
@@ -1348,10 +1348,10 @@ function appHealthCheck(options = {}) {
|
|
|
1348
1348
|
const actual = new Set(
|
|
1349
1349
|
(app.resources ?? []).map((resource) => resource.name).filter(Boolean)
|
|
1350
1350
|
);
|
|
1351
|
-
const
|
|
1352
|
-
if (
|
|
1351
|
+
const missing2 = expected.filter((resource) => !actual.has(resource));
|
|
1352
|
+
if (missing2.length > 0) {
|
|
1353
1353
|
throw new Error(
|
|
1354
|
-
`Databricks App ${name} is missing resource bindings: ${
|
|
1354
|
+
`Databricks App ${name} is missing resource bindings: ${missing2.join(", ")}`
|
|
1355
1355
|
);
|
|
1356
1356
|
}
|
|
1357
1357
|
const appUrl = env.DBX_TEST_APP_URL ?? app.url ?? app.app_url;
|
|
@@ -1422,7 +1422,7 @@ function autoLoaderIngestionCheck(options = {}) {
|
|
|
1422
1422
|
configured: (env) => Boolean(
|
|
1423
1423
|
env.DBX_TEST_AUTOLOADER_PIPELINE_ID && env.DBX_TEST_AUTOLOADER_TABLE && env.DBX_TEST_AUTOLOADER_FIXTURE && env.DBX_TEST_VOLUME
|
|
1424
1424
|
),
|
|
1425
|
-
async run({ env, client, warehouse:
|
|
1425
|
+
async run({ env, client, warehouse: warehouse3 }) {
|
|
1426
1426
|
const pipelineId = env.DBX_TEST_AUTOLOADER_PIPELINE_ID;
|
|
1427
1427
|
if (pipelineId === env.DBX_TEST_PIPELINE_ID) {
|
|
1428
1428
|
throw new Error("DBX_TEST_AUTOLOADER_PIPELINE_ID must not be the production pipeline");
|
|
@@ -1447,7 +1447,7 @@ function autoLoaderIngestionCheck(options = {}) {
|
|
|
1447
1447
|
pollIntervalMs: Number(env.DBX_TEST_POLL_INTERVAL_MS ?? 1e4)
|
|
1448
1448
|
});
|
|
1449
1449
|
const table = env.DBX_TEST_AUTOLOADER_TABLE;
|
|
1450
|
-
const rows = await
|
|
1450
|
+
const rows = await warehouse3.query(
|
|
1451
1451
|
`SELECT COUNT(*) AS n, SUM(CASE WHEN _rescued_data IS NOT NULL THEN 1 ELSE 0 END) AS rescued FROM ${table}`
|
|
1452
1452
|
);
|
|
1453
1453
|
const count = Number(rows[0]?.n ?? 0);
|
|
@@ -1473,7 +1473,7 @@ function performanceBudgetCheck() {
|
|
|
1473
1473
|
id: "performance",
|
|
1474
1474
|
description: "SQL Statement Execution p95 stays within the configured latency budget",
|
|
1475
1475
|
configured: (env) => Boolean(env.DBX_TEST_PERFORMANCE_P95_MS),
|
|
1476
|
-
async run({ env, warehouse:
|
|
1476
|
+
async run({ env, warehouse: warehouse3 }) {
|
|
1477
1477
|
const budgetMs = Number(env.DBX_TEST_PERFORMANCE_P95_MS);
|
|
1478
1478
|
const runs = Number(env.DBX_TEST_PERFORMANCE_RUNS ?? 7);
|
|
1479
1479
|
if (!Number.isFinite(budgetMs) || budgetMs <= 0) {
|
|
@@ -1482,11 +1482,11 @@ function performanceBudgetCheck() {
|
|
|
1482
1482
|
if (!Number.isInteger(runs) || runs < 3 || runs > 100) {
|
|
1483
1483
|
throw new Error("DBX_TEST_PERFORMANCE_RUNS must be an integer from 3 to 100");
|
|
1484
1484
|
}
|
|
1485
|
-
await
|
|
1485
|
+
await warehouse3.query("SELECT 1 AS warmup");
|
|
1486
1486
|
const durations = [];
|
|
1487
1487
|
for (let index = 0; index < runs; index += 1) {
|
|
1488
1488
|
const started = performance.now();
|
|
1489
|
-
await
|
|
1489
|
+
await warehouse3.query("SELECT 1 AS performance_probe");
|
|
1490
1490
|
durations.push(performance.now() - started);
|
|
1491
1491
|
}
|
|
1492
1492
|
durations.sort((left, right) => left - right);
|
|
@@ -1508,15 +1508,15 @@ function failureRecoveryCheck() {
|
|
|
1508
1508
|
id: "failure-recovery",
|
|
1509
1509
|
description: "A failed statement is isolated and a subsequent statement recovers",
|
|
1510
1510
|
configured: (env) => Boolean(env.DATABRICKS_WAREHOUSE_ID || env.DATABRICKS_HTTP_PATH),
|
|
1511
|
-
async run({ warehouse:
|
|
1511
|
+
async run({ warehouse: warehouse3 }) {
|
|
1512
1512
|
let failedAsExpected = false;
|
|
1513
1513
|
try {
|
|
1514
|
-
await
|
|
1514
|
+
await warehouse3.query("SELECT * FROM __fabric_experiments_expected_missing_table__");
|
|
1515
1515
|
} catch {
|
|
1516
1516
|
failedAsExpected = true;
|
|
1517
1517
|
}
|
|
1518
1518
|
if (!failedAsExpected) throw new Error("Injected failure unexpectedly succeeded");
|
|
1519
|
-
const rows = await
|
|
1519
|
+
const rows = await warehouse3.query("SELECT 1 AS recovered");
|
|
1520
1520
|
if (Number(rows[0]?.recovered) !== 1) {
|
|
1521
1521
|
throw new Error("Statement execution did not recover after the injected failure");
|
|
1522
1522
|
}
|
|
@@ -1554,20 +1554,20 @@ function backupRestoreCheck() {
|
|
|
1554
1554
|
id: "backup-restore",
|
|
1555
1555
|
description: "Delta DEEP CLONE backup restores a dropped scratch table",
|
|
1556
1556
|
configured: (env) => Boolean(env.DATABRICKS_WAREHOUSE_ID || env.DATABRICKS_HTTP_PATH),
|
|
1557
|
-
async run({ warehouse:
|
|
1558
|
-
const source =
|
|
1559
|
-
const backup =
|
|
1557
|
+
async run({ warehouse: warehouse3 }) {
|
|
1558
|
+
const source = warehouse3.qual(safeName("backup_source"));
|
|
1559
|
+
const backup = warehouse3.qual(safeName("backup_clone"));
|
|
1560
1560
|
try {
|
|
1561
|
-
await
|
|
1562
|
-
await
|
|
1563
|
-
await
|
|
1564
|
-
await
|
|
1565
|
-
const rows = await
|
|
1561
|
+
await warehouse3.exec(`CREATE TABLE ${source} USING DELTA AS SELECT 7 AS value`);
|
|
1562
|
+
await warehouse3.exec(`CREATE TABLE ${backup} DEEP CLONE ${source}`);
|
|
1563
|
+
await warehouse3.exec(`DROP TABLE ${source}`);
|
|
1564
|
+
await warehouse3.exec(`CREATE TABLE ${source} DEEP CLONE ${backup}`);
|
|
1565
|
+
const rows = await warehouse3.query(`SELECT value FROM ${source}`);
|
|
1566
1566
|
if (Number(rows[0]?.value) !== 7) throw new Error("Restored Delta table lost its data");
|
|
1567
1567
|
return { restoredRows: rows.length, deepClone: true };
|
|
1568
1568
|
} finally {
|
|
1569
|
-
await
|
|
1570
|
-
await
|
|
1569
|
+
await warehouse3.exec(`DROP TABLE IF EXISTS ${source}`).catch(() => void 0);
|
|
1570
|
+
await warehouse3.exec(`DROP TABLE IF EXISTS ${backup}`).catch(() => void 0);
|
|
1571
1571
|
}
|
|
1572
1572
|
}
|
|
1573
1573
|
};
|
|
@@ -1577,25 +1577,25 @@ function rollbackCheck() {
|
|
|
1577
1577
|
id: "rollback",
|
|
1578
1578
|
description: "Delta time-travel rollback restores a known-good table version",
|
|
1579
1579
|
configured: (env) => Boolean(env.DATABRICKS_WAREHOUSE_ID || env.DATABRICKS_HTTP_PATH),
|
|
1580
|
-
async run({ warehouse:
|
|
1581
|
-
const table =
|
|
1580
|
+
async run({ warehouse: warehouse3 }) {
|
|
1581
|
+
const table = warehouse3.qual(safeName("rollback_probe"));
|
|
1582
1582
|
try {
|
|
1583
|
-
await
|
|
1584
|
-
await
|
|
1585
|
-
const history = await
|
|
1583
|
+
await warehouse3.exec(`CREATE TABLE ${table} (value INT) USING DELTA`);
|
|
1584
|
+
await warehouse3.exec(`INSERT INTO ${table} VALUES (1)`);
|
|
1585
|
+
const history = await warehouse3.query(`DESCRIBE HISTORY ${table} LIMIT 1`);
|
|
1586
1586
|
const knownGoodVersion = Number(history[0]?.version);
|
|
1587
1587
|
if (!Number.isInteger(knownGoodVersion)) {
|
|
1588
1588
|
throw new Error("Delta history did not return a known-good version");
|
|
1589
1589
|
}
|
|
1590
|
-
await
|
|
1591
|
-
await
|
|
1592
|
-
const rows = await
|
|
1590
|
+
await warehouse3.exec(`INSERT INTO ${table} VALUES (999)`);
|
|
1591
|
+
await warehouse3.exec(`RESTORE TABLE ${table} TO VERSION AS OF ${knownGoodVersion}`);
|
|
1592
|
+
const rows = await warehouse3.query(`SELECT value FROM ${table} ORDER BY value`);
|
|
1593
1593
|
if (rows.length !== 1 || Number(rows[0]?.value) !== 1) {
|
|
1594
1594
|
throw new Error("Delta rollback did not restore the known-good contents");
|
|
1595
1595
|
}
|
|
1596
1596
|
return { knownGoodVersion, restoredRows: rows.length };
|
|
1597
1597
|
} finally {
|
|
1598
|
-
await
|
|
1598
|
+
await warehouse3.exec(`DROP TABLE IF EXISTS ${table}`).catch(() => void 0);
|
|
1599
1599
|
}
|
|
1600
1600
|
}
|
|
1601
1601
|
};
|
|
@@ -1605,13 +1605,13 @@ function serverlessComputeCheck() {
|
|
|
1605
1605
|
id: "azure-serverless",
|
|
1606
1606
|
description: "Azure Databricks serverless SQL warehouse is enabled and executes SQL",
|
|
1607
1607
|
configured: (env) => Boolean(env.DATABRICKS_WAREHOUSE_ID),
|
|
1608
|
-
async run({ env, client, warehouse:
|
|
1608
|
+
async run({ env, client, warehouse: warehouse3 }) {
|
|
1609
1609
|
const id = env.DATABRICKS_WAREHOUSE_ID;
|
|
1610
1610
|
const details = await client.get(`/api/2.0/sql/warehouses/${encodeURIComponent(id)}`);
|
|
1611
1611
|
if (details.enable_serverless_compute !== true) {
|
|
1612
1612
|
throw new Error(`SQL warehouse ${id} is not configured for serverless compute`);
|
|
1613
1613
|
}
|
|
1614
|
-
const rows = await
|
|
1614
|
+
const rows = await warehouse3.query("SELECT current_catalog() AS catalog");
|
|
1615
1615
|
return { warehouseId: id, name: details.name, state: details.state, rows: rows.length };
|
|
1616
1616
|
}
|
|
1617
1617
|
};
|
|
@@ -1731,15 +1731,15 @@ function createTargetPackRegistry(packs) {
|
|
|
1731
1731
|
}
|
|
1732
1732
|
return registry;
|
|
1733
1733
|
}
|
|
1734
|
-
function doctorTargetPack(pack, env = process.env, requiredChecks =
|
|
1735
|
-
const requirements = (pack.requirements ?? []).map((
|
|
1736
|
-
id:
|
|
1737
|
-
description:
|
|
1738
|
-
satisfied:
|
|
1739
|
-
required:
|
|
1740
|
-
variables: [...
|
|
1734
|
+
function doctorTargetPack(pack, env = process.env, requiredChecks = []) {
|
|
1735
|
+
const requirements = (pack.requirements ?? []).map((requirement3) => ({
|
|
1736
|
+
id: requirement3.id,
|
|
1737
|
+
description: requirement3.description,
|
|
1738
|
+
satisfied: requirement3.anyOf.some((name) => Boolean(env[name]?.trim())),
|
|
1739
|
+
required: requirement3.required !== false,
|
|
1740
|
+
variables: [...requirement3.anyOf]
|
|
1741
1741
|
}));
|
|
1742
|
-
const required3 = new Set(requiredChecks);
|
|
1742
|
+
const required3 = new Set(resolveRequiredChecks(pack, requiredChecks));
|
|
1743
1743
|
const checks = pack.checks().map((check) => ({
|
|
1744
1744
|
id: check.id,
|
|
1745
1745
|
description: check.description,
|
|
@@ -1747,7 +1747,7 @@ function doctorTargetPack(pack, env = process.env, requiredChecks = pack.require
|
|
|
1747
1747
|
required: required3.has(check.id)
|
|
1748
1748
|
}));
|
|
1749
1749
|
const known = new Set(checks.map((check) => check.id));
|
|
1750
|
-
const missingRequirements = requirements.filter((
|
|
1750
|
+
const missingRequirements = requirements.filter((requirement3) => requirement3.required && !requirement3.satisfied).map((requirement3) => requirement3.id);
|
|
1751
1751
|
const missingRequiredChecks = [
|
|
1752
1752
|
...checks.filter((check) => check.required && !check.configured).map((check) => check.id),
|
|
1753
1753
|
...[...required3].filter((id) => !known.has(id))
|
|
@@ -1768,11 +1768,11 @@ function doctorTargetPack(pack, env = process.env, requiredChecks = pack.require
|
|
|
1768
1768
|
}
|
|
1769
1769
|
function defineTargetPackRun(pack, options = {}) {
|
|
1770
1770
|
const env = options.env ?? process.env;
|
|
1771
|
-
const requiredChecks =
|
|
1771
|
+
const requiredChecks = resolveRequiredChecks(pack, options.requiredChecks);
|
|
1772
1772
|
const doctor = doctorTargetPack(pack, env, requiredChecks);
|
|
1773
1773
|
if (!doctor.ready) {
|
|
1774
|
-
const
|
|
1775
|
-
throw new Error(`Target pack '${pack.id}' is not configured: ${
|
|
1774
|
+
const missing2 = [...doctor.missingRequirements, ...doctor.missingRequiredChecks].join(", ");
|
|
1775
|
+
throw new Error(`Target pack '${pack.id}' is not configured: ${missing2}`);
|
|
1776
1776
|
}
|
|
1777
1777
|
const targetPack = evidenceMetadata(pack, env);
|
|
1778
1778
|
const suite = defineLiveSuite({
|
|
@@ -1785,6 +1785,9 @@ function defineTargetPackRun(pack, options = {}) {
|
|
|
1785
1785
|
});
|
|
1786
1786
|
return { pack, run: (runtime) => suite.run(runtime) };
|
|
1787
1787
|
}
|
|
1788
|
+
function resolveRequiredChecks(pack, additional = []) {
|
|
1789
|
+
return [.../* @__PURE__ */ new Set([...pack.requiredChecks ?? [], ...additional])];
|
|
1790
|
+
}
|
|
1788
1791
|
async function runTargetPack(pack, options = {}, runtime) {
|
|
1789
1792
|
return defineTargetPackRun(pack, options).run(runtime);
|
|
1790
1793
|
}
|
|
@@ -2494,7 +2497,579 @@ function createLakeflowJobsTargetPack() {
|
|
|
2494
2497
|
});
|
|
2495
2498
|
}
|
|
2496
2499
|
|
|
2500
|
+
// src/next-workload-checks.ts
|
|
2501
|
+
init_workspace_client();
|
|
2502
|
+
function missing(env, names) {
|
|
2503
|
+
return names.filter((name) => !env[name]?.trim());
|
|
2504
|
+
}
|
|
2505
|
+
function requireEnv(env, names) {
|
|
2506
|
+
const absent = missing(env, names);
|
|
2507
|
+
if (absent.length > 0) throw new Error(`Missing required configuration: ${absent.join(", ")}`);
|
|
2508
|
+
}
|
|
2509
|
+
async function assertBooleanSql(label, statement, query) {
|
|
2510
|
+
if (!statement) throw new Error(`${label} assertion SQL is not configured`);
|
|
2511
|
+
const rows = await query(statement);
|
|
2512
|
+
const value = rows[0] ? Object.values(rows[0])[0] : void 0;
|
|
2513
|
+
if (!(value === true || value === 1 || value === "1" || value === "true")) {
|
|
2514
|
+
throw new Error(`${label} assertion did not return a truthy first column`);
|
|
2515
|
+
}
|
|
2516
|
+
}
|
|
2517
|
+
async function certificationJob(label, jobIdValue, env, client) {
|
|
2518
|
+
const jobId = Number(jobIdValue);
|
|
2519
|
+
if (!Number.isSafeInteger(jobId) || jobId <= 0) {
|
|
2520
|
+
throw new Error(`${label} job id must be a positive integer`);
|
|
2521
|
+
}
|
|
2522
|
+
const submitted = await client.post("/api/2.1/jobs/run-now", {
|
|
2523
|
+
job_id: jobId
|
|
2524
|
+
});
|
|
2525
|
+
if (!Number.isSafeInteger(submitted.run_id)) {
|
|
2526
|
+
throw new Error(`${label} certification job returned no run_id`);
|
|
2527
|
+
}
|
|
2528
|
+
const run = await waitForDatabricksRun(client, submitted.run_id, {
|
|
2529
|
+
timeoutMs: Number(env.DBX_TEST_TIMEOUT_MS ?? 36e5),
|
|
2530
|
+
pollIntervalMs: Number(env.DBX_TEST_POLL_INTERVAL_MS ?? 1e4)
|
|
2531
|
+
});
|
|
2532
|
+
const result = run.state?.result_state;
|
|
2533
|
+
if (result !== "SUCCESS") {
|
|
2534
|
+
throw new Error(`${label} certification job ${jobId} ended in ${result ?? "UNKNOWN"}`);
|
|
2535
|
+
}
|
|
2536
|
+
return { jobId, runId: submitted.run_id };
|
|
2537
|
+
}
|
|
2538
|
+
function jobAndAssertionsCheck(spec) {
|
|
2539
|
+
const names = [spec.job, ...spec.assertions.map(({ env }) => env)];
|
|
2540
|
+
return {
|
|
2541
|
+
id: spec.id,
|
|
2542
|
+
description: spec.description,
|
|
2543
|
+
configured: (env) => missing(env, names).length === 0,
|
|
2544
|
+
async run({ env, client, warehouse: warehouse3 }) {
|
|
2545
|
+
requireEnv(env, names);
|
|
2546
|
+
const job = await certificationJob(spec.label, env[spec.job], env, client);
|
|
2547
|
+
for (const assertion of spec.assertions) {
|
|
2548
|
+
await assertBooleanSql(assertion.label, env[assertion.env], warehouse3.query);
|
|
2549
|
+
}
|
|
2550
|
+
return {
|
|
2551
|
+
...job,
|
|
2552
|
+
assertions: Object.fromEntries(spec.assertions.map(({ label }) => [label, true]))
|
|
2553
|
+
};
|
|
2554
|
+
}
|
|
2555
|
+
};
|
|
2556
|
+
}
|
|
2557
|
+
function semanticAnalyticsCheck() {
|
|
2558
|
+
return jobAndAssertionsCheck({
|
|
2559
|
+
id: "semantic-analytics",
|
|
2560
|
+
description: "Metric views, materialization, SQL alerts and query-performance evidence are healthy",
|
|
2561
|
+
label: "Semantic analytics",
|
|
2562
|
+
job: "DBX_TEST_SEMANTIC_ANALYTICS_JOB_ID",
|
|
2563
|
+
assertions: [
|
|
2564
|
+
{ env: "DBX_TEST_METRIC_VIEW_ASSERTION_SQL", label: "Metric view query" },
|
|
2565
|
+
{ env: "DBX_TEST_METRIC_MATERIALIZATION_ASSERTION_SQL", label: "Metric materialization" },
|
|
2566
|
+
{ env: "DBX_TEST_SQL_ALERT_ASSERTION_SQL", label: "SQL alert" },
|
|
2567
|
+
{ env: "DBX_TEST_QUERY_PERFORMANCE_ASSERTION_SQL", label: "Query performance" }
|
|
2568
|
+
]
|
|
2569
|
+
});
|
|
2570
|
+
}
|
|
2571
|
+
function aiFunctionsBatchInferenceCheck() {
|
|
2572
|
+
return jobAndAssertionsCheck({
|
|
2573
|
+
id: "ai-functions-batch-inference",
|
|
2574
|
+
description: "AI Functions batch and streaming inference produce governed durable output",
|
|
2575
|
+
label: "AI Functions batch inference",
|
|
2576
|
+
job: "DBX_TEST_AI_FUNCTIONS_JOB_ID",
|
|
2577
|
+
assertions: [
|
|
2578
|
+
{ env: "DBX_TEST_AI_FUNCTIONS_OUTPUT_ASSERTION_SQL", label: "AI Functions output" },
|
|
2579
|
+
{ env: "DBX_TEST_BATCH_INFERENCE_QUALITY_ASSERTION_SQL", label: "Batch inference quality" },
|
|
2580
|
+
{ env: "DBX_TEST_BATCH_INFERENCE_LINEAGE_ASSERTION_SQL", label: "Batch inference lineage" }
|
|
2581
|
+
]
|
|
2582
|
+
});
|
|
2583
|
+
}
|
|
2584
|
+
function agentOrchestrationResponsesCheck() {
|
|
2585
|
+
return jobAndAssertionsCheck({
|
|
2586
|
+
id: "agent-orchestration-responses",
|
|
2587
|
+
description: "Knowledge Assistant, multi-agent orchestration and Responses API produce grounded governed evidence",
|
|
2588
|
+
label: "Agent orchestration and Responses",
|
|
2589
|
+
job: "DBX_TEST_AGENT_ORCHESTRATION_JOB_ID",
|
|
2590
|
+
assertions: [
|
|
2591
|
+
{ env: "DBX_TEST_KNOWLEDGE_ASSISTANT_ASSERTION_SQL", label: "Knowledge Assistant" },
|
|
2592
|
+
{ env: "DBX_TEST_MULTI_AGENT_ASSERTION_SQL", label: "Multi-agent orchestration" },
|
|
2593
|
+
{ env: "DBX_TEST_RESPONSES_API_ASSERTION_SQL", label: "Responses API" },
|
|
2594
|
+
{ env: "DBX_TEST_AGENT_GROUNDEDNESS_ASSERTION_SQL", label: "Agent groundedness" }
|
|
2595
|
+
]
|
|
2596
|
+
});
|
|
2597
|
+
}
|
|
2598
|
+
function aiRuntimeTrainingCheck() {
|
|
2599
|
+
return jobAndAssertionsCheck({
|
|
2600
|
+
id: "ai-runtime-training",
|
|
2601
|
+
description: "AI Runtime training or fine-tuning produces MLflow and Unity Catalog evidence",
|
|
2602
|
+
label: "AI Runtime training",
|
|
2603
|
+
job: "DBX_TEST_AI_RUNTIME_JOB_ID",
|
|
2604
|
+
assertions: [
|
|
2605
|
+
{ env: "DBX_TEST_AI_RUNTIME_RUN_ASSERTION_SQL", label: "AI Runtime run" },
|
|
2606
|
+
{ env: "DBX_TEST_AI_RUNTIME_EVAL_ASSERTION_SQL", label: "AI Runtime evaluation" },
|
|
2607
|
+
{ env: "DBX_TEST_AI_RUNTIME_MODEL_ASSERTION_SQL", label: "AI Runtime registered model" }
|
|
2608
|
+
]
|
|
2609
|
+
});
|
|
2610
|
+
}
|
|
2611
|
+
function lakebaseAutoscalingFeatureStoreCheck() {
|
|
2612
|
+
return jobAndAssertionsCheck({
|
|
2613
|
+
id: "lakebase-autoscaling-feature-store",
|
|
2614
|
+
description: "Lakebase Autoscaling Online Feature Store publishes fresh features and serves lookups",
|
|
2615
|
+
label: "Lakebase Autoscaling feature store",
|
|
2616
|
+
job: "DBX_TEST_ONLINE_FEATURE_STORE_JOB_ID",
|
|
2617
|
+
assertions: [
|
|
2618
|
+
{ env: "DBX_TEST_ONLINE_STORE_ASSERTION_SQL", label: "Online store publication" },
|
|
2619
|
+
{ env: "DBX_TEST_FEATURE_SERVING_ASSERTION_SQL", label: "Feature Serving lookup" },
|
|
2620
|
+
{ env: "DBX_TEST_ONLINE_FEATURE_FRESHNESS_ASSERTION_SQL", label: "Online feature freshness" }
|
|
2621
|
+
]
|
|
2622
|
+
});
|
|
2623
|
+
}
|
|
2624
|
+
function declarativeBundlesCheck() {
|
|
2625
|
+
return jobAndAssertionsCheck({
|
|
2626
|
+
id: "declarative-bundles",
|
|
2627
|
+
description: "A validated bundle deployment runs the exact candidate and records provenance",
|
|
2628
|
+
label: "Declarative Automation Bundle",
|
|
2629
|
+
job: "DBX_TEST_BUNDLE_JOB_ID",
|
|
2630
|
+
assertions: [
|
|
2631
|
+
{ env: "DBX_TEST_BUNDLE_PROVENANCE_ASSERTION_SQL", label: "Bundle provenance" },
|
|
2632
|
+
{ env: "DBX_TEST_BUNDLE_CANDIDATE_ASSERTION_SQL", label: "Bundle candidate" },
|
|
2633
|
+
{ env: "DBX_TEST_BUNDLE_ROLLBACK_ASSERTION_SQL", label: "Bundle rollback" }
|
|
2634
|
+
]
|
|
2635
|
+
});
|
|
2636
|
+
}
|
|
2637
|
+
function lakehouseOptimizationCheck() {
|
|
2638
|
+
const names = [
|
|
2639
|
+
"DBX_TEST_PREDICTIVE_OPTIMIZATION_ASSERTION_SQL",
|
|
2640
|
+
"DBX_TEST_LIQUID_CLUSTERING_ASSERTION_SQL",
|
|
2641
|
+
"DBX_TEST_ICEBERG_INTEROP_ASSERTION_SQL"
|
|
2642
|
+
];
|
|
2643
|
+
return {
|
|
2644
|
+
id: "lakehouse-optimization",
|
|
2645
|
+
description: "Predictive Optimization, liquid clustering and Iceberg interoperability satisfy table contracts",
|
|
2646
|
+
configured: (env) => missing(env, names).length === 0,
|
|
2647
|
+
async run({ env, warehouse: warehouse3 }) {
|
|
2648
|
+
requireEnv(env, names);
|
|
2649
|
+
await assertBooleanSql(
|
|
2650
|
+
"Predictive Optimization",
|
|
2651
|
+
env.DBX_TEST_PREDICTIVE_OPTIMIZATION_ASSERTION_SQL,
|
|
2652
|
+
warehouse3.query
|
|
2653
|
+
);
|
|
2654
|
+
await assertBooleanSql(
|
|
2655
|
+
"Liquid clustering",
|
|
2656
|
+
env.DBX_TEST_LIQUID_CLUSTERING_ASSERTION_SQL,
|
|
2657
|
+
warehouse3.query
|
|
2658
|
+
);
|
|
2659
|
+
await assertBooleanSql(
|
|
2660
|
+
"Iceberg interoperability",
|
|
2661
|
+
env.DBX_TEST_ICEBERG_INTEROP_ASSERTION_SQL,
|
|
2662
|
+
warehouse3.query
|
|
2663
|
+
);
|
|
2664
|
+
return { predictiveOptimization: true, liquidClustering: true, icebergInterop: true };
|
|
2665
|
+
}
|
|
2666
|
+
};
|
|
2667
|
+
}
|
|
2668
|
+
function marketplaceOpenSharingCheck() {
|
|
2669
|
+
return jobAndAssertionsCheck({
|
|
2670
|
+
id: "marketplace-open-sharing",
|
|
2671
|
+
description: "Marketplace provider and consumer flows preserve OpenSharing governance and asset usability",
|
|
2672
|
+
label: "Marketplace and OpenSharing",
|
|
2673
|
+
job: "DBX_TEST_MARKETPLACE_JOB_ID",
|
|
2674
|
+
assertions: [
|
|
2675
|
+
{ env: "DBX_TEST_MARKETPLACE_LISTING_ASSERTION_SQL", label: "Marketplace listing" },
|
|
2676
|
+
{ env: "DBX_TEST_OPEN_SHARING_RECIPIENT_ASSERTION_SQL", label: "OpenSharing recipient" },
|
|
2677
|
+
{ env: "DBX_TEST_MARKETPLACE_ASSET_ASSERTION_SQL", label: "Marketplace asset" }
|
|
2678
|
+
]
|
|
2679
|
+
});
|
|
2680
|
+
}
|
|
2681
|
+
|
|
2682
|
+
// src/next-target-packs.ts
|
|
2683
|
+
var DOCS2 = "https://experiments.fabric.pro/docs/testing/target-packs/";
|
|
2684
|
+
var AZURE_M2M_SCOPE = "Azure Databricks, dedicated service principal using OAuth M2M, public network path; named managed or disposable certification fixtures";
|
|
2685
|
+
var workspace = {
|
|
2686
|
+
id: "workspace",
|
|
2687
|
+
description: "Databricks workspace host",
|
|
2688
|
+
anyOf: ["DATABRICKS_HOST"]
|
|
2689
|
+
};
|
|
2690
|
+
var auth = {
|
|
2691
|
+
id: "authentication",
|
|
2692
|
+
description: "Databricks OAuth M2M authentication",
|
|
2693
|
+
anyOf: ["DATABRICKS_CLIENT_ID"],
|
|
2694
|
+
secret: true
|
|
2695
|
+
};
|
|
2696
|
+
var warehouse = {
|
|
2697
|
+
id: "warehouse",
|
|
2698
|
+
description: "SQL warehouse for durable evidence assertions",
|
|
2699
|
+
anyOf: ["DATABRICKS_WAREHOUSE_ID", "DATABRICKS_HTTP_PATH"]
|
|
2700
|
+
};
|
|
2701
|
+
var requirement = (id, description, ...anyOf) => ({
|
|
2702
|
+
id,
|
|
2703
|
+
description,
|
|
2704
|
+
anyOf
|
|
2705
|
+
});
|
|
2706
|
+
var identityChecks = () => [restrictedPrincipalCheck()];
|
|
2707
|
+
function createSemanticAnalyticsTargetPack() {
|
|
2708
|
+
return defineTargetPack({
|
|
2709
|
+
id: "semantic-analytics",
|
|
2710
|
+
name: "Semantic analytics and SQL operations",
|
|
2711
|
+
description: "Unity Catalog metric views, materialization, SQL alerts and query-performance regression.",
|
|
2712
|
+
version: "1.0.0",
|
|
2713
|
+
maturity: "shipped",
|
|
2714
|
+
capabilities: [
|
|
2715
|
+
"semantics.metric-views",
|
|
2716
|
+
"semantics.materialization",
|
|
2717
|
+
"sql.alerts",
|
|
2718
|
+
"sql.query-performance"
|
|
2719
|
+
],
|
|
2720
|
+
checks: () => [...identityChecks(), semanticAnalyticsCheck()],
|
|
2721
|
+
requiredChecks: ["restricted-principal", "semantic-analytics"],
|
|
2722
|
+
requirements: [
|
|
2723
|
+
workspace,
|
|
2724
|
+
auth,
|
|
2725
|
+
warehouse,
|
|
2726
|
+
requirement(
|
|
2727
|
+
"semantic-job",
|
|
2728
|
+
"Metric-view certification Job",
|
|
2729
|
+
"DBX_TEST_SEMANTIC_ANALYTICS_JOB_ID"
|
|
2730
|
+
),
|
|
2731
|
+
requirement(
|
|
2732
|
+
"metric-view",
|
|
2733
|
+
"Metric-view query assertion",
|
|
2734
|
+
"DBX_TEST_METRIC_VIEW_ASSERTION_SQL"
|
|
2735
|
+
),
|
|
2736
|
+
requirement(
|
|
2737
|
+
"metric-materialization",
|
|
2738
|
+
"Metric-view materialization assertion",
|
|
2739
|
+
"DBX_TEST_METRIC_MATERIALIZATION_ASSERTION_SQL"
|
|
2740
|
+
),
|
|
2741
|
+
requirement("sql-alert", "SQL alert assertion", "DBX_TEST_SQL_ALERT_ASSERTION_SQL"),
|
|
2742
|
+
requirement(
|
|
2743
|
+
"query-performance",
|
|
2744
|
+
"Query performance assertion",
|
|
2745
|
+
"DBX_TEST_QUERY_PERFORMANCE_ASSERTION_SQL"
|
|
2746
|
+
)
|
|
2747
|
+
],
|
|
2748
|
+
docsUrl: `${DOCS2}#semantic-analytics-and-sql-operations`,
|
|
2749
|
+
certificationScopes: [
|
|
2750
|
+
`${AZURE_M2M_SCOPE}; metric view, materialization, alert and query history`
|
|
2751
|
+
]
|
|
2752
|
+
});
|
|
2753
|
+
}
|
|
2754
|
+
function createAiFunctionsBatchInferenceTargetPack() {
|
|
2755
|
+
return defineTargetPack({
|
|
2756
|
+
id: "ai-functions-batch-inference",
|
|
2757
|
+
name: "AI Functions and batch inference",
|
|
2758
|
+
description: "Governed batch or streaming inference through Databricks AI Functions.",
|
|
2759
|
+
version: "1.0.0",
|
|
2760
|
+
maturity: "shipped",
|
|
2761
|
+
capabilities: [
|
|
2762
|
+
"ai-functions.inference",
|
|
2763
|
+
"batch-inference.quality",
|
|
2764
|
+
"streaming-inference",
|
|
2765
|
+
"inference.lineage"
|
|
2766
|
+
],
|
|
2767
|
+
checks: () => [...identityChecks(), aiFunctionsBatchInferenceCheck()],
|
|
2768
|
+
requiredChecks: ["restricted-principal", "ai-functions-batch-inference"],
|
|
2769
|
+
requirements: [
|
|
2770
|
+
workspace,
|
|
2771
|
+
auth,
|
|
2772
|
+
warehouse,
|
|
2773
|
+
requirement("ai-functions-job", "AI Functions inference Job", "DBX_TEST_AI_FUNCTIONS_JOB_ID"),
|
|
2774
|
+
requirement(
|
|
2775
|
+
"ai-functions-output",
|
|
2776
|
+
"Inference output assertion",
|
|
2777
|
+
"DBX_TEST_AI_FUNCTIONS_OUTPUT_ASSERTION_SQL"
|
|
2778
|
+
),
|
|
2779
|
+
requirement(
|
|
2780
|
+
"batch-quality",
|
|
2781
|
+
"Inference quality assertion",
|
|
2782
|
+
"DBX_TEST_BATCH_INFERENCE_QUALITY_ASSERTION_SQL"
|
|
2783
|
+
),
|
|
2784
|
+
requirement(
|
|
2785
|
+
"batch-lineage",
|
|
2786
|
+
"Inference lineage assertion",
|
|
2787
|
+
"DBX_TEST_BATCH_INFERENCE_LINEAGE_ASSERTION_SQL"
|
|
2788
|
+
)
|
|
2789
|
+
],
|
|
2790
|
+
docsUrl: `${DOCS2}#ai-functions-and-batch-inference`,
|
|
2791
|
+
certificationScopes: [
|
|
2792
|
+
`${AZURE_M2M_SCOPE}; AI Functions Job with durable output, quality and lineage`
|
|
2793
|
+
]
|
|
2794
|
+
});
|
|
2795
|
+
}
|
|
2796
|
+
function createAgentOrchestrationTargetPack() {
|
|
2797
|
+
return defineTargetPack({
|
|
2798
|
+
id: "agent-orchestration-responses",
|
|
2799
|
+
name: "Knowledge Assistant, multi-agent and Responses",
|
|
2800
|
+
description: "Knowledge Assistant and multi-agent application behavior through the Responses API.",
|
|
2801
|
+
version: "1.0.0",
|
|
2802
|
+
maturity: "shipped",
|
|
2803
|
+
capabilities: [
|
|
2804
|
+
"agents.knowledge-assistant",
|
|
2805
|
+
"agents.multi-agent",
|
|
2806
|
+
"agents.responses-api",
|
|
2807
|
+
"agents.groundedness"
|
|
2808
|
+
],
|
|
2809
|
+
checks: () => [...identityChecks(), agentOrchestrationResponsesCheck()],
|
|
2810
|
+
requiredChecks: ["restricted-principal", "agent-orchestration-responses"],
|
|
2811
|
+
requirements: [
|
|
2812
|
+
workspace,
|
|
2813
|
+
auth,
|
|
2814
|
+
warehouse,
|
|
2815
|
+
requirement(
|
|
2816
|
+
"agent-orchestration-job",
|
|
2817
|
+
"Agent orchestration certification Job",
|
|
2818
|
+
"DBX_TEST_AGENT_ORCHESTRATION_JOB_ID"
|
|
2819
|
+
),
|
|
2820
|
+
requirement(
|
|
2821
|
+
"knowledge-assistant",
|
|
2822
|
+
"Knowledge Assistant assertion",
|
|
2823
|
+
"DBX_TEST_KNOWLEDGE_ASSISTANT_ASSERTION_SQL"
|
|
2824
|
+
),
|
|
2825
|
+
requirement("multi-agent", "Multi-agent assertion", "DBX_TEST_MULTI_AGENT_ASSERTION_SQL"),
|
|
2826
|
+
requirement(
|
|
2827
|
+
"responses-api",
|
|
2828
|
+
"Responses API assertion",
|
|
2829
|
+
"DBX_TEST_RESPONSES_API_ASSERTION_SQL"
|
|
2830
|
+
),
|
|
2831
|
+
requirement(
|
|
2832
|
+
"agent-groundedness",
|
|
2833
|
+
"Groundedness assertion",
|
|
2834
|
+
"DBX_TEST_AGENT_GROUNDEDNESS_ASSERTION_SQL"
|
|
2835
|
+
)
|
|
2836
|
+
],
|
|
2837
|
+
docsUrl: `${DOCS2}#knowledge-assistant-multi-agent-and-responses`,
|
|
2838
|
+
certificationScopes: [
|
|
2839
|
+
`${AZURE_M2M_SCOPE}; Databricks preview agent surfaces with durable groundedness evidence`
|
|
2840
|
+
]
|
|
2841
|
+
});
|
|
2842
|
+
}
|
|
2843
|
+
function createAiRuntimeTrainingTargetPack() {
|
|
2844
|
+
return defineTargetPack({
|
|
2845
|
+
id: "ai-runtime-training",
|
|
2846
|
+
name: "AI Runtime training and fine-tuning",
|
|
2847
|
+
description: "AI Runtime training or fine-tuning with MLflow and Unity Catalog model evidence.",
|
|
2848
|
+
version: "1.0.0",
|
|
2849
|
+
maturity: "shipped",
|
|
2850
|
+
capabilities: [
|
|
2851
|
+
"ai-runtime.training",
|
|
2852
|
+
"ai-runtime.fine-tuning",
|
|
2853
|
+
"mlflow.training-evaluation",
|
|
2854
|
+
"models.unity-catalog"
|
|
2855
|
+
],
|
|
2856
|
+
checks: () => [...identityChecks(), aiRuntimeTrainingCheck()],
|
|
2857
|
+
requiredChecks: ["restricted-principal", "ai-runtime-training"],
|
|
2858
|
+
requirements: [
|
|
2859
|
+
workspace,
|
|
2860
|
+
auth,
|
|
2861
|
+
warehouse,
|
|
2862
|
+
requirement("ai-runtime-job", "AI Runtime certification Job", "DBX_TEST_AI_RUNTIME_JOB_ID"),
|
|
2863
|
+
requirement(
|
|
2864
|
+
"ai-runtime-run",
|
|
2865
|
+
"Training-run assertion",
|
|
2866
|
+
"DBX_TEST_AI_RUNTIME_RUN_ASSERTION_SQL"
|
|
2867
|
+
),
|
|
2868
|
+
requirement(
|
|
2869
|
+
"ai-runtime-eval",
|
|
2870
|
+
"Training evaluation assertion",
|
|
2871
|
+
"DBX_TEST_AI_RUNTIME_EVAL_ASSERTION_SQL"
|
|
2872
|
+
),
|
|
2873
|
+
requirement(
|
|
2874
|
+
"ai-runtime-model",
|
|
2875
|
+
"Registered-model assertion",
|
|
2876
|
+
"DBX_TEST_AI_RUNTIME_MODEL_ASSERTION_SQL"
|
|
2877
|
+
)
|
|
2878
|
+
],
|
|
2879
|
+
docsUrl: `${DOCS2}#ai-runtime-training-and-fine-tuning`,
|
|
2880
|
+
certificationScopes: [
|
|
2881
|
+
`${AZURE_M2M_SCOPE}; serverless GPU AI Runtime candidate tracked in MLflow and Unity Catalog`
|
|
2882
|
+
]
|
|
2883
|
+
});
|
|
2884
|
+
}
|
|
2885
|
+
function createLakebaseAutoscalingFeatureStoreTargetPack() {
|
|
2886
|
+
return defineTargetPack({
|
|
2887
|
+
id: "lakebase-autoscaling-features",
|
|
2888
|
+
name: "Lakebase Autoscaling Online Feature Store",
|
|
2889
|
+
description: "Online feature publication, freshness and Feature Serving lookup behavior.",
|
|
2890
|
+
version: "1.0.0",
|
|
2891
|
+
maturity: "shipped",
|
|
2892
|
+
capabilities: [
|
|
2893
|
+
"lakebase.autoscaling",
|
|
2894
|
+
"features.online-store",
|
|
2895
|
+
"features.serving-endpoint",
|
|
2896
|
+
"features.online-freshness"
|
|
2897
|
+
],
|
|
2898
|
+
checks: () => [...identityChecks(), lakebaseAutoscalingFeatureStoreCheck()],
|
|
2899
|
+
requiredChecks: ["restricted-principal", "lakebase-autoscaling-feature-store"],
|
|
2900
|
+
requirements: [
|
|
2901
|
+
workspace,
|
|
2902
|
+
auth,
|
|
2903
|
+
warehouse,
|
|
2904
|
+
requirement(
|
|
2905
|
+
"online-feature-job",
|
|
2906
|
+
"Online Feature Store publication Job",
|
|
2907
|
+
"DBX_TEST_ONLINE_FEATURE_STORE_JOB_ID"
|
|
2908
|
+
),
|
|
2909
|
+
requirement(
|
|
2910
|
+
"online-store",
|
|
2911
|
+
"Online publication assertion",
|
|
2912
|
+
"DBX_TEST_ONLINE_STORE_ASSERTION_SQL"
|
|
2913
|
+
),
|
|
2914
|
+
requirement(
|
|
2915
|
+
"feature-serving",
|
|
2916
|
+
"Feature Serving lookup assertion",
|
|
2917
|
+
"DBX_TEST_FEATURE_SERVING_ASSERTION_SQL"
|
|
2918
|
+
),
|
|
2919
|
+
requirement(
|
|
2920
|
+
"feature-freshness",
|
|
2921
|
+
"Online freshness assertion",
|
|
2922
|
+
"DBX_TEST_ONLINE_FEATURE_FRESHNESS_ASSERTION_SQL"
|
|
2923
|
+
)
|
|
2924
|
+
],
|
|
2925
|
+
docsUrl: `${DOCS2}#lakebase-autoscaling-online-feature-store`,
|
|
2926
|
+
certificationScopes: [
|
|
2927
|
+
`${AZURE_M2M_SCOPE}; Lakebase Autoscaling store and Feature Serving lookup`
|
|
2928
|
+
]
|
|
2929
|
+
});
|
|
2930
|
+
}
|
|
2931
|
+
function createDeclarativeBundlesTargetPack() {
|
|
2932
|
+
return defineTargetPack({
|
|
2933
|
+
id: "declarative-bundles",
|
|
2934
|
+
name: "Declarative Automation Bundles",
|
|
2935
|
+
description: "Bundle validation, exact-candidate deployment, execution provenance and rollback.",
|
|
2936
|
+
version: "1.0.0",
|
|
2937
|
+
maturity: "shipped",
|
|
2938
|
+
capabilities: [
|
|
2939
|
+
"bundles.validation",
|
|
2940
|
+
"bundles.deployment",
|
|
2941
|
+
"bundles.provenance",
|
|
2942
|
+
"bundles.rollback"
|
|
2943
|
+
],
|
|
2944
|
+
checks: () => [...identityChecks(), declarativeBundlesCheck()],
|
|
2945
|
+
requiredChecks: ["restricted-principal", "declarative-bundles"],
|
|
2946
|
+
requirements: [
|
|
2947
|
+
workspace,
|
|
2948
|
+
auth,
|
|
2949
|
+
warehouse,
|
|
2950
|
+
requirement("bundle-job", "Bundle-managed certification Job", "DBX_TEST_BUNDLE_JOB_ID"),
|
|
2951
|
+
requirement(
|
|
2952
|
+
"bundle-provenance",
|
|
2953
|
+
"Deployment provenance assertion",
|
|
2954
|
+
"DBX_TEST_BUNDLE_PROVENANCE_ASSERTION_SQL"
|
|
2955
|
+
),
|
|
2956
|
+
requirement(
|
|
2957
|
+
"bundle-candidate",
|
|
2958
|
+
"Exact-candidate assertion",
|
|
2959
|
+
"DBX_TEST_BUNDLE_CANDIDATE_ASSERTION_SQL"
|
|
2960
|
+
),
|
|
2961
|
+
requirement(
|
|
2962
|
+
"bundle-rollback",
|
|
2963
|
+
"Rollback assertion",
|
|
2964
|
+
"DBX_TEST_BUNDLE_ROLLBACK_ASSERTION_SQL"
|
|
2965
|
+
)
|
|
2966
|
+
],
|
|
2967
|
+
docsUrl: `${DOCS2}#declarative-automation-bundles`,
|
|
2968
|
+
certificationScopes: [
|
|
2969
|
+
`${AZURE_M2M_SCOPE}; validate/deploy/run/rollback lifecycle for an immutable bundle target`
|
|
2970
|
+
]
|
|
2971
|
+
});
|
|
2972
|
+
}
|
|
2973
|
+
function createLakehouseOptimizationTargetPack() {
|
|
2974
|
+
return defineTargetPack({
|
|
2975
|
+
id: "lakehouse-optimization",
|
|
2976
|
+
name: "Lakehouse optimization and Iceberg interoperability",
|
|
2977
|
+
description: "Predictive Optimization, liquid clustering and governed Iceberg interoperability.",
|
|
2978
|
+
version: "1.0.0",
|
|
2979
|
+
maturity: "shipped",
|
|
2980
|
+
capabilities: [
|
|
2981
|
+
"tables.predictive-optimization",
|
|
2982
|
+
"tables.liquid-clustering",
|
|
2983
|
+
"tables.iceberg",
|
|
2984
|
+
"tables.interoperability"
|
|
2985
|
+
],
|
|
2986
|
+
checks: () => [...identityChecks(), lakehouseOptimizationCheck()],
|
|
2987
|
+
requiredChecks: ["restricted-principal", "lakehouse-optimization"],
|
|
2988
|
+
requirements: [
|
|
2989
|
+
workspace,
|
|
2990
|
+
auth,
|
|
2991
|
+
warehouse,
|
|
2992
|
+
requirement(
|
|
2993
|
+
"predictive-optimization",
|
|
2994
|
+
"Predictive Optimization assertion",
|
|
2995
|
+
"DBX_TEST_PREDICTIVE_OPTIMIZATION_ASSERTION_SQL"
|
|
2996
|
+
),
|
|
2997
|
+
requirement(
|
|
2998
|
+
"liquid-clustering",
|
|
2999
|
+
"Liquid clustering assertion",
|
|
3000
|
+
"DBX_TEST_LIQUID_CLUSTERING_ASSERTION_SQL"
|
|
3001
|
+
),
|
|
3002
|
+
requirement(
|
|
3003
|
+
"iceberg-interop",
|
|
3004
|
+
"Iceberg interoperability assertion",
|
|
3005
|
+
"DBX_TEST_ICEBERG_INTEROP_ASSERTION_SQL"
|
|
3006
|
+
)
|
|
3007
|
+
],
|
|
3008
|
+
docsUrl: `${DOCS2}#lakehouse-optimization-and-iceberg`,
|
|
3009
|
+
certificationScopes: [`${AZURE_M2M_SCOPE}; Unity Catalog managed Delta and Iceberg fixtures`]
|
|
3010
|
+
});
|
|
3011
|
+
}
|
|
3012
|
+
function createMarketplaceOpenSharingTargetPack() {
|
|
3013
|
+
return defineTargetPack({
|
|
3014
|
+
id: "marketplace-open-sharing",
|
|
3015
|
+
name: "Marketplace and OpenSharing",
|
|
3016
|
+
description: "Provider listing, recipient access and usable governed data or AI assets.",
|
|
3017
|
+
version: "1.0.0",
|
|
3018
|
+
maturity: "shipped",
|
|
3019
|
+
capabilities: [
|
|
3020
|
+
"marketplace.provider",
|
|
3021
|
+
"marketplace.consumer",
|
|
3022
|
+
"open-sharing.recipient",
|
|
3023
|
+
"marketplace.ai-assets"
|
|
3024
|
+
],
|
|
3025
|
+
checks: () => [...identityChecks(), marketplaceOpenSharingCheck()],
|
|
3026
|
+
requiredChecks: ["restricted-principal", "marketplace-open-sharing"],
|
|
3027
|
+
requirements: [
|
|
3028
|
+
workspace,
|
|
3029
|
+
auth,
|
|
3030
|
+
warehouse,
|
|
3031
|
+
requirement(
|
|
3032
|
+
"marketplace-job",
|
|
3033
|
+
"Marketplace certification Job",
|
|
3034
|
+
"DBX_TEST_MARKETPLACE_JOB_ID"
|
|
3035
|
+
),
|
|
3036
|
+
requirement(
|
|
3037
|
+
"marketplace-listing",
|
|
3038
|
+
"Listing assertion",
|
|
3039
|
+
"DBX_TEST_MARKETPLACE_LISTING_ASSERTION_SQL"
|
|
3040
|
+
),
|
|
3041
|
+
requirement(
|
|
3042
|
+
"open-sharing-recipient",
|
|
3043
|
+
"Recipient assertion",
|
|
3044
|
+
"DBX_TEST_OPEN_SHARING_RECIPIENT_ASSERTION_SQL"
|
|
3045
|
+
),
|
|
3046
|
+
requirement(
|
|
3047
|
+
"marketplace-asset",
|
|
3048
|
+
"Shared asset usability assertion",
|
|
3049
|
+
"DBX_TEST_MARKETPLACE_ASSET_ASSERTION_SQL"
|
|
3050
|
+
)
|
|
3051
|
+
],
|
|
3052
|
+
docsUrl: `${DOCS2}#marketplace-and-opensharing`,
|
|
3053
|
+
certificationScopes: [
|
|
3054
|
+
`${AZURE_M2M_SCOPE}; private listing provider and recipient lifecycle with governed asset access`
|
|
3055
|
+
]
|
|
3056
|
+
});
|
|
3057
|
+
}
|
|
3058
|
+
function createNextTargetPacks() {
|
|
3059
|
+
return [
|
|
3060
|
+
createSemanticAnalyticsTargetPack(),
|
|
3061
|
+
createAiFunctionsBatchInferenceTargetPack(),
|
|
3062
|
+
createAgentOrchestrationTargetPack(),
|
|
3063
|
+
createAiRuntimeTrainingTargetPack(),
|
|
3064
|
+
createLakebaseAutoscalingFeatureStoreTargetPack(),
|
|
3065
|
+
createDeclarativeBundlesTargetPack(),
|
|
3066
|
+
createLakehouseOptimizationTargetPack(),
|
|
3067
|
+
createMarketplaceOpenSharingTargetPack()
|
|
3068
|
+
];
|
|
3069
|
+
}
|
|
3070
|
+
|
|
2497
3071
|
// src/advanced-workload-checks.ts
|
|
3072
|
+
init_workspace_client();
|
|
2498
3073
|
init_workspace_context();
|
|
2499
3074
|
var DatabricksAdvancedWorkloadsAdapter = class {
|
|
2500
3075
|
constructor(client) {
|
|
@@ -2568,6 +3143,15 @@ var DatabricksAdvancedWorkloadsAdapter = class {
|
|
|
2568
3143
|
warehouse(id) {
|
|
2569
3144
|
return this.client.get(`/api/2.0/sql/warehouses/${segment(id)}`);
|
|
2570
3145
|
}
|
|
3146
|
+
app(name) {
|
|
3147
|
+
return this.client.get(`/api/2.0/apps/${segment(name)}`);
|
|
3148
|
+
}
|
|
3149
|
+
agentService(fullName) {
|
|
3150
|
+
return this.client.get(`/api/2.1/unity-catalog/agent-services/${segment(fullName)}`);
|
|
3151
|
+
}
|
|
3152
|
+
agentServicePermissions(fullName) {
|
|
3153
|
+
return this.client.get(`/api/2.1/unity-catalog/permissions/AGENT_SERVICE/${segment(fullName)}`);
|
|
3154
|
+
}
|
|
2571
3155
|
};
|
|
2572
3156
|
function segment(value) {
|
|
2573
3157
|
return encodeURIComponent(value);
|
|
@@ -2578,9 +3162,9 @@ function adapter(client) {
|
|
|
2578
3162
|
function required2(env, names) {
|
|
2579
3163
|
return names.filter((name) => !env[name]?.trim());
|
|
2580
3164
|
}
|
|
2581
|
-
function
|
|
2582
|
-
const
|
|
2583
|
-
if (
|
|
3165
|
+
function requireEnv2(env, names) {
|
|
3166
|
+
const missing2 = required2(env, names);
|
|
3167
|
+
if (missing2.length > 0) throw new Error(`Missing required configuration: ${missing2.join(", ")}`);
|
|
2584
3168
|
}
|
|
2585
3169
|
function parseJson(value, name) {
|
|
2586
3170
|
if (!value) return void 0;
|
|
@@ -2614,6 +3198,27 @@ async function booleanSql(label, sql, query) {
|
|
|
2614
3198
|
throw new Error(`${label} assertion did not return a truthy first column`);
|
|
2615
3199
|
}
|
|
2616
3200
|
}
|
|
3201
|
+
async function runCertificationJob(label, jobIdValue, env, client, options = {}) {
|
|
3202
|
+
const jobId = Number(jobIdValue);
|
|
3203
|
+
if (!Number.isSafeInteger(jobId) || jobId <= 0) {
|
|
3204
|
+
throw new Error(`${label} job id must be a positive integer`);
|
|
3205
|
+
}
|
|
3206
|
+
const submitted = await client.post("/api/2.1/jobs/run-now", {
|
|
3207
|
+
job_id: jobId
|
|
3208
|
+
});
|
|
3209
|
+
if (!Number.isSafeInteger(submitted.run_id)) {
|
|
3210
|
+
throw new Error(`${label} certification job returned no run_id`);
|
|
3211
|
+
}
|
|
3212
|
+
const run = await waitForDatabricksRun(client, submitted.run_id, {
|
|
3213
|
+
timeoutMs: options.timeoutMs ?? Number(env.DBX_TEST_TIMEOUT_MS ?? 9e5),
|
|
3214
|
+
pollIntervalMs: Number(env.DBX_TEST_POLL_INTERVAL_MS ?? 1e4)
|
|
3215
|
+
});
|
|
3216
|
+
const result = run.state?.result_state;
|
|
3217
|
+
if (result !== "SUCCESS") {
|
|
3218
|
+
throw new Error(`${label} certification job ${jobId} ended in ${result ?? "UNKNOWN"}`);
|
|
3219
|
+
}
|
|
3220
|
+
return { jobId, runId: submitted.run_id };
|
|
3221
|
+
}
|
|
2617
3222
|
function advancedStreamingCdcCheck() {
|
|
2618
3223
|
const names = [
|
|
2619
3224
|
"DBX_TEST_STREAMING_PIPELINE_ID",
|
|
@@ -2625,8 +3230,8 @@ function advancedStreamingCdcCheck() {
|
|
|
2625
3230
|
id: "streaming-cdc",
|
|
2626
3231
|
description: "Streaming pipeline, streaming table and CDC assertions are healthy",
|
|
2627
3232
|
configured: (env) => required2(env, names).length === 0,
|
|
2628
|
-
async run({ env, client, warehouse:
|
|
2629
|
-
|
|
3233
|
+
async run({ env, client, warehouse: warehouse3 }) {
|
|
3234
|
+
requireEnv2(env, names);
|
|
2630
3235
|
const api = adapter(client);
|
|
2631
3236
|
const pipeline = await api.pipeline(env.DBX_TEST_STREAMING_PIPELINE_ID);
|
|
2632
3237
|
assertNotFailed("Streaming pipeline", pipeline.state);
|
|
@@ -2635,11 +3240,11 @@ function advancedStreamingCdcCheck() {
|
|
|
2635
3240
|
if (!["STREAMING_TABLE", "MATERIALIZED_VIEW", "DELTA"].includes(tableType)) {
|
|
2636
3241
|
throw new Error(`Streaming target has unsupported table type ${tableType || "UNKNOWN"}`);
|
|
2637
3242
|
}
|
|
2638
|
-
await booleanSql("CDC", env.DBX_TEST_CDC_ASSERTION_SQL,
|
|
3243
|
+
await booleanSql("CDC", env.DBX_TEST_CDC_ASSERTION_SQL, warehouse3.query);
|
|
2639
3244
|
await booleanSql(
|
|
2640
3245
|
"Streaming freshness",
|
|
2641
3246
|
env.DBX_TEST_STREAMING_ASSERTION_SQL,
|
|
2642
|
-
|
|
3247
|
+
warehouse3.query
|
|
2643
3248
|
);
|
|
2644
3249
|
return { pipelineId: pipeline.pipeline_id, table: env.DBX_TEST_STREAMING_TABLE, tableType };
|
|
2645
3250
|
}
|
|
@@ -2651,8 +3256,8 @@ function lakeflowConnectCheck() {
|
|
|
2651
3256
|
id: "lakeflow-connect",
|
|
2652
3257
|
description: "Lakeflow Connect ingestion pipeline exists and is not failed",
|
|
2653
3258
|
configured: (env) => required2(env, names).length === 0,
|
|
2654
|
-
async run({ env, client, warehouse:
|
|
2655
|
-
|
|
3259
|
+
async run({ env, client, warehouse: warehouse3 }) {
|
|
3260
|
+
requireEnv2(env, names);
|
|
2656
3261
|
const id = env.DBX_TEST_CONNECT_PIPELINE_ID;
|
|
2657
3262
|
const pipeline = await adapter(client).pipeline(id);
|
|
2658
3263
|
assertNotFailed("Lakeflow Connect pipeline", pipeline.state);
|
|
@@ -2663,7 +3268,7 @@ function lakeflowConnectCheck() {
|
|
|
2663
3268
|
await booleanSql(
|
|
2664
3269
|
"Lakeflow Connect replication",
|
|
2665
3270
|
env.DBX_TEST_CONNECT_ASSERTION_SQL,
|
|
2666
|
-
|
|
3271
|
+
warehouse3.query
|
|
2667
3272
|
);
|
|
2668
3273
|
return {
|
|
2669
3274
|
pipelineId: pipeline.pipeline_id ?? id,
|
|
@@ -2703,7 +3308,7 @@ function genieCheck() {
|
|
|
2703
3308
|
description: "Genie space is accessible and can optionally start a grounded conversation",
|
|
2704
3309
|
configured: (env) => required2(env, names).length === 0,
|
|
2705
3310
|
async run({ env, client }) {
|
|
2706
|
-
|
|
3311
|
+
requireEnv2(env, names);
|
|
2707
3312
|
const api = adapter(client);
|
|
2708
3313
|
const id = env.DBX_TEST_GENIE_SPACE_ID;
|
|
2709
3314
|
const space = await api.genieSpace(id);
|
|
@@ -2733,7 +3338,7 @@ function mlflowLifecycleCheck() {
|
|
|
2733
3338
|
description: "MLflow experiment and Unity Catalog model version are accessible",
|
|
2734
3339
|
configured: (env) => required2(env, names).length === 0,
|
|
2735
3340
|
async run({ env, client }) {
|
|
2736
|
-
|
|
3341
|
+
requireEnv2(env, names);
|
|
2737
3342
|
const api = adapter(client);
|
|
2738
3343
|
const experiment = await api.experiment(env.DBX_TEST_MLFLOW_EXPERIMENT_ID);
|
|
2739
3344
|
const model = await api.registeredModel(env.DBX_TEST_REGISTERED_MODEL);
|
|
@@ -2757,8 +3362,8 @@ function featureEngineeringServingCheck() {
|
|
|
2757
3362
|
configured: (env) => Boolean(
|
|
2758
3363
|
env.DBX_TEST_FEATURE_TABLE && env.DBX_TEST_FEATURE_ASSERTION_SQL && (env.DBX_TEST_ONLINE_TABLE || env.DBX_TEST_FEATURE_SERVING_PIPELINE_ID)
|
|
2759
3364
|
),
|
|
2760
|
-
async run({ env, client, warehouse:
|
|
2761
|
-
|
|
3365
|
+
async run({ env, client, warehouse: warehouse3 }) {
|
|
3366
|
+
requireEnv2(env, ["DBX_TEST_FEATURE_TABLE"]);
|
|
2762
3367
|
if (!env.DBX_TEST_ONLINE_TABLE && !env.DBX_TEST_FEATURE_SERVING_PIPELINE_ID) {
|
|
2763
3368
|
throw new Error(
|
|
2764
3369
|
"Feature serving requires DBX_TEST_ONLINE_TABLE or DBX_TEST_FEATURE_SERVING_PIPELINE_ID"
|
|
@@ -2781,7 +3386,7 @@ function featureEngineeringServingCheck() {
|
|
|
2781
3386
|
assertNotFailed("Synced Table pipeline", state);
|
|
2782
3387
|
servingResource = pipeline.pipeline_id ?? pipelineId;
|
|
2783
3388
|
}
|
|
2784
|
-
await booleanSql("Feature freshness", env.DBX_TEST_FEATURE_ASSERTION_SQL,
|
|
3389
|
+
await booleanSql("Feature freshness", env.DBX_TEST_FEATURE_ASSERTION_SQL, warehouse3.query);
|
|
2785
3390
|
return {
|
|
2786
3391
|
featureTable: source.full_name ?? env.DBX_TEST_FEATURE_TABLE,
|
|
2787
3392
|
servingResource,
|
|
@@ -2801,7 +3406,7 @@ function modelServingCheck() {
|
|
|
2801
3406
|
description: "Model Serving endpoint is ready and can optionally serve an inference request",
|
|
2802
3407
|
configured: (env) => required2(env, names).length === 0,
|
|
2803
3408
|
async run({ env, client }) {
|
|
2804
|
-
|
|
3409
|
+
requireEnv2(env, names);
|
|
2805
3410
|
if (env.DBX_TEST_AI_GATEWAY_REQUIRED !== "1") {
|
|
2806
3411
|
throw new Error("DBX_TEST_AI_GATEWAY_REQUIRED must be 1 for the Model Serving target pack");
|
|
2807
3412
|
}
|
|
@@ -2837,7 +3442,7 @@ function evalJudgeModelServingCheck() {
|
|
|
2837
3442
|
description: "Databricks Model Serving satisfies the deterministic evaluator chat contract",
|
|
2838
3443
|
configured: (env) => required2(env, names).length === 0,
|
|
2839
3444
|
async run({ env, client }) {
|
|
2840
|
-
|
|
3445
|
+
requireEnv2(env, names);
|
|
2841
3446
|
const api = adapter(client);
|
|
2842
3447
|
const name = env.DBX_TEST_EVAL_SERVING_ENDPOINT;
|
|
2843
3448
|
const endpoint = await api.servingEndpoint(name);
|
|
@@ -2877,7 +3482,7 @@ function vectorSearchCheck() {
|
|
|
2877
3482
|
description: "Vector Search endpoint and index are online",
|
|
2878
3483
|
configured: (env) => required2(env, names).length === 0,
|
|
2879
3484
|
async run({ env, client }) {
|
|
2880
|
-
|
|
3485
|
+
requireEnv2(env, names);
|
|
2881
3486
|
const api = adapter(client);
|
|
2882
3487
|
const endpoint = await api.vectorSearchEndpoint(env.DBX_TEST_VECTOR_ENDPOINT);
|
|
2883
3488
|
assertReady("Vector Search endpoint", endpoint.endpoint_status?.state, ["ONLINE", "READY"]);
|
|
@@ -2904,7 +3509,7 @@ function ragAgentCheck() {
|
|
|
2904
3509
|
description: "RAG retrieval and agent serving endpoint return non-empty responses",
|
|
2905
3510
|
configured: (env) => required2(env, names).length === 0,
|
|
2906
3511
|
async run({ env, client }) {
|
|
2907
|
-
|
|
3512
|
+
requireEnv2(env, names);
|
|
2908
3513
|
const api = adapter(client);
|
|
2909
3514
|
let retrieval;
|
|
2910
3515
|
if (env.DBX_TEST_VECTOR_QUERY_JSON) {
|
|
@@ -2948,13 +3553,13 @@ function federationSharingCleanRoomsCheck() {
|
|
|
2948
3553
|
id: "federation-sharing-cleanrooms",
|
|
2949
3554
|
description: "Lakehouse Federation connection, Delta Share and Clean Room are accessible",
|
|
2950
3555
|
configured: (env) => required2(env, names).length === 0,
|
|
2951
|
-
async run({ env, client, warehouse:
|
|
2952
|
-
|
|
3556
|
+
async run({ env, client, warehouse: warehouse3 }) {
|
|
3557
|
+
requireEnv2(env, names);
|
|
2953
3558
|
const api = adapter(client);
|
|
2954
3559
|
const connection = await api.connection(env.DBX_TEST_CONNECTION);
|
|
2955
3560
|
const share = await api.share(env.DBX_TEST_SHARE);
|
|
2956
3561
|
const room = await api.cleanRoom(env.DBX_TEST_CLEAN_ROOM);
|
|
2957
|
-
await booleanSql("Federated query", env.DBX_TEST_FEDERATION_ASSERTION_SQL,
|
|
3562
|
+
await booleanSql("Federated query", env.DBX_TEST_FEDERATION_ASSERTION_SQL, warehouse3.query);
|
|
2958
3563
|
return {
|
|
2959
3564
|
connection: connection.name ?? env.DBX_TEST_CONNECTION,
|
|
2960
3565
|
share: share.name ?? env.DBX_TEST_SHARE,
|
|
@@ -2973,8 +3578,8 @@ function securityPostureCostCheck() {
|
|
|
2973
3578
|
id: "security-cost",
|
|
2974
3579
|
description: "Network access controls, compute policy and cost guardrail are enforced",
|
|
2975
3580
|
configured: (env) => required2(env, names).length === 0,
|
|
2976
|
-
async run({ env, client, warehouse:
|
|
2977
|
-
|
|
3581
|
+
async run({ env, client, warehouse: warehouse3 }) {
|
|
3582
|
+
requireEnv2(env, names);
|
|
2978
3583
|
const api = adapter(client);
|
|
2979
3584
|
const access = await api.ipAccessList(env.DBX_TEST_IP_ACCESS_LIST_ID);
|
|
2980
3585
|
if (access.enabled === false) throw new Error("Configured IP access list is disabled");
|
|
@@ -2984,7 +3589,7 @@ function securityPostureCostCheck() {
|
|
|
2984
3589
|
if (env.DBX_TEST_EXPECT_HOST_SUFFIX && !env.DATABRICKS_HOST?.endsWith(env.DBX_TEST_EXPECT_HOST_SUFFIX)) {
|
|
2985
3590
|
throw new Error(`Workspace host does not end with ${env.DBX_TEST_EXPECT_HOST_SUFFIX}`);
|
|
2986
3591
|
}
|
|
2987
|
-
await booleanSql("Cost guardrail", env.DBX_TEST_COST_ASSERTION_SQL,
|
|
3592
|
+
await booleanSql("Cost guardrail", env.DBX_TEST_COST_ASSERTION_SQL, warehouse3.query);
|
|
2988
3593
|
return {
|
|
2989
3594
|
ipAccessList: access.list_id ?? env.DBX_TEST_IP_ACCESS_LIST_ID,
|
|
2990
3595
|
policy: policy.policy_id ?? policy.name,
|
|
@@ -2993,6 +3598,201 @@ function securityPostureCostCheck() {
|
|
|
2993
3598
|
}
|
|
2994
3599
|
};
|
|
2995
3600
|
}
|
|
3601
|
+
function mlflow3GenAiQualityCheck() {
|
|
3602
|
+
const names = [
|
|
3603
|
+
"DBX_TEST_MLFLOW3_JOB_ID",
|
|
3604
|
+
"DBX_TEST_MLFLOW3_TRACE_ASSERTION_SQL",
|
|
3605
|
+
"DBX_TEST_MLFLOW3_EVAL_ASSERTION_SQL",
|
|
3606
|
+
"DBX_TEST_MLFLOW3_SCORER_ASSERTION_SQL",
|
|
3607
|
+
"DBX_TEST_MLFLOW3_MONITOR_ASSERTION_SQL",
|
|
3608
|
+
"DBX_TEST_AI_SEARCH_EVAL_ASSERTION_SQL"
|
|
3609
|
+
];
|
|
3610
|
+
return {
|
|
3611
|
+
id: "mlflow3-genai-quality",
|
|
3612
|
+
description: "MLflow 3 tracing, offline agent evaluation and production scorer monitoring produce durable evidence",
|
|
3613
|
+
configured: (env) => required2(env, names).length === 0,
|
|
3614
|
+
async run({ env, client, warehouse: warehouse3 }) {
|
|
3615
|
+
requireEnv2(env, names);
|
|
3616
|
+
const job = await runCertificationJob(
|
|
3617
|
+
"MLflow 3 GenAI",
|
|
3618
|
+
env.DBX_TEST_MLFLOW3_JOB_ID,
|
|
3619
|
+
env,
|
|
3620
|
+
client,
|
|
3621
|
+
{ timeoutMs: Number(env.DBX_TEST_MLFLOW3_TIMEOUT_MS ?? 72e5) }
|
|
3622
|
+
);
|
|
3623
|
+
await booleanSql("MLflow 3 trace", env.DBX_TEST_MLFLOW3_TRACE_ASSERTION_SQL, warehouse3.query);
|
|
3624
|
+
await booleanSql(
|
|
3625
|
+
"MLflow 3 offline evaluation",
|
|
3626
|
+
env.DBX_TEST_MLFLOW3_EVAL_ASSERTION_SQL,
|
|
3627
|
+
warehouse3.query
|
|
3628
|
+
);
|
|
3629
|
+
await booleanSql(
|
|
3630
|
+
"MLflow 3 production scorer lifecycle",
|
|
3631
|
+
env.DBX_TEST_MLFLOW3_SCORER_ASSERTION_SQL,
|
|
3632
|
+
warehouse3.query
|
|
3633
|
+
);
|
|
3634
|
+
await booleanSql(
|
|
3635
|
+
"MLflow 3 production monitoring",
|
|
3636
|
+
env.DBX_TEST_MLFLOW3_MONITOR_ASSERTION_SQL,
|
|
3637
|
+
warehouse3.query
|
|
3638
|
+
);
|
|
3639
|
+
await booleanSql(
|
|
3640
|
+
"AI Search retrieval quality",
|
|
3641
|
+
env.DBX_TEST_AI_SEARCH_EVAL_ASSERTION_SQL,
|
|
3642
|
+
warehouse3.query
|
|
3643
|
+
);
|
|
3644
|
+
return {
|
|
3645
|
+
...job,
|
|
3646
|
+
traces: true,
|
|
3647
|
+
offlineEvaluation: true,
|
|
3648
|
+
scorerLifecycle: true,
|
|
3649
|
+
monitor: true,
|
|
3650
|
+
aiSearchEvaluation: true
|
|
3651
|
+
};
|
|
3652
|
+
}
|
|
3653
|
+
};
|
|
3654
|
+
}
|
|
3655
|
+
function agentEvaluationPipelineCheck() {
|
|
3656
|
+
const names = ["DBX_TEST_AGENT_EVAL_E2E_JOB_ID", "DBX_TEST_AGENT_EVAL_ASSERTION_SQL"];
|
|
3657
|
+
return {
|
|
3658
|
+
id: "agent-evaluation-pipeline",
|
|
3659
|
+
description: "Experiments API, outbox, Temporal worker, Model Serving judge, SQL score sink and Quality completion execute end to end",
|
|
3660
|
+
configured: (env) => required2(env, names).length === 0,
|
|
3661
|
+
async run({ env, client, warehouse: warehouse3 }) {
|
|
3662
|
+
requireEnv2(env, names);
|
|
3663
|
+
const job = await runCertificationJob(
|
|
3664
|
+
"Agent evaluation end-to-end",
|
|
3665
|
+
env.DBX_TEST_AGENT_EVAL_E2E_JOB_ID,
|
|
3666
|
+
env,
|
|
3667
|
+
client
|
|
3668
|
+
);
|
|
3669
|
+
await booleanSql(
|
|
3670
|
+
"Agent evaluation terminal Quality evidence",
|
|
3671
|
+
env.DBX_TEST_AGENT_EVAL_ASSERTION_SQL,
|
|
3672
|
+
warehouse3.query
|
|
3673
|
+
);
|
|
3674
|
+
return { ...job, api: true, outbox: true, temporal: true, judged: true, persisted: true };
|
|
3675
|
+
}
|
|
3676
|
+
};
|
|
3677
|
+
}
|
|
3678
|
+
function managedMcpAgentsCheck() {
|
|
3679
|
+
const names = [
|
|
3680
|
+
"DBX_TEST_MCP_JOB_ID",
|
|
3681
|
+
"DBX_TEST_MCP_MANAGED_ASSERTION_SQL",
|
|
3682
|
+
"DBX_TEST_MCP_SERVICE_ASSERTION_SQL",
|
|
3683
|
+
"DBX_TEST_MCP_DENY_ASSERTION_SQL"
|
|
3684
|
+
];
|
|
3685
|
+
return {
|
|
3686
|
+
id: "managed-mcp-agents",
|
|
3687
|
+
description: "Managed MCP and Unity Catalog MCP Services support list, call and deny behavior",
|
|
3688
|
+
configured: (env) => required2(env, names).length === 0,
|
|
3689
|
+
async run({ env, client, warehouse: warehouse3 }) {
|
|
3690
|
+
requireEnv2(env, names);
|
|
3691
|
+
const job = await runCertificationJob("Databricks MCP", env.DBX_TEST_MCP_JOB_ID, env, client);
|
|
3692
|
+
await booleanSql(
|
|
3693
|
+
"Managed MCP list/call",
|
|
3694
|
+
env.DBX_TEST_MCP_MANAGED_ASSERTION_SQL,
|
|
3695
|
+
warehouse3.query
|
|
3696
|
+
);
|
|
3697
|
+
await booleanSql(
|
|
3698
|
+
"Unity Catalog MCP Service list/call",
|
|
3699
|
+
env.DBX_TEST_MCP_SERVICE_ASSERTION_SQL,
|
|
3700
|
+
warehouse3.query
|
|
3701
|
+
);
|
|
3702
|
+
await booleanSql(
|
|
3703
|
+
"MCP excluded-tool denial",
|
|
3704
|
+
env.DBX_TEST_MCP_DENY_ASSERTION_SQL,
|
|
3705
|
+
warehouse3.query
|
|
3706
|
+
);
|
|
3707
|
+
return { ...job, managedServer: true, mcpService: true, denyControl: true };
|
|
3708
|
+
}
|
|
3709
|
+
};
|
|
3710
|
+
}
|
|
3711
|
+
function dataQualityAppTelemetryCheck() {
|
|
3712
|
+
const names = [
|
|
3713
|
+
"DBX_TEST_TELEMETRY_APP_NAME",
|
|
3714
|
+
"DBX_TEST_DQM_ASSERTION_SQL",
|
|
3715
|
+
"DBX_TEST_APP_LOGS_ASSERTION_SQL",
|
|
3716
|
+
"DBX_TEST_APP_SPANS_ASSERTION_SQL",
|
|
3717
|
+
"DBX_TEST_APP_METRICS_ASSERTION_SQL"
|
|
3718
|
+
];
|
|
3719
|
+
return {
|
|
3720
|
+
id: "data-quality-app-telemetry",
|
|
3721
|
+
description: "Unity Catalog data quality monitoring and Databricks Apps logs, spans and metrics are current",
|
|
3722
|
+
configured: (env) => required2(env, names).length === 0,
|
|
3723
|
+
async run({ env, client, warehouse: warehouse3 }) {
|
|
3724
|
+
requireEnv2(env, names);
|
|
3725
|
+
const appName = env.DBX_TEST_TELEMETRY_APP_NAME;
|
|
3726
|
+
const app = await adapter(client).app(appName);
|
|
3727
|
+
const destinations = Array.isArray(app.telemetry_export_destinations) ? app.telemetry_export_destinations : [];
|
|
3728
|
+
const unityCatalog = destinations.find(
|
|
3729
|
+
(destination) => isObject(destination) && isObject(destination.unity_catalog)
|
|
3730
|
+
);
|
|
3731
|
+
if (!isObject(unityCatalog) || !isObject(unityCatalog.unity_catalog)) {
|
|
3732
|
+
throw new Error(`Databricks App ${appName} has no Unity Catalog telemetry destination`);
|
|
3733
|
+
}
|
|
3734
|
+
const tables = unityCatalog.unity_catalog;
|
|
3735
|
+
for (const field of ["logs_table", "traces_table", "metrics_table"]) {
|
|
3736
|
+
if (typeof tables[field] !== "string" || !tables[field]) {
|
|
3737
|
+
throw new Error(`Databricks App ${appName} telemetry destination has no ${field}`);
|
|
3738
|
+
}
|
|
3739
|
+
}
|
|
3740
|
+
await booleanSql("Data Quality Monitoring", env.DBX_TEST_DQM_ASSERTION_SQL, warehouse3.query);
|
|
3741
|
+
await booleanSql("App logs", env.DBX_TEST_APP_LOGS_ASSERTION_SQL, warehouse3.query);
|
|
3742
|
+
await booleanSql("App spans", env.DBX_TEST_APP_SPANS_ASSERTION_SQL, warehouse3.query);
|
|
3743
|
+
await booleanSql("App metrics", env.DBX_TEST_APP_METRICS_ASSERTION_SQL, warehouse3.query);
|
|
3744
|
+
return { app: appName, unityCatalogTelemetry: true, dataQualityMonitoring: true };
|
|
3745
|
+
}
|
|
3746
|
+
};
|
|
3747
|
+
}
|
|
3748
|
+
function agentServicesEnrollmentCheck() {
|
|
3749
|
+
const names = [
|
|
3750
|
+
"DBX_TEST_AGENT_SERVICE_FULL_NAME",
|
|
3751
|
+
"DBX_TEST_AGENT_SERVICE_CONNECTION",
|
|
3752
|
+
"DBX_TEST_AGENT_SERVICE_EXECUTE_PRINCIPAL"
|
|
3753
|
+
];
|
|
3754
|
+
return {
|
|
3755
|
+
id: "agent-services-enrollment",
|
|
3756
|
+
description: "A customer-owned Harness agent is registered as an external Unity Catalog Agent Service with governed access",
|
|
3757
|
+
configured: (env) => required2(env, names).length === 0,
|
|
3758
|
+
async run({ env, client }) {
|
|
3759
|
+
requireEnv2(env, names);
|
|
3760
|
+
const fullName = env.DBX_TEST_AGENT_SERVICE_FULL_NAME;
|
|
3761
|
+
const api = adapter(client);
|
|
3762
|
+
const service = await api.agentService(fullName);
|
|
3763
|
+
if (service.agent_service_type !== "AGENT_SERVICE_TYPE_EXTERNAL") {
|
|
3764
|
+
throw new Error(`${fullName} is not an external Agent Service`);
|
|
3765
|
+
}
|
|
3766
|
+
const expectedConnection = env.DBX_TEST_AGENT_SERVICE_CONNECTION;
|
|
3767
|
+
const actualConnection = service.config?.connection?.name ?? "";
|
|
3768
|
+
if (actualConnection !== expectedConnection && actualConnection.split("/").at(-1) !== expectedConnection) {
|
|
3769
|
+
throw new Error(`${fullName} uses unexpected connection ${actualConnection || "UNKNOWN"}`);
|
|
3770
|
+
}
|
|
3771
|
+
if (!service.config?.base_path?.startsWith("/")) {
|
|
3772
|
+
throw new Error(`${fullName} has no absolute external base path`);
|
|
3773
|
+
}
|
|
3774
|
+
const permissions = await api.agentServicePermissions(fullName);
|
|
3775
|
+
const assignments = Array.isArray(permissions.privilege_assignments) ? permissions.privilege_assignments : [];
|
|
3776
|
+
const expectedPrincipal = env.DBX_TEST_AGENT_SERVICE_EXECUTE_PRINCIPAL;
|
|
3777
|
+
const assignment = assignments.find(
|
|
3778
|
+
(entry) => isObject(entry) && entry.principal === expectedPrincipal
|
|
3779
|
+
);
|
|
3780
|
+
const privileges = isObject(assignment) && Array.isArray(assignment.privileges) ? assignment.privileges : [];
|
|
3781
|
+
const canExecute = privileges.some(
|
|
3782
|
+
(privilege) => isObject(privilege) && privilege.privilege === "EXECUTE"
|
|
3783
|
+
);
|
|
3784
|
+
if (!canExecute) {
|
|
3785
|
+
throw new Error(`${expectedPrincipal} does not have EXECUTE on ${fullName}`);
|
|
3786
|
+
}
|
|
3787
|
+
return {
|
|
3788
|
+
fullName: service.full_name ?? service.name ?? fullName,
|
|
3789
|
+
connection: actualConnection,
|
|
3790
|
+
executePrincipal: expectedPrincipal,
|
|
3791
|
+
runtimeInvocationAvailable: false
|
|
3792
|
+
};
|
|
3793
|
+
}
|
|
3794
|
+
};
|
|
3795
|
+
}
|
|
2996
3796
|
function regionalDrCheck(options = {}) {
|
|
2997
3797
|
const names = [
|
|
2998
3798
|
"DBX_TEST_DR_HOST",
|
|
@@ -3004,7 +3804,7 @@ function regionalDrCheck(options = {}) {
|
|
|
3004
3804
|
description: "Secondary-region workspace authentication and SQL warehouse are reachable",
|
|
3005
3805
|
configured: (env) => required2(env, names).length === 0,
|
|
3006
3806
|
async run({ env }) {
|
|
3007
|
-
|
|
3807
|
+
requireEnv2(env, names);
|
|
3008
3808
|
const drEnv = {
|
|
3009
3809
|
...env,
|
|
3010
3810
|
DATABRICKS_HOST: env.DBX_TEST_DR_HOST,
|
|
@@ -3034,14 +3834,14 @@ function regionalDrCheck(options = {}) {
|
|
|
3034
3834
|
}
|
|
3035
3835
|
|
|
3036
3836
|
// src/advanced-target-packs.ts
|
|
3037
|
-
var
|
|
3038
|
-
var
|
|
3039
|
-
var
|
|
3837
|
+
var DOCS3 = "https://experiments.fabric.pro/docs/testing/target-packs/";
|
|
3838
|
+
var AZURE_M2M_SCOPE2 = "Azure Databricks, dedicated service principal using OAuth M2M, public network path; named managed or disposable certification fixtures";
|
|
3839
|
+
var workspace2 = {
|
|
3040
3840
|
id: "workspace",
|
|
3041
3841
|
description: "Databricks workspace host",
|
|
3042
3842
|
anyOf: ["DATABRICKS_HOST"]
|
|
3043
3843
|
};
|
|
3044
|
-
var
|
|
3844
|
+
var auth2 = {
|
|
3045
3845
|
id: "authentication",
|
|
3046
3846
|
description: "Databricks OAuth, OIDC, bearer, or PAT authentication",
|
|
3047
3847
|
anyOf: [
|
|
@@ -3053,12 +3853,12 @@ var auth = {
|
|
|
3053
3853
|
],
|
|
3054
3854
|
secret: true
|
|
3055
3855
|
};
|
|
3056
|
-
var
|
|
3856
|
+
var warehouse2 = {
|
|
3057
3857
|
id: "warehouse",
|
|
3058
3858
|
description: "SQL warehouse for data-plane assertions",
|
|
3059
3859
|
anyOf: ["DATABRICKS_WAREHOUSE_ID", "DATABRICKS_HTTP_PATH"]
|
|
3060
3860
|
};
|
|
3061
|
-
var
|
|
3861
|
+
var requirement2 = (id, description, ...anyOf) => ({
|
|
3062
3862
|
id,
|
|
3063
3863
|
description,
|
|
3064
3864
|
anyOf
|
|
@@ -3077,33 +3877,33 @@ function createAdvancedStreamingTargetPack() {
|
|
|
3077
3877
|
"lakeflow-connect.replication"
|
|
3078
3878
|
],
|
|
3079
3879
|
checks: () => [restrictedPrincipalCheck(), advancedStreamingCdcCheck(), lakeflowConnectCheck()],
|
|
3080
|
-
requiredChecks: ["streaming-cdc", "lakeflow-connect"],
|
|
3880
|
+
requiredChecks: ["restricted-principal", "streaming-cdc", "lakeflow-connect"],
|
|
3081
3881
|
requirements: [
|
|
3082
|
-
|
|
3083
|
-
|
|
3084
|
-
|
|
3085
|
-
|
|
3086
|
-
|
|
3087
|
-
|
|
3882
|
+
workspace2,
|
|
3883
|
+
auth2,
|
|
3884
|
+
warehouse2,
|
|
3885
|
+
requirement2("streaming-pipeline", "Streaming pipeline ID", "DBX_TEST_STREAMING_PIPELINE_ID"),
|
|
3886
|
+
requirement2("streaming-table", "Streaming target table", "DBX_TEST_STREAMING_TABLE"),
|
|
3887
|
+
requirement2(
|
|
3088
3888
|
"connect-pipeline",
|
|
3089
3889
|
"Lakeflow Connect ingestion pipeline",
|
|
3090
3890
|
"DBX_TEST_CONNECT_PIPELINE_ID"
|
|
3091
3891
|
),
|
|
3092
|
-
|
|
3892
|
+
requirement2(
|
|
3093
3893
|
"streaming-assertion",
|
|
3094
3894
|
"Streaming freshness SQL",
|
|
3095
3895
|
"DBX_TEST_STREAMING_ASSERTION_SQL"
|
|
3096
3896
|
),
|
|
3097
|
-
|
|
3098
|
-
|
|
3897
|
+
requirement2("cdc-assertion", "CDC correctness SQL", "DBX_TEST_CDC_ASSERTION_SQL"),
|
|
3898
|
+
requirement2(
|
|
3099
3899
|
"connect-assertion",
|
|
3100
3900
|
"Lakeflow Connect replication SQL",
|
|
3101
3901
|
"DBX_TEST_CONNECT_ASSERTION_SQL"
|
|
3102
3902
|
)
|
|
3103
3903
|
],
|
|
3104
|
-
docsUrl: `${
|
|
3904
|
+
docsUrl: `${DOCS3}#advanced-streaming-cdc-and-lakeflow-connect`,
|
|
3105
3905
|
certificationScopes: [
|
|
3106
|
-
`${
|
|
3906
|
+
`${AZURE_M2M_SCOPE2}; serverless Lakeflow pipeline AUTO CDC and query-based PostgreSQL foreign-catalog ingestion`
|
|
3107
3907
|
]
|
|
3108
3908
|
});
|
|
3109
3909
|
}
|
|
@@ -3116,21 +3916,21 @@ function createAiBiGenieTargetPack() {
|
|
|
3116
3916
|
maturity: "live-gated",
|
|
3117
3917
|
capabilities: ["aibi.dashboard", "genie.space", "genie.conversation"],
|
|
3118
3918
|
checks: () => [restrictedPrincipalCheck(), aiBiDashboardCheck(), genieCheck()],
|
|
3119
|
-
requiredChecks: ["aibi-dashboard", "genie"],
|
|
3919
|
+
requiredChecks: ["restricted-principal", "aibi-dashboard", "genie"],
|
|
3120
3920
|
requirements: [
|
|
3121
|
-
|
|
3122
|
-
|
|
3123
|
-
|
|
3124
|
-
|
|
3125
|
-
|
|
3921
|
+
workspace2,
|
|
3922
|
+
auth2,
|
|
3923
|
+
requirement2("dashboard", "AI/BI dashboard ID", "DBX_TEST_DASHBOARD_ID"),
|
|
3924
|
+
requirement2("genie-space", "Genie space ID", "DBX_TEST_GENIE_SPACE_ID"),
|
|
3925
|
+
requirement2(
|
|
3126
3926
|
"genie-question",
|
|
3127
3927
|
"Grounded Genie certification question",
|
|
3128
3928
|
"DBX_TEST_GENIE_QUESTION"
|
|
3129
3929
|
)
|
|
3130
3930
|
],
|
|
3131
|
-
docsUrl: `${
|
|
3931
|
+
docsUrl: `${DOCS3}#aibi-dashboards-and-genie`,
|
|
3132
3932
|
certificationScopes: [
|
|
3133
|
-
`${
|
|
3933
|
+
`${AZURE_M2M_SCOPE2}; published AI/BI dashboard revision and Genie conversation start`
|
|
3134
3934
|
]
|
|
3135
3935
|
});
|
|
3136
3936
|
}
|
|
@@ -3148,21 +3948,21 @@ function createMlflowLifecycleTargetPack() {
|
|
|
3148
3948
|
"models.lifecycle"
|
|
3149
3949
|
],
|
|
3150
3950
|
checks: () => [restrictedPrincipalCheck(), mlflowLifecycleCheck()],
|
|
3151
|
-
requiredChecks: ["mlflow-lifecycle"],
|
|
3951
|
+
requiredChecks: ["restricted-principal", "mlflow-lifecycle"],
|
|
3152
3952
|
requirements: [
|
|
3153
|
-
|
|
3154
|
-
|
|
3155
|
-
|
|
3156
|
-
|
|
3953
|
+
workspace2,
|
|
3954
|
+
auth2,
|
|
3955
|
+
requirement2("experiment", "MLflow experiment ID", "DBX_TEST_MLFLOW_EXPERIMENT_ID"),
|
|
3956
|
+
requirement2(
|
|
3157
3957
|
"registered-model",
|
|
3158
3958
|
"Unity Catalog registered model",
|
|
3159
3959
|
"DBX_TEST_REGISTERED_MODEL"
|
|
3160
3960
|
),
|
|
3161
|
-
|
|
3961
|
+
requirement2("model-version", "Registered model version", "DBX_TEST_MODEL_VERSION")
|
|
3162
3962
|
],
|
|
3163
|
-
docsUrl: `${
|
|
3963
|
+
docsUrl: `${DOCS3}#mlflow-and-model-lifecycle`,
|
|
3164
3964
|
certificationScopes: [
|
|
3165
|
-
`${
|
|
3965
|
+
`${AZURE_M2M_SCOPE2}; MLflow experiment and configured Unity Catalog model version`
|
|
3166
3966
|
]
|
|
3167
3967
|
});
|
|
3168
3968
|
}
|
|
@@ -3180,27 +3980,27 @@ function createFeatureEngineeringTargetPack() {
|
|
|
3180
3980
|
"features.serving"
|
|
3181
3981
|
],
|
|
3182
3982
|
checks: () => [restrictedPrincipalCheck(), featureEngineeringServingCheck()],
|
|
3183
|
-
requiredChecks: ["feature-engineering"],
|
|
3983
|
+
requiredChecks: ["restricted-principal", "feature-engineering"],
|
|
3184
3984
|
requirements: [
|
|
3185
|
-
|
|
3186
|
-
|
|
3187
|
-
|
|
3188
|
-
|
|
3189
|
-
|
|
3985
|
+
workspace2,
|
|
3986
|
+
auth2,
|
|
3987
|
+
warehouse2,
|
|
3988
|
+
requirement2("feature-table", "Unity Catalog feature table", "DBX_TEST_FEATURE_TABLE"),
|
|
3989
|
+
requirement2(
|
|
3190
3990
|
"online-materialization",
|
|
3191
3991
|
"Databricks Online Table or Synced Table pipeline",
|
|
3192
3992
|
"DBX_TEST_ONLINE_TABLE",
|
|
3193
3993
|
"DBX_TEST_FEATURE_SERVING_PIPELINE_ID"
|
|
3194
3994
|
),
|
|
3195
|
-
|
|
3995
|
+
requirement2(
|
|
3196
3996
|
"feature-assertion",
|
|
3197
3997
|
"Feature freshness/correctness SQL",
|
|
3198
3998
|
"DBX_TEST_FEATURE_ASSERTION_SQL"
|
|
3199
3999
|
)
|
|
3200
4000
|
],
|
|
3201
|
-
docsUrl: `${
|
|
4001
|
+
docsUrl: `${DOCS3}#feature-engineering-and-serving`,
|
|
3202
4002
|
certificationScopes: [
|
|
3203
|
-
`${
|
|
4003
|
+
`${AZURE_M2M_SCOPE2}; Delta feature table, PostgreSQL-backed Synced Table, and SQL freshness`
|
|
3204
4004
|
]
|
|
3205
4005
|
});
|
|
3206
4006
|
}
|
|
@@ -3217,25 +4017,25 @@ function createModelServingTargetPack() {
|
|
|
3217
4017
|
"ai-gateway.configuration"
|
|
3218
4018
|
],
|
|
3219
4019
|
checks: () => [restrictedPrincipalCheck(), modelServingCheck()],
|
|
3220
|
-
requiredChecks: ["model-serving"],
|
|
4020
|
+
requiredChecks: ["restricted-principal", "model-serving"],
|
|
3221
4021
|
requirements: [
|
|
3222
|
-
|
|
3223
|
-
|
|
3224
|
-
|
|
3225
|
-
|
|
4022
|
+
workspace2,
|
|
4023
|
+
auth2,
|
|
4024
|
+
requirement2("serving-endpoint", "Model Serving endpoint name", "DBX_TEST_SERVING_ENDPOINT"),
|
|
4025
|
+
requirement2(
|
|
3226
4026
|
"serving-request",
|
|
3227
4027
|
"Safe inference request JSON",
|
|
3228
4028
|
"DBX_TEST_SERVING_REQUEST_JSON"
|
|
3229
4029
|
),
|
|
3230
|
-
|
|
4030
|
+
requirement2(
|
|
3231
4031
|
"ai-gateway",
|
|
3232
4032
|
"AI Gateway enforcement flag set to 1",
|
|
3233
4033
|
"DBX_TEST_AI_GATEWAY_REQUIRED"
|
|
3234
4034
|
)
|
|
3235
4035
|
],
|
|
3236
|
-
docsUrl: `${
|
|
4036
|
+
docsUrl: `${DOCS3}#model-serving-and-ai-gateway`,
|
|
3237
4037
|
certificationScopes: [
|
|
3238
|
-
`${
|
|
4038
|
+
`${AZURE_M2M_SCOPE2}; custom-model inference and AI Gateway inference-table configuration`
|
|
3239
4039
|
]
|
|
3240
4040
|
});
|
|
3241
4041
|
}
|
|
@@ -3253,19 +4053,19 @@ function createVectorRagAgentsTargetPack() {
|
|
|
3253
4053
|
"agents.serving"
|
|
3254
4054
|
],
|
|
3255
4055
|
checks: () => [restrictedPrincipalCheck(), vectorSearchCheck(), ragAgentCheck()],
|
|
3256
|
-
requiredChecks: ["vector-search", "rag-agent"],
|
|
4056
|
+
requiredChecks: ["restricted-principal", "vector-search", "rag-agent"],
|
|
3257
4057
|
requirements: [
|
|
3258
|
-
|
|
3259
|
-
|
|
3260
|
-
|
|
3261
|
-
|
|
3262
|
-
|
|
3263
|
-
|
|
3264
|
-
|
|
4058
|
+
workspace2,
|
|
4059
|
+
auth2,
|
|
4060
|
+
requirement2("vector-endpoint", "Vector Search endpoint", "DBX_TEST_VECTOR_ENDPOINT"),
|
|
4061
|
+
requirement2("vector-index", "Vector Search index", "DBX_TEST_VECTOR_INDEX"),
|
|
4062
|
+
requirement2("vector-query", "Vector retrieval request JSON", "DBX_TEST_VECTOR_QUERY_JSON"),
|
|
4063
|
+
requirement2("agent-endpoint", "Agent serving endpoint", "DBX_TEST_AGENT_ENDPOINT"),
|
|
4064
|
+
requirement2("agent-request", "Safe agent request JSON", "DBX_TEST_AGENT_REQUEST_JSON")
|
|
3265
4065
|
],
|
|
3266
|
-
docsUrl: `${
|
|
4066
|
+
docsUrl: `${DOCS3}#vector-search-rag-and-agents`,
|
|
3267
4067
|
certificationScopes: [
|
|
3268
|
-
`${
|
|
4068
|
+
`${AZURE_M2M_SCOPE2}; Delta Sync vector retrieval and custom PyFunc agent invocation`
|
|
3269
4069
|
]
|
|
3270
4070
|
});
|
|
3271
4071
|
}
|
|
@@ -3283,23 +4083,23 @@ function createFederationSharingTargetPack() {
|
|
|
3283
4083
|
"clean-rooms.access"
|
|
3284
4084
|
],
|
|
3285
4085
|
checks: () => [restrictedPrincipalCheck(), federationSharingCleanRoomsCheck()],
|
|
3286
|
-
requiredChecks: ["federation-sharing-cleanrooms"],
|
|
4086
|
+
requiredChecks: ["restricted-principal", "federation-sharing-cleanrooms"],
|
|
3287
4087
|
requirements: [
|
|
3288
|
-
|
|
3289
|
-
|
|
3290
|
-
|
|
3291
|
-
|
|
3292
|
-
|
|
3293
|
-
|
|
3294
|
-
|
|
4088
|
+
workspace2,
|
|
4089
|
+
auth2,
|
|
4090
|
+
warehouse2,
|
|
4091
|
+
requirement2("connection", "Lakehouse Federation connection", "DBX_TEST_CONNECTION"),
|
|
4092
|
+
requirement2("share", "Delta Sharing share", "DBX_TEST_SHARE"),
|
|
4093
|
+
requirement2("clean-room", "Clean Room name", "DBX_TEST_CLEAN_ROOM"),
|
|
4094
|
+
requirement2(
|
|
3295
4095
|
"federation-assertion",
|
|
3296
4096
|
"Federated data-plane SQL",
|
|
3297
4097
|
"DBX_TEST_FEDERATION_ASSERTION_SQL"
|
|
3298
4098
|
)
|
|
3299
4099
|
],
|
|
3300
|
-
docsUrl: `${
|
|
4100
|
+
docsUrl: `${DOCS3}#federation-delta-sharing-and-clean-rooms`,
|
|
3301
4101
|
certificationScopes: [
|
|
3302
|
-
`${
|
|
4102
|
+
`${AZURE_M2M_SCOPE2}; managed PostgreSQL federation, Delta Sharing table, and two-metastore Clean Room`
|
|
3303
4103
|
]
|
|
3304
4104
|
});
|
|
3305
4105
|
}
|
|
@@ -3317,25 +4117,253 @@ function createSecurityCostDrTargetPack() {
|
|
|
3317
4117
|
"dr.secondary-region"
|
|
3318
4118
|
],
|
|
3319
4119
|
checks: () => [restrictedPrincipalCheck(), securityPostureCostCheck(), regionalDrCheck()],
|
|
3320
|
-
requiredChecks: ["security-cost", "regional-dr"],
|
|
4120
|
+
requiredChecks: ["restricted-principal", "security-cost", "regional-dr"],
|
|
3321
4121
|
requirements: [
|
|
3322
|
-
|
|
3323
|
-
|
|
3324
|
-
|
|
3325
|
-
|
|
4122
|
+
workspace2,
|
|
4123
|
+
auth2,
|
|
4124
|
+
warehouse2,
|
|
4125
|
+
requirement2(
|
|
3326
4126
|
"ip-access-list",
|
|
3327
4127
|
"Enabled workspace IP access list",
|
|
3328
4128
|
"DBX_TEST_IP_ACCESS_LIST_ID"
|
|
3329
4129
|
),
|
|
3330
|
-
|
|
3331
|
-
|
|
3332
|
-
|
|
3333
|
-
|
|
3334
|
-
|
|
4130
|
+
requirement2("cluster-policy", "Compute policy ID", "DBX_TEST_CLUSTER_POLICY_ID"),
|
|
4131
|
+
requirement2("cost-assertion", "Boolean SQL cost guardrail", "DBX_TEST_COST_ASSERTION_SQL"),
|
|
4132
|
+
requirement2("dr-workspace", "Secondary workspace host", "DBX_TEST_DR_HOST"),
|
|
4133
|
+
requirement2("dr-warehouse", "Running secondary-region warehouse", "DBX_TEST_DR_WAREHOUSE_ID"),
|
|
4134
|
+
requirement2("dr-assertion", "Secondary-region workload SQL", "DBX_TEST_DR_ASSERTION_SQL")
|
|
4135
|
+
],
|
|
4136
|
+
docsUrl: `${DOCS3}#networking-security-cost-and-regional-dr`,
|
|
4137
|
+
certificationScopes: [
|
|
4138
|
+
`${AZURE_M2M_SCOPE2}; TEST-NET block list, bounded compute policy, billing system-table guardrail, and West US 3 serverless DR warehouse`
|
|
4139
|
+
]
|
|
4140
|
+
});
|
|
4141
|
+
}
|
|
4142
|
+
function createMlflow3AgentQualityTargetPack() {
|
|
4143
|
+
return defineTargetPack({
|
|
4144
|
+
id: "mlflow3-agent-quality",
|
|
4145
|
+
name: "MLflow 3 agent quality and monitoring",
|
|
4146
|
+
description: "Native MLflow 3 traces, offline agent evaluation, production scorer lifecycle and online monitoring.",
|
|
4147
|
+
version: "1.0.0",
|
|
4148
|
+
maturity: "shipped",
|
|
4149
|
+
capabilities: [
|
|
4150
|
+
"mlflow3.tracing",
|
|
4151
|
+
"mlflow3.agent-evaluation",
|
|
4152
|
+
"mlflow3.production-scorers",
|
|
4153
|
+
"mlflow3.production-monitoring",
|
|
4154
|
+
"ai-search.retrieval-evaluation"
|
|
4155
|
+
],
|
|
4156
|
+
checks: () => [restrictedPrincipalCheck(), mlflow3GenAiQualityCheck()],
|
|
4157
|
+
requiredChecks: ["restricted-principal", "mlflow3-genai-quality"],
|
|
4158
|
+
requirements: [
|
|
4159
|
+
workspace2,
|
|
4160
|
+
auth2,
|
|
4161
|
+
warehouse2,
|
|
4162
|
+
requirement2("mlflow3-job", "Native MLflow 3 certification Job", "DBX_TEST_MLFLOW3_JOB_ID"),
|
|
4163
|
+
requirement2(
|
|
4164
|
+
"mlflow3-traces",
|
|
4165
|
+
"Boolean SQL proving a fresh MLflow 3 trace",
|
|
4166
|
+
"DBX_TEST_MLFLOW3_TRACE_ASSERTION_SQL"
|
|
4167
|
+
),
|
|
4168
|
+
requirement2(
|
|
4169
|
+
"mlflow3-evaluation",
|
|
4170
|
+
"Boolean SQL proving offline agent evaluation results",
|
|
4171
|
+
"DBX_TEST_MLFLOW3_EVAL_ASSERTION_SQL"
|
|
4172
|
+
),
|
|
4173
|
+
requirement2(
|
|
4174
|
+
"mlflow3-scorers",
|
|
4175
|
+
"Boolean SQL proving production scorer lifecycle evidence",
|
|
4176
|
+
"DBX_TEST_MLFLOW3_SCORER_ASSERTION_SQL"
|
|
4177
|
+
),
|
|
4178
|
+
requirement2(
|
|
4179
|
+
"mlflow3-monitoring",
|
|
4180
|
+
"Boolean SQL proving production monitoring output",
|
|
4181
|
+
"DBX_TEST_MLFLOW3_MONITOR_ASSERTION_SQL"
|
|
4182
|
+
),
|
|
4183
|
+
requirement2(
|
|
4184
|
+
"ai-search-evaluation",
|
|
4185
|
+
"Boolean SQL proving AI Search retrieval-quality thresholds",
|
|
4186
|
+
"DBX_TEST_AI_SEARCH_EVAL_ASSERTION_SQL"
|
|
4187
|
+
)
|
|
4188
|
+
],
|
|
4189
|
+
docsUrl: `${DOCS3}#mlflow-3-agent-quality-and-monitoring`,
|
|
4190
|
+
certificationScopes: [
|
|
4191
|
+
`${AZURE_M2M_SCOPE2}; Python-native MLflow 3 trace, evaluation, complete scorer lifecycle and monitor evidence`
|
|
4192
|
+
]
|
|
4193
|
+
});
|
|
4194
|
+
}
|
|
4195
|
+
function createAgentEvaluationPipelineTargetPack() {
|
|
4196
|
+
return defineTargetPack({
|
|
4197
|
+
id: "agent-evaluation-pipeline",
|
|
4198
|
+
name: "Agent evaluation delivery pipeline",
|
|
4199
|
+
description: "Exact-candidate API submission, outbox dispatch, Temporal execution, Databricks judge inference, SQL score persistence and Quality completion.",
|
|
4200
|
+
version: "1.0.0",
|
|
4201
|
+
maturity: "live-gated",
|
|
4202
|
+
capabilities: [
|
|
4203
|
+
"agent-evals.api-submission",
|
|
4204
|
+
"agent-evals.temporal-dispatch",
|
|
4205
|
+
"agent-evals.model-serving-judge",
|
|
4206
|
+
"agent-evals.sql-persistence",
|
|
4207
|
+
"agent-evals.quality-evidence"
|
|
4208
|
+
],
|
|
4209
|
+
checks: () => [
|
|
4210
|
+
restrictedPrincipalCheck(),
|
|
4211
|
+
evalJudgeModelServingCheck(),
|
|
4212
|
+
agentEvaluationPipelineCheck()
|
|
4213
|
+
],
|
|
4214
|
+
requiredChecks: ["restricted-principal", "model-eval-judge", "agent-evaluation-pipeline"],
|
|
4215
|
+
requirements: [
|
|
4216
|
+
workspace2,
|
|
4217
|
+
auth2,
|
|
4218
|
+
warehouse2,
|
|
4219
|
+
requirement2(
|
|
4220
|
+
"eval-serving-endpoint",
|
|
4221
|
+
"Databricks Model Serving endpoint satisfying the evaluator chat contract",
|
|
4222
|
+
"DBX_TEST_EVAL_SERVING_ENDPOINT"
|
|
4223
|
+
),
|
|
4224
|
+
requirement2(
|
|
4225
|
+
"agent-eval-job",
|
|
4226
|
+
"Exact-candidate end-to-end agent evaluation certification Job",
|
|
4227
|
+
"DBX_TEST_AGENT_EVAL_E2E_JOB_ID"
|
|
4228
|
+
),
|
|
4229
|
+
requirement2(
|
|
4230
|
+
"agent-eval-evidence",
|
|
4231
|
+
"Boolean SQL proving terminal scores and Quality evidence",
|
|
4232
|
+
"DBX_TEST_AGENT_EVAL_ASSERTION_SQL"
|
|
4233
|
+
)
|
|
4234
|
+
],
|
|
4235
|
+
docsUrl: `${DOCS3}#agent-evaluation-delivery-pipeline`,
|
|
4236
|
+
certificationScopes: [
|
|
4237
|
+
`${AZURE_M2M_SCOPE2}; Experiments API through customer worker and Databricks judge to SQL/Quality`
|
|
4238
|
+
]
|
|
4239
|
+
});
|
|
4240
|
+
}
|
|
4241
|
+
function createManagedMcpAgentsTargetPack() {
|
|
4242
|
+
return defineTargetPack({
|
|
4243
|
+
id: "managed-mcp-agents",
|
|
4244
|
+
name: "Managed MCP and MCP Services",
|
|
4245
|
+
description: "Streamable HTTP tool discovery and calls for Databricks managed MCP servers and governed Unity Catalog MCP Services, including a deny control.",
|
|
4246
|
+
version: "1.0.0",
|
|
4247
|
+
maturity: "live-gated",
|
|
4248
|
+
capabilities: [
|
|
4249
|
+
"mcp.managed.list-call",
|
|
4250
|
+
"mcp.services.list-call",
|
|
4251
|
+
"mcp.unity-catalog-governance",
|
|
4252
|
+
"mcp.denial"
|
|
4253
|
+
],
|
|
4254
|
+
checks: () => [restrictedPrincipalCheck(), managedMcpAgentsCheck()],
|
|
4255
|
+
requiredChecks: ["restricted-principal", "managed-mcp-agents"],
|
|
4256
|
+
requirements: [
|
|
4257
|
+
workspace2,
|
|
4258
|
+
auth2,
|
|
4259
|
+
warehouse2,
|
|
4260
|
+
requirement2("mcp-job", "Native Streamable HTTP MCP certification Job", "DBX_TEST_MCP_JOB_ID"),
|
|
4261
|
+
requirement2(
|
|
4262
|
+
"managed-mcp",
|
|
4263
|
+
"Boolean SQL proving managed MCP list/call behavior",
|
|
4264
|
+
"DBX_TEST_MCP_MANAGED_ASSERTION_SQL"
|
|
4265
|
+
),
|
|
4266
|
+
requirement2(
|
|
4267
|
+
"mcp-service",
|
|
4268
|
+
"Boolean SQL proving UC MCP Service list/call behavior",
|
|
4269
|
+
"DBX_TEST_MCP_SERVICE_ASSERTION_SQL"
|
|
4270
|
+
),
|
|
4271
|
+
requirement2(
|
|
4272
|
+
"mcp-denial",
|
|
4273
|
+
"Boolean SQL proving an MCP tool excluded by UC selectors was denied",
|
|
4274
|
+
"DBX_TEST_MCP_DENY_ASSERTION_SQL"
|
|
4275
|
+
)
|
|
4276
|
+
],
|
|
4277
|
+
docsUrl: `${DOCS3}#managed-mcp-and-mcp-services`,
|
|
4278
|
+
certificationScopes: [
|
|
4279
|
+
`${AZURE_M2M_SCOPE2}; managed AI Search or SQL MCP plus a UC MCP Service over Streamable HTTP`
|
|
4280
|
+
]
|
|
4281
|
+
});
|
|
4282
|
+
}
|
|
4283
|
+
function createDataQualityObservabilityTargetPack() {
|
|
4284
|
+
return defineTargetPack({
|
|
4285
|
+
id: "data-quality-observability",
|
|
4286
|
+
name: "Data quality and Databricks Apps observability",
|
|
4287
|
+
description: "Unity Catalog Data Quality Monitoring plus Databricks Apps OpenTelemetry logs, spans and metrics.",
|
|
4288
|
+
version: "1.0.0",
|
|
4289
|
+
maturity: "shipped",
|
|
4290
|
+
capabilities: [
|
|
4291
|
+
"data-quality.freshness-completeness",
|
|
4292
|
+
"apps.telemetry.logs",
|
|
4293
|
+
"apps.telemetry.traces",
|
|
4294
|
+
"apps.telemetry.metrics"
|
|
4295
|
+
],
|
|
4296
|
+
checks: () => [restrictedPrincipalCheck(), dataQualityAppTelemetryCheck()],
|
|
4297
|
+
requiredChecks: ["restricted-principal", "data-quality-app-telemetry"],
|
|
4298
|
+
requirements: [
|
|
4299
|
+
workspace2,
|
|
4300
|
+
auth2,
|
|
4301
|
+
warehouse2,
|
|
4302
|
+
requirement2("telemetry-app", "App with UC telemetry export", "DBX_TEST_TELEMETRY_APP_NAME"),
|
|
4303
|
+
requirement2(
|
|
4304
|
+
"data-quality",
|
|
4305
|
+
"Boolean SQL over current Data Quality Monitoring results",
|
|
4306
|
+
"DBX_TEST_DQM_ASSERTION_SQL"
|
|
4307
|
+
),
|
|
4308
|
+
requirement2(
|
|
4309
|
+
"app-logs",
|
|
4310
|
+
"Boolean SQL proving current app logs",
|
|
4311
|
+
"DBX_TEST_APP_LOGS_ASSERTION_SQL"
|
|
4312
|
+
),
|
|
4313
|
+
requirement2(
|
|
4314
|
+
"app-spans",
|
|
4315
|
+
"Boolean SQL proving current app spans",
|
|
4316
|
+
"DBX_TEST_APP_SPANS_ASSERTION_SQL"
|
|
4317
|
+
),
|
|
4318
|
+
requirement2(
|
|
4319
|
+
"app-metrics",
|
|
4320
|
+
"Boolean SQL proving current app metrics",
|
|
4321
|
+
"DBX_TEST_APP_METRICS_ASSERTION_SQL"
|
|
4322
|
+
)
|
|
4323
|
+
],
|
|
4324
|
+
docsUrl: `${DOCS3}#data-quality-and-databricks-apps-observability`,
|
|
4325
|
+
certificationScopes: [
|
|
4326
|
+
`${AZURE_M2M_SCOPE2}; system.data_quality_monitoring.table_results and UC OTel tables`
|
|
4327
|
+
]
|
|
4328
|
+
});
|
|
4329
|
+
}
|
|
4330
|
+
function createAgentServicesEnrollmentTargetPack() {
|
|
4331
|
+
return defineTargetPack({
|
|
4332
|
+
id: "agent-services-enrollment",
|
|
4333
|
+
name: "Unity Catalog Agent Services enrollment",
|
|
4334
|
+
description: "Customer-owned Fabric Harness agents registered as external Unity Catalog Agent Services with explicit EXECUTE grants.",
|
|
4335
|
+
version: "1.0.0",
|
|
4336
|
+
maturity: "shipped",
|
|
4337
|
+
capabilities: [
|
|
4338
|
+
"agent-services.external-registration",
|
|
4339
|
+
"agent-services.discovery",
|
|
4340
|
+
"agent-services.permissions",
|
|
4341
|
+
"harness.customer-worker-enrollment"
|
|
4342
|
+
],
|
|
4343
|
+
checks: () => [restrictedPrincipalCheck(), agentServicesEnrollmentCheck()],
|
|
4344
|
+
requiredChecks: ["restricted-principal", "agent-services-enrollment"],
|
|
4345
|
+
requirements: [
|
|
4346
|
+
workspace2,
|
|
4347
|
+
auth2,
|
|
4348
|
+
requirement2(
|
|
4349
|
+
"agent-service",
|
|
4350
|
+
"External Unity Catalog Agent Service full name",
|
|
4351
|
+
"DBX_TEST_AGENT_SERVICE_FULL_NAME"
|
|
4352
|
+
),
|
|
4353
|
+
requirement2(
|
|
4354
|
+
"agent-connection",
|
|
4355
|
+
"Expected Unity Catalog HTTP connection",
|
|
4356
|
+
"DBX_TEST_AGENT_SERVICE_CONNECTION"
|
|
4357
|
+
),
|
|
4358
|
+
requirement2(
|
|
4359
|
+
"agent-execute-principal",
|
|
4360
|
+
"Principal expected to have EXECUTE",
|
|
4361
|
+
"DBX_TEST_AGENT_SERVICE_EXECUTE_PRINCIPAL"
|
|
4362
|
+
)
|
|
3335
4363
|
],
|
|
3336
|
-
docsUrl: `${
|
|
4364
|
+
docsUrl: `${DOCS3}#unity-catalog-agent-services-enrollment`,
|
|
3337
4365
|
certificationScopes: [
|
|
3338
|
-
`${
|
|
4366
|
+
`${AZURE_M2M_SCOPE2}; Agent Services Beta registration/discovery/ACL only; runtime invocation is not claimed`
|
|
3339
4367
|
]
|
|
3340
4368
|
});
|
|
3341
4369
|
}
|
|
@@ -3348,7 +4376,12 @@ function createAdvancedTargetPacks() {
|
|
|
3348
4376
|
createModelServingTargetPack(),
|
|
3349
4377
|
createVectorRagAgentsTargetPack(),
|
|
3350
4378
|
createFederationSharingTargetPack(),
|
|
3351
|
-
createSecurityCostDrTargetPack()
|
|
4379
|
+
createSecurityCostDrTargetPack(),
|
|
4380
|
+
createMlflow3AgentQualityTargetPack(),
|
|
4381
|
+
createManagedMcpAgentsTargetPack(),
|
|
4382
|
+
createDataQualityObservabilityTargetPack(),
|
|
4383
|
+
createAgentServicesEnrollmentTargetPack(),
|
|
4384
|
+
createAgentEvaluationPipelineTargetPack()
|
|
3352
4385
|
];
|
|
3353
4386
|
}
|
|
3354
4387
|
|
|
@@ -3357,7 +4390,8 @@ function createBuiltinTargetPacks() {
|
|
|
3357
4390
|
return [
|
|
3358
4391
|
...createFoundationTargetPacks(),
|
|
3359
4392
|
createLakeflowJobsTargetPack(),
|
|
3360
|
-
...createAdvancedTargetPacks()
|
|
4393
|
+
...createAdvancedTargetPacks(),
|
|
4394
|
+
...createNextTargetPacks()
|
|
3361
4395
|
];
|
|
3362
4396
|
}
|
|
3363
4397
|
var builtinTargetPacks = createBuiltinTargetPacks();
|
|
@@ -3368,7 +4402,12 @@ init_workspace_client();
|
|
|
3368
4402
|
exports.DatabricksAdvancedWorkloadsAdapter = DatabricksAdvancedWorkloadsAdapter;
|
|
3369
4403
|
exports.DatabricksJobsAdapter = DatabricksJobsAdapter;
|
|
3370
4404
|
exports.advancedStreamingCdcCheck = advancedStreamingCdcCheck;
|
|
4405
|
+
exports.agentEvaluationPipelineCheck = agentEvaluationPipelineCheck;
|
|
4406
|
+
exports.agentOrchestrationResponsesCheck = agentOrchestrationResponsesCheck;
|
|
4407
|
+
exports.agentServicesEnrollmentCheck = agentServicesEnrollmentCheck;
|
|
3371
4408
|
exports.aiBiDashboardCheck = aiBiDashboardCheck;
|
|
4409
|
+
exports.aiFunctionsBatchInferenceCheck = aiFunctionsBatchInferenceCheck;
|
|
4410
|
+
exports.aiRuntimeTrainingCheck = aiRuntimeTrainingCheck;
|
|
3372
4411
|
exports.appHealthCheck = appHealthCheck;
|
|
3373
4412
|
exports.assertDeltaContract = assertDeltaContract;
|
|
3374
4413
|
exports.autoLoaderIngestionCheck = autoLoaderIngestionCheck;
|
|
@@ -3378,10 +4417,17 @@ exports.classicComputeCheck = classicComputeCheck;
|
|
|
3378
4417
|
exports.compareToGolden = compareToGolden;
|
|
3379
4418
|
exports.createAdvancedStreamingTargetPack = createAdvancedStreamingTargetPack;
|
|
3380
4419
|
exports.createAdvancedTargetPacks = createAdvancedTargetPacks;
|
|
4420
|
+
exports.createAgentEvaluationPipelineTargetPack = createAgentEvaluationPipelineTargetPack;
|
|
4421
|
+
exports.createAgentOrchestrationTargetPack = createAgentOrchestrationTargetPack;
|
|
4422
|
+
exports.createAgentServicesEnrollmentTargetPack = createAgentServicesEnrollmentTargetPack;
|
|
3381
4423
|
exports.createAiBiGenieTargetPack = createAiBiGenieTargetPack;
|
|
4424
|
+
exports.createAiFunctionsBatchInferenceTargetPack = createAiFunctionsBatchInferenceTargetPack;
|
|
4425
|
+
exports.createAiRuntimeTrainingTargetPack = createAiRuntimeTrainingTargetPack;
|
|
3382
4426
|
exports.createAppsOperationalFoundationPack = createAppsOperationalFoundationPack;
|
|
3383
4427
|
exports.createBuiltinTargetPacks = createBuiltinTargetPacks;
|
|
3384
4428
|
exports.createClientFromEnv = createClientFromEnv;
|
|
4429
|
+
exports.createDataQualityObservabilityTargetPack = createDataQualityObservabilityTargetPack;
|
|
4430
|
+
exports.createDeclarativeBundlesTargetPack = createDeclarativeBundlesTargetPack;
|
|
3385
4431
|
exports.createDuckDbContext = createDuckDbContext;
|
|
3386
4432
|
exports.createEphemeralLakebaseBranch = createEphemeralLakebaseBranch;
|
|
3387
4433
|
exports.createExecutionContext = createExecutionContext;
|
|
@@ -3389,20 +4435,29 @@ exports.createFeatureEngineeringTargetPack = createFeatureEngineeringTargetPack;
|
|
|
3389
4435
|
exports.createFederationSharingTargetPack = createFederationSharingTargetPack;
|
|
3390
4436
|
exports.createFoundationTargetPacks = createFoundationTargetPacks;
|
|
3391
4437
|
exports.createJobsCodeFoundationPack = createJobsCodeFoundationPack;
|
|
4438
|
+
exports.createLakebaseAutoscalingFeatureStoreTargetPack = createLakebaseAutoscalingFeatureStoreTargetPack;
|
|
3392
4439
|
exports.createLakebaseTestProvider = createLakebaseTestProvider;
|
|
3393
4440
|
exports.createLakeflowFoundationPack = createLakeflowFoundationPack;
|
|
3394
4441
|
exports.createLakeflowJobsTargetPack = createLakeflowJobsTargetPack;
|
|
4442
|
+
exports.createLakehouseOptimizationTargetPack = createLakehouseOptimizationTargetPack;
|
|
4443
|
+
exports.createManagedMcpAgentsTargetPack = createManagedMcpAgentsTargetPack;
|
|
4444
|
+
exports.createMarketplaceOpenSharingTargetPack = createMarketplaceOpenSharingTargetPack;
|
|
4445
|
+
exports.createMlflow3AgentQualityTargetPack = createMlflow3AgentQualityTargetPack;
|
|
3395
4446
|
exports.createMlflowLifecycleTargetPack = createMlflowLifecycleTargetPack;
|
|
3396
4447
|
exports.createMockDatabricksClient = createMockDatabricksClient;
|
|
3397
4448
|
exports.createModelServingTargetPack = createModelServingTargetPack;
|
|
4449
|
+
exports.createNextTargetPacks = createNextTargetPacks;
|
|
3398
4450
|
exports.createSecurityCostDrTargetPack = createSecurityCostDrTargetPack;
|
|
4451
|
+
exports.createSemanticAnalyticsTargetPack = createSemanticAnalyticsTargetPack;
|
|
3399
4452
|
exports.createSqlDeltaFoundationPack = createSqlDeltaFoundationPack;
|
|
3400
4453
|
exports.createTargetPackRegistry = createTargetPackRegistry;
|
|
3401
4454
|
exports.createUnityStorageFoundationPack = createUnityStorageFoundationPack;
|
|
3402
4455
|
exports.createVectorRagAgentsTargetPack = createVectorRagAgentsTargetPack;
|
|
3403
4456
|
exports.createWorkspaceContext = createWorkspaceContext;
|
|
3404
4457
|
exports.customLiveCheck = customLiveCheck;
|
|
4458
|
+
exports.dataQualityAppTelemetryCheck = dataQualityAppTelemetryCheck;
|
|
3405
4459
|
exports.dbtBuildCheck = dbtBuildCheck;
|
|
4460
|
+
exports.declarativeBundlesCheck = declarativeBundlesCheck;
|
|
3406
4461
|
exports.defineLiveSuite = defineLiveSuite;
|
|
3407
4462
|
exports.defineTargetPack = defineTargetPack;
|
|
3408
4463
|
exports.defineTargetPackRun = defineTargetPackRun;
|
|
@@ -3422,9 +4477,14 @@ exports.genieCheck = genieCheck;
|
|
|
3422
4477
|
exports.jobRunCheck = jobRunCheck;
|
|
3423
4478
|
exports.jobsCertificationCheck = jobsCertificationCheck;
|
|
3424
4479
|
exports.jobsOrchestrationCheck = jobsOrchestrationCheck;
|
|
4480
|
+
exports.lakebaseAutoscalingFeatureStoreCheck = lakebaseAutoscalingFeatureStoreCheck;
|
|
3425
4481
|
exports.lakebaseCredentialCheck = lakebaseCredentialCheck;
|
|
3426
4482
|
exports.lakebaseRoundTripCheck = lakebaseRoundTripCheck;
|
|
3427
4483
|
exports.lakeflowConnectCheck = lakeflowConnectCheck;
|
|
4484
|
+
exports.lakehouseOptimizationCheck = lakehouseOptimizationCheck;
|
|
4485
|
+
exports.managedMcpAgentsCheck = managedMcpAgentsCheck;
|
|
4486
|
+
exports.marketplaceOpenSharingCheck = marketplaceOpenSharingCheck;
|
|
4487
|
+
exports.mlflow3GenAiQualityCheck = mlflow3GenAiQualityCheck;
|
|
3428
4488
|
exports.mlflowLifecycleCheck = mlflowLifecycleCheck;
|
|
3429
4489
|
exports.modelServingCheck = modelServingCheck;
|
|
3430
4490
|
exports.normalizeJobRun = normalizeJobRun;
|
|
@@ -3442,6 +4502,7 @@ exports.renderJUnit = renderJUnit;
|
|
|
3442
4502
|
exports.resolveFixtureRows = resolveFixtureRows;
|
|
3443
4503
|
exports.resolveLakebaseProject = resolveLakebaseProject;
|
|
3444
4504
|
exports.resolveProfile = resolveProfile;
|
|
4505
|
+
exports.resolveRequiredChecks = resolveRequiredChecks;
|
|
3445
4506
|
exports.resolveTokenProvider = resolveTokenProvider;
|
|
3446
4507
|
exports.restrictedPrincipalCheck = restrictedPrincipalCheck;
|
|
3447
4508
|
exports.rollbackCheck = rollbackCheck;
|
|
@@ -3450,6 +4511,7 @@ exports.runTargetPack = runTargetPack;
|
|
|
3450
4511
|
exports.secretRotationCheck = secretRotationCheck;
|
|
3451
4512
|
exports.secretScopeCheck = secretScopeCheck;
|
|
3452
4513
|
exports.securityPostureCostCheck = securityPostureCostCheck;
|
|
4514
|
+
exports.semanticAnalyticsCheck = semanticAnalyticsCheck;
|
|
3453
4515
|
exports.serverlessComputeCheck = serverlessComputeCheck;
|
|
3454
4516
|
exports.sqlRoundTripCheck = sqlRoundTripCheck;
|
|
3455
4517
|
exports.toLakebaseBranchId = toLakebaseBranchId;
|