Example #1
0
        public List<Models.AssignedVmModel> GenerateVMsForUsers(string serviceNameBase, VMConfigModel vmConfig, List<Models.VMUserModel> users)
        {
            _logger.Info("Entering GenerateVMsForUsers stub. [serviceNameBase:{0}; sourceVhdName:{1}; users:{2}]",
                serviceNameBase, vmConfig.ImageName, users.Count);

            List<AssignedVmModel> result = new List<AssignedVmModel>();
            foreach (VMUserModel user in users)
            {
                AssignedVmModel assignedVm = new AssignedVmModel
                {
                    UserId = user.IdentityId,
                    UserName = user.Username,
                    Password = user.Password,
                    VmName = "VM_" + user.Username,
                    VmRdpPort = 567
                };
                result.Add(assignedVm);
            }
            Thread.Sleep(1000);

            _logger.Info("Exiting GenerateVMsForUsers stub. [serviceNameBase:{0}; sourceVhdName:{1}; users:{2}]",
                serviceNameBase, vmConfig.ImageName, users.Count);
            return result;
        }
Example #2
0
        private void GenerateVM(string serviceName, VMConfigModel vmConfig, string virtualMachineName, 
			int rdpPort, VMUserModel user, bool firstVMInDeployment)
        {
            var windowsConfigurationSet = new ConfigurationSet
            {
                //TODO: depends on the OS type??
                ConfigurationSetType = ConfigurationSetTypes.WindowsProvisioningConfiguration,
                AdminPassword = user.Password,
                AdminUserName = user.Username,
                ComputerName = virtualMachineName,
                HostName = string.Format("{0}.cloudapp.net", serviceName),

            };

            var endpoints = new ConfigurationSet
            {
                ConfigurationSetType = "NetworkConfiguration",
                InputEndpoints = new List<InputEndpoint>
                {
                    new InputEndpoint
                    {
                        Name = "RDP",
                        Port = rdpPort,
                        Protocol = "TCP",
                        LocalPort = InternalRdpPort
                    }
                }
            };

            string newVhdName = string.Format("{0}.vhd", virtualMachineName);

            Uri mediaUri = new Uri(GetVHDStorageUrl(vmConfig.Region) + newVhdName);

            var vhd = new OSVirtualHardDisk
            {
                SourceImageName = vmConfig.ImageName,
                HostCaching = VirtualHardDiskHostCaching.ReadWrite,
                MediaLink = mediaUri,

            };

            OperationStatusResponse deploymentResult;

            if (firstVMInDeployment)
            {
                deploymentResult = CreateDeployment(serviceName, virtualMachineName, windowsConfigurationSet, endpoints, vhd, vmConfig);

            }
            else
            {
                deploymentResult = AddVm(serviceName, virtualMachineName, windowsConfigurationSet, endpoints, vhd, vmConfig);
            }
            //TODO: handle the deploymentResult
        }
Example #3
0
        private OperationStatusResponse CreateDeployment(string serviceName, string virtualMachineName, ConfigurationSet windowsConfigurationSet, ConfigurationSet endpoints, OSVirtualHardDisk vhd, VMConfigModel vmConfig)
        {
            OperationStatusResponse deploymentResult;
            var role = new Role
            {
                RoleName = virtualMachineName,
                RoleSize = MapToAzureVmSize(vmConfig.VmSize),
                RoleType = VirtualMachineRoleType.PersistentVMRole.ToString(),
                OSVirtualHardDisk = vhd,
                ProvisionGuestAgent = true,
                ConfigurationSets = new List<ConfigurationSet>
                {
                    windowsConfigurationSet,
                    endpoints,
                }
            };

            if (vmConfig.InsertCaptureScript)
            {
                role.ResourceExtensionReferences =
                    CreateCaptureScript(vmConfig.CaptureKey, vmConfig.ChocoPackageList);
            }

            var createDeploymentParameters = new VirtualMachineCreateDeploymentParameters
            {
                Name = serviceName,
                Label = serviceName,
                DeploymentSlot = DeploymentSlot.Production,
                Roles = new List<Role> { role },

            };

            deploymentResult = _compute.VirtualMachines.CreateDeployment(
                serviceName,
                createDeploymentParameters);
            return deploymentResult;
        }
Example #4
0
        private OperationStatusResponse AddVm(string serviceName, string virtualMachineName, ConfigurationSet windowsConfigurationSet, ConfigurationSet endpoints, OSVirtualHardDisk vhd, VMConfigModel vmConfig)
        {
            OperationStatusResponse deploymentResult;
            var createVMParameters = new VirtualMachineCreateParameters
            {

                RoleName = virtualMachineName,
                RoleSize = MapToAzureVmSize(vmConfig.VmSize),
                OSVirtualHardDisk = vhd,
                ProvisionGuestAgent = true,
                ConfigurationSets = new List<ConfigurationSet>
                    {
                        windowsConfigurationSet,
                        endpoints,
                    },
            };

            if (vmConfig.InsertCaptureScript)
            {
                createVMParameters.ResourceExtensionReferences =
                    CreateCaptureScript(vmConfig.CaptureKey, vmConfig.ChocoPackageList);
            }

            deploymentResult = _compute.VirtualMachines.Create(serviceName, serviceName, createVMParameters);
            return deploymentResult;
        }
Example #5
0
        /// <summary>
        /// TODO: Summary in work....
        /// </summary>
        /// <param name="serviceName">A new service name.</param>
        /// <param name="sourceVhdName">The original Azure image 
        /// name from which the reference VM has been created.</param>
        /// <param name="users">The list of users that need VMs.</param>
        public List<AssignedVmModel> GenerateVMsForUsers(string serviceName, VMConfigModel vmConfig,
			List<VMUserModel> users)
        {
            _compute.HostedServices.Create(new HostedServiceCreateParameters
                {
                    ServiceName = serviceName,
                    Location = LocationNames.NorthEurope
                });

            int vmIndex = 0;
            int rdpPortIndex = RdpPortBase;
            List<AssignedVmModel> assignedVms = new List<AssignedVmModel>();
            List<Task> taskList = new List<Task>();

            foreach (VMUserModel user in users)
            {
                bool isFirstVmInDeployment = !assignedVms.Any();
                string virtualMachineName = serviceName + ++vmIndex;

                //TODO: use the async version of the method to avoid creating new Tasks
                //Task task = Task.Factory.StartNew(() => GenerateVM(serviceName, vmConfig, virtualMachineName,
                //	rdpPortIndex, user, isFirstVmInDeployment));
                GenerateVM(serviceName, vmConfig, virtualMachineName,
                    rdpPortIndex, user, isFirstVmInDeployment);

                //if it's the first VM, then we must wait till the Deployment is set-up so we can
                //add to it the rest of the VMs
                //if (isFirstVmInDeployment) task.Wait(); else taskList.Add(task);

                assignedVms.Add(new AssignedVmModel
                {
                    UserId = user.IdentityId,
                    UserName = user.Username,
                    VmName = virtualMachineName,
                    VmRdpPort = rdpPortIndex,
                    Password = user.Password
                });

                rdpPortIndex++;
            }

            //Task.WaitAll(taskList.ToArray());

            return assignedVms;
        }
Example #6
0
        public AssignedVmModel GenerateVm(string serviceBaseName, VMConfigModel vmConfig, VMUserModel user)
        {
            //TODO: refactor GenerateVMsForUsers to be used instead of this one

            if (serviceBaseName.Length > 10) throw new ArgumentOutOfRangeException("serviceBaseName can't have more than 10 characters.");

            //find a name that is available
            Random r = new Random();
            string serviceName = null;
            HostedServiceCheckNameAvailabilityResponse availableResponse;

            do
            {
                int randomValue = r.Next(99999);
                serviceName = serviceBaseName + randomValue;

                availableResponse = _compute.HostedServices.CheckNameAvailability(serviceName);

            } while (!availableResponse.IsAvailable);

            var createCloudService = _compute.HostedServices.Create(
                new HostedServiceCreateParameters
                {
                    ServiceName = serviceName,
                    Location = vmConfig.Region
                });

            string virtualMachineName = serviceName;

            //TODO: need a status check
            GenerateVM(serviceName, vmConfig, virtualMachineName, RdpPortBase, user,
                firstVMInDeployment: true);
            AssignedVmModel assignedVm = new AssignedVmModel
            {
                UserId = user.IdentityId,
                UserName = user.Username,
                VmName = virtualMachineName,
                VmRdpPort = RdpPortBase,
                Password = user.Password
            };

            return assignedVm;
        }
Example #7
0
        public void Start(StartSessionRequest request)
        {
            using (ApplicationDbContext context = new ApplicationDbContext())
            {
                Session session = context.Sessions.Single(x => x.SessionId == request.SessionId);
                //Session session = context.Sessions.Single(x => x.Version == version);

                //check if the session is canceled or the request is no longer valid
                if (session.Removed ||
                    (session.Version != request.Version.ToString()))
                {
                    _logger.InfoFormat("StartSessionRequest for Sessionid: {0} was ignored because Removed: {1} and Version: {2}",
                        request.SessionId, session.Removed, request.Version);
                    return;
                }

                _logger.InfoFormat("Spawning VMs for SessionId: {0} ({1} - {2})",
                    session.SessionId, session.StartDate, session.EndDate);

                Subscription subscription = context.Subscriptions
                    .Single(x => x.SubscriptionId == session.SubscriptionId);

                IVMManagement vmManagement = AzureFacadeFactory.VMManagement(subscription.AzureSubscriptionId,
                    subscription.Certificate, subscription.CertificateKey, subscription.BlobStorageName,
                    subscription.BlobStorageKey);

                //TODO: remove the hardcoding at some point in time
                string NorthEurope = "North Europe";

                VMConfigModel vmConfig = new VMConfigModel(session.Lab.ImageName, NorthEurope)
                {
                    VmSize = (VmSizeEnum)Enum.Parse(typeof(VmSizeEnum), session.VmSize)
                };

                var sessionUsers = session.SessionUsers.ToList();

                var vmUsers = new List<VMUserModel>();
                sessionUsers.ForEach(x =>
                {
                    //TODO: wrong logic.. not all sessions are based on templates
                    var templateVM = context.TemplateVMs.Where(y => y.IdentityId == x.IdentityId && y.SubscriptionId == subscription.SubscriptionId).FirstOrDefault();
                    if (templateVM != null)
                    {
                        vmUsers.Add(new VMUserModel
                        {
                            IdentityId = x.IdentityId,
                            Username = templateVM.VMAdminUser,
                            Password = templateVM.VMAdminPass
                        });
                    }
                });

                //figure out a URL friendly name for the vm names
                string vmNameBase = "tn" + session.SessionId + "vm";

                var assignedVMs = vmManagement.GenerateVMsForUsers(vmNameBase, vmConfig, vmUsers);

                foreach (var assignedVM in assignedVMs)
                {
                    VirtualMachine virtualMachine = new VirtualMachine
                    {
                        IdentityId = assignedVM.UserId,
                        VmAdminPass = assignedVM.Password,
                        VmAdminUser = assignedVM.UserName,
                        VmName = assignedVM.VmName,
                        VmRdpPort = assignedVM.VmRdpPort
                    };

                    session.VirtualMachines.Add(virtualMachine);
                    context.SaveChanges();
                }

                _logger.InfoFormat("Spawned VMs for SessionId: {0} ({1} - {2})",
                    session.SessionId, session.StartDate, session.EndDate);

                _logger.InfoFormat("Sending emails for SessionId: {0} ({1} - {2})",
                    session.SessionId, session.StartDate, session.EndDate);
                //well.. this is a hack
                //TODO: send the correct service name, that should be returned from the Azure Facade
                Email.BuildSessionEmails(session, vmNameBase).Send();
            }
        }
Example #8
0
        public void Start(StartSessionRequest request)
        {
            using (ApplicationDbContext context = new ApplicationDbContext())
            {
                Session session = context.Sessions.Single(x => x.SessionId == request.SessionId);
                //Session session = context.Sessions.Single(x => x.Version == version);

                Identity trainer = session.TrainerId != 0 ?
                    context.Identities.Where(x => x.IdentityId == session.TrainerId).FirstOrDefault() :
                    context.Identities.Where(x => x.IdentityId ==
                        (context.SubscriptionIdentityRoles.Where(y => y.SubscriptionId == session.SubscriptionId && y.Role == "Owner").FirstOrDefault()).IdentityId).FirstOrDefault();

                //figure out a URL friendly name for the vm names
                string vmNameBase = "tn" + session.SessionId + "vm";

                try
                {
                    //check if the session is canceled or the request is no longer valid
                    if (session.Removed ||
                        (session.Version != request.Version.ToString()))
                    {
                        _logger.InfoFormat("StartSessionRequest for Sessionid: {0} was ignored because Removed: {1} and Version: {2}",
                            request.SessionId, session.Removed, request.Version);
                        return;
                    }

                    _logger.InfoFormat("Spawning VMs for SessionId: {0} ({1} - {2})", session.SessionId, session.StartDate, session.EndDate);

                    Subscription subscription = context.Subscriptions.Single(x => x.SubscriptionId == session.SubscriptionId);

                    IVMManagement vmManagement = AzureFacadeFactory.VMManagement(subscription.AzureSubscriptionId,
                        subscription.Certificate, subscription.CertificateKey, subscription.BlobStorageName,
                        subscription.BlobStorageKey);

                    //TODO: remove the hardcoding at some point in time
                    string NorthEurope = "North Europe";

                    VMConfigModel vmConfig = new VMConfigModel(session.Lab.ImageName, NorthEurope)
                    {
                        VmSize = (VmSizeEnum)Enum.Parse(typeof(VmSizeEnum), session.VmSize)
                    };

                    var sessionUsers = session.SessionUsers.ToList();
                    var vmUsers = new List<VMUserModel>();
                    RandomProvider randomProvider = new RandomProvider();

                    sessionUsers.ForEach(x =>
                    {
                        vmUsers.Add(new VMUserModel
                        {
                            IdentityId = x.IdentityId,
                            Username = x.Identity != null ? string.Format("{0}.{1}", x.Identity.FirstName, x.Identity.LastName) : string.Empty,
                            Password = randomProvider.SecurePassword(8)
                        });
                    });

                    Email.BuildSessionStartVmsEmails(trainer.FirstName, trainer.Email, session, vmNameBase, vmUsers.Count).Send();

                    var assignedVMs = vmManagement.GenerateVMsForUsers(vmNameBase, vmConfig, vmUsers);

                    foreach (var assignedVM in assignedVMs)
                    {
                        VirtualMachine virtualMachine = new VirtualMachine
                        {
                            IdentityId = assignedVM.UserId,
                            VmAdminPass = assignedVM.Password,
                            VmAdminUser = assignedVM.UserName,
                            VmName = assignedVM.VmName,
                            VmRdpPort = assignedVM.VmRdpPort
                        };

                        session.VirtualMachines.Add(virtualMachine);
                        context.SaveChanges();
                    }

                    _logger.InfoFormat("Spawned VMs for SessionId: {0} ({1} - {2})", session.SessionId, session.StartDate, session.EndDate);

                    _logger.InfoFormat("Sending emails for SessionId: {0} ({1} - {2})", session.SessionId, session.StartDate, session.EndDate);
                    //well.. this is a hack
                    //TODO: send the correct service name, that should be returned from the Azure Facade

                    Email.BuildSessionEndVmsEmails(trainer.FirstName, trainer.Email, session.SessionName, vmNameBase, vmUsers.Count, assignedVMs.Count).Send();
                    Email.BuildSessionEmails(session, vmNameBase).Send();
                }
                catch(Exception ex)
                {
                    Email.BuildProblemStartingVmsEmails(trainer.FirstName, trainer.Email, session.SessionName, vmNameBase, ex.InnerException != null ? ex.InnerException.Message : "Error in starting the virtual machine(s).").Send();
                    throw ex;
                }
            }
        }
Example #9
0
 //TODO: stub
 public AssignedVmModel GenerateVm(string serviceBaseName, VMConfigModel vmConfig, VMUserModel user)
 {
     throw new NotImplementedException();
 }