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));
        }
Example #2
0
        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);
                }
            });
        }
Example #3
0
        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));
            }
        }
Example #5
0
        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));
        }
Example #6
0
        // 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()));

        }
Example #7
0
        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);
        }
Example #8
0
        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);
            });

        }
Example #9
0
        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));

        }
Example #10
0
        // 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()));
        }
Example #11
0
 public ResourceActivity AddResourceActivity(ResourceActivity activity)
 {
     activityRepository.Add(activity);
     SaveChanges();
     return(activity);
 }