Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
0d90470
Add level-2 property to runtime.cache in dab.draft.schema.json (#3317)
aaronburtle Mar 26, 2026
6d75ddb
Make CLI Log Labels consistent with ASP.NET Core and use appropriate …
aaronburtle Mar 27, 2026
1ce6e7e
Align behavior between Parent and Child configs during deserializatio…
aaronburtle Apr 3, 2026
22c9f0c
Add descriptive message when OpenAPI role filter returns 404 (#3305)
aaronburtle Apr 3, 2026
000cbc4
Return 400 for invalid If-Match values (#3415)
aaronburtle Apr 15, 2026
926dbb2
Fix dab validate error messaging when logger is not available (#3311)
aaronburtle Apr 15, 2026
5115ae9
Omit redundant _NoAutoPK and _NoPK OpenAPI schemas when request-body-…
aaronburtle Apr 15, 2026
62155b7
Map int types to integer in System Type to Json Type Map (#3327)
aaronburtle Apr 20, 2026
4c13d3a
Update config validation logic for entities (#3306)
aaronburtle May 5, 2026
a4b4156
Merge branch 'release/2.0' into dev/aaronburtle/Cherry-Pick-2.0
Aniruddh25 May 6, 2026
5ce5d6d
Merge branch 'release/2.0' into dev/aaronburtle/Cherry-Pick-2.0
RubenCerna2079 May 6, 2026
d406cae
Make JsonConstructor DataSource parameter nullable to match property …
aaronburtle May 6, 2026
24ba815
Merge branch 'release/2.0' into dev/aaronburtle/Cherry-Pick-2.0
aaronburtle May 6, 2026
1c15e18
Fix duplicate abbreviation block from merge conflict resolution
aaronburtle May 7, 2026
8c382be
Merge branch 'release/2.0' into dev/aaronburtle/Cherry-Pick-2.0
aaronburtle May 7, 2026
5fe65aa
Update DataSource parameter doc to reflect nullable annotation
aaronburtle May 7, 2026
344d9d0
Merge branch 'release/2.0' into dev/aaronburtle/Cherry-Pick-2.0
aaronburtle May 7, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 34 additions & 1 deletion schemas/dab.draft.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -492,7 +492,40 @@
"ttl-seconds": {
"type": "integer",
"description": "Time to live in seconds",
"default": 5
"default": 5,
"minimum": 1
},
"level-2": {
"type": "object",
"description": "Configuration for the level 2 (distributed) cache and backplane.",
"additionalProperties": false,
"properties": {
"enabled": {
"$ref": "#/$defs/boolean-or-string",
"description": "Enable or disable the level 2 distributed cache.",
"default": false
},
"provider": {
"type": "string",
"description": "The provider for the L2 cache. Currently only 'redis' is supported."
},
"connection-string": {
"type": "string",
"description": "The connection string for the level 2 cache provider."
},
"partition": {
"type": "string",
"description": "The prefix to use for cache keys in level 2 and backplane, useful in a shared environment to avoid collisions."
}
},
"if": {
"properties": {
"enabled": { "const": true }
}
},
"then": {
"required": ["connection-string"]
}
}
}
},
Expand Down
6 changes: 3 additions & 3 deletions src/Cli.Tests/ConfigureOptionsTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -811,7 +811,7 @@ public void TestDatabaseTypeUpdate(string dbType)
string updatedConfig = _fileSystem!.File.ReadAllText(TEST_RUNTIME_CONFIG_FILE);
Assert.IsTrue(RuntimeConfigLoader.TryParseConfig(updatedConfig, out RuntimeConfig? config));
Assert.IsNotNull(config.Runtime);
Assert.AreEqual(config.DataSource.DatabaseType, Enum.Parse<DatabaseType>(dbType, ignoreCase: true));
Assert.AreEqual(config.DataSource!.DatabaseType, Enum.Parse<DatabaseType>(dbType, ignoreCase: true));
}

/// <summary>
Expand Down Expand Up @@ -841,7 +841,7 @@ public void TestDatabaseTypeUpdateCosmosDB_NoSQLToMSSQL()
string updatedConfig = _fileSystem!.File.ReadAllText(TEST_RUNTIME_CONFIG_FILE);
Assert.IsTrue(RuntimeConfigLoader.TryParseConfig(updatedConfig, out RuntimeConfig? config));
Assert.IsNotNull(config.Runtime);
Assert.AreEqual(config.DataSource.DatabaseType, DatabaseType.MSSQL);
Assert.AreEqual(config.DataSource!.DatabaseType, DatabaseType.MSSQL);
Assert.AreEqual(config.DataSource.Options!.GetValueOrDefault("set-session-context", false), true);
Assert.IsFalse(config.DataSource.Options!.ContainsKey("database"));
Assert.IsFalse(config.DataSource.Options!.ContainsKey("container"));
Expand Down Expand Up @@ -877,7 +877,7 @@ public void TestDatabaseTypeUpdateMSSQLToCosmosDB_NoSQL()
string updatedConfig = _fileSystem!.File.ReadAllText(TEST_RUNTIME_CONFIG_FILE);
Assert.IsTrue(RuntimeConfigLoader.TryParseConfig(updatedConfig, out RuntimeConfig? config));
Assert.IsNotNull(config.Runtime);
Assert.AreEqual(config.DataSource.DatabaseType, DatabaseType.CosmosDB_NoSQL);
Assert.AreEqual(config.DataSource!.DatabaseType, DatabaseType.CosmosDB_NoSQL);
Assert.AreEqual(config.DataSource.Options!.GetValueOrDefault("database"), "testdb");
Assert.AreEqual(config.DataSource.Options!.GetValueOrDefault("container"), "testcontainer");
Assert.AreEqual(config.DataSource.Options!.GetValueOrDefault("schema"), "testschema.gql");
Expand Down
14 changes: 5 additions & 9 deletions src/Cli.Tests/EndToEndTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ public Task TestInitForCosmosDBNoSql()

Assert.IsNotNull(runtimeConfig);
Assert.IsTrue(runtimeConfig.AllowIntrospection);
Assert.AreEqual(DatabaseType.CosmosDB_NoSQL, runtimeConfig.DataSource.DatabaseType);
Assert.AreEqual(DatabaseType.CosmosDB_NoSQL, runtimeConfig.DataSource!.DatabaseType);
CosmosDbNoSQLDataSourceOptions? cosmosDataSourceOptions = runtimeConfig.DataSource.GetTypedOptions<CosmosDbNoSQLDataSourceOptions>();
Assert.IsNotNull(cosmosDataSourceOptions);
Assert.AreEqual("graphqldb", cosmosDataSourceOptions.Database);
Expand Down Expand Up @@ -93,7 +93,7 @@ public void TestInitForCosmosDBPostgreSql()
Assert.IsTrue(_runtimeConfigLoader!.TryLoadConfig(TEST_RUNTIME_CONFIG_FILE, out RuntimeConfig? runtimeConfig));

Assert.IsNotNull(runtimeConfig);
Assert.AreEqual(DatabaseType.CosmosDB_PostgreSQL, runtimeConfig.DataSource.DatabaseType);
Assert.AreEqual(DatabaseType.CosmosDB_PostgreSQL, runtimeConfig.DataSource!.DatabaseType);
Assert.IsNotNull(runtimeConfig.Runtime);
Assert.IsNotNull(runtimeConfig.Runtime.Rest);
Assert.AreEqual("/rest-api", runtimeConfig.Runtime.Rest.Path);
Expand Down Expand Up @@ -124,7 +124,7 @@ public void TestInitializingRestAndGraphQLGlobalSettings()
out RuntimeConfig? runtimeConfig,
replacementSettings: replacementSettings));

SqlConnectionStringBuilder builder = new(runtimeConfig.DataSource.ConnectionString);
SqlConnectionStringBuilder builder = new(runtimeConfig.DataSource!.ConnectionString);
Assert.AreEqual(ProductInfo.GetDataApiBuilderUserAgent(), builder.ApplicationName);

Assert.IsNotNull(runtimeConfig);
Expand Down Expand Up @@ -205,7 +205,7 @@ public void TestEnablingMultipleCreateOperation(CliBool isMultipleCreateEnabled,
replacementSettings: replacementSettings));

Assert.IsNotNull(runtimeConfig);
Assert.AreEqual(expectedDbType, runtimeConfig.DataSource.DatabaseType);
Assert.AreEqual(expectedDbType, runtimeConfig.DataSource!.DatabaseType);
Assert.IsNotNull(runtimeConfig.Runtime);
Assert.IsNotNull(runtimeConfig.Runtime.GraphQL);
if (runtimeConfig.DataSource.DatabaseType is DatabaseType.MSSQL && isMultipleCreateEnabled is not CliBool.None)
Expand Down Expand Up @@ -244,7 +244,7 @@ public void TestAddEntity()

Assert.IsTrue(_runtimeConfigLoader!.TryLoadConfig(TEST_RUNTIME_CONFIG_FILE, out RuntimeConfig? addRuntimeConfig));
Assert.IsNotNull(addRuntimeConfig);
Assert.AreEqual(TEST_ENV_CONN_STRING, addRuntimeConfig.DataSource.ConnectionString);
Assert.AreEqual(TEST_ENV_CONN_STRING, addRuntimeConfig.DataSource!.ConnectionString);
Assert.AreEqual(1, addRuntimeConfig.Entities.Count()); // 1 new entity added
Assert.IsTrue(addRuntimeConfig.Entities.ContainsKey("todo"));
Entity entity = addRuntimeConfig.Entities["todo"];
Expand Down Expand Up @@ -1173,10 +1173,6 @@ public async Task TestExitOfRuntimeEngineWithInvalidConfig(
Assert.IsNotNull(output);
StringAssert.Contains(output, $"Deserialization of the configuration file failed.", StringComparison.Ordinal);

output = await process.StandardOutput.ReadLineAsync();
Assert.IsNotNull(output);
StringAssert.Contains(output, $"Error: Failed to parse the config file: {TEST_RUNTIME_CONFIG_FILE}.", StringComparison.Ordinal);

output = await process.StandardOutput.ReadLineAsync();
Assert.IsNotNull(output);
StringAssert.Contains(output, $"Failed to start the engine.", StringComparison.Ordinal);
Expand Down
4 changes: 2 additions & 2 deletions src/Cli.Tests/EnvironmentTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -163,8 +163,8 @@ public async Task FailureToStartEngineWhenEnvVarNamedWrong()
);

string? output = await process.StandardError.ReadLineAsync();
Assert.AreEqual("Deserialization of the configuration file failed during a post-processing step.", output);
output = await process.StandardError.ReadToEndAsync();
Assert.IsNotNull(output);
// Clean error message on stderr with no stack trace.
StringAssert.Contains(output, "A valid Connection String should be provided.", StringComparison.Ordinal);
process.Kill();
}
Expand Down
8 changes: 8 additions & 0 deletions src/Cli.Tests/ModuleInitializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,14 @@ public static void Init()
VerifierSettings.IgnoreMember<DataSource>(dataSource => dataSource.DatabaseTypeNotSupportedMessage);
// Ignore DefaultDataSourceName as that's not serialized in our config file.
VerifierSettings.IgnoreMember<RuntimeConfig>(config => config.DefaultDataSourceName);
// Ignore IsRootConfig as that's a computed property for validation, not serialized.
VerifierSettings.IgnoreMember<RuntimeConfig>(config => config.IsRootConfig);
// Ignore IsChildConfig as that's a runtime flag for validation, not serialized.
VerifierSettings.IgnoreMember<RuntimeConfig>(config => config.IsChildConfig);
// Ignore AutoentityResolutionCounts as that's populated at runtime during metadata initialization.
VerifierSettings.IgnoreMember<RuntimeConfig>(config => config.AutoentityResolutionCounts);
// Ignore ChildConfigs as that's populated at runtime during child config loading.
VerifierSettings.IgnoreMember<RuntimeConfig>(config => config.ChildConfigs);
// Ignore MaxResponseSizeMB as as that's unimportant from a test standpoint.
VerifierSettings.IgnoreMember<HostOptions>(options => options.MaxResponseSizeMB);
// Ignore UserProvidedMaxResponseSizeMB as that's not serialized in our config file.
Expand Down
4 changes: 2 additions & 2 deletions src/Cli.Tests/UserDelegatedAuthRuntimeParsingTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public void TestRuntimeCanParseUserDelegatedAuthConfig()
// Assert
Assert.IsTrue(success);
Assert.IsNotNull(config);
Assert.IsNotNull(config.DataSource.UserDelegatedAuth);
Assert.IsNotNull(config.DataSource!.UserDelegatedAuth);
Assert.IsTrue(config.DataSource.UserDelegatedAuth.Enabled);
Assert.AreEqual("https://database.windows.net", config.DataSource.UserDelegatedAuth.DatabaseAudience);
}
Expand Down Expand Up @@ -95,7 +95,7 @@ public void TestRuntimeCanParseConfigWithoutUserDelegatedAuth()
// Assert
Assert.IsTrue(success);
Assert.IsNotNull(config);
Assert.IsNull(config.DataSource.UserDelegatedAuth);
Assert.IsNull(config.DataSource!.UserDelegatedAuth);
}
}
}
Loading