diff options
| author | Roy Ben-Shabat <Roy@Twine-s.com> | 2018-11-14 18:13:32 +0200 |
|---|---|---|
| committer | Roy Ben-Shabat <Roy@Twine-s.com> | 2018-11-14 18:13:32 +0200 |
| commit | 5b420a654977644e7e2433a7761dc1a696babd15 (patch) | |
| tree | 0b2b7132e914aa2e18ea15c89475c7bafc541c98 /Software/Visual_Studio/Web/Tango.MachineService/Controllers | |
| parent | 281bfcfea70a1c7250e7c081de998e4ce0cc6e0e (diff) | |
| download | Tango-5b420a654977644e7e2433a7761dc1a696babd15.tar.gz Tango-5b420a654977644e7e2433a7761dc1a696babd15.zip | |
Moving PPC update, setup and machine service to Azure!!!
Diffstat (limited to 'Software/Visual_Studio/Web/Tango.MachineService/Controllers')
2 files changed, 235 insertions, 54 deletions
diff --git a/Software/Visual_Studio/Web/Tango.MachineService/Controllers/SynchronizationController.cs b/Software/Visual_Studio/Web/Tango.MachineService/Controllers/SynchronizationController.cs index 51cf6f96b..5c5a13c4e 100644 --- a/Software/Visual_Studio/Web/Tango.MachineService/Controllers/SynchronizationController.cs +++ b/Software/Visual_Studio/Web/Tango.MachineService/Controllers/SynchronizationController.cs @@ -1,4 +1,7 @@ using Google.Protobuf; +using Microsoft.Azure; +using Microsoft.Azure.Management.Sql; +using Microsoft.SqlServer.Management.Smo; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; @@ -17,7 +20,9 @@ using Tango.Core.DB; using Tango.Core.Helpers; using Tango.Core.IO; using Tango.Logging; +using Tango.MachineService.Helpers; using Tango.MachineService.Models; +using Tango.MachineService.SMO; using Tango.PMR.Stubs; using Tango.PMR.Synchronization; using Tango.Synchronization.Local; @@ -84,7 +89,7 @@ namespace Tango.MachineService.Controllers try { - using (ObservablesContext db = ObservablesContext.CreateDefault(GetLocalServerAddress())) + using (ObservablesContext db = ObservablesContextHelper.CreateContext()) { db.Configuration.LazyLoadingEnabled = false; String serial_number = request.SerialNumber; @@ -102,27 +107,28 @@ namespace Tango.MachineService.Controllers response.Version = latest_machine_version.Version; - response.FtpAddress = GetFtpAddress(); - response.FtpFilePath = latest_machine_version.FtpFilePath; - response.FtpUserName = GetFtpUserName(); - response.FtpPassword = GetFtpPassword(); + var client = StorageHelper.GetStorageBlobClient(); + var container = StorageHelper.GetTangoVersionsContainer(client); + var blob = container.GetBlockBlobReference(latest_machine_version.BlobName); + + response.BlobAddress = StorageHelper.GenerateBlobReadSignature(blob, TimeSpan.FromMinutes(60)); DbCredentials credentials = new DbCredentials(); - using (DbManager manager = DbManager.FromAddressAndName(GetDbAddress(), "Tango")) + using (SmoManager manager = new SmoManager()) { - credentials = manager.CreateRandomLoginAndUser("Tango"); + credentials = manager.CreateRandomLoginAndUser(); Task.Delay(TimeSpan.FromMinutes(10)).ContinueWith((x) => { - using (DbManager m = DbManager.FromAddressAndName(GetDbAddress(), "Tango")) + using (SmoManager m = new SmoManager()) { - m.DeleteLoginAndUser(credentials.UserName, "Tango"); + m.DeleteLoginAndUser(credentials.UserName); } }); } - response.DbAddress = GetDbAddress(); + response.DbAddress = Config.DB_ADDRESS; response.DbUserName = credentials.UserName; response.DbPassword = credentials.Password; } @@ -143,7 +149,7 @@ namespace Tango.MachineService.Controllers try { - using (ObservablesContext db = ObservablesContext.CreateDefault(GetLocalServerAddress())) + using (ObservablesContext db = ObservablesContextHelper.CreateContext()) { db.Configuration.LazyLoadingEnabled = false; String serial_number = request.SerialNumber; @@ -161,27 +167,28 @@ namespace Tango.MachineService.Controllers response.Version = latest_machine_version.Version; - response.FtpAddress = GetFtpAddress(); - response.FtpFilePath = latest_machine_version.FtpFilePath; - response.FtpUserName = GetFtpUserName(); - response.FtpPassword = GetFtpPassword(); + var client = StorageHelper.GetStorageBlobClient(); + var container = StorageHelper.GetTangoVersionsContainer(client); + var blob = container.GetBlockBlobReference(latest_machine_version.BlobName); + + response.BlobAddress = StorageHelper.GenerateBlobReadSignature(blob, TimeSpan.FromMinutes(60)); DbCredentials credentials = new DbCredentials(); - using (DbManager manager = DbManager.FromAddressAndName(GetDbAddress(), "Tango")) + using (SmoManager manager = new SmoManager()) { - credentials = manager.CreateRandomLoginAndUser("Tango"); + credentials = manager.CreateRandomLoginAndUser(); Task.Delay(TimeSpan.FromMinutes(10)).ContinueWith((x) => { - using (DbManager m = DbManager.FromAddressAndName(GetDbAddress(), "Tango")) + using (SmoManager m = new SmoManager()) { - m.DeleteLoginAndUser(credentials.UserName, "Tango"); + m.DeleteLoginAndUser(credentials.UserName); } }); } - response.DbAddress = GetDbAddress(); + response.DbAddress = Config.DB_ADDRESS; response.DbUserName = credentials.UserName; response.DbPassword = credentials.Password; } @@ -201,7 +208,7 @@ namespace Tango.MachineService.Controllers try { - using (ObservablesContext db = ObservablesContext.CreateDefault(GetLocalServerAddress())) + using (ObservablesContext db = ObservablesContextHelper.CreateContext()) { db.Configuration.LazyLoadingEnabled = false; @@ -239,7 +246,7 @@ namespace Tango.MachineService.Controllers try { - using (ObservablesContext db = ObservablesContext.CreateDefault(GetLocalServerAddress())) + using (ObservablesContext db = ObservablesContextHelper.CreateContext()) { db.Configuration.LazyLoadingEnabled = false; String serial_number = request.SerialNumber; @@ -253,20 +260,20 @@ namespace Tango.MachineService.Controllers DbCredentials credentials = new DbCredentials(); - using (DbManager manager = DbManager.FromAddressAndName(GetDbAddress(), "Tango")) + using (SmoManager manager = new SmoManager()) { - credentials = manager.CreateRandomLoginAndUser("Tango"); + credentials = manager.CreateRandomLoginAndUser(); Task.Delay(TimeSpan.FromMinutes(10)).ContinueWith((x) => { - using (DbManager m = DbManager.FromAddressAndName(GetDbAddress(), "Tango")) + using (SmoManager m = new SmoManager()) { - m.DeleteLoginAndUser(credentials.UserName, "Tango"); + m.DeleteLoginAndUser(credentials.UserName); } }); } - response.DbAddress = GetDbAddress(); + response.DbAddress = Config.DB_ADDRESS; response.DbUserName = credentials.UserName; response.DbPassword = credentials.Password; } @@ -282,7 +289,7 @@ namespace Tango.MachineService.Controllers [HttpPost] public Machine PersonTest(Person p) { - using (var db = ObservablesContext.CreateDefault(GetLocalServerAddress())) + using (var db = ObservablesContextHelper.CreateContext()) { var machine = new MachineBuilder(db) .Set(x => x.SerialNumber == "1111") @@ -304,32 +311,6 @@ namespace Tango.MachineService.Controllers { throw new HttpResponseException(Request.CreateErrorResponse(code, message)); } - - private String GetLocalServerAddress() - { - return ConfigurationManager.AppSettings["LocalServerAddress"].ToString(); - } - - private String GetDbAddress() - { - return ConfigurationManager.AppSettings["DbAddress"].ToString(); - } - - private String GetFtpAddress() - { - return ConfigurationManager.AppSettings["FtpAddress"].ToString(); - } - - private String GetFtpUserName() - { - return ConfigurationManager.AppSettings["FtpUserName"].ToString(); - } - - private String GetFtpPassword() - { - return ConfigurationManager.AppSettings["FtpPassword"].ToString(); - } - #endregion } } diff --git a/Software/Visual_Studio/Web/Tango.MachineService/Controllers/VersionUpdateController.cs b/Software/Visual_Studio/Web/Tango.MachineService/Controllers/VersionUpdateController.cs new file mode 100644 index 000000000..953399530 --- /dev/null +++ b/Software/Visual_Studio/Web/Tango.MachineService/Controllers/VersionUpdateController.cs @@ -0,0 +1,200 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Security.Authentication; +using System.Web.Http; +using Tango.BL; +using Tango.BL.Entities; +using Tango.BL.Enumerations; +using Tango.Logging; +using Tango.MachineService.Helpers; +using Tango.PPC.Common.Update; + +namespace Tango.MachineService.Controllers +{ + public class VersionUpdateController : ApiController + { + private LogManager LogManager = LogManager.Default; + + private class PendingUpload + { + public String Token { get; set; } + + public String Version { get; set; } + + public String UserGuid { get; set; } + + public String Comments { get; set; } + + public String MachineVersionGuid { get; set; } + + public String BlobName { get; set; } + } + + private static List<PendingUpload> _pendingUploads; + + static VersionUpdateController() + { + _pendingUploads = new List<PendingUpload>(); + } + + [HttpPost] + public LatestVersionResponse GetLatestVersion(LatestVersionRequest request) + { + try + { + LatestVersionResponse response = new LatestVersionResponse(); + + using (ObservablesContext db = ObservablesContextHelper.CreateContext()) + { + var versions = db.TangoVersions.Where(x => x.MachineVersionGuid == request.MachineVersionGuid).ToList(); + + if (versions.Count > 0) + { + response.Version = db.TangoVersions.Where(x => x.MachineVersionGuid == request.MachineVersionGuid).ToList().OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault().Version; + } + else + { + return new LatestVersionResponse() + { + Version = "0.0.0.0" + }; + } + } + + return response; + } + catch (Exception ex) + { + throw CreateError(ex, HttpStatusCode.InternalServerError); + } + } + + [HttpPost] + public UploadVersionResponse UploadVersion(UploadVersionRequest request) + { + try + { + UploadVersionResponse response = new UploadVersionResponse(); + + using (ObservablesContext db = ObservablesContextHelper.CreateContext()) + { + //Load relation first... + db.Roles.ToList(); + db.Permissions.ToList(); + db.UsersRoles.ToList(); + db.RolesPermissions.ToList(); + + var user = db.Users.SingleOrDefault(x => x.Email.ToLower() == request.Email.ToLower() && x.Password == request.Password); + + if (user != null && user.HasPermission(Permissions.PublishMachineStudioVersion)) + { + var versions = db.TangoVersions.ToList().Where(x => x.MachineVersionGuid == request.MachineVersionGuid).OrderByDescending(x => Version.Parse(x.Version)).ToList(); + + TangoVersion latestVersion = new TangoVersion(); + latestVersion.Version = "0.0.0.0"; + + if (versions.Count > 0) + { + latestVersion = versions.FirstOrDefault(); + } + + Version currentVersion = Version.Parse(request.Version); + + if (currentVersion > Version.Parse(latestVersion.Version)) + { + String newVersionFileName = "Tango Version" + " " + currentVersion.ToString() + ".zip"; + + var client = StorageHelper.GetStorageBlobClient(); + var container = StorageHelper.GetTangoVersionsContainer(client); + var blob = StorageHelper.CreateEmptyBlob(container, newVersionFileName); + + response.Token = Guid.NewGuid().ToString(); + response.BlobAddress = StorageHelper.GenerateBlobWriteSignature(blob, TimeSpan.FromMinutes(30)); + + _pendingUploads.Add(new PendingUpload() + { + UserGuid = user.Guid, + Comments = request.Comments, + Token = response.Token, + Version = request.Version, + BlobName = blob.Name, + MachineVersionGuid = request.MachineVersionGuid, + }); + } + else + { + throw CreateError(new ArgumentException("New version must be greater than latest version."), HttpStatusCode.BadRequest); + } + } + else + { + throw CreateError(new AuthenticationException("Invalid user credentials."), HttpStatusCode.Unauthorized); + } + } + + return response; + } + catch (HttpResponseException ex) + { + throw ex; + } + catch (Exception ex) + { + LogManager.Log(ex); + throw CreateError(ex, HttpStatusCode.InternalServerError); + } + } + + [HttpPost] + public UploadCompletedResponse NotifyUploadCompleted(UploadCompletedRequest request) + { + try + { + PendingUpload upload = _pendingUploads.FirstOrDefault(x => x.Token == request.Token); + + if (upload != null) + { + _pendingUploads.RemoveAll(x => x.Token == upload.Token); + + using (ObservablesContext db = ObservablesContextHelper.CreateContext()) + { + db.TangoVersions.Add(new TangoVersion() + { + Comments = upload.Comments, + BlobName = upload.BlobName, + UserGuid = upload.UserGuid, + Version = upload.Version, + MachineVersionGuid = upload.MachineVersionGuid + }); + + db.SaveChanges(); + } + + return new UploadCompletedResponse(); + } + else + { + throw CreateError(new AuthenticationException("Invalid Token."), HttpStatusCode.Unauthorized); + } + } + catch (HttpRequestException ex) + { + throw ex; + } + catch (Exception ex) + { + LogManager.Log(ex); + throw CreateError(ex, HttpStatusCode.InternalServerError); + } + } + + private Exception CreateError(Exception ex, HttpStatusCode code) + { + LogManager.Log(ex); + return new HttpResponseException(Request.CreateErrorResponse(code, ex.Message)); + } + } +} |
