Ejemplo n.º 1
0
        public void ImpXvaFile()
        {
            log.InfoFormat("开始导入WinCenter xva文件:{0}", ConnectManager.FilePath);
            string vmRef = GetVmRef(applyFile());

            if (string.IsNullOrEmpty(vmRef))
            {
                return;
            }
            log.InfoFormat("WinCenter xva文件导入完成");

            try {
                log.InfoFormat("导入后的WinCenter VM:[{0}]", vmRef);
                List <XenRef <VIF> > vifRefs = VM.get_VIFs(ConnectManager.session, vmRef);
                foreach (XenRef <VIF> vifRef in vifRefs)
                {
                    log.InfoFormat("删除原有的VIF:[{0}]", vifRef.opaque_ref);
                    VIF.destroy(ConnectManager.session, vifRef);
                }
                HTTPHelper.progressInfo     = "删除原有VIF";
                HTTPHelper.progressPercent += 1;

                bool isTemplate = VM.get_is_a_template(ConnectManager.session, vmRef);
                if (isTemplate)
                {
                    log.InfoFormat("导入的xva是模板,删除VM:[{0}]", vmRef);
                    VM.destroy(ConnectManager.session, vmRef);
                    return;
                }

                VIF newVif = ConnectManager.VIF;
                newVif.VM = new XenRef <VM>(vmRef);
                XenRef <VIF> newVifRef = VIF.create(ConnectManager.session, newVif);
                log.InfoFormat("重新创建VIF:[{0}]", newVifRef.opaque_ref);
                string mac = VIF.get_MAC(ConnectManager.session, newVifRef);
                log.InfoFormat("新的MAC地址为:[{0}]", mac);
                string newVifUuid = VIF.get_uuid(ConnectManager.session, newVifRef);
                log.InfoFormat("新的VIF UUID为:[{0}]", newVifUuid);

                HTTPHelper.progressInfo     = "创建新的VIF";
                HTTPHelper.progressPercent += 1;

                DefaultVMName(ConnectManager.VMName);
                log.InfoFormat("检查WinCenter VM的名称,VM名称为:{0}", ConnectManager.VMName);
                VM.set_name_label(ConnectManager.session, vmRef, ConnectManager.VMName);
                HTTPHelper.progressInfo     = "检查VM名称";
                HTTPHelper.progressPercent += 1;

                /**
                 * BUG:AE方式设置IP之后,由于ISO没有弹出,在控制台修改IP重启以后,AE会重新设置ISO配置中的IP
                 * 故不再使用AE这种方式,而是改成在VM启动后使用xenstore-write方式动态修改IP
                 */
                //初始化AE
                //initVmByAe(vmRef, mac);

                XenRef <Host> hostRef = Host.get_by_uuid(ConnectManager.session, ConnectManager.TargetHost.uuid);
                log.InfoFormat("设置WinCenter VM的所属主机:[{0}]", ConnectManager.TargetHostName);
                HTTPHelper.progressInfo = "设置主机";
                VM.set_affinity(ConnectManager.session, vmRef, hostRef);
                HTTPHelper.progressPercent += 1;

                setAutoPoweron(vmRef);
                HTTPHelper.progressInfo = "启动VM";
                VM.start(ConnectManager.session, vmRef, false, false);
                Thread.Sleep(2 * 60 * 1000);                 //休眠2分钟,等待虚拟机启动完成
                HTTPHelper.progressPercent += 2;
                log.InfoFormat("启动WinCenter VM:[{0}]成功", vmRef);

                //去掉AE方式设置IP,VM启动后使用xenstore-write方式动态设置IP
                HTTPHelper.progressInfo = "设置网络信息";
                setActiveVifIp(newVifUuid);
                HTTPHelper.progressPercent = 100;
                log.InfoFormat("设置IP信息成功");
            }
            catch (Exception ex) {
                log.ErrorFormat("安装失败: {0}", ex.Message);
                log.ErrorFormat("开始删除WinCenter VM:[{0}]", vmRef);
                try {
                    vm_power_state power_state = VM.get_power_state(ConnectManager.session, vmRef);
                    if (!vm_power_state.Halted.ToString().Equals(power_state.ToString()))
                    {
                        VM.shutdown(ConnectManager.session, vmRef);
                    }
                }
                catch (Exception ex1) {
                    log.ErrorFormat("WinCenter VM关机失败:{0}", ex1.Message);
                }

                try {
                    VM.destroy(ConnectManager.session, vmRef);
                }
                catch (Exception ex1) {
                    log.ErrorFormat("删除WinCenter VM失败:{0}", ex1.Message);
                    throw ex1;
                }
                throw;
            }
        }