diff options
7 files changed, 200 insertions, 5 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 40c1b8223..ab4b62ae7 100644 --- a/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/Controls/WebAppPropertiesControl.xaml +++ b/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/Controls/WebAppPropertiesControl.xaml @@ -9,8 +9,8 @@ mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800" d:DataContext="{d:DesignInstance Type=azure:IWebAppBase, IsDesignTimeCreatable=False}" x:Name="control" > <Grid> - <StackPanel TextElement.FontSize="10"> - <controls:TableGrid RowHeight="20"> + <StackPanel TextElement.FontSize="9"> + <controls:TableGrid RowHeight="18"> <TextBlock FontWeight="SemiBold">ADDRESS:</TextBlock> <ItemsControl ItemsSource="{Binding ElementName=control,Path=HostNames}"/> @@ -56,12 +56,18 @@ <TextBlock FontWeight="SemiBold">Machine Studio Version:</TextBlock> <TextBlock Text="{Binding ElementName=control,Path=MachineStudioVersion.Version}"></TextBlock> - <TextBlock FontWeight="SemiBold">Tango Application Version:</TextBlock> + <TextBlock FontWeight="SemiBold">PPC Application Version:</TextBlock> <TextBlock Text="{Binding ElementName=control,Path=TangoVersion.VersionAndTag}"></TextBlock> - <TextBlock FontWeight="SemiBold">Tango Firmware Version::</TextBlock> + <TextBlock FontWeight="SemiBold">PPC Firmware Version::</TextBlock> <TextBlock Text="{Binding ElementName=control,Path=TangoVersion.FirmwareVersion}"></TextBlock> + <TextBlock FontWeight="SemiBold">Twine X4 Application Version:</TextBlock> + <TextBlock Text="{Binding ElementName=control,Path=EurekaVersion.VersionAndTag}"></TextBlock> + + <TextBlock FontWeight="SemiBold">Twine X4 Firmware Version::</TextBlock> + <TextBlock Text="{Binding ElementName=control,Path=EurekaVersion.FirmwareVersion}"></TextBlock> + <TextBlock FontWeight="SemiBold">Tango FSE Version:</TextBlock> <TextBlock Text="{Binding ElementName=control,Path=FseVersion.Version}"></TextBlock> 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 51303d126..22396cefe 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 @@ -66,6 +66,14 @@ namespace Tango.AzureUtils.UI.Controls public static readonly DependencyProperty TangoVersionProperty = DependencyProperty.Register("TangoVersion", typeof(TangoVersion), typeof(WebAppPropertiesControl), new PropertyMetadata(null)); + public TangoVersion EurekaVersion + { + get { return (TangoVersion)GetValue(EurekaVersionProperty); } + set { SetValue(EurekaVersionProperty, value); } + } + public static readonly DependencyProperty EurekaVersionProperty = + DependencyProperty.Register("EurekaVersion", typeof(TangoVersion), typeof(WebAppPropertiesControl), new PropertyMetadata(null)); + public FseVersion FseVersion { get { return (FseVersion)GetValue(FseVersionProperty); } @@ -144,6 +152,7 @@ namespace Tango.AzureUtils.UI.Controls var azure = await AzureUtilsAuthenticationFactory.AuthenticateOrGetAsync(); var databaseManager = new DatabaseManager(azure); TangoVersion = await databaseManager.GetLatestPPCVersion(app, PPCVersionTag); + EurekaVersion = await databaseManager.GetLatestEurekaVersion(app, PPCVersionTag); MachineStudioVersion = await databaseManager.GetLatestMachineStudioVersion(app); FseVersion = await databaseManager.GetLatestFSEVersion(app, FSEBuildVariants.FSE); TwineRSMVersion = await databaseManager.GetLatestFSEVersion(app, FSEBuildVariants.TwineRSM); 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 5b6491a48..fe82fb0b8 100644 --- a/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/Views/EnvironmentUpgradeView.xaml +++ b/Software/Visual_Studio/Azure/Tango.AzureUtils.UI/Views/EnvironmentUpgradeView.xaml @@ -47,6 +47,8 @@ <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.CopyEurekaStorageBlobs}" >Upgrade Twine X4 Blob Storage</CheckBox> + <CheckBox Click="OnConfigChanged" Margin="0 5 0 0" IsChecked="{Binding Config.UpgradeEurekaDatabaseVersion}" >Upgrade Twine X4 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.CopyTwineRSMStorageBlobs}" >Upgrade Twine RSM Blob Storage</CheckBox> diff --git a/Software/Visual_Studio/Azure/Tango.AzureUtils/Database/DatabaseManager.cs b/Software/Visual_Studio/Azure/Tango.AzureUtils/Database/DatabaseManager.cs index 4202b45a7..2ed20e91e 100644 --- a/Software/Visual_Studio/Azure/Tango.AzureUtils/Database/DatabaseManager.cs +++ b/Software/Visual_Studio/Azure/Tango.AzureUtils/Database/DatabaseManager.cs @@ -244,6 +244,21 @@ namespace Tango.AzureUtils.Database } } + public async Task UpgradeEurekaVersion(IWebAppBase sourceApp, IWebAppBase targetApp, String versionTag) + { + var latestEurekaVersion = await GetLatestEurekaVersion(sourceApp, versionTag); + + var targetDataSource = (await targetApp.GetMachineServiceSettingsAsync()).ToDataSource(); + + OnProgress(AzureUtilsStage.Database, $"Adding Twine X4 database entry for version '{latestEurekaVersion.VersionAndTag}'..."); + + using (var db = ObservablesContext.CreateDefault(targetDataSource)) + { + db.TangoVersions.Add(latestEurekaVersion); + await db.SaveChangesAsync(); + } + } + public async Task UpgradeFSEVersion(IWebAppBase sourceApp, IWebAppBase targetApp, FSEBuildVariants build) { var latestFSEVersion = await GetLatestFSEVersion(sourceApp, build); @@ -342,7 +357,8 @@ namespace Tango.AzureUtils.Database using (var db = ObservablesContext.CreateDefault(dataSource)) { - var versions = await db.TangoVersions.Where(x => x.Tag == versionTag).ToListAsync(); + var versions = await db.TangoVersions.Include(x => x.MachineVersion).Where(x => x.Tag == versionTag).ToListAsync(); + versions = versions.Where(x => x.MachineVersion.MachineType == MachineTypes.TS1800).ToList(); var latest_version = versions.OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault(); return latest_version; } @@ -353,6 +369,39 @@ namespace Tango.AzureUtils.Database } } + public async Task<TangoVersion> GetLatestEurekaVersion(IWebAppBase app, String versionTag) + { + OnProgress(AzureUtilsStage.Database, $"Getting latest Twine X4 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.TangoVersions.Include(x => x.MachineVersion).Where(x => x.Tag == versionTag).ToListAsync(); + versions = versions.Where(x => x.MachineVersion.MachineType == MachineTypes.Eureka).ToList(); + 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 Twine X4 version from database.", ex); + } + } + public async Task<FseVersion> GetLatestFSEVersion(IWebAppBase app, FSEBuildVariants build) { OnProgress(AzureUtilsStage.Database, $"Getting latest {build} version on '{app.Name}'..."); @@ -433,6 +482,30 @@ namespace Tango.AzureUtils.Database } } + public async Task ValidateEurekaDatabaseUpgrade(IWebAppBase sourceApp, IWebAppBase targetApp, String versionTag) + { + OnProgress(AzureUtilsStage.Validating, "Validating Twine X4 database upgrade..."); + + var sourceSettings = await sourceApp.GetMachineServiceSettingsAsync(); + var targetSettings = await targetApp.GetMachineServiceSettingsAsync(); + + var latestSourceEurekaVersion = await GetLatestEurekaVersion(sourceApp, versionTag); + + //Check if there is any source PPC version. + if (latestSourceEurekaVersion == null) + { + throw new ValidationException("Could not locate a Twine X4 version entry on the source database."); + } + + var latestTargetEurekaVersion = await GetLatestEurekaVersion(targetApp, versionTag); + + //Check target latest PPC version is older if there is any. + if (latestTargetEurekaVersion != null && Version.Parse(latestSourceEurekaVersion.Version) <= Version.Parse(latestTargetEurekaVersion.Version)) + { + throw new ValidationException($"Twine X4 source version is '{latestSourceEurekaVersion.VersionAndTag}' while target version is '{latestTargetEurekaVersion.VersionAndTag}'."); + } + } + public async Task ValidateFSEDatabaseUpgrade(IWebAppBase sourceApp, IWebAppBase targetApp, FSEBuildVariants build) { OnProgress(AzureUtilsStage.Validating, $"Validating {build} database upgrade..."); diff --git a/Software/Visual_Studio/Azure/Tango.AzureUtils/Environment/EnvironmentManager.cs b/Software/Visual_Studio/Azure/Tango.AzureUtils/Environment/EnvironmentManager.cs index 01c95a566..e610efc2d 100644 --- a/Software/Visual_Studio/Azure/Tango.AzureUtils/Environment/EnvironmentManager.cs +++ b/Software/Visual_Studio/Azure/Tango.AzureUtils/Environment/EnvironmentManager.cs @@ -328,6 +328,20 @@ namespace Tango.AzureUtils.Environment } } + //Add Eureka storage versions. + if (config.CopyEurekaStorageBlobs) + { + try + { + await _storageManager.ValidateEurekaStorageUpgrade(sourceApp, targetApp, config.PPCVersionTag); + await _storageManager.UpgradeEurekaStorage(sourceApp, targetApp, config.PPCVersionTag); + } + catch (Exception ex) + { + await RequestConfirmation($"Issues encountered with upgrading Twine X4 storage versions.\n{ex.FlattenMessage()}\nDo you wish to continue?"); + } + } + //Add FSE storage versions. if (config.CopyFSEStorageBlobs) { @@ -384,6 +398,20 @@ namespace Tango.AzureUtils.Environment } } + //Upgrade Eureka database version. + if (config.UpgradeEurekaDatabaseVersion) + { + try + { + await _databaseManager.ValidateEurekaDatabaseUpgrade(sourceApp, targetApp, config.PPCVersionTag); + await _databaseManager.UpgradeEurekaVersion(sourceApp, targetApp, config.PPCVersionTag); + } + catch (Exception ex) + { + await RequestConfirmation($"Issues encountered with upgrading Twine X4 database versions.\n{ex.FlattenMessage()}\nDo you wish to continue?"); + } + } + //Upgrade FSE database version. if (config.UpgradeFSEDatabaseVersion) { @@ -445,6 +473,12 @@ namespace Tango.AzureUtils.Environment await _storageManager.ValidatePPCStorageUpgrade(sourceApp, targetApp, config.PPCVersionTag); } + //Add Eureka storage versions. + if (config.CopyEurekaStorageBlobs) + { + await _storageManager.ValidateEurekaStorageUpgrade(sourceApp, targetApp, config.PPCVersionTag); + } + //Add FSE storage versions. if (config.CopyFSEStorageBlobs) { @@ -469,6 +503,12 @@ namespace Tango.AzureUtils.Environment await _databaseManager.ValidatePPCDatabaseUpgrade(sourceApp, targetApp, config.PPCVersionTag); } + //Upgrade Eureka database version. + if (config.UpgradeEurekaDatabaseVersion) + { + await _databaseManager.ValidateEurekaDatabaseUpgrade(sourceApp, targetApp, config.PPCVersionTag); + } + //Upgrade FSE database version. if (config.UpgradeFSEDatabaseVersion) { diff --git a/Software/Visual_Studio/Azure/Tango.AzureUtils/Environment/UpgradeEnvironmentConfiguration.cs b/Software/Visual_Studio/Azure/Tango.AzureUtils/Environment/UpgradeEnvironmentConfiguration.cs index b165fb6b0..0dbaec3c0 100644 --- a/Software/Visual_Studio/Azure/Tango.AzureUtils/Environment/UpgradeEnvironmentConfiguration.cs +++ b/Software/Visual_Studio/Azure/Tango.AzureUtils/Environment/UpgradeEnvironmentConfiguration.cs @@ -15,6 +15,8 @@ namespace Tango.AzureUtils.Environment public bool UpgradeMachineStudioDatabaseVersion { get; set; } public bool CopyPPCStorageBlobs { get; set; } public bool UpgradePPCDatabaseVersion { get; set; } + public bool CopyEurekaStorageBlobs { get; set; } + public bool UpgradeEurekaDatabaseVersion { get; set; } public bool CopyFSEStorageBlobs { get; set; } public bool UpgradeFSEDatabaseVersion { get; set; } public bool CopyTwineRSMStorageBlobs { 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 887b0ec63..d16a3f90b 100644 --- a/Software/Visual_Studio/Azure/Tango.AzureUtils/Storage/StorageManager.cs +++ b/Software/Visual_Studio/Azure/Tango.AzureUtils/Storage/StorageManager.cs @@ -110,6 +110,39 @@ namespace Tango.AzureUtils.Storage }); } + public async Task UpgradeEurekaStorage(IWebAppBase sourceApp, IWebAppBase targetApp, String versionTag) + { + OnProgress(AzureUtilsStage.Storage, $"Retrieving source and target settings..."); + + var sourceSettings = await sourceApp.GetMachineServiceSettingsAsync(); + var targetSettings = await targetApp.GetMachineServiceSettingsAsync(); + + var latestEurekaVersion = await _databaseManager.GetLatestEurekaVersion(sourceApp, versionTag); + + OnProgress(AzureUtilsStage.Storage, $"Upgrading Eureka 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 sourceEurekaContainer = sourceClient.GetContainerReference(sourceSettings.TANGO_VERSIONS_CONTAINER); + var targetEurekaContainer = targetClient.GetContainerReference(targetSettings.TANGO_VERSIONS_CONTAINER); + + var sourceEurekaBlob = sourceEurekaContainer.GetBlockBlobReference(latestEurekaVersion.BlobName); + var sourceEurekaInstallerBlob = sourceEurekaContainer.GetBlockBlobReference(latestEurekaVersion.InstallerBlobName); + + var targetEurekaBlob = await CreateEmptyBlob(targetEurekaContainer, sourceEurekaBlob.Name); + var targetEurekaInstallerBlob = await CreateEmptyBlob(targetEurekaContainer, sourceEurekaInstallerBlob.Name); + + await Task.Factory.StartNew(() => + { + targetEurekaBlob.StartCopy(sourceEurekaBlob); + targetEurekaInstallerBlob.StartCopy(sourceEurekaInstallerBlob); + }); + } + public async Task UpgradeFSEStorage(IWebAppBase sourceApp, IWebAppBase targetApp, FSEBuildVariants build) { OnProgress(AzureUtilsStage.Storage, $"Retrieving source and target settings..."); @@ -232,6 +265,36 @@ namespace Tango.AzureUtils.Storage } } + public async Task ValidateEurekaStorageUpgrade(IWebAppBase sourceApp, IWebAppBase targetApp, String versionTag) + { + OnProgress(AzureUtilsStage.Validating, "Validating Eureka storage upgrade..."); + + var sourceSettings = await sourceApp.GetMachineServiceSettingsAsync(); + var targetSettings = await targetApp.GetMachineServiceSettingsAsync(); + + var latestSourceEurekaVersion = await _databaseManager.GetLatestEurekaVersion(sourceApp, versionTag); + var latestTargetEurekaVersion = await _databaseManager.GetLatestEurekaVersion(targetApp, versionTag); + + var targetAccount = CloudStorageAccount.Parse(targetSettings.STORAGE_ACCOUNT); + var targetClient = targetAccount.CreateCloudBlobClient(); + + var targetEurekaContainer = targetClient.GetContainerReference(targetSettings.TANGO_VERSIONS_CONTAINER); + + //Check PPC binaries blob not exists on the target. + var targetEurekaBlob = targetEurekaContainer.GetBlockBlobReference(latestSourceEurekaVersion.BlobName); + if (await targetEurekaBlob.ExistsAsync()) + { + throw new ValidationException($"Twine X4 Block blob '{latestSourceEurekaVersion.BlobName}' already exists on the target storage."); + } + + //Check PPC installer blob not exists on the target. + var targetEurekaInstallerBlob = targetEurekaContainer.GetBlockBlobReference(latestSourceEurekaVersion.InstallerBlobName); + if (await targetEurekaInstallerBlob.ExistsAsync()) + { + throw new ValidationException($"Twine X4 Block blob '{latestSourceEurekaVersion.InstallerBlobName}' already exists on the target storage."); + } + } + public async Task ValidateFSEStorageUpgrade(IWebAppBase sourceApp, IWebAppBase targetApp, FSEBuildVariants build) { OnProgress(AzureUtilsStage.Validating, $"Validating {build} storage upgrade..."); |
