private void Populate(VMRequest dataRequest) { this.IsValid = false; try { this.Id = dataRequest.Id; if (!string.IsNullOrEmpty(dataRequest.MDTConfigurationSettings)) { if (this.MdtConfiguration == null) { this.MdtConfiguration = new XmlDataDocument(); } this.MdtConfiguration.LoadXml(dataRequest.MDTConfigurationSettings); } if (!string.IsNullOrEmpty(dataRequest.TargetConfiguration)) { if (this.DeploymentConfiguration == null) { this.DeploymentConfiguration = new XmlDataDocument(); } this.DeploymentConfiguration.LoadXml(dataRequest.TargetConfiguration); } this.RequestedBy = dataRequest.CreatedBy; if (dataRequest.CreatedOn != null) { this.RequestedOn = (DateTime)dataRequest.CreatedOn; } if (dataRequest.VMTemplate != null) { this.TemplateId = dataRequest.VMTemplate.Id.ToString(); } if (dataRequest.RequestStatus != null) { this.Status = (RequestStatus)dataRequest.RequestStatus; } this.ProcessLog = dataRequest.ProcessLog; this.IsValid = true; } catch (Exception ex) { ExceptionManager.HandleException(ex); } }
public ActionResult Edit(VMRequest vmrequest) { if (ModelState.IsValid) { db.Entry(vmrequest).State = EntityState.Modified; db.SaveChanges(); return(RedirectToAction("Index")); } ViewBag.RequestStatus = new SelectList(db.RequestStatus, "Id", "Name", vmrequest.RequestStatus); ViewBag.TemplateId = new SelectList(db.VMTemplates, "Id", "UniqueName", vmrequest.TemplateId); return(View(vmrequest)); }
public ActionResult Delete(long id = 0) { VMRequest vmrequest = db.VMRequests.Find(id); if (vmrequest == null) { return(HttpNotFound()); } return(View(vmrequest)); }
public ActionResult Edit(long id = 0) { VMRequest vmrequest = db.VMRequests.Find(id); if (vmrequest == null) { return(HttpNotFound()); } ViewBag.RequestStatus = new SelectList(db.RequestStatus, "Id", "Name", vmrequest.RequestStatus); ViewBag.TemplateId = new SelectList(db.VMTemplates, "Id", "UniqueName", vmrequest.TemplateId); return(View(vmrequest)); }
private HttpResponseMessage Authorise(VMRequest requestObj, RoleDTO methodRole) { if (isRequestFormatValid(requestObj)) { if (new SecurityFramework.Authorization().isAuthorizedAction(requestObj.SessionID, methodRole)) { throw new InvalidSessionException(); } } return(new HttpResponseMessage()); }
public ActionResult Details(long id = 0) { if (IsRegistered()) { VMRequest vmrequest = db.VMRequests.Find(id); if (vmrequest == null) { return(HttpNotFound()); } if (vmrequest.CreatedBy != ViewBag.EMail) { return(HttpNotFound()); } return(View(vmrequest)); } else { return(RedirectToAction("Register", "Home")); } }
public static void CreateVirtualMachine(VMRequest vmToProcess, VMFSupportContext db) { #region Start VM Creation process #region Lauch conditions // Check for launch conditions Console.WriteLine("Checking for launch conditions."); // Call the lauunch checker module bool readyToLounch = false; ValidateLaunch launchValidator = new ValidateLaunch(); readyToLounch = launchValidator.VerifyLaunchConditions(); Console.WriteLine("Completed with the result [{0}]", readyToLounch.ToString()); // dump the screen info Console.WriteLine("Checking lounch conditions: {0}", "<TBD> Lounch conditions status"); #endregion if (readyToLounch) { Console.WriteLine(String.Format("Reserving VM request : {0} ({1})", vmToProcess.MachineName, vmToProcess.Id)); vmToProcess.RequestStatus = (int)RequestStatus.Queued; vmToProcess.ProcessLog = ""; var valErrors = db.GetValidationErrors(); if (valErrors.Count() > 0) { foreach (var valErr in valErrors) { foreach (var valerrCol in valErr.ValidationErrors) { Console.WriteLine(String.Format("Validation errors on update: {0} - {1}", valerrCol.PropertyName, valerrCol.ErrorMessage)); } } } else { db.SaveChanges(); } Console.WriteLine(String.Format("Calling the StartProcess for VM : {0} ({1})", vmToProcess.MachineName, vmToProcess.Id)); vmToProcess.RequestStatus = (int)RequestStatus.InProgress; vmToProcess.ProcessLog = "Copying and importing base VM."; db.SaveChanges(); string baseVmSourcePath = DefaultConfigurationStore.Current.BaseVmSourcePath; string destinationFolder = vmToProcess.DestinationFolder; string baseVmConfigFile = DefaultConfigurationStore.Current.BaseVmConfigFilePath.Replace(baseVmSourcePath, destinationFolder); string newVmName = vmToProcess.DisplayName; string baseVmName = DefaultConfigurationStore.Current.BaseVmName; HyperVHelper.CopyAndImportVM(baseVmName, baseVmSourcePath, destinationFolder, baseVmConfigFile, newVmName); vmToProcess.ProcessLog = "Preloading boot data."; db.SaveChanges(); string driveLetter = DefaultConfigurationStore.Current.TemporaryDriveLetter; string dismPath = DefaultConfigurationStore.Current.DismPath; string vmId = vmToProcess.Id.ToString(); string vmStatusSvcUrl = DefaultConfigurationStore.Current.VmfStatusServiceUrl; string cfgFileName = DefaultConfigurationStore.Current.VmfConfigFile; HyperVHelper.PreLoadVHDBootData(driveLetter, dismPath, vmToProcess.DisplayName, vmId, vmStatusSvcUrl, cfgFileName); vmToProcess.ProcessLog = "Starting VM."; db.SaveChanges(); HyperVHelper.StartVM(vmToProcess.DisplayName); Console.WriteLine(String.Format("Transferred control for MDT for VM: {0} ({1})", vmToProcess.MachineName, vmToProcess.Id)); } else { Console.WriteLine("No resources available at the moment. Skipping cycle"); Thread.Sleep(DefaultConfigurationStore.Current.WaitTimeBetweenCicles * 1000); } #endregion }
public bool isRequestFormatValid(VMRequest vmRequest) { if (vmRequest == null) { throw new InvalidRequestFormatException("Request is null"); } if (vmRequest.SessionID != null) { if (vmRequest.SessionID != null && (vmRequest.ID != null || vmRequest.DecisionModel != null)) { return(true); } throw new InvalidRequestFormatException(); } else { throw new InvalidSessionException(); } }
public static void DeployVirtualMachineForDownload(VMRequest vmToProcess, VMFSupportContext db) { Debug.WriteLine("VM [{1}]({0}) Shutting down.", vmToProcess.Id, vmToProcess.DisplayName); if (HyperVHelper.StopVM(vmToProcess.DisplayName)) { Debug.WriteLine("VM [{1}]({0}) Compressing", vmToProcess.Id, vmToProcess.DisplayName); vmToProcess.RequestStatus = (int)RequestStatus.Packaging; vmToProcess.ProcessLog = "Compressing VHD file."; db.SaveChanges(); VMFinalization finalization = new VMFinalization(); Guid internalId = Guid.NewGuid(); string dropFolder = string.Format(DefaultConfigurationStore.Current.VhdSplitDropLocationTemplate, internalId); if (finalization.FinalizeVM(vmToProcess.DisplayName, dropFolder, DefaultConfigurationStore.Current.VhdSplitBlockSize, null, null)) { Debug.WriteLine("VM [{1}]({0}) Updating request information", vmToProcess.Id, vmToProcess.DisplayName); vmToProcess.RequestStatus = (int)RequestStatus.Deploying; vmToProcess.ProcessLog = "Deploying result."; db.SaveChanges(); vmToProcess.VMOutputs.Clear(); DirectoryInfo dirInfo = new DirectoryInfo(dropFolder); foreach (FileInfo file in dirInfo.GetFiles()) { VMOutput vmOut = new VMOutput(); vmOut.FileName = file.Name; vmOut.DownloadUrl = string.Concat(DefaultConfigurationStore.Current.BaseVmDownloadUrl, "/", internalId, "/", file.Name); vmOut.VMRequest = vmToProcess; vmOut.VMRequestId = vmToProcess.Id; vmOut.VMTemplate = vmToProcess.VMTemplate; vmOut.VMTemplateId = vmToProcess.VMTemplate.Id; vmOut.CreatedOn = file.CreationTime.ToUniversalTime(); vmOut.LastModified = file.LastWriteTime; vmOut.Log += "File added to the VM Output file list."; vmToProcess.VMOutputs.Add(vmOut); } Debug.WriteLine("VM [{1}]({0}) Sending email to the user", vmToProcess.Id, vmToProcess.DisplayName); try { EmailHelper.SendConfirmationEmail(vmToProcess.DisplayName, vmToProcess.CreatedBy, vmToProcess.VMOutputs); } catch (Exception ex) { Console.WriteLine("Processing Error (unable to send email alert) \n {0} \n {1}\n\n", ex.Message, ex.StackTrace); } vmToProcess.RequestStatus = (int)RequestStatus.ReadyForPickup; vmToProcess.ProcessLog = "Done."; var valErrors = db.GetValidationErrors(); if (valErrors.Count() > 0) { foreach (var valErr in valErrors) { foreach (var valerrCol in valErr.ValidationErrors) { Console.WriteLine("Validation errors on update: {0} - {1}", valerrCol.PropertyName, valerrCol.ErrorMessage); } } } else { db.SaveChanges(); } if (HyperVHelper.RemoveVM(vmToProcess.DisplayName)) { try { DirectoryInfo dir = new DirectoryInfo(vmToProcess.DestinationFolder); dir.Delete(true); } catch (Exception ex) { Console.WriteLine("Processing Error (unable to delete VM info) \n {0} \n {1}\n\npath: ", ex.Message, ex.StackTrace, vmToProcess.DestinationFolder); } } else { Console.WriteLine("Processing Error (unable to remove VM from Hyper-V)"); } } } else { Console.WriteLine("Unable to stop machine: {0}", vmToProcess.DisplayName); } }
public ActionResult Create(VMRequest vmrequest) { bool redirectToVMOutputList = false; if (ModelState.IsValid) { string vmUrl = string.Empty; StringBuilder message = new StringBuilder(); try { vmrequest.RequestStatus = (int)VMFactory.Api.Business.Entity.RequestStatus.None; vmrequest.LastUpdated = DateTime.UtcNow; vmrequest.CreatedOn = vmrequest.LastUpdated; db.VMRequests.Add(vmrequest); db.SaveChanges(); var existingVms = db.VMOutputs.Where(c => c.VMRequest.TemplateId == vmrequest.TemplateId && c.VMRequest.CreatedBy == vmrequest.CreatedBy).OrderByDescending(c => c.VMRequest.CreatedBy); if (existingVms.Count() > 0) { StringBuilder vmList = new StringBuilder("Here is a list of prebuilt VMs for the selected template:"); foreach (VMOutput v in existingVms) { vmList.AppendFormat("<tr><td>{0}</td><td>{1}</td><td>{2}</td><td><a href=\"{3}\" target=\"_blank\">Download</a></td></tr>\n", v.VMTemplate.DisplayName, v.FileName, v.LastModified, v.DownloadUrl); } message.Append(vmList.ToString()); redirectToVMOutputList = true; } SendConfirmationEmail(vmrequest.CreatedBy, message.ToString()); if (redirectToVMOutputList) { return(RedirectToAction("ListAvailable", "VMOutput", new { templateId = vmrequest.TemplateId })); } else { return(View("Success")); } } catch (DbEntityValidationException e) { Api.Core.Exceptions.ExceptionManager.HandleException(e); return(View("Error"));; } } ViewBag.RequestStatus = new SelectList(db.RequestStatus, "Id", "Name", vmrequest.RequestStatus); ViewBag.TemplateId = new SelectList(db.VMTemplates, "Id", "UniqueName", vmrequest.TemplateId); return(View(vmrequest)); }
public HttpResponseMessage RegisterNew(VMRequest requestObj, RoleDTO methodRole) { throw new NotImplementedException(); }
public HttpResponseMessage GetSingle(VMRequest requestObj, RoleDTO methodRole) { throw new NotImplementedException(); }
private HttpResponseMessage Condomize(Func <List <BaseModel> > nonProtectedAction, RoleDTO MethodRole, VMRequest RequestObj = null) { try { Authorise(RequestObj, MethodRole); return(Request.CreateResponse(HttpStatusCode.OK, nonProtectedAction())); } catch (InvalidSessionException ex) { return(Request.CreateErrorResponse(HttpStatusCode.Forbidden, "Invalid Session information. Please log in to utilise this functionality")); } catch (InvalidRequestFormatException ex) { return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, "The server recieved a corrupt or incomplete Request. Please try again")); } catch (Exception ex) { return(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "An internal error has occured. Please contact the system admin for advice")); } }
public HttpResponseMessage GetSingle(VMRequest requestObj) { RoleDTO role = new RoleDTO(1, "MyGet"); return(base.GetAll(requestObj, role)); }
static void Main(string[] args) { Console.WriteLine(string.Format("{0}: VM Factory Orchestration Simulator", DateTime.UtcNow)); Console.WriteLine(string.Format("{0}: Hit CRT+C to exit.", DateTime.UtcNow)); bool isCriticalException = false; while (true) { using (VMFSupportContext db = new VMFSupportContext()) { try { Console.WriteLine(string.Format("\n{0}: Checking request queue.", DateTime.UtcNow)); var queuedVms = db.VMRequests.Where(c => (c.RequestStatus == null || c.RequestStatus == (int)RequestStatus.None || c.RequestStatus == (int)RequestStatus.InstallationCompleted)); if (queuedVms.Count() > 0) { Console.WriteLine(string.Format("{1}: Found {0} VMs queued.", queuedVms.Count(), DateTime.UtcNow)); VMRequest vmToProcess = queuedVms.First(); if (vmToProcess.RequestStatus == (int)RequestStatus.None) { CreateVM.CreateVirtualMachine(vmToProcess, db); } if (vmToProcess.RequestStatus == (int)RequestStatus.InstallationCompleted) { Console.WriteLine(string.Format("{2}: VM [{1}]({0}) ready for finalization", vmToProcess.Id, vmToProcess.DisplayName, DateTime.UtcNow)); DeployVM.DeployVirtualMachineForDownload(vmToProcess, db); } } else { Console.WriteLine(string.Format("{0}: No VMs on the queue!", DateTime.UtcNow)); Thread.Sleep(DefaultConfigurationStore.Current.WaitTimeBetweenCicles * 1000); } } catch (InvalidOperationException ioe) { Console.WriteLine(string.Format("{0}: Failed! Exception detail bellow.", DateTime.UtcNow)); Console.WriteLine(string.Format("{2}: Processing Error \n {0} \n {1}", ioe.Message, ioe.StackTrace, DateTime.UtcNow)); isCriticalException = true; } catch (Exception ex) { Console.WriteLine(string.Format("{2}: Processing Error \n {0} \n {1}", ex.Message, ex.StackTrace, DateTime.UtcNow)); } finally { } if (isCriticalException) { Console.WriteLine(string.Format("{0}: Critical error found. Operation stopped. Press <RETURN> to exit.", DateTime.UtcNow)); if (DefaultConfigurationStore.Current.RequestUserConfirmation) { Console.ReadLine(); } return; } Thread.Sleep(10000); } } }
/// <summary> /// Processes the VM Requests. /// </summary> private void ProcessRequest() { VMRequest.Status = RequestStatus.InProgress; VMRequest.Save(); try { } catch { VMRequest.Status = RequestStatus.Failed; VMRequest.Save(); } }
public ActionResult DeleteConfirmed(long id) { VMRequest vmrequest = db.VMRequests.Find(id); db.VMRequests.Remove(vmrequest); db.SaveChanges(); return(RedirectToAction("Index")); }
/// <summary> /// This constructor translates the data entity into the business entity /// </summary> /// <param name="dataRequest"></param> public VirtualMachineRequest(VMRequest dataRequest) { Populate(dataRequest); }
public ActionResult Create() { ViewBag.RequestStatus = new SelectList(db.RequestStatus, "Id", "Name"); ViewBag.TemplateId = new SelectList(db.VMTemplates, "Id", "UniqueName"); VMRequest request = new VMRequest(); if (IsRegistered()) { request.CreatedBy = ViewBag.Email; return(View(request)); } else { return(RedirectToAction("Register", "Home")); } }
/// <summary> /// Saves this instance. /// The only properties saved/updated will be the: request status and last udpdated date. /// </summary> /// <returns></returns> public bool Save() { bool result = false; try { using (var db = new VMFSupportContext()) { VMRequest request = (from v in db.VMRequests where v.Id == this.Id select v).First(); if (request == null) { throw new TechnicalException("Virtual machine request not found!"); } if (request.RequestStatus != (int)this.Status) { request.RequestStatus = (int)this.Status; request.LastUpdated = DateTime.UtcNow; } if (request.ProcessLog != this.ProcessLog) { request.ProcessLog = this.ProcessLog; request.LastUpdated = DateTime.UtcNow; } db.SaveChanges(); result = true; } } catch (Exception e) { ExceptionManager.HandleException(e); throw; } return(result); }
protected HttpResponseMessage GetAll(VMRequest requestObj, RoleDTO methodRole) { return(Condomize(Controller.GetAll, methodRole, requestObj)); }