diff options
| author | Roy Ben Shabat <Roy.mail.net@gmail.com> | 2020-07-28 15:27:05 +0300 |
|---|---|---|
| committer | Roy Ben Shabat <Roy.mail.net@gmail.com> | 2020-07-28 15:27:05 +0300 |
| commit | 7c7aba43ab895d02e0209861550fed3bc12f3904 (patch) | |
| tree | 11287241a4cc80baa871712240ab82487c563f9f /Software/Visual_Studio/Azure | |
| parent | 55b795f940282378784f0175803fcba62aecc816 (diff) | |
| download | Tango-7c7aba43ab895d02e0209861550fed3bc12f3904.tar.gz Tango-7c7aba43ab895d02e0209861550fed3bc12f3904.zip | |
Implemented Tango FSE Publish Utils.
Added FSE to AzureUtils on environment upgrade.
Diffstat (limited to 'Software/Visual_Studio/Azure')
10 files changed, 199 insertions, 6 deletions
diff --git a/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/Controls/WebAppPropertiesControl.xaml b/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/Controls/WebAppPropertiesControl.xaml index fe8b4bdef..aadfb7918 100644 --- a/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/Controls/WebAppPropertiesControl.xaml +++ b/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/Controls/WebAppPropertiesControl.xaml @@ -61,6 +61,9 @@ <TextBlock FontWeight="SemiBold">Tango Firmware Version::</TextBlock> <TextBlock Text="{Binding ElementName=control,Path=TangoVersion.FirmwareVersion}"></TextBlock> + + <TextBlock FontWeight="SemiBold">Tango FSE Version:</TextBlock> + <TextBlock Text="{Binding ElementName=control,Path=FseVersion.Version}"></TextBlock> </controls:TableGrid> </StackPanel> diff --git a/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/Controls/WebAppPropertiesControl.xaml.cs b/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/Controls/WebAppPropertiesControl.xaml.cs index ea7475fb1..8888dfc02 100644 --- a/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/Controls/WebAppPropertiesControl.xaml.cs +++ b/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/Controls/WebAppPropertiesControl.xaml.cs @@ -47,6 +47,14 @@ namespace Tango.AzureUtils.UI.Controls public static readonly DependencyProperty TangoVersionProperty = DependencyProperty.Register("TangoVersion", typeof(TangoVersion), typeof(WebAppPropertiesControl), new PropertyMetadata(null)); + public FseVersion FseVersion + { + get { return (FseVersion)GetValue(FseVersionProperty); } + set { SetValue(FseVersionProperty, value); } + } + public static readonly DependencyProperty FseVersionProperty = + DependencyProperty.Register("FseVersion", typeof(FseVersion), typeof(WebAppPropertiesControl), new PropertyMetadata(null)); + public MachineStudioVersion MachineStudioVersion { get { return (MachineStudioVersion)GetValue(MachineStudioVersionProperty); } @@ -88,6 +96,7 @@ namespace Tango.AzureUtils.UI.Controls var databaseManager = new DatabaseManager(azure); TangoVersion = await databaseManager.GetLatestPPCVersion(app); MachineStudioVersion = await databaseManager.GetLatestMachineStudioVersion(app); + FseVersion = await databaseManager.GetLatestFSEVersion(app); } catch { } finally diff --git a/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/MainWindow.xaml b/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/MainWindow.xaml index 7985f7985..6eaedea2a 100644 --- a/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/MainWindow.xaml +++ b/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/MainWindow.xaml @@ -6,7 +6,7 @@ xmlns:views="clr-namespace:Tango.AzureUtils.UI.Views" xmlns:local="clr-namespace:Tango.AzureUtils.UI" mc:Ignorable="d" - Title="Azure Utils" Height="900" Width="1280"> + Title="Azure Utils" Height="920" Width="1280"> <Grid> <views:MainView/> diff --git a/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/Views/EnvironmentUpgradeView.xaml b/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/Views/EnvironmentUpgradeView.xaml index b82be1e67..0bc763c35 100644 --- a/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/Views/EnvironmentUpgradeView.xaml +++ b/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/Views/EnvironmentUpgradeView.xaml @@ -44,9 +44,11 @@ <CheckBox Click="OnConfigChanged" IsChecked="{Binding Config.SynchronizeDatabaseSchema}" >Upgrade Database Schema</CheckBox> <CheckBox Click="OnConfigChanged" Margin="0 5 0 0" IsChecked="{Binding Config.SynchronizeDatabaseData}" >Upgrade Database Static Collections</CheckBox> <CheckBox Click="OnConfigChanged" Margin="0 5 0 0" IsChecked="{Binding Config.CopyMachineStudioStorageBlobs}" >Upgrade Machine Studio Blob Storage</CheckBox> - <CheckBox Click="OnConfigChanged" Margin="0 5 0 0" IsChecked="{Binding Config.CopyPPCStorageBlobs}" >Upgrade PPC Blob Storage</CheckBox> <CheckBox Click="OnConfigChanged" Margin="0 5 0 0" IsChecked="{Binding Config.UpgradeMachineStudioDatabaseVersion}" >Upgrade Machine Studio Database Version</CheckBox> + <CheckBox Click="OnConfigChanged" Margin="0 5 0 0" IsChecked="{Binding Config.CopyPPCStorageBlobs}" >Upgrade PPC Blob Storage</CheckBox> <CheckBox Click="OnConfigChanged" Margin="0 5 0 0" IsChecked="{Binding Config.UpgradePPCDatabaseVersion}" >Upgrade PPC Database Version</CheckBox> + <CheckBox Click="OnConfigChanged" Margin="0 5 0 0" IsChecked="{Binding Config.CopyFSEStorageBlobs}" >Upgrade FSE Blob Storage</CheckBox> + <CheckBox Click="OnConfigChanged" Margin="0 5 0 0" IsChecked="{Binding Config.UpgradeFSEDatabaseVersion}" >Upgrade FSE Database Version</CheckBox> <CheckBox Click="OnConfigChanged" Margin="0 5 0 0" IsChecked="{Binding Config.CopyMachineServiceFiles}" >Upgrade Machine Service</CheckBox> </StackPanel> </GroupBox> diff --git a/Software/Visual_Studio/Azure/Tango.AzureUtils/Database/DatabaseManager.cs b/Software/Visual_Studio/Azure/Tango.AzureUtils/Database/DatabaseManager.cs index 75a7f321b..2a94e95b0 100644 --- a/Software/Visual_Studio/Azure/Tango.AzureUtils/Database/DatabaseManager.cs +++ b/Software/Visual_Studio/Azure/Tango.AzureUtils/Database/DatabaseManager.cs @@ -234,7 +234,7 @@ namespace Tango.AzureUtils.Database var targetDataSource = (await targetApp.GetMachineServiceSettingsAsync()).ToDataSource(); - OnProgress(AzureUtilsStage.Database, $"Adding machine studio database entry for version '{latestPPCVersion.Version}'..."); + OnProgress(AzureUtilsStage.Database, $"Adding PPC database entry for version '{latestPPCVersion.Version}'..."); using (var db = ObservablesContext.CreateDefault(targetDataSource)) { @@ -243,6 +243,21 @@ namespace Tango.AzureUtils.Database } } + public async Task UpgradeFSEVersion(IWebAppBase sourceApp, IWebAppBase targetApp) + { + var latestFSEVersion = await GetLatestFSEVersion(sourceApp); + + var targetDataSource = (await targetApp.GetMachineServiceSettingsAsync()).ToDataSource(); + + OnProgress(AzureUtilsStage.Database, $"Adding FSE database entry for version '{latestFSEVersion.Version}'..."); + + using (var db = ObservablesContext.CreateDefault(targetDataSource)) + { + db.FseVersions.Add(latestFSEVersion); + await db.SaveChangesAsync(); + } + } + public async Task DowngradeMachineStudioVersion(IWebAppBase app) { var latestMachineStudioVersion = await GetLatestMachineStudioVersion(app); @@ -327,8 +342,8 @@ namespace Tango.AzureUtils.Database using (var db = ObservablesContext.CreateDefault(dataSource)) { var versions = await db.TangoVersions.ToListAsync(); - var latest_machine_version = versions.OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault(); - return latest_machine_version; + var latest_version = versions.OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault(); + return latest_version; } } catch (Exception ex) @@ -337,6 +352,38 @@ namespace Tango.AzureUtils.Database } } + public async Task<FseVersion> GetLatestFSEVersion(IWebAppBase app) + { + OnProgress(AzureUtilsStage.Database, $"Getting latest FSE version on '{app.Name}'..."); + + MachineServiceSettings settings = null; + + try + { + settings = await app.GetMachineServiceSettingsAsync(); + } + catch (Exception ex) + { + throw new ArgumentException("Could not fetch machine service settings. Please check that all settings are available.", ex); + } + + try + { + DataSource dataSource = settings.ToDataSource(); + + using (var db = ObservablesContext.CreateDefault(dataSource)) + { + var versions = await db.FseVersions.ToListAsync(); + var latest_version = versions.OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault(); + return latest_version; + } + } + catch (Exception ex) + { + throw new InvalidDataException($"Could not retrieve '{app.Name}' latest FSE version from database.", ex); + } + } + public async Task ValidateMachineStudioDatabaseUpgrade(IWebAppBase sourceApp, IWebAppBase targetApp) { OnProgress(AzureUtilsStage.Validating, "Validating machine studio database upgrade..."); @@ -385,6 +432,30 @@ namespace Tango.AzureUtils.Database } } + public async Task ValidateFSEDatabaseUpgrade(IWebAppBase sourceApp, IWebAppBase targetApp) + { + OnProgress(AzureUtilsStage.Validating, "Validating FSE database upgrade..."); + + var sourceSettings = await sourceApp.GetMachineServiceSettingsAsync(); + var targetSettings = await targetApp.GetMachineServiceSettingsAsync(); + + var latestSourceFSEVersion = await GetLatestFSEVersion(sourceApp); + + //Check if there is any source FSE version. + if (latestSourceFSEVersion == null) + { + throw new ValidationException("Could not locate a FSE version entry on the source database."); + } + + var latestTargetFSEVersion = await GetLatestFSEVersion(targetApp); + + //Check target latest FSE version is older if there is any. + if (latestTargetFSEVersion != null && Version.Parse(latestSourceFSEVersion.Version) <= Version.Parse(latestTargetFSEVersion.Version)) + { + throw new ValidationException($"FSE source version is '{latestSourceFSEVersion.Version}' while target version is '{latestTargetFSEVersion.Version}'."); + } + } + #endregion } } diff --git a/Software/Visual_Studio/Azure/Tango.AzureUtils/Environment/EnvironmentManager.cs b/Software/Visual_Studio/Azure/Tango.AzureUtils/Environment/EnvironmentManager.cs index 19ccb8f92..123c94f7d 100644 --- a/Software/Visual_Studio/Azure/Tango.AzureUtils/Environment/EnvironmentManager.cs +++ b/Software/Visual_Studio/Azure/Tango.AzureUtils/Environment/EnvironmentManager.cs @@ -327,6 +327,20 @@ namespace Tango.AzureUtils.Environment } } + //Add FSE storage versions. + if (config.CopyFSEStorageBlobs) + { + try + { + await _storageManager.ValidateFSEStorageUpgrade(sourceApp, targetApp); + await _storageManager.UpgradeFSEStorage(sourceApp, targetApp); + } + catch (Exception ex) + { + await RequestConfirmation($"Issues encountered with upgrading FSE storage versions.\n{ex.FlattenMessage()}\nDo you wish to continue?"); + } + } + //Upgrade machine studio database version. if (config.UpgradeMachineStudioDatabaseVersion) { @@ -355,6 +369,20 @@ namespace Tango.AzureUtils.Environment } } + //Upgrade FSE database version. + if (config.UpgradeFSEDatabaseVersion) + { + try + { + await _databaseManager.ValidateFSEDatabaseUpgrade(sourceApp, targetApp); + await _databaseManager.UpgradeFSEVersion(sourceApp, targetApp); + } + catch (Exception ex) + { + await RequestConfirmation($"Issues encountered with upgrading FSE database versions.\n{ex.FlattenMessage()}\nDo you wish to continue?"); + } + } + //Copy Website files. if (config.CopyMachineServiceFiles) @@ -388,6 +416,12 @@ namespace Tango.AzureUtils.Environment await _storageManager.ValidatePPCStorageUpgrade(sourceApp, targetApp); } + //Add FSE storage versions. + if (config.CopyFSEStorageBlobs) + { + await _storageManager.ValidateFSEStorageUpgrade(sourceApp, targetApp); + } + //Upgrade machine studio database version. if (config.UpgradeMachineStudioDatabaseVersion) { @@ -399,6 +433,12 @@ namespace Tango.AzureUtils.Environment { await _databaseManager.ValidatePPCDatabaseUpgrade(sourceApp, targetApp); } + + //Upgrade FSE database version. + if (config.UpgradeFSEDatabaseVersion) + { + await _databaseManager.ValidateFSEDatabaseUpgrade(sourceApp, targetApp); + } } #endregion diff --git a/Software/Visual_Studio/Azure/Tango.AzureUtils/Environment/EnvironmentSettings.cs b/Software/Visual_Studio/Azure/Tango.AzureUtils/Environment/EnvironmentSettings.cs index 8b8e3a757..8eefc4bc5 100644 --- a/Software/Visual_Studio/Azure/Tango.AzureUtils/Environment/EnvironmentSettings.cs +++ b/Software/Visual_Studio/Azure/Tango.AzureUtils/Environment/EnvironmentSettings.cs @@ -12,6 +12,7 @@ namespace Tango.AzureUtils.Environment public String DB_CATALOG { get; set; } public String MACHINE_STUDIO_VERSIONS_CONTAINER { get; set; } public String TANGO_VERSIONS_CONTAINER { get; set; } + public String FSE_VERSIONS_CONTAINER { get; set; } public String MACHINE_SERVICE_BACKUPS_CONTAINER { get; set; } public String MACHINE_SERVICE_LOGS_CONTAINER { get; set; } public String ENVIRONMENT_GROUP { get; set; } @@ -24,6 +25,7 @@ namespace Tango.AzureUtils.Environment settings.DB_CATALOG = $"Tango_{name}"; settings.MACHINE_STUDIO_VERSIONS_CONTAINER = $"machine-studio-versions-{name.ToLower()}"; settings.TANGO_VERSIONS_CONTAINER = $"tango-versions-{name.ToLower()}"; + settings.FSE_VERSIONS_CONTAINER = $"fse-versions-{name.ToLower()}"; settings.MACHINE_SERVICE_BACKUPS_CONTAINER = $"machine-service-backups-{name.ToLower()}"; settings.MACHINE_SERVICE_LOGS_CONTAINER = $"machine-service-logs-{name.ToLower()}"; settings.ENVIRONMENT_GROUP = $"Tango {name}"; diff --git a/Software/Visual_Studio/Azure/Tango.AzureUtils/Environment/UpgradeEnvironmentConfiguration.cs b/Software/Visual_Studio/Azure/Tango.AzureUtils/Environment/UpgradeEnvironmentConfiguration.cs index 537056701..1d7b9de16 100644 --- a/Software/Visual_Studio/Azure/Tango.AzureUtils/Environment/UpgradeEnvironmentConfiguration.cs +++ b/Software/Visual_Studio/Azure/Tango.AzureUtils/Environment/UpgradeEnvironmentConfiguration.cs @@ -14,6 +14,8 @@ namespace Tango.AzureUtils.Environment public bool UpgradeMachineStudioDatabaseVersion { get; set; } = true; public bool CopyPPCStorageBlobs { get; set; } = true; public bool UpgradePPCDatabaseVersion { get; set; } = true; + public bool CopyFSEStorageBlobs { get; set; } = true; + public bool UpgradeFSEDatabaseVersion { get; set; } = true; public bool CopyMachineServiceFiles { get; set; } = true; } } diff --git a/Software/Visual_Studio/Azure/Tango.AzureUtils/MachineServiceSettings.cs b/Software/Visual_Studio/Azure/Tango.AzureUtils/MachineServiceSettings.cs index 93065c50d..4f8742083 100644 --- a/Software/Visual_Studio/Azure/Tango.AzureUtils/MachineServiceSettings.cs +++ b/Software/Visual_Studio/Azure/Tango.AzureUtils/MachineServiceSettings.cs @@ -18,5 +18,6 @@ namespace Tango.AzureUtils public String MACHINE_STUDIO_VERSIONS_CONTAINER { get; set; } public String STORAGE_ACCOUNT { get; set; } public String TANGO_VERSIONS_CONTAINER { get; set; } + public String FSE_VERSIONS_CONTAINER { get; set; } } } diff --git a/Software/Visual_Studio/Azure/Tango.AzureUtils/Storage/StorageManager.cs b/Software/Visual_Studio/Azure/Tango.AzureUtils/Storage/StorageManager.cs index 77a0aaf6d..db4403cc9 100644 --- a/Software/Visual_Studio/Azure/Tango.AzureUtils/Storage/StorageManager.cs +++ b/Software/Visual_Studio/Azure/Tango.AzureUtils/Storage/StorageManager.cs @@ -109,6 +109,39 @@ namespace Tango.AzureUtils.Storage }); } + public async Task UpgradeFSEStorage(IWebAppBase sourceApp, IWebAppBase targetApp) + { + OnProgress(AzureUtilsStage.Storage, $"Retrieving source and target settings..."); + + var sourceSettings = await sourceApp.GetMachineServiceSettingsAsync(); + var targetSettings = await targetApp.GetMachineServiceSettingsAsync(); + + var latestFSEVersion = await _databaseManager.GetLatestFSEVersion(sourceApp); + + OnProgress(AzureUtilsStage.Storage, $"Upgrading FSE version storage..."); + + var sourceAccount = CloudStorageAccount.Parse(sourceSettings.STORAGE_ACCOUNT); + var sourceClient = sourceAccount.CreateCloudBlobClient(); + + var targetAccount = CloudStorageAccount.Parse(targetSettings.STORAGE_ACCOUNT); + var targetClient = targetAccount.CreateCloudBlobClient(); + + var sourceFSEContainer = sourceClient.GetContainerReference(sourceSettings.FSE_VERSIONS_CONTAINER); + var targetFSEContainer = targetClient.GetContainerReference(targetSettings.FSE_VERSIONS_CONTAINER); + + //var sourceFSEBlob = sourceFSEContainer.GetBlockBlobReference(latestPPCVersion.BlobName); + var sourceFSEInstallerBlob = sourceFSEContainer.GetBlockBlobReference(latestFSEVersion.InstallerBlobName); + + //var targetFSEBlob = await CreateEmptyBlob(targetFSEContainer, sourceFSEBlob.Name); + var targetFSEInstallerBlob = await CreateEmptyBlob(targetFSEContainer, sourceFSEInstallerBlob.Name); + + await Task.Factory.StartNew(() => + { + //targetFSEBlob.StartCopy(sourceFSEBlob); + targetFSEInstallerBlob.StartCopy(sourceFSEInstallerBlob); + }); + } + public async Task UpgradeMachineStudioStorage(IWebAppBase sourceApp, IWebAppBase targetApp) { OnProgress(AzureUtilsStage.Storage, $"Retrieving source and target settings..."); @@ -170,7 +203,7 @@ namespace Tango.AzureUtils.Storage public async Task ValidatePPCStorageUpgrade(IWebAppBase sourceApp, IWebAppBase targetApp) { - OnProgress(AzureUtilsStage.Validating, "Validating PPC database upgrade..."); + OnProgress(AzureUtilsStage.Validating, "Validating PPC storage upgrade..."); var sourceSettings = await sourceApp.GetMachineServiceSettingsAsync(); var targetSettings = await targetApp.GetMachineServiceSettingsAsync(); @@ -198,6 +231,36 @@ namespace Tango.AzureUtils.Storage } } + public async Task ValidateFSEStorageUpgrade(IWebAppBase sourceApp, IWebAppBase targetApp) + { + OnProgress(AzureUtilsStage.Validating, "Validating FSE storage upgrade..."); + + var sourceSettings = await sourceApp.GetMachineServiceSettingsAsync(); + var targetSettings = await targetApp.GetMachineServiceSettingsAsync(); + + var latestSourceFSEVersion = await _databaseManager.GetLatestFSEVersion(sourceApp); + var latestTargetFSEVersion = await _databaseManager.GetLatestFSEVersion(targetApp); + + var targetAccount = CloudStorageAccount.Parse(targetSettings.STORAGE_ACCOUNT); + var targetClient = targetAccount.CreateCloudBlobClient(); + + var targetFSEContainer = targetClient.GetContainerReference(targetSettings.FSE_VERSIONS_CONTAINER); + + //Check FSE binaries blob not exists on the target. + var targetFSEBlob = targetFSEContainer.GetBlockBlobReference(latestSourceFSEVersion.BlobName); + if (await targetFSEBlob.ExistsAsync()) + { + throw new ValidationException($"FSE Block blob '{latestSourceFSEVersion.BlobName}' already exists on the target storage."); + } + + //Check FSE installer blob not exists on the target. + var targetFSEInstallerBlob = targetFSEContainer.GetBlockBlobReference(latestSourceFSEVersion.InstallerBlobName); + if (await targetFSEInstallerBlob.ExistsAsync()) + { + throw new ValidationException($"FSE Block blob '{latestSourceFSEVersion.InstallerBlobName}' already exists on the target storage."); + } + } + public async Task ValidateMachineStudioStorageUpgrade(IWebAppBase sourceApp, IWebAppBase targetApp) { OnProgress(AzureUtilsStage.Validating, "Validating machine studio storage upgrade..."); |
