aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Azure/Tango.AzureUtils
diff options
context:
space:
mode:
authorRoy Ben Shabat <Roy.mail.net@gmail.com>2020-07-28 15:27:05 +0300
committerRoy Ben Shabat <Roy.mail.net@gmail.com>2020-07-28 15:27:05 +0300
commit7c7aba43ab895d02e0209861550fed3bc12f3904 (patch)
tree11287241a4cc80baa871712240ab82487c563f9f /Software/Visual_Studio/Azure/Tango.AzureUtils
parent55b795f940282378784f0175803fcba62aecc816 (diff)
downloadTango-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/Tango.AzureUtils')
-rw-r--r--Software/Visual_Studio/Azure/Tango.AzureUtils/Database/DatabaseManager.cs77
-rw-r--r--Software/Visual_Studio/Azure/Tango.AzureUtils/Environment/EnvironmentManager.cs40
-rw-r--r--Software/Visual_Studio/Azure/Tango.AzureUtils/Environment/EnvironmentSettings.cs2
-rw-r--r--Software/Visual_Studio/Azure/Tango.AzureUtils/Environment/UpgradeEnvironmentConfiguration.cs2
-rw-r--r--Software/Visual_Studio/Azure/Tango.AzureUtils/MachineServiceSettings.cs1
-rw-r--r--Software/Visual_Studio/Azure/Tango.AzureUtils/Storage/StorageManager.cs65
6 files changed, 183 insertions, 4 deletions
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...");