From fdbca8497340e481ac8fc63c201adb46e1a06b17 Mon Sep 17 00:00:00 2001 From: Ayush Agarwal Date: Tue, 15 Nov 2022 23:00:46 +0530 Subject: [PATCH 1/6] Adding options section in data-source and removing database specific sections from config- except cosmos --- src/Cli/src/ConfigGenerator.cs | 41 ++++++--------- src/Cli/test/EndToEndTests.cs | 8 +-- src/Cli/test/InitTests.cs | 7 ++- src/Cli/test/UpdateEntityTests.cs | 8 --- src/Config/DataSource.cs | 50 ++++++++++++++++++- src/Config/RuntimeConfig.cs | 16 ++---- .../Authorization/AuthorizationHelpers.cs | 4 -- .../AuthorizationResolverUnitTests.cs | 12 ----- .../AuthenticationConfigValidatorUnitTests.cs | 4 -- .../Configuration/ConfigurationTests.cs | 22 ++++---- .../Unittests/ConfigValidationUnitTests.cs | 24 --------- .../Configurations/RuntimeConfigProvider.cs | 2 +- .../Configurations/RuntimeConfigValidator.cs | 18 ++++--- 13 files changed, 98 insertions(+), 118 deletions(-) diff --git a/src/Cli/src/ConfigGenerator.cs b/src/Cli/src/ConfigGenerator.cs index d4442c47d3..d8590d1733 100644 --- a/src/Cli/src/ConfigGenerator.cs +++ b/src/Cli/src/ConfigGenerator.cs @@ -53,59 +53,48 @@ public static bool TryCreateRuntimeConfig(InitOptions options, out string runtim runtimeConfigJson = string.Empty; DatabaseType dbType = options.DatabaseType; - DataSource dataSource = new(dbType); - // default value of connection-string should be used, i.e Empty-string - // if not explicitly provided by the user - if (options.ConnectionString is not null) - { - dataSource.ConnectionString = options.ConnectionString; - } - - CosmosDbOptions? cosmosDbOptions = null; - MsSqlOptions? msSqlOptions = null; - MySqlOptions? mySqlOptions = null; - PostgreSqlOptions? postgreSqlOptions = null; + CosmosDbOptions? cosmosDbNoSqlOptions = null; switch (dbType) { case DatabaseType.cosmos: + case DatabaseType.cosmosdb_nosql: string? cosmosDatabase = options.CosmosDatabase; string? cosmosContainer = options.CosmosContainer; string? graphQLSchemaPath = options.GraphQLSchemaPath; if (string.IsNullOrEmpty(cosmosDatabase) || string.IsNullOrEmpty(graphQLSchemaPath)) { - Console.WriteLine($"Provide all the mandatory options for CosmosDB: --cosmos-database, and --graphql-schema"); + Console.WriteLine($"Provide all the mandatory options for CosmosDB_NoSql: --cosmos-database, and --graphql-schema"); return false; } - cosmosDbOptions = new CosmosDbOptions(cosmosDatabase, cosmosContainer, graphQLSchemaPath, GraphQLSchema: null); + cosmosDbNoSqlOptions = new CosmosDbOptions(cosmosDatabase, cosmosContainer, graphQLSchemaPath, GraphQLSchema: null); break; case DatabaseType.mssql: - msSqlOptions = new MsSqlOptions(); - break; - case DatabaseType.mysql: - mySqlOptions = new MySqlOptions(); - break; - case DatabaseType.postgresql: - postgreSqlOptions = new PostgreSqlOptions(); + case DatabaseType.cosmosdb_postgresql: break; - default: Console.WriteLine($"DatabaseType: ${dbType} not supported.Please provide a valid database-type."); return false; } + DataSource dataSource = new(dbType, DbOptions: cosmosDbNoSqlOptions); + + // default value of connection-string should be used, i.e Empty-string + // if not explicitly provided by the user + if (options.ConnectionString is not null) + { + dataSource.ConnectionString = options.ConnectionString; + } + RuntimeConfig runtimeConfig = new( Schema: RuntimeConfig.SCHEMA, DataSource: dataSource, - CosmosDb: cosmosDbOptions, - MsSql: msSqlOptions, - PostgreSql: postgreSqlOptions, - MySql: mySqlOptions, + CosmosDb: cosmosDbNoSqlOptions, RuntimeSettings: GetDefaultGlobalSettings( options.HostMode, options.CorsOrigin, diff --git a/src/Cli/test/EndToEndTests.cs b/src/Cli/test/EndToEndTests.cs index 19992a2676..b2206337e1 100644 --- a/src/Cli/test/EndToEndTests.cs +++ b/src/Cli/test/EndToEndTests.cs @@ -25,10 +25,10 @@ public void TestInitForCosmosDB() Assert.IsNotNull(runtimeConfig); Assert.IsTrue(runtimeConfig.GraphQLGlobalSettings.AllowIntrospection); Assert.AreEqual(DatabaseType.cosmos, runtimeConfig.DatabaseType); - Assert.IsNotNull(runtimeConfig.CosmosDb); - Assert.AreEqual("graphqldb", runtimeConfig.CosmosDb.Database); - Assert.AreEqual("planet", runtimeConfig.CosmosDb.Container); - Assert.AreEqual("schema.gql", runtimeConfig.CosmosDb.GraphQLSchemaPath); + Assert.IsNotNull(runtimeConfig.DataSource.CosmosDbNoSql); + Assert.AreEqual("graphqldb", runtimeConfig.DataSource.CosmosDbNoSql.Database); + Assert.AreEqual("planet", runtimeConfig.DataSource.CosmosDbNoSql.Container); + Assert.AreEqual("schema.gql", runtimeConfig.DataSource.CosmosDbNoSql.GraphQLSchemaPath); Assert.IsNotNull(runtimeConfig.RuntimeSettings); Assert.AreEqual(true, runtimeConfig.HostGlobalSettings.IsDevModeDefaultRequestAuthenticated); JsonElement jsonRestSettings = (JsonElement)runtimeConfig.RuntimeSettings[GlobalSettingsType.Rest]; diff --git a/src/Cli/test/InitTests.cs b/src/Cli/test/InitTests.cs index ddc9898b6c..09dfa9075e 100644 --- a/src/Cli/test/InitTests.cs +++ b/src/Cli/test/InitTests.cs @@ -107,7 +107,12 @@ public void CosmosDatabase() ""$schema"": ""dab.draft.schema.json"", ""data-source"": { ""database-type"": ""cosmos"", - ""connection-string"": ""testconnectionstring"" + ""connection-string"": ""testconnectionstring"", + ""options"": { + ""database"": ""testdb"", + ""container"": ""testcontainer"", + ""schema"": ""schemafile"" + } }, ""cosmos"": { ""database"": ""testdb"", diff --git a/src/Cli/test/UpdateEntityTests.cs b/src/Cli/test/UpdateEntityTests.cs index 307d6e38be..87123040b8 100644 --- a/src/Cli/test/UpdateEntityTests.cs +++ b/src/Cli/test/UpdateEntityTests.cs @@ -1585,10 +1585,6 @@ public void TestVerifyCanUpdateRelationshipInvalidOptions(string db, string card RuntimeConfig runtimeConfig = new( Schema: "schema", DataSource: new DataSource(Enum.Parse(db)), - CosmosDb: null, - MsSql: null, - PostgreSql: null, - MySql: null, RuntimeSettings: new Dictionary(), Entities: new Dictionary() ); @@ -1639,10 +1635,6 @@ public void EnsureFailure_AddRelationshipToEntityWithDisabledGraphQL() RuntimeConfig runtimeConfig = new( Schema: "schema", DataSource: new DataSource(DatabaseType.mssql), - CosmosDb: null, - MsSql: null, - PostgreSql: null, - MySql: null, RuntimeSettings: new Dictionary(), Entities: entityMap ); diff --git a/src/Config/DataSource.cs b/src/Config/DataSource.cs index 7122edb688..25eaabc379 100644 --- a/src/Config/DataSource.cs +++ b/src/Config/DataSource.cs @@ -1,3 +1,4 @@ +using System.Text.Json; using System.Text.Json.Serialization; namespace Azure.DataApiBuilder.Config @@ -10,14 +11,50 @@ namespace Azure.DataApiBuilder.Config /// will use to connect to the backend database. public record DataSource( [property: JsonPropertyName(DataSource.DATABASE_PROPERTY_NAME)] - DatabaseType DatabaseType) + DatabaseType DatabaseType, + [property: JsonPropertyName(DataSource.OPTIONS_PROPERTY_NAME)] + object? DbOptions = null) { public const string JSON_PROPERTY_NAME = "data-source"; public const string DATABASE_PROPERTY_NAME = "database-type"; public const string CONNSTRING_PROPERTY_NAME = "connection-string"; + public const string OPTIONS_PROPERTY_NAME = "options"; [property: JsonPropertyName(CONNSTRING_PROPERTY_NAME)] public string ConnectionString { get; set; } = string.Empty; + public CosmosDbOptions? CosmosDbNoSql { get; set; } + public MsSqlOptions? MsSql { get; set; } + public PostgreSqlOptions? PostgreSql { get; set; } + public MySqlOptions? MySql { get; set; } + public CosmosDbPostgreSqlOptions? CosmosDbPostgreSql { get; set; } + + public void PopulateDbSpecificOptions() + { + if (DbOptions is null) + { + return; + } + + switch (DatabaseType) + { + case DatabaseType.cosmos: + case DatabaseType.cosmosdb_nosql: + CosmosDbNoSql = ((JsonElement)DbOptions).Deserialize(RuntimeConfig.SerializerOptions)!; + break; + case DatabaseType.mssql: + MsSql = ((JsonElement)DbOptions).Deserialize(RuntimeConfig.SerializerOptions)!; + break; + case DatabaseType.mysql: + MySql = ((JsonElement)DbOptions).Deserialize(RuntimeConfig.SerializerOptions)!; + break; + case DatabaseType.postgresql: + PostgreSql = ((JsonElement)DbOptions).Deserialize(RuntimeConfig.SerializerOptions)!; + break; + case DatabaseType.cosmosdb_postgresql: + CosmosDbPostgreSql = ((JsonElement)DbOptions).Deserialize(RuntimeConfig.SerializerOptions)!; + break; + } + } } /// @@ -32,6 +69,9 @@ public record CosmosDbOptions( string? GraphQLSchema) { public const string GRAPHQL_SCHEMA_PATH_PROPERTY_NAME = "schema"; + + // Keeping the name as cosmos only to provide backwards compatibility. + // This property won't be needed going forward. public const string JSON_PROPERTY_NAME = nameof(DatabaseType.cosmos); } @@ -40,6 +80,7 @@ public record CosmosDbOptions( /// public record MsSqlOptions( [property: JsonPropertyName("set-session-context")] + [property: JsonIgnore] bool SetSessionContext = true) { public const string JSON_PROPERTY_NAME = nameof(DatabaseType.mssql); @@ -56,6 +97,11 @@ public record PostgreSqlOptions public const string JSON_PROPERTY_NAME = nameof(DatabaseType.postgresql); } + /// + /// Options for CosmosDb_PostgresSql database. + /// + public record CosmosDbPostgreSqlOptions { } + /// /// Options for MySql database. /// @@ -70,6 +116,8 @@ public record MySqlOptions public enum DatabaseType { cosmos, + cosmosdb_postgresql, + cosmosdb_nosql, mssql, mysql, postgresql diff --git a/src/Config/RuntimeConfig.cs b/src/Config/RuntimeConfig.cs index a51aa16332..702616c513 100644 --- a/src/Config/RuntimeConfig.cs +++ b/src/Config/RuntimeConfig.cs @@ -54,21 +54,12 @@ namespace Azure.DataApiBuilder.Config public record RuntimeConfig( [property: JsonPropertyName(RuntimeConfig.SCHEMA_PROPERTY_NAME)] string Schema, [property: JsonPropertyName(DataSource.JSON_PROPERTY_NAME)] DataSource DataSource, - [property: JsonPropertyName(CosmosDbOptions.JSON_PROPERTY_NAME)] - CosmosDbOptions? CosmosDb, - [property: JsonPropertyName(MsSqlOptions.JSON_PROPERTY_NAME)] - [property: JsonIgnore] - MsSqlOptions? MsSql, - [property: JsonPropertyName(PostgreSqlOptions.JSON_PROPERTY_NAME)] - [property: JsonIgnore] - PostgreSqlOptions? PostgreSql, - [property: JsonPropertyName(MySqlOptions.JSON_PROPERTY_NAME)] - [property: JsonIgnore] - MySqlOptions? MySql, [property: JsonPropertyName(GlobalSettings.JSON_PROPERTY_NAME)] Dictionary? RuntimeSettings, [property: JsonPropertyName(Entity.JSON_PROPERTY_NAME)] - Dictionary Entities) + Dictionary Entities, + [property: JsonPropertyName(CosmosDbOptions.JSON_PROPERTY_NAME)] + CosmosDbOptions? CosmosDb = null) { public const string SCHEMA_PROPERTY_NAME = "$schema"; public const string SCHEMA = "dab.draft.schema.json"; @@ -211,6 +202,7 @@ public static bool TryGetDeserializedRuntimeConfig( deserializedRuntimeConfig = JsonSerializer.Deserialize(configJson, SerializerOptions); deserializedRuntimeConfig!.DetermineGlobalSettings(); deserializedRuntimeConfig!.DetermineGraphQLEntityNames(); + deserializedRuntimeConfig.DataSource.PopulateDbSpecificOptions(); return true; } catch (Exception ex) diff --git a/src/Service.Tests/Authorization/AuthorizationHelpers.cs b/src/Service.Tests/Authorization/AuthorizationHelpers.cs index db35b0bec3..9a5d456f45 100644 --- a/src/Service.Tests/Authorization/AuthorizationHelpers.cs +++ b/src/Service.Tests/Authorization/AuthorizationHelpers.cs @@ -107,10 +107,6 @@ public static RuntimeConfig InitRuntimeConfig( RuntimeConfig runtimeConfig = new( Schema: "UnitTestSchema", - MsSql: null, - CosmosDb: null, - PostgreSql: null, - MySql: null, DataSource: new DataSource(DatabaseType: DatabaseType.mssql), RuntimeSettings: new Dictionary(), Entities: entityMap diff --git a/src/Service.Tests/Authorization/AuthorizationResolverUnitTests.cs b/src/Service.Tests/Authorization/AuthorizationResolverUnitTests.cs index 170e6e748a..dd966c653f 100644 --- a/src/Service.Tests/Authorization/AuthorizationResolverUnitTests.cs +++ b/src/Service.Tests/Authorization/AuthorizationResolverUnitTests.cs @@ -216,10 +216,6 @@ public void TestRoleAndOperationCombination() RuntimeConfig runtimeConfig = new( Schema: "UnitTestSchema", - MsSql: null, - CosmosDb: null, - PostgreSql: null, - MySql: null, DataSource: new DataSource(DatabaseType: DatabaseType.mssql), RuntimeSettings: new Dictionary(), Entities: entityMap @@ -452,10 +448,6 @@ public void TestAuthenticatedRoleWhenBothAnonymousAndAuthenticatedAreDefined() RuntimeConfig runtimeConfig = new( Schema: "UnitTestSchema", - MsSql: null, - CosmosDb: null, - PostgreSql: null, - MySql: null, DataSource: new DataSource(DatabaseType: DatabaseType.mssql), RuntimeSettings: new Dictionary(), Entities: entityMap @@ -1197,10 +1189,6 @@ public static RuntimeConfig InitRuntimeConfig( RuntimeConfig runtimeConfig = new( Schema: "UnitTestSchema", - MsSql: null, - CosmosDb: null, - PostgreSql: null, - MySql: null, DataSource: new DataSource(DatabaseType: DatabaseType.mssql), RuntimeSettings: new Dictionary(), Entities: entityMap diff --git a/src/Service.Tests/Configuration/AuthenticationConfigValidatorUnitTests.cs b/src/Service.Tests/Configuration/AuthenticationConfigValidatorUnitTests.cs index 8e77aaf69d..8c97696a32 100644 --- a/src/Service.Tests/Configuration/AuthenticationConfigValidatorUnitTests.cs +++ b/src/Service.Tests/Configuration/AuthenticationConfigValidatorUnitTests.cs @@ -160,10 +160,6 @@ private static RuntimeConfig RuntimeConfig config = new( Schema: RuntimeConfig.SCHEMA, DataSource: dataSource, - CosmosDb: null, - MsSql: null, - PostgreSql: null, - MySql: null, RuntimeSettings: runtimeSettings, Entities: entities ); diff --git a/src/Service.Tests/Configuration/ConfigurationTests.cs b/src/Service.Tests/Configuration/ConfigurationTests.cs index 47eb6f7235..eccaf7b6c8 100644 --- a/src/Service.Tests/Configuration/ConfigurationTests.cs +++ b/src/Service.Tests/Configuration/ConfigurationTests.cs @@ -426,7 +426,7 @@ public async Task TestSettingConfigurationCreatesCorrectClasses() Assert.IsTrue(isConfigSet, "TryGetRuntimeConfiguration should return true when the config is set."); Assert.AreEqual(DatabaseType.cosmos, configuration.DatabaseType, "Expected cosmos database type after configuring the runtime with cosmos settings."); - Assert.AreEqual(config.Schema, configuration.CosmosDb.GraphQLSchema, "Expected the schema in the configuration to match the one sent to the configuration endpoint."); + Assert.AreEqual(config.Schema, configuration.DataSource.CosmosDbNoSql.GraphQLSchema, "Expected the schema in the configuration to match the one sent to the configuration endpoint."); Assert.AreEqual(config.ConnectionString, configuration.ConnectionString, "Expected the connection string in the configuration to match the one sent to the configuration endpoint."); } @@ -460,14 +460,14 @@ public void TestReadingRuntimeConfig() RuntimeConfig.TryGetDeserializedRuntimeConfig(jsonString, out RuntimeConfig runtimeConfig, logger.Object); Assert.IsNotNull(runtimeConfig.Schema); Assert.IsInstanceOfType(runtimeConfig.DataSource, typeof(DataSource)); - Assert.IsTrue(runtimeConfig.CosmosDb == null - || runtimeConfig.CosmosDb.GetType() == typeof(CosmosDbOptions)); - Assert.IsTrue(runtimeConfig.MsSql == null - || runtimeConfig.MsSql.GetType() == typeof(MsSqlOptions)); - Assert.IsTrue(runtimeConfig.PostgreSql == null - || runtimeConfig.PostgreSql.GetType() == typeof(PostgreSqlOptions)); - Assert.IsTrue(runtimeConfig.MySql == null - || runtimeConfig.MySql.GetType() == typeof(MySqlOptions)); + Assert.IsTrue(runtimeConfig.DataSource.CosmosDbNoSql == null + || runtimeConfig.DataSource.CosmosDbNoSql.GetType() == typeof(CosmosDbOptions)); + Assert.IsTrue(runtimeConfig.DataSource.MsSql == null + || runtimeConfig.DataSource.MsSql.GetType() == typeof(MsSqlOptions)); + Assert.IsTrue(runtimeConfig.DataSource.PostgreSql == null + || runtimeConfig.DataSource.PostgreSql.GetType() == typeof(PostgreSqlOptions)); + Assert.IsTrue(runtimeConfig.DataSource.MySql == null + || runtimeConfig.DataSource.MySql.GetType() == typeof(MySqlOptions)); Assert.IsInstanceOfType(runtimeConfig.Entities, typeof(Dictionary)); foreach (Entity entity in runtimeConfig.Entities.Values) @@ -980,10 +980,6 @@ public static RuntimeConfig InitMinimalRuntimeConfig(Dictionary(), Entities: entityMap @@ -206,10 +202,6 @@ public void TestAddingRelationshipWithDisabledGraphQL() RuntimeConfig runtimeConfig = new( Schema: "UnitTestSchema", - MsSql: null, - CosmosDb: null, - PostgreSql: null, - MySql: null, DataSource: new DataSource(DatabaseType: DatabaseType.mssql), RuntimeSettings: new Dictionary(), Entities: entityMap @@ -257,10 +249,6 @@ string relationshipEntity RuntimeConfig runtimeConfig = new( Schema: "UnitTestSchema", - MsSql: null, - CosmosDb: null, - PostgreSql: null, - MySql: null, DataSource: new DataSource(DatabaseType: DatabaseType.mssql), RuntimeSettings: new Dictionary(), Entities: entityMap @@ -360,10 +348,6 @@ bool isValidScenario RuntimeConfig runtimeConfig = new( Schema: "UnitTestSchema", - MsSql: null, - CosmosDb: null, - PostgreSql: null, - MySql: null, DataSource: new DataSource(DatabaseType: DatabaseType.mssql), RuntimeSettings: new Dictionary(), Entities: entityMap @@ -447,10 +431,6 @@ public void TestRelationshipWithNoLinkingObjectAndEitherSourceOrTargetFieldIsNul RuntimeConfig runtimeConfig = new( Schema: "UnitTestSchema", - MsSql: null, - CosmosDb: null, - PostgreSql: null, - MySql: null, DataSource: new DataSource(DatabaseType: DatabaseType.mssql), RuntimeSettings: new Dictionary(), Entities: entityMap @@ -669,10 +649,6 @@ public void TestOperationValidityAndCasing(string operationName, bool exceptionE RuntimeConfig runtimeConfig = new( Schema: "UnitTestSchema", - MsSql: null, - CosmosDb: null, - PostgreSql: null, - MySql: null, DataSource: new DataSource(DatabaseType: DatabaseType.mssql), RuntimeSettings: new Dictionary(), Entities: entityMap diff --git a/src/Service/Configurations/RuntimeConfigProvider.cs b/src/Service/Configurations/RuntimeConfigProvider.cs index 0a71a19b5f..3086c5cd3c 100644 --- a/src/Service/Configurations/RuntimeConfigProvider.cs +++ b/src/Service/Configurations/RuntimeConfigProvider.cs @@ -246,7 +246,7 @@ public void Initialize( throw new ArgumentException($"'{nameof(schema)}' cannot be null or empty.", nameof(schema)); } - CosmosDbOptions? cosmosDb = RuntimeConfiguration.CosmosDb! with { GraphQLSchema = schema }; + CosmosDbOptions? cosmosDb = RuntimeConfiguration.DataSource.CosmosDbNoSql! with { GraphQLSchema = schema }; RuntimeConfiguration = RuntimeConfiguration with { CosmosDb = cosmosDb }; } } diff --git a/src/Service/Configurations/RuntimeConfigValidator.cs b/src/Service/Configurations/RuntimeConfigValidator.cs index 02513f6a40..13c6b62b34 100644 --- a/src/Service/Configurations/RuntimeConfigValidator.cs +++ b/src/Service/Configurations/RuntimeConfigValidator.cs @@ -118,23 +118,25 @@ public static void ValidateDatabaseType( // Schema file should be present in the directory if not specified in the config // when using cosmos database. - if (runtimeConfig.DatabaseType is DatabaseType.cosmos) + if (runtimeConfig.DatabaseType is DatabaseType.cosmos || + runtimeConfig.DatabaseType is DatabaseType.cosmosdb_nosql) { - if (runtimeConfig.CosmosDb is null) + CosmosDbOptions cosmosDbNoSql = runtimeConfig.DataSource.CosmosDbNoSql!; + if (cosmosDbNoSql is null) { - throw new NotSupportedException("CosmosDB is specified but no CosmosDB configuration information has been provided."); + throw new NotSupportedException("CosmosDB_NoSql is specified but no CosmosDB_NoSql configuration information has been provided."); } - if (string.IsNullOrEmpty(runtimeConfig.CosmosDb.GraphQLSchema)) + if (string.IsNullOrEmpty(cosmosDbNoSql.GraphQLSchema)) { - if (string.IsNullOrEmpty(runtimeConfig.CosmosDb.GraphQLSchemaPath)) + if (string.IsNullOrEmpty(cosmosDbNoSql.GraphQLSchemaPath)) { - throw new NotSupportedException("No GraphQL schema file has been provided for CosmosDB. Ensure you provide a GraphQL schema containing the GraphQL object types to expose."); + throw new NotSupportedException("No GraphQL schema file has been provided for CosmosDB_NoSql. Ensure you provide a GraphQL schema containing the GraphQL object types to expose."); } - if (!fileSystem.File.Exists(runtimeConfig.CosmosDb.GraphQLSchemaPath)) + if (!fileSystem.File.Exists(cosmosDbNoSql.GraphQLSchemaPath)) { - throw new FileNotFoundException($"The GraphQL schema file at '{runtimeConfig.CosmosDb.GraphQLSchemaPath}' could not be found. Ensure that it is a path relative to the runtime."); + throw new FileNotFoundException($"The GraphQL schema file at '{cosmosDbNoSql.GraphQLSchemaPath}' could not be found. Ensure that it is a path relative to the runtime."); } } } From 8cb8f9edc959f6637b2b1a452a88761363e59dd7 Mon Sep 17 00:00:00 2001 From: Ayush Agarwal Date: Wed, 16 Nov 2022 22:01:50 +0530 Subject: [PATCH 2/6] fixing test --- src/Service.Tests/Configuration/ConfigurationTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Service.Tests/Configuration/ConfigurationTests.cs b/src/Service.Tests/Configuration/ConfigurationTests.cs index eccaf7b6c8..386f09d581 100644 --- a/src/Service.Tests/Configuration/ConfigurationTests.cs +++ b/src/Service.Tests/Configuration/ConfigurationTests.cs @@ -426,7 +426,7 @@ public async Task TestSettingConfigurationCreatesCorrectClasses() Assert.IsTrue(isConfigSet, "TryGetRuntimeConfiguration should return true when the config is set."); Assert.AreEqual(DatabaseType.cosmos, configuration.DatabaseType, "Expected cosmos database type after configuring the runtime with cosmos settings."); - Assert.AreEqual(config.Schema, configuration.DataSource.CosmosDbNoSql.GraphQLSchema, "Expected the schema in the configuration to match the one sent to the configuration endpoint."); + Assert.AreEqual(config.Schema, configuration.CosmosDb.GraphQLSchema, "Expected the schema in the configuration to match the one sent to the configuration endpoint."); Assert.AreEqual(config.ConnectionString, configuration.ConnectionString, "Expected the connection string in the configuration to match the one sent to the configuration endpoint."); } From e914150efac54fb45bab3d0980cc1dbcd9dc14b3 Mon Sep 17 00:00:00 2001 From: Ayush Agarwal Date: Thu, 17 Nov 2022 11:56:36 +0530 Subject: [PATCH 3/6] seperating concern of engine --- src/Service/Configurations/RuntimeConfigProvider.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Service/Configurations/RuntimeConfigProvider.cs b/src/Service/Configurations/RuntimeConfigProvider.cs index 3086c5cd3c..faed91d728 100644 --- a/src/Service/Configurations/RuntimeConfigProvider.cs +++ b/src/Service/Configurations/RuntimeConfigProvider.cs @@ -246,7 +246,7 @@ public void Initialize( throw new ArgumentException($"'{nameof(schema)}' cannot be null or empty.", nameof(schema)); } - CosmosDbOptions? cosmosDb = RuntimeConfiguration.DataSource.CosmosDbNoSql! with { GraphQLSchema = schema }; + CosmosDbOptions? cosmosDb = RuntimeConfiguration.CosmosDb with { GraphQLSchema = schema }; RuntimeConfiguration = RuntimeConfiguration with { CosmosDb = cosmosDb }; } } From c508bee4037cf91b5db058c923401119c812223a Mon Sep 17 00:00:00 2001 From: Ayush Agarwal Date: Thu, 17 Nov 2022 12:05:41 +0530 Subject: [PATCH 4/6] updating existing init tests to use cosmosdb_nosql --- src/Cli/test/InitTests.cs | 12 ++++++------ src/Cli/test/TestHelper.cs | 1 - src/Service/Configurations/RuntimeConfigProvider.cs | 4 ++-- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/Cli/test/InitTests.cs b/src/Cli/test/InitTests.cs index 09dfa9075e..a99f663976 100644 --- a/src/Cli/test/InitTests.cs +++ b/src/Cli/test/InitTests.cs @@ -39,7 +39,7 @@ public void MssqlDatabase() // Adding runtime settings to the above basic config string expectedRuntimeConfig = AddPropertiesToJson( _basicRuntimeConfig, - GetDefaultTestRuntimeSettingString(DatabaseType.mssql, + GetDefaultTestRuntimeSettingString( HostModeType.Development, new List() { "http://localhost:3000", "http://nolocalhost:80" }, authenticateDevModeRequest: true) @@ -78,7 +78,7 @@ public void TestInitializingConfigWithoutConnectionString() // Adding runtime settings to the above basic config string expectedRuntimeConfig = AddPropertiesToJson( _basicRuntimeConfig, - GetDefaultTestRuntimeSettingString(DatabaseType.mssql, + GetDefaultTestRuntimeSettingString( HostModeType.Development, new List() { "http://localhost:3000", "http://nolocalhost:80" }, authenticateDevModeRequest: false) @@ -93,7 +93,7 @@ public void TestInitializingConfigWithoutConnectionString() public void CosmosDatabase() { InitOptions options = new( - databaseType: DatabaseType.cosmos, + databaseType: DatabaseType.cosmosdb_nosql, connectionString: "testconnectionstring", cosmosDatabase: "testdb", cosmosContainer: "testcontainer", @@ -106,7 +106,7 @@ public void CosmosDatabase() _basicRuntimeConfig = @"{ ""$schema"": ""dab.draft.schema.json"", ""data-source"": { - ""database-type"": ""cosmos"", + ""database-type"": ""cosmosdb_nosql"", ""connection-string"": ""testconnectionstring"", ""options"": { ""database"": ""testdb"", @@ -125,7 +125,7 @@ public void CosmosDatabase() // Adding runtime settings to the above basic config string expectedRuntimeConfig = AddPropertiesToJson( _basicRuntimeConfig, - GetDefaultTestRuntimeSettingString(DatabaseType.cosmos)); + GetDefaultTestRuntimeSettingString()); RunTest(options, expectedRuntimeConfig); } @@ -145,7 +145,7 @@ public void VerifyRequiredOptionsForCosmosDatabase( bool expectedResult) { InitOptions options = new( - databaseType: DatabaseType.cosmos, + databaseType: DatabaseType.cosmosdb_nosql, connectionString: "testconnectionstring", cosmosDatabase: cosmosDatabase, cosmosContainer: cosmosContainer, diff --git a/src/Cli/test/TestHelper.cs b/src/Cli/test/TestHelper.cs index 5f42d24cb3..2730327709 100644 --- a/src/Cli/test/TestHelper.cs +++ b/src/Cli/test/TestHelper.cs @@ -362,7 +362,6 @@ public static Process StartDabProcess(string command, string flags) /// for json comparison in tests. /// public static string GetDefaultTestRuntimeSettingString( - DatabaseType databaseType, HostModeType hostModeType = HostModeType.Production, IEnumerable? corsOrigins = null, bool? authenticateDevModeRequest = null) diff --git a/src/Service/Configurations/RuntimeConfigProvider.cs b/src/Service/Configurations/RuntimeConfigProvider.cs index faed91d728..2f2ee7660a 100644 --- a/src/Service/Configurations/RuntimeConfigProvider.cs +++ b/src/Service/Configurations/RuntimeConfigProvider.cs @@ -239,14 +239,14 @@ public void Initialize( RuntimeConfiguration!.MapGraphQLSingularTypeToEntityName(); RuntimeConfiguration!.ConnectionString = connectionString; - if (RuntimeConfiguration!.DatabaseType == DatabaseType.cosmos) + if (RuntimeConfiguration!.DatabaseType is DatabaseType.cosmos) { if (string.IsNullOrEmpty(schema)) { throw new ArgumentException($"'{nameof(schema)}' cannot be null or empty.", nameof(schema)); } - CosmosDbOptions? cosmosDb = RuntimeConfiguration.CosmosDb with { GraphQLSchema = schema }; + CosmosDbOptions? cosmosDb = RuntimeConfiguration.CosmosDb! with { GraphQLSchema = schema }; RuntimeConfiguration = RuntimeConfiguration with { CosmosDb = cosmosDb }; } } From a4b61f55afc165ad52593499f3e1a142e19a0c85 Mon Sep 17 00:00:00 2001 From: Ayush Agarwal Date: Thu, 17 Nov 2022 12:12:29 +0530 Subject: [PATCH 5/6] adding test for cosmosdb_postgresql --- src/Cli/test/InitTests.cs | 44 +++++++++++++++++-- .../Configurations/RuntimeConfigProvider.cs | 2 +- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/src/Cli/test/InitTests.cs b/src/Cli/test/InitTests.cs index a99f663976..30817a0230 100644 --- a/src/Cli/test/InitTests.cs +++ b/src/Cli/test/InitTests.cs @@ -47,6 +47,44 @@ public void MssqlDatabase() RunTest(options, expectedRuntimeConfig); } + /// + /// Test the simple init config for cosmosdb_postgresql database. + /// + [TestMethod] + public void CosmosDbPostgreSqlDatabase() + { + InitOptions options = new( + databaseType: DatabaseType.cosmosdb_postgresql, + connectionString: "testconnectionstring", + cosmosDatabase: null, + cosmosContainer: null, + graphQLSchemaPath: null, + hostMode: HostModeType.Development, + corsOrigin: new List() { "http://localhost:3000", "http://nolocalhost:80" }, + config: _testRuntimeConfig, + devModeDefaultAuth: "true"); + + _basicRuntimeConfig = + @"{ + ""$schema"": ""dab.draft.schema.json"", + ""data-source"": { + ""database-type"": ""cosmosdb_postgresql"", + ""connection-string"": ""testconnectionstring"" + }, + ""entities"": {} + }"; + + // Adding runtime settings to the above basic config + string expectedRuntimeConfig = AddPropertiesToJson( + _basicRuntimeConfig, + GetDefaultTestRuntimeSettingString( + HostModeType.Development, + new List() { "http://localhost:3000", "http://nolocalhost:80" }, + authenticateDevModeRequest: true) + ); + RunTest(options, expectedRuntimeConfig); + } + /// /// Test to verify creation of initial config without providing /// connection-string @@ -87,10 +125,10 @@ public void TestInitializingConfigWithoutConnectionString() } /// - /// Test cosmos db specifc settings like cosmos-database, cosmos-container, cosmos-schema file. + /// Test cosmosdb_nosql specifc settings like cosmos-database, cosmos-container, cosmos-schema file. /// [TestMethod] - public void CosmosDatabase() + public void CosmosDbNoSqlDatabase() { InitOptions options = new( databaseType: DatabaseType.cosmosdb_nosql, @@ -138,7 +176,7 @@ public void CosmosDatabase() [DataRow("testDatabase", null, "", false, DisplayName = "database is provided, container and Schema is null/empty.")] [DataRow("testDatabase", null, "testSchema", true, DisplayName = "database and schema provided, container is null/empty.")] [DataTestMethod] - public void VerifyRequiredOptionsForCosmosDatabase( + public void VerifyRequiredOptionsForCosmosDbNoSqlDatabase( string? cosmosDatabase, string? cosmosContainer, string? graphQLSchema, diff --git a/src/Service/Configurations/RuntimeConfigProvider.cs b/src/Service/Configurations/RuntimeConfigProvider.cs index 2f2ee7660a..0a71a19b5f 100644 --- a/src/Service/Configurations/RuntimeConfigProvider.cs +++ b/src/Service/Configurations/RuntimeConfigProvider.cs @@ -239,7 +239,7 @@ public void Initialize( RuntimeConfiguration!.MapGraphQLSingularTypeToEntityName(); RuntimeConfiguration!.ConnectionString = connectionString; - if (RuntimeConfiguration!.DatabaseType is DatabaseType.cosmos) + if (RuntimeConfiguration!.DatabaseType == DatabaseType.cosmos) { if (string.IsNullOrEmpty(schema)) { From e2611a1e85c773849bbf767ab64e7beda8759688 Mon Sep 17 00:00:00 2001 From: Ayush Agarwal Date: Fri, 18 Nov 2022 08:53:26 +0530 Subject: [PATCH 6/6] addressing review comments --- src/Cli/src/ConfigGenerator.cs | 3 +-- src/Cli/test/InitTests.cs | 9 +++++---- src/Config/DataSource.cs | 6 +++++- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/Cli/src/ConfigGenerator.cs b/src/Cli/src/ConfigGenerator.cs index d8590d1733..f13b8dfa5b 100644 --- a/src/Cli/src/ConfigGenerator.cs +++ b/src/Cli/src/ConfigGenerator.cs @@ -78,8 +78,7 @@ public static bool TryCreateRuntimeConfig(InitOptions options, out string runtim case DatabaseType.cosmosdb_postgresql: break; default: - Console.WriteLine($"DatabaseType: ${dbType} not supported.Please provide a valid database-type."); - return false; + throw new Exception($"DatabaseType: ${dbType} not supported.Please provide a valid database-type."); } DataSource dataSource = new(dbType, DbOptions: cosmosDbNoSqlOptions); diff --git a/src/Cli/test/InitTests.cs b/src/Cli/test/InitTests.cs index 30817a0230..2adeae853d 100644 --- a/src/Cli/test/InitTests.cs +++ b/src/Cli/test/InitTests.cs @@ -44,6 +44,7 @@ public void MssqlDatabase() new List() { "http://localhost:3000", "http://nolocalhost:80" }, authenticateDevModeRequest: true) ); + RunTest(options, expectedRuntimeConfig); } @@ -147,10 +148,10 @@ public void CosmosDbNoSqlDatabase() ""database-type"": ""cosmosdb_nosql"", ""connection-string"": ""testconnectionstring"", ""options"": { - ""database"": ""testdb"", - ""container"": ""testcontainer"", - ""schema"": ""schemafile"" - } + ""database"": ""testdb"", + ""container"": ""testcontainer"", + ""schema"": ""schemafile"" + } }, ""cosmos"": { ""database"": ""testdb"", diff --git a/src/Config/DataSource.cs b/src/Config/DataSource.cs index 25eaabc379..c3de806381 100644 --- a/src/Config/DataSource.cs +++ b/src/Config/DataSource.cs @@ -23,11 +23,15 @@ public record DataSource( [property: JsonPropertyName(CONNSTRING_PROPERTY_NAME)] public string ConnectionString { get; set; } = string.Empty; public CosmosDbOptions? CosmosDbNoSql { get; set; } + public CosmosDbPostgreSqlOptions? CosmosDbPostgreSql { get; set; } public MsSqlOptions? MsSql { get; set; } public PostgreSqlOptions? PostgreSql { get; set; } public MySqlOptions? MySql { get; set; } - public CosmosDbPostgreSqlOptions? CosmosDbPostgreSql { get; set; } + /// + /// Method to populate the database specific options from the "options" + /// section in data-source. + /// public void PopulateDbSpecificOptions() { if (DbOptions is null)