private async Task <FlowBlobOutputSpec> ProcessOutputBlob(string configName, FlowGuiOutput uiOutput)
        {
            if (uiOutput != null && uiOutput.Properties != null)
            {
                var sparkKeyVaultName = Configuration[Constants.ConfigSettingName_RuntimeKeyVaultName];

                string connectionString = await KeyVaultClient.ResolveSecretUriAsync(uiOutput.Properties.ConnectionString);

                var accountName    = ParseBlobAccountName(connectionString);
                var blobPath       = $"wasbs://{uiOutput.Properties.ContainerName}@{accountName}.blob.core.windows.net/{uiOutput.Properties.BlobPrefix}/%1$tY/%1$tm/%1$td/%1$tH/${{quarterBucket}}/${{minuteBucket}}";
                var secretId       = $"{configName}-output";
                var blobPathSecret = await KeyVaultClient.SaveSecretAsync(sparkKeyVaultName, secretId, blobPath, Configuration[Constants.ConfigSettingName_SparkType], true);

                await KeyVaultClient.SaveSecretAsync(sparkKeyVaultName, $"{Constants.AccountSecretPrefix}{accountName}", ParseBlobAccountKey(connectionString), Configuration[Constants.ConfigSettingName_SparkType], false);

                FlowBlobOutputSpec blobOutput = new FlowBlobOutputSpec()
                {
                    CompressionType = uiOutput.Properties.CompressionType,
                    Format          = uiOutput.Properties.Format,
                    Groups          = new BlobOutputGroups()
                    {
                        Main = new BlobOutputMain()
                        {
                            Folder = blobPathSecret
                        }
                    }
                };
                return(blobOutput);
            }
            else
            {
                return(null);
            }
        }
        private async Task <FlowSqlOutputSpec> ProcessOutputSql(string configName, FlowGuiOutput uiOutput)
        {
            if (uiOutput != null && uiOutput.Properties != null)
            {
                var sparkKeyVaultName = Configuration[Constants.ConfigSettingName_RuntimeKeyVaultName];

                string connectionString = await KeyVaultClient.ResolveSecretUriAsync(uiOutput.Properties.ConnectionString).ConfigureAwait(false);

                var database = GetValueFromJdbcConnection(connectionString, "database");
                var user     = GetValueFromJdbcConnection(connectionString, "user");
                var pwd      = GetValueFromJdbcConnection(connectionString, "password");
                var url      = GetUrlFromJdbcConnection(connectionString);

                var sparkType = Configuration.TryGet(Constants.ConfigSettingName_SparkType, out string value) ? value : null;

                // Save password and url in keyvault
                var pwdSecretId = $"{configName}-outSqlPassword";
                var pwdRef      = await KeyVaultClient.SaveSecretAsync(sparkKeyVaultName, pwdSecretId, pwd, sparkType, true).ConfigureAwait(false);

                var urlSecretId = $"{configName}-outSqlUrl";
                var urlRef      = await KeyVaultClient.SaveSecretAsync(sparkKeyVaultName, urlSecretId, url, sparkType, true).ConfigureAwait(false);

                FlowSqlOutputSpec sqlOutput = new FlowSqlOutputSpec()
                {
                    ConnectionStringRef = uiOutput.Properties.ConnectionString,
                    TableName           = uiOutput.Properties.TableName,
                    WriteMode           = uiOutput.Properties.WriteMode,
                    UseBulkInsert       = uiOutput.Properties.UseBulkInsert,
                    DatabaseName        = database,
                    User     = user,
                    Password = pwdRef,
                    Url      = urlRef
                };
                return(sqlOutput);
            }
            else
            {
                return(null);
            }
        }
        private async Task <FlowBlobOutputSpec> ProcessOutputBlob(string inputMode, string configName, FlowGuiOutput uiOutput)
        {
            if (uiOutput != null && uiOutput.Properties != null)
            {
                var sparkKeyVaultName = Configuration[Constants.ConfigSettingName_RuntimeKeyVaultName];

                string connectionString = await KeyVaultClient.ResolveSecretUriAsync(uiOutput.Properties.ConnectionString).ConfigureAwait(false);

                var accountName = ConfigHelper.ParseBlobAccountName(connectionString);
                var timeFormat  = ConfigHelper.GetBlobPartitionFormat(inputMode, uiOutput.Properties.BlobPartitionFormat);

                var blobPath       = $"wasbs://{uiOutput.Properties.ContainerName}@{accountName}.blob.core.windows.net/{uiOutput.Properties.BlobPrefix}/{timeFormat}";
                var secretId       = $"{configName}-output";
                var sparkType      = Configuration.TryGet(Constants.ConfigSettingName_SparkType, out string value) ? value : null;
                var blobPathSecret = await KeyVaultClient.SaveSecretAsync(sparkKeyVaultName, secretId, blobPath, sparkType, true);

                await KeyVaultClient.SaveSecretAsync(sparkKeyVaultName, $"{Constants.AccountSecretPrefix}{accountName}", ConfigHelper.ParseBlobAccountKey(connectionString), sparkType, false);

                FlowBlobOutputSpec blobOutput = new FlowBlobOutputSpec()
                {
                    CompressionType = uiOutput.Properties.CompressionType,
                    Format          = uiOutput.Properties.Format,
                    Groups          = new BlobOutputGroups()
                    {
                        Main = new BlobOutputMain()
                        {
                            Folder = blobPathSecret
                        }
                    }
                };
                return(blobOutput);
            }
            else
            {
                return(null);
            }
        }