@fabricorg/databricks-testkit 0.8.0 → 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 +819 -226
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +26 -1
- package/dist/index.d.ts +26 -1
- package/dist/index.js +801 -227
- 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,6 +2497,577 @@ 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
|
|
2498
3072
|
init_workspace_client();
|
|
2499
3073
|
init_workspace_context();
|
|
@@ -2588,9 +3162,9 @@ function adapter(client) {
|
|
|
2588
3162
|
function required2(env, names) {
|
|
2589
3163
|
return names.filter((name) => !env[name]?.trim());
|
|
2590
3164
|
}
|
|
2591
|
-
function
|
|
2592
|
-
const
|
|
2593
|
-
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(", ")}`);
|
|
2594
3168
|
}
|
|
2595
3169
|
function parseJson(value, name) {
|
|
2596
3170
|
if (!value) return void 0;
|
|
@@ -2656,8 +3230,8 @@ function advancedStreamingCdcCheck() {
|
|
|
2656
3230
|
id: "streaming-cdc",
|
|
2657
3231
|
description: "Streaming pipeline, streaming table and CDC assertions are healthy",
|
|
2658
3232
|
configured: (env) => required2(env, names).length === 0,
|
|
2659
|
-
async run({ env, client, warehouse:
|
|
2660
|
-
|
|
3233
|
+
async run({ env, client, warehouse: warehouse3 }) {
|
|
3234
|
+
requireEnv2(env, names);
|
|
2661
3235
|
const api = adapter(client);
|
|
2662
3236
|
const pipeline = await api.pipeline(env.DBX_TEST_STREAMING_PIPELINE_ID);
|
|
2663
3237
|
assertNotFailed("Streaming pipeline", pipeline.state);
|
|
@@ -2666,11 +3240,11 @@ function advancedStreamingCdcCheck() {
|
|
|
2666
3240
|
if (!["STREAMING_TABLE", "MATERIALIZED_VIEW", "DELTA"].includes(tableType)) {
|
|
2667
3241
|
throw new Error(`Streaming target has unsupported table type ${tableType || "UNKNOWN"}`);
|
|
2668
3242
|
}
|
|
2669
|
-
await booleanSql("CDC", env.DBX_TEST_CDC_ASSERTION_SQL,
|
|
3243
|
+
await booleanSql("CDC", env.DBX_TEST_CDC_ASSERTION_SQL, warehouse3.query);
|
|
2670
3244
|
await booleanSql(
|
|
2671
3245
|
"Streaming freshness",
|
|
2672
3246
|
env.DBX_TEST_STREAMING_ASSERTION_SQL,
|
|
2673
|
-
|
|
3247
|
+
warehouse3.query
|
|
2674
3248
|
);
|
|
2675
3249
|
return { pipelineId: pipeline.pipeline_id, table: env.DBX_TEST_STREAMING_TABLE, tableType };
|
|
2676
3250
|
}
|
|
@@ -2682,8 +3256,8 @@ function lakeflowConnectCheck() {
|
|
|
2682
3256
|
id: "lakeflow-connect",
|
|
2683
3257
|
description: "Lakeflow Connect ingestion pipeline exists and is not failed",
|
|
2684
3258
|
configured: (env) => required2(env, names).length === 0,
|
|
2685
|
-
async run({ env, client, warehouse:
|
|
2686
|
-
|
|
3259
|
+
async run({ env, client, warehouse: warehouse3 }) {
|
|
3260
|
+
requireEnv2(env, names);
|
|
2687
3261
|
const id = env.DBX_TEST_CONNECT_PIPELINE_ID;
|
|
2688
3262
|
const pipeline = await adapter(client).pipeline(id);
|
|
2689
3263
|
assertNotFailed("Lakeflow Connect pipeline", pipeline.state);
|
|
@@ -2694,7 +3268,7 @@ function lakeflowConnectCheck() {
|
|
|
2694
3268
|
await booleanSql(
|
|
2695
3269
|
"Lakeflow Connect replication",
|
|
2696
3270
|
env.DBX_TEST_CONNECT_ASSERTION_SQL,
|
|
2697
|
-
|
|
3271
|
+
warehouse3.query
|
|
2698
3272
|
);
|
|
2699
3273
|
return {
|
|
2700
3274
|
pipelineId: pipeline.pipeline_id ?? id,
|
|
@@ -2734,7 +3308,7 @@ function genieCheck() {
|
|
|
2734
3308
|
description: "Genie space is accessible and can optionally start a grounded conversation",
|
|
2735
3309
|
configured: (env) => required2(env, names).length === 0,
|
|
2736
3310
|
async run({ env, client }) {
|
|
2737
|
-
|
|
3311
|
+
requireEnv2(env, names);
|
|
2738
3312
|
const api = adapter(client);
|
|
2739
3313
|
const id = env.DBX_TEST_GENIE_SPACE_ID;
|
|
2740
3314
|
const space = await api.genieSpace(id);
|
|
@@ -2764,7 +3338,7 @@ function mlflowLifecycleCheck() {
|
|
|
2764
3338
|
description: "MLflow experiment and Unity Catalog model version are accessible",
|
|
2765
3339
|
configured: (env) => required2(env, names).length === 0,
|
|
2766
3340
|
async run({ env, client }) {
|
|
2767
|
-
|
|
3341
|
+
requireEnv2(env, names);
|
|
2768
3342
|
const api = adapter(client);
|
|
2769
3343
|
const experiment = await api.experiment(env.DBX_TEST_MLFLOW_EXPERIMENT_ID);
|
|
2770
3344
|
const model = await api.registeredModel(env.DBX_TEST_REGISTERED_MODEL);
|
|
@@ -2788,8 +3362,8 @@ function featureEngineeringServingCheck() {
|
|
|
2788
3362
|
configured: (env) => Boolean(
|
|
2789
3363
|
env.DBX_TEST_FEATURE_TABLE && env.DBX_TEST_FEATURE_ASSERTION_SQL && (env.DBX_TEST_ONLINE_TABLE || env.DBX_TEST_FEATURE_SERVING_PIPELINE_ID)
|
|
2790
3364
|
),
|
|
2791
|
-
async run({ env, client, warehouse:
|
|
2792
|
-
|
|
3365
|
+
async run({ env, client, warehouse: warehouse3 }) {
|
|
3366
|
+
requireEnv2(env, ["DBX_TEST_FEATURE_TABLE"]);
|
|
2793
3367
|
if (!env.DBX_TEST_ONLINE_TABLE && !env.DBX_TEST_FEATURE_SERVING_PIPELINE_ID) {
|
|
2794
3368
|
throw new Error(
|
|
2795
3369
|
"Feature serving requires DBX_TEST_ONLINE_TABLE or DBX_TEST_FEATURE_SERVING_PIPELINE_ID"
|
|
@@ -2812,7 +3386,7 @@ function featureEngineeringServingCheck() {
|
|
|
2812
3386
|
assertNotFailed("Synced Table pipeline", state);
|
|
2813
3387
|
servingResource = pipeline.pipeline_id ?? pipelineId;
|
|
2814
3388
|
}
|
|
2815
|
-
await booleanSql("Feature freshness", env.DBX_TEST_FEATURE_ASSERTION_SQL,
|
|
3389
|
+
await booleanSql("Feature freshness", env.DBX_TEST_FEATURE_ASSERTION_SQL, warehouse3.query);
|
|
2816
3390
|
return {
|
|
2817
3391
|
featureTable: source.full_name ?? env.DBX_TEST_FEATURE_TABLE,
|
|
2818
3392
|
servingResource,
|
|
@@ -2832,7 +3406,7 @@ function modelServingCheck() {
|
|
|
2832
3406
|
description: "Model Serving endpoint is ready and can optionally serve an inference request",
|
|
2833
3407
|
configured: (env) => required2(env, names).length === 0,
|
|
2834
3408
|
async run({ env, client }) {
|
|
2835
|
-
|
|
3409
|
+
requireEnv2(env, names);
|
|
2836
3410
|
if (env.DBX_TEST_AI_GATEWAY_REQUIRED !== "1") {
|
|
2837
3411
|
throw new Error("DBX_TEST_AI_GATEWAY_REQUIRED must be 1 for the Model Serving target pack");
|
|
2838
3412
|
}
|
|
@@ -2868,7 +3442,7 @@ function evalJudgeModelServingCheck() {
|
|
|
2868
3442
|
description: "Databricks Model Serving satisfies the deterministic evaluator chat contract",
|
|
2869
3443
|
configured: (env) => required2(env, names).length === 0,
|
|
2870
3444
|
async run({ env, client }) {
|
|
2871
|
-
|
|
3445
|
+
requireEnv2(env, names);
|
|
2872
3446
|
const api = adapter(client);
|
|
2873
3447
|
const name = env.DBX_TEST_EVAL_SERVING_ENDPOINT;
|
|
2874
3448
|
const endpoint = await api.servingEndpoint(name);
|
|
@@ -2908,7 +3482,7 @@ function vectorSearchCheck() {
|
|
|
2908
3482
|
description: "Vector Search endpoint and index are online",
|
|
2909
3483
|
configured: (env) => required2(env, names).length === 0,
|
|
2910
3484
|
async run({ env, client }) {
|
|
2911
|
-
|
|
3485
|
+
requireEnv2(env, names);
|
|
2912
3486
|
const api = adapter(client);
|
|
2913
3487
|
const endpoint = await api.vectorSearchEndpoint(env.DBX_TEST_VECTOR_ENDPOINT);
|
|
2914
3488
|
assertReady("Vector Search endpoint", endpoint.endpoint_status?.state, ["ONLINE", "READY"]);
|
|
@@ -2935,7 +3509,7 @@ function ragAgentCheck() {
|
|
|
2935
3509
|
description: "RAG retrieval and agent serving endpoint return non-empty responses",
|
|
2936
3510
|
configured: (env) => required2(env, names).length === 0,
|
|
2937
3511
|
async run({ env, client }) {
|
|
2938
|
-
|
|
3512
|
+
requireEnv2(env, names);
|
|
2939
3513
|
const api = adapter(client);
|
|
2940
3514
|
let retrieval;
|
|
2941
3515
|
if (env.DBX_TEST_VECTOR_QUERY_JSON) {
|
|
@@ -2979,13 +3553,13 @@ function federationSharingCleanRoomsCheck() {
|
|
|
2979
3553
|
id: "federation-sharing-cleanrooms",
|
|
2980
3554
|
description: "Lakehouse Federation connection, Delta Share and Clean Room are accessible",
|
|
2981
3555
|
configured: (env) => required2(env, names).length === 0,
|
|
2982
|
-
async run({ env, client, warehouse:
|
|
2983
|
-
|
|
3556
|
+
async run({ env, client, warehouse: warehouse3 }) {
|
|
3557
|
+
requireEnv2(env, names);
|
|
2984
3558
|
const api = adapter(client);
|
|
2985
3559
|
const connection = await api.connection(env.DBX_TEST_CONNECTION);
|
|
2986
3560
|
const share = await api.share(env.DBX_TEST_SHARE);
|
|
2987
3561
|
const room = await api.cleanRoom(env.DBX_TEST_CLEAN_ROOM);
|
|
2988
|
-
await booleanSql("Federated query", env.DBX_TEST_FEDERATION_ASSERTION_SQL,
|
|
3562
|
+
await booleanSql("Federated query", env.DBX_TEST_FEDERATION_ASSERTION_SQL, warehouse3.query);
|
|
2989
3563
|
return {
|
|
2990
3564
|
connection: connection.name ?? env.DBX_TEST_CONNECTION,
|
|
2991
3565
|
share: share.name ?? env.DBX_TEST_SHARE,
|
|
@@ -3004,8 +3578,8 @@ function securityPostureCostCheck() {
|
|
|
3004
3578
|
id: "security-cost",
|
|
3005
3579
|
description: "Network access controls, compute policy and cost guardrail are enforced",
|
|
3006
3580
|
configured: (env) => required2(env, names).length === 0,
|
|
3007
|
-
async run({ env, client, warehouse:
|
|
3008
|
-
|
|
3581
|
+
async run({ env, client, warehouse: warehouse3 }) {
|
|
3582
|
+
requireEnv2(env, names);
|
|
3009
3583
|
const api = adapter(client);
|
|
3010
3584
|
const access = await api.ipAccessList(env.DBX_TEST_IP_ACCESS_LIST_ID);
|
|
3011
3585
|
if (access.enabled === false) throw new Error("Configured IP access list is disabled");
|
|
@@ -3015,7 +3589,7 @@ function securityPostureCostCheck() {
|
|
|
3015
3589
|
if (env.DBX_TEST_EXPECT_HOST_SUFFIX && !env.DATABRICKS_HOST?.endsWith(env.DBX_TEST_EXPECT_HOST_SUFFIX)) {
|
|
3016
3590
|
throw new Error(`Workspace host does not end with ${env.DBX_TEST_EXPECT_HOST_SUFFIX}`);
|
|
3017
3591
|
}
|
|
3018
|
-
await booleanSql("Cost guardrail", env.DBX_TEST_COST_ASSERTION_SQL,
|
|
3592
|
+
await booleanSql("Cost guardrail", env.DBX_TEST_COST_ASSERTION_SQL, warehouse3.query);
|
|
3019
3593
|
return {
|
|
3020
3594
|
ipAccessList: access.list_id ?? env.DBX_TEST_IP_ACCESS_LIST_ID,
|
|
3021
3595
|
policy: policy.policy_id ?? policy.name,
|
|
@@ -3037,8 +3611,8 @@ function mlflow3GenAiQualityCheck() {
|
|
|
3037
3611
|
id: "mlflow3-genai-quality",
|
|
3038
3612
|
description: "MLflow 3 tracing, offline agent evaluation and production scorer monitoring produce durable evidence",
|
|
3039
3613
|
configured: (env) => required2(env, names).length === 0,
|
|
3040
|
-
async run({ env, client, warehouse:
|
|
3041
|
-
|
|
3614
|
+
async run({ env, client, warehouse: warehouse3 }) {
|
|
3615
|
+
requireEnv2(env, names);
|
|
3042
3616
|
const job = await runCertificationJob(
|
|
3043
3617
|
"MLflow 3 GenAI",
|
|
3044
3618
|
env.DBX_TEST_MLFLOW3_JOB_ID,
|
|
@@ -3046,26 +3620,26 @@ function mlflow3GenAiQualityCheck() {
|
|
|
3046
3620
|
client,
|
|
3047
3621
|
{ timeoutMs: Number(env.DBX_TEST_MLFLOW3_TIMEOUT_MS ?? 72e5) }
|
|
3048
3622
|
);
|
|
3049
|
-
await booleanSql("MLflow 3 trace", env.DBX_TEST_MLFLOW3_TRACE_ASSERTION_SQL,
|
|
3623
|
+
await booleanSql("MLflow 3 trace", env.DBX_TEST_MLFLOW3_TRACE_ASSERTION_SQL, warehouse3.query);
|
|
3050
3624
|
await booleanSql(
|
|
3051
3625
|
"MLflow 3 offline evaluation",
|
|
3052
3626
|
env.DBX_TEST_MLFLOW3_EVAL_ASSERTION_SQL,
|
|
3053
|
-
|
|
3627
|
+
warehouse3.query
|
|
3054
3628
|
);
|
|
3055
3629
|
await booleanSql(
|
|
3056
3630
|
"MLflow 3 production scorer lifecycle",
|
|
3057
3631
|
env.DBX_TEST_MLFLOW3_SCORER_ASSERTION_SQL,
|
|
3058
|
-
|
|
3632
|
+
warehouse3.query
|
|
3059
3633
|
);
|
|
3060
3634
|
await booleanSql(
|
|
3061
3635
|
"MLflow 3 production monitoring",
|
|
3062
3636
|
env.DBX_TEST_MLFLOW3_MONITOR_ASSERTION_SQL,
|
|
3063
|
-
|
|
3637
|
+
warehouse3.query
|
|
3064
3638
|
);
|
|
3065
3639
|
await booleanSql(
|
|
3066
3640
|
"AI Search retrieval quality",
|
|
3067
3641
|
env.DBX_TEST_AI_SEARCH_EVAL_ASSERTION_SQL,
|
|
3068
|
-
|
|
3642
|
+
warehouse3.query
|
|
3069
3643
|
);
|
|
3070
3644
|
return {
|
|
3071
3645
|
...job,
|
|
@@ -3084,8 +3658,8 @@ function agentEvaluationPipelineCheck() {
|
|
|
3084
3658
|
id: "agent-evaluation-pipeline",
|
|
3085
3659
|
description: "Experiments API, outbox, Temporal worker, Model Serving judge, SQL score sink and Quality completion execute end to end",
|
|
3086
3660
|
configured: (env) => required2(env, names).length === 0,
|
|
3087
|
-
async run({ env, client, warehouse:
|
|
3088
|
-
|
|
3661
|
+
async run({ env, client, warehouse: warehouse3 }) {
|
|
3662
|
+
requireEnv2(env, names);
|
|
3089
3663
|
const job = await runCertificationJob(
|
|
3090
3664
|
"Agent evaluation end-to-end",
|
|
3091
3665
|
env.DBX_TEST_AGENT_EVAL_E2E_JOB_ID,
|
|
@@ -3095,7 +3669,7 @@ function agentEvaluationPipelineCheck() {
|
|
|
3095
3669
|
await booleanSql(
|
|
3096
3670
|
"Agent evaluation terminal Quality evidence",
|
|
3097
3671
|
env.DBX_TEST_AGENT_EVAL_ASSERTION_SQL,
|
|
3098
|
-
|
|
3672
|
+
warehouse3.query
|
|
3099
3673
|
);
|
|
3100
3674
|
return { ...job, api: true, outbox: true, temporal: true, judged: true, persisted: true };
|
|
3101
3675
|
}
|
|
@@ -3112,23 +3686,23 @@ function managedMcpAgentsCheck() {
|
|
|
3112
3686
|
id: "managed-mcp-agents",
|
|
3113
3687
|
description: "Managed MCP and Unity Catalog MCP Services support list, call and deny behavior",
|
|
3114
3688
|
configured: (env) => required2(env, names).length === 0,
|
|
3115
|
-
async run({ env, client, warehouse:
|
|
3116
|
-
|
|
3689
|
+
async run({ env, client, warehouse: warehouse3 }) {
|
|
3690
|
+
requireEnv2(env, names);
|
|
3117
3691
|
const job = await runCertificationJob("Databricks MCP", env.DBX_TEST_MCP_JOB_ID, env, client);
|
|
3118
3692
|
await booleanSql(
|
|
3119
3693
|
"Managed MCP list/call",
|
|
3120
3694
|
env.DBX_TEST_MCP_MANAGED_ASSERTION_SQL,
|
|
3121
|
-
|
|
3695
|
+
warehouse3.query
|
|
3122
3696
|
);
|
|
3123
3697
|
await booleanSql(
|
|
3124
3698
|
"Unity Catalog MCP Service list/call",
|
|
3125
3699
|
env.DBX_TEST_MCP_SERVICE_ASSERTION_SQL,
|
|
3126
|
-
|
|
3700
|
+
warehouse3.query
|
|
3127
3701
|
);
|
|
3128
3702
|
await booleanSql(
|
|
3129
3703
|
"MCP excluded-tool denial",
|
|
3130
3704
|
env.DBX_TEST_MCP_DENY_ASSERTION_SQL,
|
|
3131
|
-
|
|
3705
|
+
warehouse3.query
|
|
3132
3706
|
);
|
|
3133
3707
|
return { ...job, managedServer: true, mcpService: true, denyControl: true };
|
|
3134
3708
|
}
|
|
@@ -3146,8 +3720,8 @@ function dataQualityAppTelemetryCheck() {
|
|
|
3146
3720
|
id: "data-quality-app-telemetry",
|
|
3147
3721
|
description: "Unity Catalog data quality monitoring and Databricks Apps logs, spans and metrics are current",
|
|
3148
3722
|
configured: (env) => required2(env, names).length === 0,
|
|
3149
|
-
async run({ env, client, warehouse:
|
|
3150
|
-
|
|
3723
|
+
async run({ env, client, warehouse: warehouse3 }) {
|
|
3724
|
+
requireEnv2(env, names);
|
|
3151
3725
|
const appName = env.DBX_TEST_TELEMETRY_APP_NAME;
|
|
3152
3726
|
const app = await adapter(client).app(appName);
|
|
3153
3727
|
const destinations = Array.isArray(app.telemetry_export_destinations) ? app.telemetry_export_destinations : [];
|
|
@@ -3163,10 +3737,10 @@ function dataQualityAppTelemetryCheck() {
|
|
|
3163
3737
|
throw new Error(`Databricks App ${appName} telemetry destination has no ${field}`);
|
|
3164
3738
|
}
|
|
3165
3739
|
}
|
|
3166
|
-
await booleanSql("Data Quality Monitoring", env.DBX_TEST_DQM_ASSERTION_SQL,
|
|
3167
|
-
await booleanSql("App logs", env.DBX_TEST_APP_LOGS_ASSERTION_SQL,
|
|
3168
|
-
await booleanSql("App spans", env.DBX_TEST_APP_SPANS_ASSERTION_SQL,
|
|
3169
|
-
await booleanSql("App metrics", env.DBX_TEST_APP_METRICS_ASSERTION_SQL,
|
|
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);
|
|
3170
3744
|
return { app: appName, unityCatalogTelemetry: true, dataQualityMonitoring: true };
|
|
3171
3745
|
}
|
|
3172
3746
|
};
|
|
@@ -3182,7 +3756,7 @@ function agentServicesEnrollmentCheck() {
|
|
|
3182
3756
|
description: "A customer-owned Harness agent is registered as an external Unity Catalog Agent Service with governed access",
|
|
3183
3757
|
configured: (env) => required2(env, names).length === 0,
|
|
3184
3758
|
async run({ env, client }) {
|
|
3185
|
-
|
|
3759
|
+
requireEnv2(env, names);
|
|
3186
3760
|
const fullName = env.DBX_TEST_AGENT_SERVICE_FULL_NAME;
|
|
3187
3761
|
const api = adapter(client);
|
|
3188
3762
|
const service = await api.agentService(fullName);
|
|
@@ -3230,7 +3804,7 @@ function regionalDrCheck(options = {}) {
|
|
|
3230
3804
|
description: "Secondary-region workspace authentication and SQL warehouse are reachable",
|
|
3231
3805
|
configured: (env) => required2(env, names).length === 0,
|
|
3232
3806
|
async run({ env }) {
|
|
3233
|
-
|
|
3807
|
+
requireEnv2(env, names);
|
|
3234
3808
|
const drEnv = {
|
|
3235
3809
|
...env,
|
|
3236
3810
|
DATABRICKS_HOST: env.DBX_TEST_DR_HOST,
|
|
@@ -3260,14 +3834,14 @@ function regionalDrCheck(options = {}) {
|
|
|
3260
3834
|
}
|
|
3261
3835
|
|
|
3262
3836
|
// src/advanced-target-packs.ts
|
|
3263
|
-
var
|
|
3264
|
-
var
|
|
3265
|
-
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 = {
|
|
3266
3840
|
id: "workspace",
|
|
3267
3841
|
description: "Databricks workspace host",
|
|
3268
3842
|
anyOf: ["DATABRICKS_HOST"]
|
|
3269
3843
|
};
|
|
3270
|
-
var
|
|
3844
|
+
var auth2 = {
|
|
3271
3845
|
id: "authentication",
|
|
3272
3846
|
description: "Databricks OAuth, OIDC, bearer, or PAT authentication",
|
|
3273
3847
|
anyOf: [
|
|
@@ -3279,12 +3853,12 @@ var auth = {
|
|
|
3279
3853
|
],
|
|
3280
3854
|
secret: true
|
|
3281
3855
|
};
|
|
3282
|
-
var
|
|
3856
|
+
var warehouse2 = {
|
|
3283
3857
|
id: "warehouse",
|
|
3284
3858
|
description: "SQL warehouse for data-plane assertions",
|
|
3285
3859
|
anyOf: ["DATABRICKS_WAREHOUSE_ID", "DATABRICKS_HTTP_PATH"]
|
|
3286
3860
|
};
|
|
3287
|
-
var
|
|
3861
|
+
var requirement2 = (id, description, ...anyOf) => ({
|
|
3288
3862
|
id,
|
|
3289
3863
|
description,
|
|
3290
3864
|
anyOf
|
|
@@ -3305,31 +3879,31 @@ function createAdvancedStreamingTargetPack() {
|
|
|
3305
3879
|
checks: () => [restrictedPrincipalCheck(), advancedStreamingCdcCheck(), lakeflowConnectCheck()],
|
|
3306
3880
|
requiredChecks: ["restricted-principal", "streaming-cdc", "lakeflow-connect"],
|
|
3307
3881
|
requirements: [
|
|
3308
|
-
|
|
3309
|
-
|
|
3310
|
-
|
|
3311
|
-
|
|
3312
|
-
|
|
3313
|
-
|
|
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(
|
|
3314
3888
|
"connect-pipeline",
|
|
3315
3889
|
"Lakeflow Connect ingestion pipeline",
|
|
3316
3890
|
"DBX_TEST_CONNECT_PIPELINE_ID"
|
|
3317
3891
|
),
|
|
3318
|
-
|
|
3892
|
+
requirement2(
|
|
3319
3893
|
"streaming-assertion",
|
|
3320
3894
|
"Streaming freshness SQL",
|
|
3321
3895
|
"DBX_TEST_STREAMING_ASSERTION_SQL"
|
|
3322
3896
|
),
|
|
3323
|
-
|
|
3324
|
-
|
|
3897
|
+
requirement2("cdc-assertion", "CDC correctness SQL", "DBX_TEST_CDC_ASSERTION_SQL"),
|
|
3898
|
+
requirement2(
|
|
3325
3899
|
"connect-assertion",
|
|
3326
3900
|
"Lakeflow Connect replication SQL",
|
|
3327
3901
|
"DBX_TEST_CONNECT_ASSERTION_SQL"
|
|
3328
3902
|
)
|
|
3329
3903
|
],
|
|
3330
|
-
docsUrl: `${
|
|
3904
|
+
docsUrl: `${DOCS3}#advanced-streaming-cdc-and-lakeflow-connect`,
|
|
3331
3905
|
certificationScopes: [
|
|
3332
|
-
`${
|
|
3906
|
+
`${AZURE_M2M_SCOPE2}; serverless Lakeflow pipeline AUTO CDC and query-based PostgreSQL foreign-catalog ingestion`
|
|
3333
3907
|
]
|
|
3334
3908
|
});
|
|
3335
3909
|
}
|
|
@@ -3344,19 +3918,19 @@ function createAiBiGenieTargetPack() {
|
|
|
3344
3918
|
checks: () => [restrictedPrincipalCheck(), aiBiDashboardCheck(), genieCheck()],
|
|
3345
3919
|
requiredChecks: ["restricted-principal", "aibi-dashboard", "genie"],
|
|
3346
3920
|
requirements: [
|
|
3347
|
-
|
|
3348
|
-
|
|
3349
|
-
|
|
3350
|
-
|
|
3351
|
-
|
|
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(
|
|
3352
3926
|
"genie-question",
|
|
3353
3927
|
"Grounded Genie certification question",
|
|
3354
3928
|
"DBX_TEST_GENIE_QUESTION"
|
|
3355
3929
|
)
|
|
3356
3930
|
],
|
|
3357
|
-
docsUrl: `${
|
|
3931
|
+
docsUrl: `${DOCS3}#aibi-dashboards-and-genie`,
|
|
3358
3932
|
certificationScopes: [
|
|
3359
|
-
`${
|
|
3933
|
+
`${AZURE_M2M_SCOPE2}; published AI/BI dashboard revision and Genie conversation start`
|
|
3360
3934
|
]
|
|
3361
3935
|
});
|
|
3362
3936
|
}
|
|
@@ -3376,19 +3950,19 @@ function createMlflowLifecycleTargetPack() {
|
|
|
3376
3950
|
checks: () => [restrictedPrincipalCheck(), mlflowLifecycleCheck()],
|
|
3377
3951
|
requiredChecks: ["restricted-principal", "mlflow-lifecycle"],
|
|
3378
3952
|
requirements: [
|
|
3379
|
-
|
|
3380
|
-
|
|
3381
|
-
|
|
3382
|
-
|
|
3953
|
+
workspace2,
|
|
3954
|
+
auth2,
|
|
3955
|
+
requirement2("experiment", "MLflow experiment ID", "DBX_TEST_MLFLOW_EXPERIMENT_ID"),
|
|
3956
|
+
requirement2(
|
|
3383
3957
|
"registered-model",
|
|
3384
3958
|
"Unity Catalog registered model",
|
|
3385
3959
|
"DBX_TEST_REGISTERED_MODEL"
|
|
3386
3960
|
),
|
|
3387
|
-
|
|
3961
|
+
requirement2("model-version", "Registered model version", "DBX_TEST_MODEL_VERSION")
|
|
3388
3962
|
],
|
|
3389
|
-
docsUrl: `${
|
|
3963
|
+
docsUrl: `${DOCS3}#mlflow-and-model-lifecycle`,
|
|
3390
3964
|
certificationScopes: [
|
|
3391
|
-
`${
|
|
3965
|
+
`${AZURE_M2M_SCOPE2}; MLflow experiment and configured Unity Catalog model version`
|
|
3392
3966
|
]
|
|
3393
3967
|
});
|
|
3394
3968
|
}
|
|
@@ -3408,25 +3982,25 @@ function createFeatureEngineeringTargetPack() {
|
|
|
3408
3982
|
checks: () => [restrictedPrincipalCheck(), featureEngineeringServingCheck()],
|
|
3409
3983
|
requiredChecks: ["restricted-principal", "feature-engineering"],
|
|
3410
3984
|
requirements: [
|
|
3411
|
-
|
|
3412
|
-
|
|
3413
|
-
|
|
3414
|
-
|
|
3415
|
-
|
|
3985
|
+
workspace2,
|
|
3986
|
+
auth2,
|
|
3987
|
+
warehouse2,
|
|
3988
|
+
requirement2("feature-table", "Unity Catalog feature table", "DBX_TEST_FEATURE_TABLE"),
|
|
3989
|
+
requirement2(
|
|
3416
3990
|
"online-materialization",
|
|
3417
3991
|
"Databricks Online Table or Synced Table pipeline",
|
|
3418
3992
|
"DBX_TEST_ONLINE_TABLE",
|
|
3419
3993
|
"DBX_TEST_FEATURE_SERVING_PIPELINE_ID"
|
|
3420
3994
|
),
|
|
3421
|
-
|
|
3995
|
+
requirement2(
|
|
3422
3996
|
"feature-assertion",
|
|
3423
3997
|
"Feature freshness/correctness SQL",
|
|
3424
3998
|
"DBX_TEST_FEATURE_ASSERTION_SQL"
|
|
3425
3999
|
)
|
|
3426
4000
|
],
|
|
3427
|
-
docsUrl: `${
|
|
4001
|
+
docsUrl: `${DOCS3}#feature-engineering-and-serving`,
|
|
3428
4002
|
certificationScopes: [
|
|
3429
|
-
`${
|
|
4003
|
+
`${AZURE_M2M_SCOPE2}; Delta feature table, PostgreSQL-backed Synced Table, and SQL freshness`
|
|
3430
4004
|
]
|
|
3431
4005
|
});
|
|
3432
4006
|
}
|
|
@@ -3445,23 +4019,23 @@ function createModelServingTargetPack() {
|
|
|
3445
4019
|
checks: () => [restrictedPrincipalCheck(), modelServingCheck()],
|
|
3446
4020
|
requiredChecks: ["restricted-principal", "model-serving"],
|
|
3447
4021
|
requirements: [
|
|
3448
|
-
|
|
3449
|
-
|
|
3450
|
-
|
|
3451
|
-
|
|
4022
|
+
workspace2,
|
|
4023
|
+
auth2,
|
|
4024
|
+
requirement2("serving-endpoint", "Model Serving endpoint name", "DBX_TEST_SERVING_ENDPOINT"),
|
|
4025
|
+
requirement2(
|
|
3452
4026
|
"serving-request",
|
|
3453
4027
|
"Safe inference request JSON",
|
|
3454
4028
|
"DBX_TEST_SERVING_REQUEST_JSON"
|
|
3455
4029
|
),
|
|
3456
|
-
|
|
4030
|
+
requirement2(
|
|
3457
4031
|
"ai-gateway",
|
|
3458
4032
|
"AI Gateway enforcement flag set to 1",
|
|
3459
4033
|
"DBX_TEST_AI_GATEWAY_REQUIRED"
|
|
3460
4034
|
)
|
|
3461
4035
|
],
|
|
3462
|
-
docsUrl: `${
|
|
4036
|
+
docsUrl: `${DOCS3}#model-serving-and-ai-gateway`,
|
|
3463
4037
|
certificationScopes: [
|
|
3464
|
-
`${
|
|
4038
|
+
`${AZURE_M2M_SCOPE2}; custom-model inference and AI Gateway inference-table configuration`
|
|
3465
4039
|
]
|
|
3466
4040
|
});
|
|
3467
4041
|
}
|
|
@@ -3481,17 +4055,17 @@ function createVectorRagAgentsTargetPack() {
|
|
|
3481
4055
|
checks: () => [restrictedPrincipalCheck(), vectorSearchCheck(), ragAgentCheck()],
|
|
3482
4056
|
requiredChecks: ["restricted-principal", "vector-search", "rag-agent"],
|
|
3483
4057
|
requirements: [
|
|
3484
|
-
|
|
3485
|
-
|
|
3486
|
-
|
|
3487
|
-
|
|
3488
|
-
|
|
3489
|
-
|
|
3490
|
-
|
|
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")
|
|
3491
4065
|
],
|
|
3492
|
-
docsUrl: `${
|
|
4066
|
+
docsUrl: `${DOCS3}#vector-search-rag-and-agents`,
|
|
3493
4067
|
certificationScopes: [
|
|
3494
|
-
`${
|
|
4068
|
+
`${AZURE_M2M_SCOPE2}; Delta Sync vector retrieval and custom PyFunc agent invocation`
|
|
3495
4069
|
]
|
|
3496
4070
|
});
|
|
3497
4071
|
}
|
|
@@ -3511,21 +4085,21 @@ function createFederationSharingTargetPack() {
|
|
|
3511
4085
|
checks: () => [restrictedPrincipalCheck(), federationSharingCleanRoomsCheck()],
|
|
3512
4086
|
requiredChecks: ["restricted-principal", "federation-sharing-cleanrooms"],
|
|
3513
4087
|
requirements: [
|
|
3514
|
-
|
|
3515
|
-
|
|
3516
|
-
|
|
3517
|
-
|
|
3518
|
-
|
|
3519
|
-
|
|
3520
|
-
|
|
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(
|
|
3521
4095
|
"federation-assertion",
|
|
3522
4096
|
"Federated data-plane SQL",
|
|
3523
4097
|
"DBX_TEST_FEDERATION_ASSERTION_SQL"
|
|
3524
4098
|
)
|
|
3525
4099
|
],
|
|
3526
|
-
docsUrl: `${
|
|
4100
|
+
docsUrl: `${DOCS3}#federation-delta-sharing-and-clean-rooms`,
|
|
3527
4101
|
certificationScopes: [
|
|
3528
|
-
`${
|
|
4102
|
+
`${AZURE_M2M_SCOPE2}; managed PostgreSQL federation, Delta Sharing table, and two-metastore Clean Room`
|
|
3529
4103
|
]
|
|
3530
4104
|
});
|
|
3531
4105
|
}
|
|
@@ -3545,23 +4119,23 @@ function createSecurityCostDrTargetPack() {
|
|
|
3545
4119
|
checks: () => [restrictedPrincipalCheck(), securityPostureCostCheck(), regionalDrCheck()],
|
|
3546
4120
|
requiredChecks: ["restricted-principal", "security-cost", "regional-dr"],
|
|
3547
4121
|
requirements: [
|
|
3548
|
-
|
|
3549
|
-
|
|
3550
|
-
|
|
3551
|
-
|
|
4122
|
+
workspace2,
|
|
4123
|
+
auth2,
|
|
4124
|
+
warehouse2,
|
|
4125
|
+
requirement2(
|
|
3552
4126
|
"ip-access-list",
|
|
3553
4127
|
"Enabled workspace IP access list",
|
|
3554
4128
|
"DBX_TEST_IP_ACCESS_LIST_ID"
|
|
3555
4129
|
),
|
|
3556
|
-
|
|
3557
|
-
|
|
3558
|
-
|
|
3559
|
-
|
|
3560
|
-
|
|
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")
|
|
3561
4135
|
],
|
|
3562
|
-
docsUrl: `${
|
|
4136
|
+
docsUrl: `${DOCS3}#networking-security-cost-and-regional-dr`,
|
|
3563
4137
|
certificationScopes: [
|
|
3564
|
-
`${
|
|
4138
|
+
`${AZURE_M2M_SCOPE2}; TEST-NET block list, bounded compute policy, billing system-table guardrail, and West US 3 serverless DR warehouse`
|
|
3565
4139
|
]
|
|
3566
4140
|
});
|
|
3567
4141
|
}
|
|
@@ -3582,39 +4156,39 @@ function createMlflow3AgentQualityTargetPack() {
|
|
|
3582
4156
|
checks: () => [restrictedPrincipalCheck(), mlflow3GenAiQualityCheck()],
|
|
3583
4157
|
requiredChecks: ["restricted-principal", "mlflow3-genai-quality"],
|
|
3584
4158
|
requirements: [
|
|
3585
|
-
|
|
3586
|
-
|
|
3587
|
-
|
|
3588
|
-
|
|
3589
|
-
|
|
4159
|
+
workspace2,
|
|
4160
|
+
auth2,
|
|
4161
|
+
warehouse2,
|
|
4162
|
+
requirement2("mlflow3-job", "Native MLflow 3 certification Job", "DBX_TEST_MLFLOW3_JOB_ID"),
|
|
4163
|
+
requirement2(
|
|
3590
4164
|
"mlflow3-traces",
|
|
3591
4165
|
"Boolean SQL proving a fresh MLflow 3 trace",
|
|
3592
4166
|
"DBX_TEST_MLFLOW3_TRACE_ASSERTION_SQL"
|
|
3593
4167
|
),
|
|
3594
|
-
|
|
4168
|
+
requirement2(
|
|
3595
4169
|
"mlflow3-evaluation",
|
|
3596
4170
|
"Boolean SQL proving offline agent evaluation results",
|
|
3597
4171
|
"DBX_TEST_MLFLOW3_EVAL_ASSERTION_SQL"
|
|
3598
4172
|
),
|
|
3599
|
-
|
|
4173
|
+
requirement2(
|
|
3600
4174
|
"mlflow3-scorers",
|
|
3601
4175
|
"Boolean SQL proving production scorer lifecycle evidence",
|
|
3602
4176
|
"DBX_TEST_MLFLOW3_SCORER_ASSERTION_SQL"
|
|
3603
4177
|
),
|
|
3604
|
-
|
|
4178
|
+
requirement2(
|
|
3605
4179
|
"mlflow3-monitoring",
|
|
3606
4180
|
"Boolean SQL proving production monitoring output",
|
|
3607
4181
|
"DBX_TEST_MLFLOW3_MONITOR_ASSERTION_SQL"
|
|
3608
4182
|
),
|
|
3609
|
-
|
|
4183
|
+
requirement2(
|
|
3610
4184
|
"ai-search-evaluation",
|
|
3611
4185
|
"Boolean SQL proving AI Search retrieval-quality thresholds",
|
|
3612
4186
|
"DBX_TEST_AI_SEARCH_EVAL_ASSERTION_SQL"
|
|
3613
4187
|
)
|
|
3614
4188
|
],
|
|
3615
|
-
docsUrl: `${
|
|
4189
|
+
docsUrl: `${DOCS3}#mlflow-3-agent-quality-and-monitoring`,
|
|
3616
4190
|
certificationScopes: [
|
|
3617
|
-
`${
|
|
4191
|
+
`${AZURE_M2M_SCOPE2}; Python-native MLflow 3 trace, evaluation, complete scorer lifecycle and monitor evidence`
|
|
3618
4192
|
]
|
|
3619
4193
|
});
|
|
3620
4194
|
}
|
|
@@ -3639,28 +4213,28 @@ function createAgentEvaluationPipelineTargetPack() {
|
|
|
3639
4213
|
],
|
|
3640
4214
|
requiredChecks: ["restricted-principal", "model-eval-judge", "agent-evaluation-pipeline"],
|
|
3641
4215
|
requirements: [
|
|
3642
|
-
|
|
3643
|
-
|
|
3644
|
-
|
|
3645
|
-
|
|
4216
|
+
workspace2,
|
|
4217
|
+
auth2,
|
|
4218
|
+
warehouse2,
|
|
4219
|
+
requirement2(
|
|
3646
4220
|
"eval-serving-endpoint",
|
|
3647
4221
|
"Databricks Model Serving endpoint satisfying the evaluator chat contract",
|
|
3648
4222
|
"DBX_TEST_EVAL_SERVING_ENDPOINT"
|
|
3649
4223
|
),
|
|
3650
|
-
|
|
4224
|
+
requirement2(
|
|
3651
4225
|
"agent-eval-job",
|
|
3652
4226
|
"Exact-candidate end-to-end agent evaluation certification Job",
|
|
3653
4227
|
"DBX_TEST_AGENT_EVAL_E2E_JOB_ID"
|
|
3654
4228
|
),
|
|
3655
|
-
|
|
4229
|
+
requirement2(
|
|
3656
4230
|
"agent-eval-evidence",
|
|
3657
4231
|
"Boolean SQL proving terminal scores and Quality evidence",
|
|
3658
4232
|
"DBX_TEST_AGENT_EVAL_ASSERTION_SQL"
|
|
3659
4233
|
)
|
|
3660
4234
|
],
|
|
3661
|
-
docsUrl: `${
|
|
4235
|
+
docsUrl: `${DOCS3}#agent-evaluation-delivery-pipeline`,
|
|
3662
4236
|
certificationScopes: [
|
|
3663
|
-
`${
|
|
4237
|
+
`${AZURE_M2M_SCOPE2}; Experiments API through customer worker and Databricks judge to SQL/Quality`
|
|
3664
4238
|
]
|
|
3665
4239
|
});
|
|
3666
4240
|
}
|
|
@@ -3680,29 +4254,29 @@ function createManagedMcpAgentsTargetPack() {
|
|
|
3680
4254
|
checks: () => [restrictedPrincipalCheck(), managedMcpAgentsCheck()],
|
|
3681
4255
|
requiredChecks: ["restricted-principal", "managed-mcp-agents"],
|
|
3682
4256
|
requirements: [
|
|
3683
|
-
|
|
3684
|
-
|
|
3685
|
-
|
|
3686
|
-
|
|
3687
|
-
|
|
4257
|
+
workspace2,
|
|
4258
|
+
auth2,
|
|
4259
|
+
warehouse2,
|
|
4260
|
+
requirement2("mcp-job", "Native Streamable HTTP MCP certification Job", "DBX_TEST_MCP_JOB_ID"),
|
|
4261
|
+
requirement2(
|
|
3688
4262
|
"managed-mcp",
|
|
3689
4263
|
"Boolean SQL proving managed MCP list/call behavior",
|
|
3690
4264
|
"DBX_TEST_MCP_MANAGED_ASSERTION_SQL"
|
|
3691
4265
|
),
|
|
3692
|
-
|
|
4266
|
+
requirement2(
|
|
3693
4267
|
"mcp-service",
|
|
3694
4268
|
"Boolean SQL proving UC MCP Service list/call behavior",
|
|
3695
4269
|
"DBX_TEST_MCP_SERVICE_ASSERTION_SQL"
|
|
3696
4270
|
),
|
|
3697
|
-
|
|
4271
|
+
requirement2(
|
|
3698
4272
|
"mcp-denial",
|
|
3699
4273
|
"Boolean SQL proving an MCP tool excluded by UC selectors was denied",
|
|
3700
4274
|
"DBX_TEST_MCP_DENY_ASSERTION_SQL"
|
|
3701
4275
|
)
|
|
3702
4276
|
],
|
|
3703
|
-
docsUrl: `${
|
|
4277
|
+
docsUrl: `${DOCS3}#managed-mcp-and-mcp-services`,
|
|
3704
4278
|
certificationScopes: [
|
|
3705
|
-
`${
|
|
4279
|
+
`${AZURE_M2M_SCOPE2}; managed AI Search or SQL MCP plus a UC MCP Service over Streamable HTTP`
|
|
3706
4280
|
]
|
|
3707
4281
|
});
|
|
3708
4282
|
}
|
|
@@ -3722,34 +4296,34 @@ function createDataQualityObservabilityTargetPack() {
|
|
|
3722
4296
|
checks: () => [restrictedPrincipalCheck(), dataQualityAppTelemetryCheck()],
|
|
3723
4297
|
requiredChecks: ["restricted-principal", "data-quality-app-telemetry"],
|
|
3724
4298
|
requirements: [
|
|
3725
|
-
|
|
3726
|
-
|
|
3727
|
-
|
|
3728
|
-
|
|
3729
|
-
|
|
4299
|
+
workspace2,
|
|
4300
|
+
auth2,
|
|
4301
|
+
warehouse2,
|
|
4302
|
+
requirement2("telemetry-app", "App with UC telemetry export", "DBX_TEST_TELEMETRY_APP_NAME"),
|
|
4303
|
+
requirement2(
|
|
3730
4304
|
"data-quality",
|
|
3731
4305
|
"Boolean SQL over current Data Quality Monitoring results",
|
|
3732
4306
|
"DBX_TEST_DQM_ASSERTION_SQL"
|
|
3733
4307
|
),
|
|
3734
|
-
|
|
4308
|
+
requirement2(
|
|
3735
4309
|
"app-logs",
|
|
3736
4310
|
"Boolean SQL proving current app logs",
|
|
3737
4311
|
"DBX_TEST_APP_LOGS_ASSERTION_SQL"
|
|
3738
4312
|
),
|
|
3739
|
-
|
|
4313
|
+
requirement2(
|
|
3740
4314
|
"app-spans",
|
|
3741
4315
|
"Boolean SQL proving current app spans",
|
|
3742
4316
|
"DBX_TEST_APP_SPANS_ASSERTION_SQL"
|
|
3743
4317
|
),
|
|
3744
|
-
|
|
4318
|
+
requirement2(
|
|
3745
4319
|
"app-metrics",
|
|
3746
4320
|
"Boolean SQL proving current app metrics",
|
|
3747
4321
|
"DBX_TEST_APP_METRICS_ASSERTION_SQL"
|
|
3748
4322
|
)
|
|
3749
4323
|
],
|
|
3750
|
-
docsUrl: `${
|
|
4324
|
+
docsUrl: `${DOCS3}#data-quality-and-databricks-apps-observability`,
|
|
3751
4325
|
certificationScopes: [
|
|
3752
|
-
`${
|
|
4326
|
+
`${AZURE_M2M_SCOPE2}; system.data_quality_monitoring.table_results and UC OTel tables`
|
|
3753
4327
|
]
|
|
3754
4328
|
});
|
|
3755
4329
|
}
|
|
@@ -3769,27 +4343,27 @@ function createAgentServicesEnrollmentTargetPack() {
|
|
|
3769
4343
|
checks: () => [restrictedPrincipalCheck(), agentServicesEnrollmentCheck()],
|
|
3770
4344
|
requiredChecks: ["restricted-principal", "agent-services-enrollment"],
|
|
3771
4345
|
requirements: [
|
|
3772
|
-
|
|
3773
|
-
|
|
3774
|
-
|
|
4346
|
+
workspace2,
|
|
4347
|
+
auth2,
|
|
4348
|
+
requirement2(
|
|
3775
4349
|
"agent-service",
|
|
3776
4350
|
"External Unity Catalog Agent Service full name",
|
|
3777
4351
|
"DBX_TEST_AGENT_SERVICE_FULL_NAME"
|
|
3778
4352
|
),
|
|
3779
|
-
|
|
4353
|
+
requirement2(
|
|
3780
4354
|
"agent-connection",
|
|
3781
4355
|
"Expected Unity Catalog HTTP connection",
|
|
3782
4356
|
"DBX_TEST_AGENT_SERVICE_CONNECTION"
|
|
3783
4357
|
),
|
|
3784
|
-
|
|
4358
|
+
requirement2(
|
|
3785
4359
|
"agent-execute-principal",
|
|
3786
4360
|
"Principal expected to have EXECUTE",
|
|
3787
4361
|
"DBX_TEST_AGENT_SERVICE_EXECUTE_PRINCIPAL"
|
|
3788
4362
|
)
|
|
3789
4363
|
],
|
|
3790
|
-
docsUrl: `${
|
|
4364
|
+
docsUrl: `${DOCS3}#unity-catalog-agent-services-enrollment`,
|
|
3791
4365
|
certificationScopes: [
|
|
3792
|
-
`${
|
|
4366
|
+
`${AZURE_M2M_SCOPE2}; Agent Services Beta registration/discovery/ACL only; runtime invocation is not claimed`
|
|
3793
4367
|
]
|
|
3794
4368
|
});
|
|
3795
4369
|
}
|
|
@@ -3816,7 +4390,8 @@ function createBuiltinTargetPacks() {
|
|
|
3816
4390
|
return [
|
|
3817
4391
|
...createFoundationTargetPacks(),
|
|
3818
4392
|
createLakeflowJobsTargetPack(),
|
|
3819
|
-
...createAdvancedTargetPacks()
|
|
4393
|
+
...createAdvancedTargetPacks(),
|
|
4394
|
+
...createNextTargetPacks()
|
|
3820
4395
|
];
|
|
3821
4396
|
}
|
|
3822
4397
|
var builtinTargetPacks = createBuiltinTargetPacks();
|
|
@@ -3828,8 +4403,11 @@ exports.DatabricksAdvancedWorkloadsAdapter = DatabricksAdvancedWorkloadsAdapter;
|
|
|
3828
4403
|
exports.DatabricksJobsAdapter = DatabricksJobsAdapter;
|
|
3829
4404
|
exports.advancedStreamingCdcCheck = advancedStreamingCdcCheck;
|
|
3830
4405
|
exports.agentEvaluationPipelineCheck = agentEvaluationPipelineCheck;
|
|
4406
|
+
exports.agentOrchestrationResponsesCheck = agentOrchestrationResponsesCheck;
|
|
3831
4407
|
exports.agentServicesEnrollmentCheck = agentServicesEnrollmentCheck;
|
|
3832
4408
|
exports.aiBiDashboardCheck = aiBiDashboardCheck;
|
|
4409
|
+
exports.aiFunctionsBatchInferenceCheck = aiFunctionsBatchInferenceCheck;
|
|
4410
|
+
exports.aiRuntimeTrainingCheck = aiRuntimeTrainingCheck;
|
|
3833
4411
|
exports.appHealthCheck = appHealthCheck;
|
|
3834
4412
|
exports.assertDeltaContract = assertDeltaContract;
|
|
3835
4413
|
exports.autoLoaderIngestionCheck = autoLoaderIngestionCheck;
|
|
@@ -3840,12 +4418,16 @@ exports.compareToGolden = compareToGolden;
|
|
|
3840
4418
|
exports.createAdvancedStreamingTargetPack = createAdvancedStreamingTargetPack;
|
|
3841
4419
|
exports.createAdvancedTargetPacks = createAdvancedTargetPacks;
|
|
3842
4420
|
exports.createAgentEvaluationPipelineTargetPack = createAgentEvaluationPipelineTargetPack;
|
|
4421
|
+
exports.createAgentOrchestrationTargetPack = createAgentOrchestrationTargetPack;
|
|
3843
4422
|
exports.createAgentServicesEnrollmentTargetPack = createAgentServicesEnrollmentTargetPack;
|
|
3844
4423
|
exports.createAiBiGenieTargetPack = createAiBiGenieTargetPack;
|
|
4424
|
+
exports.createAiFunctionsBatchInferenceTargetPack = createAiFunctionsBatchInferenceTargetPack;
|
|
4425
|
+
exports.createAiRuntimeTrainingTargetPack = createAiRuntimeTrainingTargetPack;
|
|
3845
4426
|
exports.createAppsOperationalFoundationPack = createAppsOperationalFoundationPack;
|
|
3846
4427
|
exports.createBuiltinTargetPacks = createBuiltinTargetPacks;
|
|
3847
4428
|
exports.createClientFromEnv = createClientFromEnv;
|
|
3848
4429
|
exports.createDataQualityObservabilityTargetPack = createDataQualityObservabilityTargetPack;
|
|
4430
|
+
exports.createDeclarativeBundlesTargetPack = createDeclarativeBundlesTargetPack;
|
|
3849
4431
|
exports.createDuckDbContext = createDuckDbContext;
|
|
3850
4432
|
exports.createEphemeralLakebaseBranch = createEphemeralLakebaseBranch;
|
|
3851
4433
|
exports.createExecutionContext = createExecutionContext;
|
|
@@ -3853,15 +4435,20 @@ exports.createFeatureEngineeringTargetPack = createFeatureEngineeringTargetPack;
|
|
|
3853
4435
|
exports.createFederationSharingTargetPack = createFederationSharingTargetPack;
|
|
3854
4436
|
exports.createFoundationTargetPacks = createFoundationTargetPacks;
|
|
3855
4437
|
exports.createJobsCodeFoundationPack = createJobsCodeFoundationPack;
|
|
4438
|
+
exports.createLakebaseAutoscalingFeatureStoreTargetPack = createLakebaseAutoscalingFeatureStoreTargetPack;
|
|
3856
4439
|
exports.createLakebaseTestProvider = createLakebaseTestProvider;
|
|
3857
4440
|
exports.createLakeflowFoundationPack = createLakeflowFoundationPack;
|
|
3858
4441
|
exports.createLakeflowJobsTargetPack = createLakeflowJobsTargetPack;
|
|
4442
|
+
exports.createLakehouseOptimizationTargetPack = createLakehouseOptimizationTargetPack;
|
|
3859
4443
|
exports.createManagedMcpAgentsTargetPack = createManagedMcpAgentsTargetPack;
|
|
4444
|
+
exports.createMarketplaceOpenSharingTargetPack = createMarketplaceOpenSharingTargetPack;
|
|
3860
4445
|
exports.createMlflow3AgentQualityTargetPack = createMlflow3AgentQualityTargetPack;
|
|
3861
4446
|
exports.createMlflowLifecycleTargetPack = createMlflowLifecycleTargetPack;
|
|
3862
4447
|
exports.createMockDatabricksClient = createMockDatabricksClient;
|
|
3863
4448
|
exports.createModelServingTargetPack = createModelServingTargetPack;
|
|
4449
|
+
exports.createNextTargetPacks = createNextTargetPacks;
|
|
3864
4450
|
exports.createSecurityCostDrTargetPack = createSecurityCostDrTargetPack;
|
|
4451
|
+
exports.createSemanticAnalyticsTargetPack = createSemanticAnalyticsTargetPack;
|
|
3865
4452
|
exports.createSqlDeltaFoundationPack = createSqlDeltaFoundationPack;
|
|
3866
4453
|
exports.createTargetPackRegistry = createTargetPackRegistry;
|
|
3867
4454
|
exports.createUnityStorageFoundationPack = createUnityStorageFoundationPack;
|
|
@@ -3870,6 +4457,7 @@ exports.createWorkspaceContext = createWorkspaceContext;
|
|
|
3870
4457
|
exports.customLiveCheck = customLiveCheck;
|
|
3871
4458
|
exports.dataQualityAppTelemetryCheck = dataQualityAppTelemetryCheck;
|
|
3872
4459
|
exports.dbtBuildCheck = dbtBuildCheck;
|
|
4460
|
+
exports.declarativeBundlesCheck = declarativeBundlesCheck;
|
|
3873
4461
|
exports.defineLiveSuite = defineLiveSuite;
|
|
3874
4462
|
exports.defineTargetPack = defineTargetPack;
|
|
3875
4463
|
exports.defineTargetPackRun = defineTargetPackRun;
|
|
@@ -3889,10 +4477,13 @@ exports.genieCheck = genieCheck;
|
|
|
3889
4477
|
exports.jobRunCheck = jobRunCheck;
|
|
3890
4478
|
exports.jobsCertificationCheck = jobsCertificationCheck;
|
|
3891
4479
|
exports.jobsOrchestrationCheck = jobsOrchestrationCheck;
|
|
4480
|
+
exports.lakebaseAutoscalingFeatureStoreCheck = lakebaseAutoscalingFeatureStoreCheck;
|
|
3892
4481
|
exports.lakebaseCredentialCheck = lakebaseCredentialCheck;
|
|
3893
4482
|
exports.lakebaseRoundTripCheck = lakebaseRoundTripCheck;
|
|
3894
4483
|
exports.lakeflowConnectCheck = lakeflowConnectCheck;
|
|
4484
|
+
exports.lakehouseOptimizationCheck = lakehouseOptimizationCheck;
|
|
3895
4485
|
exports.managedMcpAgentsCheck = managedMcpAgentsCheck;
|
|
4486
|
+
exports.marketplaceOpenSharingCheck = marketplaceOpenSharingCheck;
|
|
3896
4487
|
exports.mlflow3GenAiQualityCheck = mlflow3GenAiQualityCheck;
|
|
3897
4488
|
exports.mlflowLifecycleCheck = mlflowLifecycleCheck;
|
|
3898
4489
|
exports.modelServingCheck = modelServingCheck;
|
|
@@ -3911,6 +4502,7 @@ exports.renderJUnit = renderJUnit;
|
|
|
3911
4502
|
exports.resolveFixtureRows = resolveFixtureRows;
|
|
3912
4503
|
exports.resolveLakebaseProject = resolveLakebaseProject;
|
|
3913
4504
|
exports.resolveProfile = resolveProfile;
|
|
4505
|
+
exports.resolveRequiredChecks = resolveRequiredChecks;
|
|
3914
4506
|
exports.resolveTokenProvider = resolveTokenProvider;
|
|
3915
4507
|
exports.restrictedPrincipalCheck = restrictedPrincipalCheck;
|
|
3916
4508
|
exports.rollbackCheck = rollbackCheck;
|
|
@@ -3919,6 +4511,7 @@ exports.runTargetPack = runTargetPack;
|
|
|
3919
4511
|
exports.secretRotationCheck = secretRotationCheck;
|
|
3920
4512
|
exports.secretScopeCheck = secretScopeCheck;
|
|
3921
4513
|
exports.securityPostureCostCheck = securityPostureCostCheck;
|
|
4514
|
+
exports.semanticAnalyticsCheck = semanticAnalyticsCheck;
|
|
3922
4515
|
exports.serverlessComputeCheck = serverlessComputeCheck;
|
|
3923
4516
|
exports.sqlRoundTripCheck = sqlRoundTripCheck;
|
|
3924
4517
|
exports.toLakebaseBranchId = toLakebaseBranchId;
|