Пример #1
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();
            }
        }
Пример #2
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;
                }
            }
        }