diff --git a/KustoSchemaTools/KustoSchemaHandler.cs b/KustoSchemaTools/KustoSchemaHandler.cs index 4599e58..4543e3f 100644 --- a/KustoSchemaTools/KustoSchemaHandler.cs +++ b/KustoSchemaTools/KustoSchemaHandler.cs @@ -25,11 +25,26 @@ public KustoSchemaHandler(ILogger> schemaHandlerLogger, Ya public YamlDatabaseHandlerFactory YamlDatabaseHandlerFactory { get; } public KustoDatabaseHandlerFactory KustoDatabaseHandlerFactory { get; } - public async Task<(string markDown, bool isValid)> GenerateDiffMarkdown(string path, string databaseName) + public Clusters FilterClusters(Clusters clusters, List? includedConnections) { + // Connections may be marked inactive, so we need to filter them out + // However, if includedConnections is provided we should only process those regardless of the IsActive flag + var includedConnectionsIsNullOrEmpty = includedConnections == null || includedConnections.Count == 0; + var filteredConnections = includedConnectionsIsNullOrEmpty + ? clusters.Connections.Where(cluster => cluster.IsActive).ToList() + : clusters.Connections.Where(cluster => includedConnections != null && includedConnections.Any(name => string.Equals(name, cluster.Name, StringComparison.OrdinalIgnoreCase))).ToList(); + + return new Clusters + { + Connections = filteredConnections + }; + } + public async Task<(string markDown, bool isValid)> GenerateDiffMarkdown(string path, string databaseName, List? includedConnections = null) + { var clustersFile = File.ReadAllText(Path.Combine(path, "clusters.yml")); var clusters = Serialization.YamlPascalCaseDeserializer.Deserialize(clustersFile); + clusters = FilterClusters(clusters, includedConnections); var sb = new StringBuilder(); bool isValid = true; @@ -74,7 +89,7 @@ public KustoSchemaHandler(ILogger> schemaHandlerLogger, Ya } var scriptSb = new StringBuilder(); - foreach(var script in changes.SelectMany(itm => itm.Scripts).Where(itm => itm.IsValid == true).OrderBy(itm => itm.Order)) + foreach (var script in changes.SelectMany(itm => itm.Scripts).Where(itm => itm.IsValid == true).OrderBy(itm => itm.Order)) { scriptSb.AppendLine(script.Text); } @@ -82,12 +97,10 @@ public KustoSchemaHandler(ILogger> schemaHandlerLogger, Ya Log.LogInformation($"Following scripts will be applied:\n{scriptSb}"); } - foreach(var follower in yamlDb.Followers) + foreach (var follower in yamlDb.Followers) { - Log.LogInformation($"Generating diff markdown for {Path.Combine(path, databaseName)} => {follower.Key}/{follower.Value.DatabaseName}"); - var followerClient = new KustoClient(follower.Key); var oldModel = FollowerLoader.LoadFollower(follower.Value.DatabaseName, followerClient); @@ -100,7 +113,7 @@ public KustoSchemaHandler(ILogger> schemaHandlerLogger, Ya foreach (var change in changes) { sb.AppendLine(change.Markdown); - sb.AppendLine(); + sb.AppendLine(); } } return (sb.ToString(), isValid); @@ -110,14 +123,15 @@ public async Task Import(string path, string databaseName, bool includeColumns) { var clustersFile = File.ReadAllText(Path.Combine(path, "clusters.yml")); var clusters = Serialization.YamlPascalCaseDeserializer.Deserialize(clustersFile); - + clusters = FilterClusters(clusters, null); + var escapedDbName = databaseName.BracketIfIdentifier(); var dbHandler = KustoDatabaseHandlerFactory.Create(clusters.Connections[0].Url, escapedDbName); var db = await dbHandler.LoadAsync(); if (includeColumns == false) { - foreach(var table in db.Tables.Values) + foreach (var table in db.Tables.Values) { table.Columns = new Dictionary(); } @@ -128,16 +142,16 @@ public async Task Import(string path, string databaseName, bool includeColumns) } - public async Task> Apply(string path, string databaseName) + public async Task> Apply(string path, string databaseName, List? includedConnections = null) { var clustersFile = File.ReadAllText(Path.Combine(path, "clusters.yml")); var clusters = Serialization.YamlPascalCaseDeserializer.Deserialize(clustersFile); - + clusters = FilterClusters(clusters, includedConnections); var escapedDbName = databaseName.BracketIfIdentifier(); var yamlHandler = YamlDatabaseHandlerFactory.Create(path, databaseName); var yamlDb = await yamlHandler.LoadAsync(); - var results = new ConcurrentDictionary(); + var results = new ConcurrentDictionary(); await Parallel.ForEachAsync(clusters.Connections, async (cluster, token) => { diff --git a/KustoSchemaTools/Model/Cluster.cs b/KustoSchemaTools/Model/Cluster.cs index 95e220a..64b4812 100644 --- a/KustoSchemaTools/Model/Cluster.cs +++ b/KustoSchemaTools/Model/Cluster.cs @@ -5,6 +5,7 @@ public class Cluster public string Name { get; set; } public string Url { get; set; } public List Scripts { get; set; } = new List(); + public bool IsActive { get; set; } = true; } }