public IHttpActionResult Post(ResourceActivityViewModel activity) { var entity = new ResourceActivity(); Mapper.Map(activity, entity); activityService.AddResourceActivity(entity); activity.Id = entity.Id; return(Created(Url.Link("DefaultApi", new { controller = "ResourceActivities", id = activity.Id }), activity)); }
static async Task ActionStart(ResourceActivity activity) { Console.WriteLine(string.Format("Starting VM [{0}]", activity.MachineName)); await activity.Provisioning.StartStopVirtualMachineAsync(activity.MachineName, activity.ServiceName, VirtualMachineAction.Start); // start command completed, need to poll for updated state Task <bool> monitorTask = Task.Run(() => activity.Provisioning.WaitForStatus(activity.MachineName, activity.ServiceName, "ReadyRole")); // when the monitor completes, update resource status Task continuation = monitorTask.ContinueWith(async(antecedent) => { if (antecedent.Result) // if previous completed without timeout { await _volatileStorageController.UpdateResourceState(activity.Resource.Id, ResourceState.Running); } }); }
static async Task ActionCreate(ResourceActivity activity) { var r = new Random(); //Need to find a way to assign Usename and Pwd string username = "******"; string password = "******"; string storageAccountName = activity.ServiceName; int rdpPort = r.Next(3000, 4000); //activity.Resource.State = ResourceState.Starting; await activity.ResourceController.UpdateResource(activity.Resource); var isCloudServiceAlreadyCreated = await activity.Provisioning.IsCloudServiceAlreadyCreated(activity.ServiceName); if (!isCloudServiceAlreadyCreated) { Console.WriteLine(string.Format("Creating Cloud Services [{0}]", activity.ServiceName)); string location = activity.ResourceController.GetServiceLocation(); var x = activity.Provisioning.CreateCloudService(activity.ServiceName, location); x.Wait(); Console.WriteLine(string.Format("Creating Storage for Cloud Service [{0}]", activity.ServiceName)); await activity.Provisioning.CreateStorageAccount(location, storageAccountName); } //TODO Need to delete disk in case is already there Console.WriteLine(string.Format("Creating Virtual Machine [{0}]", activity.ServiceName)); var z = await activity.Provisioning.CreateVirtualMachine(activity.MachineName, activity.ServiceName, storageAccountName, username, password, "Visual-Studio-2015-Ultimate", VirtualMachineRoleSize.Small, rdpPort, isCloudServiceAlreadyCreated); activity.Resource.CloudServiceName = activity.ServiceName; activity.Resource.SubscriptionId = activity.Subscription.Id; activity.Resource.UserName = username; //docDbResource.UserPassword = password; activity.Resource.RdpPort = rdpPort.ToString(); var vault = Provider.GetService <IKeyRepository>(); await vault.UpsertSecret(activity.Resource.Id, "password", password); await activity.ResourceController.UpdateResource(activity.Resource); }
public ApiResponse Post(string appName, [FromBody] ResourceActivity activity) { try { activity.AppName = appName; activity.OccurenceTime = DateTime.UtcNow; dbContext.Add(activity); dbContext.SaveChanges(); return(new ApiSuccessResponse()); } catch (Exception ex) { return(new ApiErrorResponse(ex.Message)); } }
static async Task ActionDelete(ResourceActivity activity) { //TODO Temporary try { await activity.Provisioning.StartStopVirtualMachineAsync(activity.MachineName, activity.ServiceName, VirtualMachineAction.Stop); } catch { Console.WriteLine(string.Format("Stop VM (to delete) [{0}] failed - machine might be stopping or stopped", activity.MachineName)); } Console.WriteLine(string.Format("about to delete VM [{0}]", activity.MachineName)); await activity.ResourceController.DeleteResource(activity.Resource); Console.WriteLine(string.Format("Deleted VM [{0}]", activity.MachineName)); }
// This function will get triggered/executed when a new message is written // on an Azure Queue called queue. public async static void ProcessQueueMessage([QueueTrigger("processorqueue")] QueueMessage message, TextWriter log) { Console.WriteLine(string.Format("Process Q Message: Resource[{0}] Action[{1}] RequestId[{2}]", message.ResourceId, message.Action, message.OperationGuid.ToString())); Console.WriteLine(string.Format("Start - Current Time: [{0}]", DateTime.UtcNow.ToLongTimeString())); // TODO - shouldn't be depending on ResourceController here var resourceController = Provider.GetService<IResourceController>(); if (_volatileStorageController == null) _volatileStorageController = Provider.GetService<IVolatileStorageController>(); var activity = new ResourceActivity(resourceController); if (!await activity.TryInitializeAsync(message.ResourceId)) { Console.WriteLine("Resource not found"); return; } if (activity.IsCreating) message.Action = ResourceAction.Create; // sometimes actions will throw exceptions, handle them gracefully: // example: // ConflictError: Another reboot or reimage operation is already in progress on role instance brent1. try { switch (message.Action) { case ResourceAction.Delete: await ActionDelete(activity); break; case ResourceAction.Stop: await ActionStop(activity); break; case ResourceAction.Start: await ActionStart(activity); break; case ResourceAction.Create: await ActionCreate(activity); break; default: Console.WriteLine("Unhandled action: " + message.Action); return; } /* the following is logging code. it will need to be uncommented after the previous code is stable enough */ var groupId = string.Empty; if (activity.Resource != null && activity.Resource.ResourceGroup != null) groupId = activity.Resource.ResourceGroup.Id; await _volatileStorageController.CreateActivityLog(new ActivityLog() { ResourceId = message.ResourceId, GroupId = groupId, RequestId = message.OperationGuid.ToString(), Action = message.Action.ToString(), UserId = "ProvisioningConsole" }); //Console.WriteLine(string.Format("My orginal message was: {0}", message)); } catch (Exception e) { Console.WriteLine(string.Format("Process Q Message FAILED!: Resource[{0}] Action[{1}] RequestId[{2}] Error[{3}]", message.ResourceId, message.Action, message.OperationGuid.ToString(), e.Message)); } Console.WriteLine(string.Format("End - Current Time: [{0}]", DateTime.UtcNow.ToLongTimeString())); }
static async Task ActionCreate(ResourceActivity activity) { var r = new Random(); //Need to find a way to assign Usename and Pwd string username = "******"; string password = "******"; string storageAccountName = activity.ServiceName; int rdpPort = r.Next(3000, 4000); //activity.Resource.State = ResourceState.Starting; await activity.ResourceController.UpdateResource(activity.Resource); var isCloudServiceAlreadyCreated = await activity.Provisioning.IsCloudServiceAlreadyCreated(activity.ServiceName); if (!isCloudServiceAlreadyCreated) { Console.WriteLine(string.Format("Creating Cloud Services [{0}]", activity.ServiceName)); string location = activity.ResourceController.GetServiceLocation(); var x = activity.Provisioning.CreateCloudService(activity.ServiceName, location); x.Wait(); Console.WriteLine(string.Format("Creating Storage for Cloud Service [{0}]", activity.ServiceName)); await activity.Provisioning.CreateStorageAccount(location, storageAccountName); } //TODO Need to delete disk in case is already there Console.WriteLine(string.Format("Creating Virtual Machine [{0}]", activity.ServiceName)); var z = await activity.Provisioning.CreateVirtualMachine(activity.MachineName, activity.ServiceName, storageAccountName, username, password, "Visual-Studio-2015-Ultimate", VirtualMachineRoleSize.Small, rdpPort, isCloudServiceAlreadyCreated); activity.Resource.CloudServiceName = activity.ServiceName; activity.Resource.SubscriptionId = activity.Subscription.Id; activity.Resource.UserName = username; //docDbResource.UserPassword = password; activity.Resource.RdpPort = rdpPort.ToString(); var vault = Provider.GetService<IKeyRepository>(); await vault.UpsertSecret(activity.Resource.Id, "password", password); await activity.ResourceController.UpdateResource(activity.Resource); }
static async Task ActionStart(ResourceActivity activity) { Console.WriteLine(string.Format("Starting VM [{0}]", activity.MachineName)); await activity.Provisioning.StartStopVirtualMachineAsync(activity.MachineName, activity.ServiceName, VirtualMachineAction.Start); // start command completed, need to poll for updated state Task<bool> monitorTask = Task.Run(() => activity.Provisioning.WaitForStatus(activity.MachineName, activity.ServiceName, "ReadyRole")); // when the monitor completes, update resource status Task continuation = monitorTask.ContinueWith(async (antecedent) => { if (antecedent.Result) // if previous completed without timeout await _volatileStorageController.UpdateResourceState(activity.Resource.Id, ResourceState.Running); }); }
// This function will get triggered/executed when a new message is written // on an Azure Queue called queue. public async static void ProcessQueueMessage([QueueTrigger("processorqueue")] QueueMessage message, TextWriter log) { Console.WriteLine(string.Format("Process Q Message: Resource[{0}] Action[{1}] RequestId[{2}]", message.ResourceId, message.Action, message.OperationGuid.ToString())); Console.WriteLine(string.Format("Start - Current Time: [{0}]", DateTime.UtcNow.ToLongTimeString())); // TODO - shouldn't be depending on ResourceController here var resourceController = Provider.GetService <IResourceController>(); if (_volatileStorageController == null) { _volatileStorageController = Provider.GetService <IVolatileStorageController>(); } var activity = new ResourceActivity(resourceController); if (!await activity.TryInitializeAsync(message.ResourceId)) { Console.WriteLine("Resource not found"); return; } if (activity.IsCreating) { message.Action = ResourceAction.Create; } // sometimes actions will throw exceptions, handle them gracefully: // example: // ConflictError: Another reboot or reimage operation is already in progress on role instance brent1. try { switch (message.Action) { case ResourceAction.Delete: await ActionDelete(activity); break; case ResourceAction.Stop: await ActionStop(activity); break; case ResourceAction.Start: await ActionStart(activity); break; case ResourceAction.Create: await ActionCreate(activity); break; default: Console.WriteLine("Unhandled action: " + message.Action); return; } /* * * the following is logging code. it will need to * be uncommented after the previous code is stable enough * */ var groupId = string.Empty; if (activity.Resource != null && activity.Resource.ResourceGroup != null) { groupId = activity.Resource.ResourceGroup.Id; } await _volatileStorageController.CreateActivityLog(new ActivityLog() { ResourceId = message.ResourceId, GroupId = groupId, RequestId = message.OperationGuid.ToString(), Action = message.Action.ToString(), UserId = "ProvisioningConsole" }); //Console.WriteLine(string.Format("My orginal message was: {0}", message)); } catch (Exception e) { Console.WriteLine(string.Format("Process Q Message FAILED!: Resource[{0}] Action[{1}] RequestId[{2}] Error[{3}]", message.ResourceId, message.Action, message.OperationGuid.ToString(), e.Message)); } Console.WriteLine(string.Format("End - Current Time: [{0}]", DateTime.UtcNow.ToLongTimeString())); }
public ResourceActivity AddResourceActivity(ResourceActivity activity) { activityRepository.Add(activity); SaveChanges(); return(activity); }