/// <summary>
        /// 创建一个虚拟机
        /// </summary>
        /// <param name="vmConfig">虚拟机配置信息</param>
        /// <param name="vm">虚拟机权限信息</param>
        /// <returns></returns>
        public static string CreateVM(VMConfig vmConfig, VirtualMachine vm)
        {
            string res = "success";

            if (ManagerType.Equals("Sangfor"))
            {
                SangforInfo info = new SangforInfo();
                info.student_id   = vm.owner_id;
                info.teacher_id   = vm.owner_id;
                info.IsTemplate   = false;
                info.is_exp       = false;
                info.is_exps      = "False";
                info.Name         = vm.vm_name;
                info.TemplateName = vmConfig.TemplateName;
                //vmConfig.Disk = vmConfig.Disk / 1024;

                string result = restful.Create(vmConfig, info.Name, null, null);
                if (!result.StartsWith("error"))
                {
                    info.id = result;
                    SangforDao.Add(info);
                }
            }
            else
            {
                res = manager.Create(vmConfig, vm.vm_name, vm.owner_id);
            }
            return(res);
        }
Beispiel #2
0
        private static FileInfo CreateProgramTraceFile(VMConfig config, string tx_hash)
        {
            FileInfo result = null;

            if (config.IsVmTrace)
            {
                DirectoryInfo directory = new DirectoryInfo(@"./vm_trace/");
                result = new FileInfo(directory.FullName + tx_hash + @".json");
                {
                    if (result.Exists)
                    {
                        if (!result.IsReadOnly)
                        {
                            result = null;
                        }
                    }
                    else
                    {
                        try
                        {
                            Directory.CreateDirectory(directory.FullName);
                            File.Create(result.FullName);
                        }
                        catch
                        {
                        }
                    }
                }
            }
            return(result);
        }
Beispiel #3
0
        ///// <summary>
        ///// 批量创建虚拟机
        ///// </summary>
        ///// <param name="config">虚拟机配置</param>
        ///// <param name="vmNameList">虚拟机名称</param>
        ///// <param name="IDList">未知参数</param>
        ///// <param name="hostName">未知参数</param>
        ///// <returns></returns>
        public string Create(VMConfig config, List <string> vmNameList, List <string> IDList, string teacherId = "", string hostName = "")
        {
            //    string vmName = vmNameList[0];
            //    string flavorRef = MessageManager.FindFlavor(config.CPU, config.Memory, config.Disk);
            //    string uuid = MysqlManager.FindNetworks();
            //    string zone = MysqlManager.FindZone();
            string info = "";

            //    if (MysqlManager.FindServer(vmName).Equals("Not Found") == false)
            //        return "Used Name";
            //    if (MysqlManager.IsImage(config.TemplateName))
            //    {
            //        string imgRef = MysqlManager.FindServer(config.TemplateName);
            //        Dictionary<string, object> data = MessageManager.PackageCreateJsonByImage(flavorRef, uuid, vmName, zone, imgRef,2);

            //        info = APIManager.CreateServer(data);
            //    }
            //    else
            //    {
            //        string serverId = MysqlManager.FindServer(config.TemplateName);
            //        string volumeId = MessageManager.FindVolume(serverId);
            //        Dictionary<string, object> data = MessageManager.PackageCreateJsonByVolume(flavorRef, uuid, vmName, zone, volumeId,2);
            //        info = APIManager.CreateServer(data);
            //    }
            //    /*string id = MessageManager.AnalyzeCreateInfo(info, vmName);
            //    if (id.Equals("error") == false)
            //    {
            //        MysqlManager.AddServer(id, vmName);
            //        return "Create Success";
            //    }*/
            return(info);
        }
Beispiel #4
0
        public IActionResult CreateVM([FromBody] VMConfig vmConfig)
        {
            Task.Run(async() =>
            {
                try
                {
                    await SaveRequestLogToDB(vmConfig);

                    var publicIPAddress = await azure.PublicIPAddresses.Define("AzureMgmtPublicIP" + RandomString(5)).WithRegion(location).WithExistingResourceGroup(groupName).WithDynamicIP().CreateAsync();

                    var networkInterface = await azure.NetworkInterfaces.Define("AzureMgmtNIC" + RandomString(5)).WithRegion(location).WithExistingResourceGroup(groupName).WithExistingPrimaryNetwork(network).WithSubnet("AzureMgmtSubnet").WithPrimaryPrivateIPAddressDynamic().WithExistingPrimaryPublicIPAddress(publicIPAddress).CreateAsync();

                    var size = GetVMSize(vmConfig);
                    await azure.VirtualMachines.Define(vmConfig.VMName)
                    .WithRegion(location)
                    .WithExistingResourceGroup(groupName)
                    .WithExistingPrimaryNetworkInterface(networkInterface)
                    .WithLatestWindowsImage("MicrosoftWindowsServer", "WindowsServer", "2012-R2-Datacenter")
                    .WithAdminUsername("dumpatipavankumar")
                    .WithAdminPassword("Airforce@22")
                    .WithComputerName(vmConfig.VMName)
                    .WithExistingAvailabilitySet(availabilitySet)
                    .WithSize(size)
                    .CreateAsync();
                }
                catch (Exception ex)
                {
                    var message = "Message: " + ex.Message + " InnerException: " + ex.StackTrace.ToString();
                    await SaveRequestLogToDB(vmConfig, message);
                }
            });

            return(Ok());
        }
Beispiel #5
0
        public string Create(VMConfig config, string vmName, string ID, string teacher_id, string hostName = "")
        {
            VCManagerService vms = new VCManagerService();

            string[] vmNameList = { vmName };
            string[] IDList     = { ID };
            return(vms.CreateFromTemplate(config.TemplateName, vmNameList, "0", IDList, teacher_id, "true", config.CPU.ToString(), config.Memory.ToString(), config.Disk.ToString(), hostName, ""));
        }
Beispiel #6
0
        public static void SaveProgramTraceFile(VMConfig config, string tx_hash, string content)
        {
            FileInfo file = CreateProgramTraceFile(config, tx_hash);

            if (file != null)
            {
                WriteStringToFile(file, content);
            }
        }
Beispiel #7
0
        private List <VMConfig> Deserialize(List <dynamic> vmList)
        {
            List <VMConfig> ret = new List <VMConfig>();

            foreach (var vmInfo in vmList)
            {
                string ip = vmInfo.IPAddress.ToString();
                if (ip != null && !ip.Equals("Unavailable"))
                {
                    List <string> ips = ip
                                        .Replace("[", "").Replace("]", "").Replace("\"", "").Replace("\r", "").Replace("\n", "")
                                        .Replace(" ", "")
                                        .Split(',')
                                        .Where(s => s.StartsWith(ipPrefix)).ToList();
                    ip = string.Join(",", ips);
                }
                VMStatus status = new VMStatus
                {
                    IPAddress    = ip,
                    HostName     = vmInfo.hostName.ToString(),
                    PowerState   = vmInfo.powerState.ToString(),
                    RunTimeState = vmInfo.runTimeState.ToString()
                };

                VMConfig vm = new VMConfig
                {
                    Name           = vmInfo.vmName.ToString(),
                    CPU            = int.Parse(vmInfo.CPUByNum.ToString()),
                    Memory         = long.Parse(vmInfo.memoryByMb.ToString()),
                    Disk           = long.Parse(vmInfo.diskByB.ToString()) / 1024 / 1024,
                    IsTemplate     = bool.Parse(vmInfo.isTemplate.ToString()),
                    GuestFullName  = vmInfo.guestFullName.ToString(),
                    AdvancedConfig = "",
                    Status         = status,
                    student_id     = vmInfo.studentID.ToString(),
                    teacher_id     = vmInfo.teacherID.ToString(),
                    admin_id       = vmInfo.adminID.ToString(),
                    is_exps        = vmInfo.isExperimental.ToString()
                };
                if (vm.is_exps != null && vm.is_exps.Equals("True"))
                {
                    vm.is_exp = true;
                }
                else if (vm.is_exps != null && vm.is_exps.Equals("False"))
                {
                    vm.is_exp = false;
                }
                else
                {
                    vm.is_exp = false;
                }
                ret.Add(vm);
            }
            return(ret);
        }
Beispiel #8
0
        /// <summary>
        /// Saves the request log to database.
        /// </summary>
        /// <param name="vmConfig">The VM configuration.</param>
        private static async Task SaveRequestLogToDB(VMConfig vmConfig, string exceptionMessage = "NA")
        {
            VMRequestLogEntity vmRequestLogEntity = new VMRequestLogEntity(vmConfig.VMName, vmConfig.VMSize)
            {
                VMName       = vmConfig.VMName,
                VMSize       = vmConfig.VMSize,
                ErrorMessage = exceptionMessage
            };

            await CosmosDBStorageHelper.InsertOrMergeEntityAsync(table, vmRequestLogEntity);
        }
Beispiel #9
0
        /// <summary>
        /// 获取虚拟机信息
        /// </summary>
        /// <param name="vmName">虚拟机名称</param>
        /// <returns>虚拟机信息(VMConfig)|null</returns>
        public VMConfig GetVMInfo(string id)
        {
            //string id = MysqlManager.FindServer(vmName);
            if (id.Equals("Not Found"))
            {
                return(null);
            }
            VMConfig vMConfig = MessageManager.GetServerDetail(id);

            return(vMConfig);
        }
Beispiel #10
0
        /// <summary>
        /// 采用新逻辑批量创建虚拟机,用于优化多台创建的情况
        /// </summary>
        public void CreateNewLogic(VMConfig config, List <SangforInfo> infos)
        {
            List <string> nameList    = new List <string>();
            List <string> newNameList = new List <string>();

            //nameList.Add(config.Name);
            newNameList.Add(config.TemplateName);

            int num = 0;

            while (true)
            {
                List <string> idList = new List <string>();
                nameList = new List <string>();
                foreach (string name in newNameList)
                {
                    nameList.Add(name);
                }
                if (num == infos.Count())
                {
                    break;
                }

                foreach (string name in nameList)
                {
                    config.TemplateName = name;
                    string id = Create(config, infos[num].Name, null, null);

                    if (!id.StartsWith("error"))
                    {
                        infos[num].id = id;
                        idList.Add(id);
                        SangforDao.Add(infos[num]);
                        newNameList.Add(infos[num].Name);
                    }
                    num++;
                    if (num == infos.Count())
                    {
                        break;
                    }
                }
                Thread.Sleep(180000);
                foreach (string id in idList)
                {
                    PowerOption(id, 2);
                }
                Thread.Sleep(120000);
            }
        }
Beispiel #11
0
        /// <summary>
        /// 创建虚拟机
        /// </summary>
        /// <param name="config">虚拟机配置</param>
        /// <param name="vmName">虚拟机名称</param>
        /// <param name="ID">模板id</param>
        /// <param name="hostName">未知参数</param>
        /// <returns>success|error:错误信息</returns>
        public string Create(VMConfig config, string vmName, string ID, string hostName = "")
        {
            SangforInfo info1 = SangforDao.GetSangforInfoByName(config.TemplateName);

            config.Disk = Convert.ToInt64(info1.image_disk);
            string flavorRef = MessageManager.FindFlavor(config.CPU, config.Memory, config.Disk);

            if (flavorRef.Equals("Not Found"))
            {
                flavorRef = MessageManager.CreateFlavor(config);
            }

            string uuid = ConfigurationManager.AppSettings["AcloudNetworks"];
            string zone = ConfigurationManager.AppSettings["AcloudAvailability_zone"];
            string info = "";

            //if (info1 == null)
            //{
            //   return "error";
            //}
            //string serverId = info1.id;
            //PowerOption(serverId, 2);
            //string volumeId = MessageManager.FindVolume(serverId);
            //Dictionary<string, object> data =
            //MessageManager.PackageCreateJsonByVolume(flavorRef, uuid, vmName, zone, volumeId);
            Dictionary <string, object> data =
                MessageManager.PackageCreateJsonByImage(flavorRef, uuid, vmName, zone, info1.id);

            info = APIManager.CreateServer(data);
            string id = MessageManager.AnalyzeCreateInfo(info);

            if (id.Equals("error") == false)
            {
                return(id);
            }
            else if (info.Equals("No Content"))
            {
                return("error:No Content");
            }
            else if (info.Equals("|No Authority"))
            {
                return("error:No Authority");
            }
            else
            {
                return("error" + info);
            }
        }
        /// <summary>
        /// 合并数据
        /// </summary>
        /// <param name="vmConfigs">统一虚拟机数据</param>
        /// <returns></returns>
        public static List <VMConfig> MergeData(List <VMConfig> vmConfigs)
        {
            using (var dbContext = new DataModels())
            {
                RESTful restful = new RESTful();
                foreach (VMConfig config in vmConfigs)
                {
                    SangforInfo info = GetSangforInfoByName(config.Name);
                    config.admin_id     = info.admin_id;
                    config.teacher_id   = info.teacher_id;
                    config.student_id   = info.student_id;
                    config.is_exp       = info.is_exp;
                    config.is_exps      = info.is_exps;
                    config.IsTemplate   = info.IsTemplate;
                    config.TemplateName = info.TemplateName;
                    config.console_url  = restful.OpenConsole(info.id);

                    if (config.Status.PowerState.Equals("ACTIVE"))
                    {
                        config.Status.PowerState = "poweredOn";
                    }
                    else
                    {
                        config.Status.PowerState = "poweredOff";
                    }
                }
                List <SangforInfo> infos = dbContext.SangforInfos.ToList();
                infos = infos.Where(u => u.IsTemplate == true).ToList();
                foreach (SangforInfo info in infos)
                {
                    VMConfig config = new VMConfig();
                    config.admin_id     = info.admin_id;
                    config.teacher_id   = info.teacher_id;
                    config.student_id   = info.student_id;
                    config.is_exp       = info.is_exp;
                    config.is_exps      = info.is_exps;
                    config.IsTemplate   = info.IsTemplate;
                    config.TemplateName = info.TemplateName;
                    config.Name         = info.Name;
                    vmConfigs.Add(config);
                }
            }
            return(vmConfigs);
        }
Beispiel #13
0
        public static string CreateFlavor(VMConfig config)
        {
            Dictionary <string, object> data   = new Dictionary <string, object>();
            Dictionary <string, object> flavor = new Dictionary <string, object>();

            flavor.Add("name", config.Name + "_" + config.Memory.ToString() + "_" + config.CPU.ToString() + "_" + config.Disk.ToString());
            flavor.Add("ram", config.Memory);
            flavor.Add("vcpus", config.CPU);
            flavor.Add("disk", config.Disk);
            data.Add("flavor", flavor);
            string result = APIManager.CreateFlavor(data);
            var    param  = HttpUtil.Deserialize(JObject.Parse(result));

            if (param == null)
            {
                return(null);
            }
            return(param["flavor"]["id"]);
        }
Beispiel #14
0
        /// <summary>
        /// Gets the size of the VM.
        /// </summary>
        /// <param name="vmConfig">The VM configuration.</param>
        /// <returns>the size of the VM</returns>
        private static VirtualMachineSizeTypes GetVMSize(VMConfig vmConfig)
        {
            VirtualMachineSizeTypes size;

            if (vmConfig.VMSize == "StandardD1")
            {
                size = VirtualMachineSizeTypes.StandardD1;
            }
            else if (vmConfig.VMSize == "StandardD2")
            {
                size = VirtualMachineSizeTypes.StandardD2;
            }
            else
            {
                size = VirtualMachineSizeTypes.StandardD11;
            }

            return(size);
        }
Beispiel #15
0
        /// <summary>
        /// 批量获取虚拟机信息
        /// </summary>
        /// <param name="vmNameList">虚拟机名称列表</param>
        /// <returns>虚拟机信息列表(List<VMConfig>)</returns>
        public List <VMConfig> GetVMList(List <string> idList)
        {
            List <VMConfig> vMConfigs = new List <VMConfig>();

            foreach (string id in idList)
            {
                if (id == null)
                {
                    continue;
                }
                VMConfig vMConfig = MessageManager.GetServerDetail(id);
                if (vMConfig == null)
                {
                    continue;
                }
                vMConfigs.Add(vMConfig);
            }


            return(vMConfigs);
        }
Beispiel #16
0
        /// <summary>
        /// 获取虚拟机信息并封装
        /// </summary>
        /// <param name="id">虚拟机id</param>
        /// <returns>虚拟机信息(VMConfig)</returns>
        public static VMConfig GetServerDetail(string id)
        {
            try
            {
                VMConfig vMConfig = new VMConfig();
                var      param    = HttpUtil.Deserialize(JObject.Parse(APIManager.GetServer(id)));
                if (param == null || param["error"] != null)
                {
                    return(null);
                }
                vMConfig.Name              = param["server"]["name"];
                vMConfig.Status            = new VMStatus();
                vMConfig.Status.PowerState = param["server"]["status"].ToString();
                if (param["server"]["addresses"].ToString().Equals("{}") == false)
                {
                    vMConfig.Status.IPAddress = param["server"]["addresses"]["子网1"][0]["addr"].ToString();
                }
                string flavorRef = param["server"]["flavor"]["id"];
                //if (param["server"]["image"] != null)
                //{
                //    string imageRef = param["server"]["image"]["id"];
                //    param = HttpUtil.Deserialize(JObject.Parse(APIManager.GetImage(imageRef)));
                //    vMConfig.GuestFullName = param["image"]["name"];
                //}

                param           = HttpUtil.Deserialize(JObject.Parse(APIManager.GetFlavor(flavorRef)));
                vMConfig.Memory = param["flavor"]["ram"];
                vMConfig.CPU    = param["flavor"]["vcpus"];
                vMConfig.Disk   = param["flavor"]["disk"];
                vMConfig.Disk   = vMConfig.Disk * 1024;
                return(vMConfig);
            }
            catch
            {
                return(null);
            }
        }
Beispiel #17
0
 /// <summary>
 /// 创建虚拟机
 /// </summary>
 /// <param name="config">虚拟机配置</param>
 /// <param name="vmNameList">虚拟机名列表</param>
 /// <param name="hostName">创建位置</param>
 /// <returns></returns>
 public string Create(VMConfig config, List <string> vmNameList, List <string> IDList, string teacherId, string hostName = "")
 {
     string[] vmNames = vmNameList.ToArray();
     string[] IDs     = IDList.ToArray();
     return(vms.CreateFromTemplate(config.TemplateName, vmNames, "0", IDs, teacherId, "true", config.CPU.ToString(), config.Memory.ToString(), config.Disk.ToString(), hostName, ""));
 }
        /// <summary>
        /// 为实验创建虚拟机
        /// </summary>
        /// <param name="vmConfig">虚拟机配置</param>
        /// <param name="vmName">虚拟机名</param>
        /// <param name="expId">实验id</param>
        /// <returns></returns>
        public static string CreateVMsForExp(VMConfig vmConfig, int applyId, string stulist)
        {
            Experiment exp = ExperimentDao.GetExperimentByApplyId(applyId);

            Course course = CourseDao.GetCourseInfoById((int)exp.course_id);

            vmConfig.Name = exp.vm_name;
            string teacherId = course.teacher_id;

            string[]      ids    = stulist.Split(' ');
            List <string> stuIds = new List <string>();

            foreach (string id in ids)
            {
                if (id != null && id.Length != 0)
                {
                    stuIds.Add(id);
                }
            }
            string[] names = new string[stuIds.Count()];
            string   res   = "success";


            for (int i = 0; i < stuIds.Count(); ++i)
            {
                names[i] = vmConfig.Name + "_" + stuIds[i];
            }
            if (ManagerType.Equals("Sangfor"))
            {
                List <SangforInfo> infoList = new List <SangforInfo>();
                for (int i = 0; i < stuIds.Count(); ++i)
                {
                    SangforInfo info = new SangforInfo();
                    info.student_id   = stuIds[i];
                    info.teacher_id   = teacherId;
                    info.IsTemplate   = false;
                    info.is_exp       = true;
                    info.is_exps      = "True";
                    info.Name         = names[i];
                    info.TemplateName = vmConfig.TemplateName;
                    infoList.Add(info);
                }
                //vmConfig.Disk = vmConfig.Disk / 1024;

                foreach (SangforInfo info in infoList)
                {
                    string result = restful.Create(vmConfig, info.Name, null, null);
                    if (!result.StartsWith("error"))
                    {
                        info.id = result;
                        SangforDao.Add(info);
                    }
                }
                // 使用新逻辑创建,优化创建时间
                //restful.CreateNewLogic(vmConfig,infoList);
            }
            else
            {
                res = manager.Create(vmConfig, names.ToList(), stuIds.ToList(), teacherId);
            }

            return(res);
        }
        /// <summary>
        /// 获取用户对某虚拟机的权限
        /// </summary>
        /// <param name="vmName">虚拟机名称</param>
        /// <param name="userId">id</param>
        /// <returns>
        /// 0:无权限
        /// 1:仅有开关机权限
        /// 2:有完全权限
        /// </returns>
        public static int GetPermissionForVM(string vmName, string userId)
        {
            VMConfig config = null;

            if (ManagerType.Equals("Sangfor"))
            {
                List <VMConfig> configs = GetAllVm();
                configs = configs.Where(c => c.Name == vmName).ToList();
                if (configs.Count() != 0)
                {
                    config = configs[0];
                }
            }
            else
            {
                config = manager.GetVMByName(vmName);
            }

            if (config == null)
            {
                return(0);
            }
            if (config.student_id == null)
            {
                return(2);
            }
            User user = UserDao.GetUserById(userId);

            if (user.role == 4)
            {
                return(2);
            }
            if (config.is_exps.Equals("False"))
            {
                if (config.student_id.Equals(userId) || config.teacher_id.Equals(userId))
                {
                    return(2);
                }
                if (user.role == 3)
                {
                    User owner = UserDao.GetUserById(config.student_id);
                    if (owner == null)
                    {
                        return(0);
                    }
                    if (owner.department_id.Equals(user.department_id) == true)
                    {
                        return(2);
                    }
                    else
                    {
                        return(0);
                    }
                }
                return(0);
            }
            else
            {
                if (config.teacher_id == userId)
                {
                    return(2);
                }
                if (config.student_id == userId)
                {
                    return(1);
                }
                if (user.role == 3)
                {
                    User owner = UserDao.GetUserById(config.teacher_id);
                    if (owner == null)
                    {
                        return(0);
                    }
                    if (owner.department_id.Equals(user.department_id) == true)
                    {
                        return(2);
                    }
                    else
                    {
                        return(0);
                    }
                }
            }
            return(0);
        }