aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Azure
diff options
context:
space:
mode:
Diffstat (limited to 'Software/Visual_Studio/Azure')
-rw-r--r--Software/Visual_Studio/Azure/Tango.AzureUtils.UI/Controls/WebAppPropertiesControl.xaml14
-rw-r--r--Software/Visual_Studio/Azure/Tango.AzureUtils.UI/Controls/WebAppPropertiesControl.xaml.cs9
-rw-r--r--Software/Visual_Studio/Azure/Tango.AzureUtils.UI/Views/EnvironmentUpgradeView.xaml2
-rw-r--r--Software/Visual_Studio/Azure/Tango.AzureUtils/Database/DatabaseManager.cs75
-rw-r--r--Software/Visual_Studio/Azure/Tango.AzureUtils/Environment/EnvironmentManager.cs40
-rw-r--r--Software/Visual_Studio/Azure/Tango.AzureUtils/Environment/UpgradeEnvironmentConfiguration.cs2
-rw-r--r--Software/Visual_Studio/Azure/Tango.AzureUtils/Storage/StorageManager.cs63
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...");