示例#1
0
        /// <summary>
        /// InstantClone Create
        /// </summary>
        /// <param name="createPool"></param>
        private T CreateInstantClonePool <T>(CreatePoolModel createPool)
        {
            Collection <PSObject> result = null;
            T retValue = default(T);

            /*
             * // New-HVPool -InstantClone -PoolName "InsPoolvmware" -PoolDisplayName "insPool" -Description "create instant pool" -UserAssignment FLOATING -ParentVM 'Agent_vmware' -SnapshotVM 'kb-hotfix' -VmFolder 'vmware' -HostOrCluster  'CS-1' -ResourcePool 'CS-1' -NamingMethod PATTERN -Datastores 'datastore1' -NamingPattern "inspool2" -NetBiosName 'adviewdev' -DomainAdmin root
             */
            try
            {
                using (runSpace = RunspaceFactory.CreateRunspace())
                {
                    runSpace.Open();
                    using (PowerShell pPs = PowerShell.Create())
                    {
                        pPs.Runspace = runSpace;
                        foreach (var item in Commands)
                        {
                            pPs.AddScript(item);
                        }
                        result = pPs.Invoke();
                        if (result.Count == 0 || (result.Count > 0 && result[0] == null))
                        {
                            Trace.WriteLine("[Connect] HorizonView.Connection Failed");
                            throw new CliException(CliException.Reason.Connection);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw new CliException(CliException.Reason.NewPool, "VMWare.HorizonView.InstantClone Exception", ex);
            }

            #region 권한부여
            // ###############################################################################
            // 사용자 권한 부여 추가 (Dedicate 일시)
            // ###############################################################################
            if (createPool.UserAssignment == "DEDICATED")
            {
                // New-HVEntitlement -User domain\username -ResourceName $pool -Type User -HvServer $vcs
                // New-HVEntitlement -User [email protected] -ResourceName mypool
                // New-HVEntitlement -User domain\group -ResourceName 'poolname' -Type Group
            }
            #endregion
            return(retValue);
        }
示例#2
0
        /// <summary>
        /// DeskTop Pool Create
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="createPool"></param>
        /// <returns></returns>
        public T NewPool <T>(CreatePoolModel createPool)
        {
            Collection <PSObject> result = null;
            T retValue = default(T);

            // 1. 유형 (자동, 수동, RDS)
            // 2. 자동(전용[자동할당], 부동) / 수동(전용[자동할당], 부동) / RDS
            // 3-1. 자동 > 인스턴트클론, ViewComposer, 전체가상시스템
            // 3-2. 수동 > vCenter가상시스템, 기타소스
            // 3-3. RDS > Skip
            switch (createPool.PoolType)
            {
            case "InstantClone":
                retValue = CreateInstantClonePool <T>(createPool);
                break;

            case "LinkedClone":
                retValue = CreateLinkedClonePool <T>(createPool);
                break;

            case "FullClone":
                retValue = CreateFullClonePool <T>(createPool);
                break;

            case "Manual":
                retValue = CreateManualPool <T>(createPool);
                break;

            case "RDS":
                CreateRDSPool(createPool);
                break;

            default:
                break;
            }

            return(retValue);
        }
示例#3
0
 /// <summary>
 /// RDS Create
 /// </summary>
 /// <param name="createPool"></param>
 private void CreateRDSPool(CreatePoolModel createPool)
 {
     throw new NotImplementedException();
 }
示例#4
0
        /// <summary>
        /// 수동풀 전용 Create (vCenter VM선택 후 사용자지정)
        /// </summary>
        /// <param name="createPool"></param>
        private T CreateManualPool <T>(CreatePoolModel createPool)
        {
            Collection <PSObject> result = null;
            T retValue = default(T);

            try
            {
                using (runSpace = RunspaceFactory.CreateRunspace())
                {
                    runSpace.Open();
                    using (PowerShell pPs = PowerShell.Create())
                    {
                        pPs.Runspace = runSpace;
                        foreach (var item in Commands)
                        {
                            pPs.AddScript(item);
                        }
                        result = pPs.Invoke();
                        if (result.Count == 0 || (result.Count > 0 && result[0] == null))
                        {
                            Trace.WriteLine("[Connect] HorizonView.Connection Failed");
                            throw new CliException(CliException.Reason.Connection);
                        }

                        string poolvm = string.Empty;
                        for (int i = 0; i < createPool.VM.Length; i++)
                        {
                            poolvm += i == 0 ? "'" + createPool.VM[i] + "'" : " ,'" + createPool.VM[i] + "'";
                        }

                        StringBuilder sb = new StringBuilder();
                        // vCenter내 VM > Managed 수동풀 Floating (사용O) >> 풀생성 완료후 권한 부여
                        // Try&Catch로 진행 >> Exception확인 // Debugging시 Invoke Result확인
                        sb.AppendFormat(@"try {{New-HVPool -MANUAL -PoolName ""{0}"" -PoolDisplayName ""{1}"" -Description ""{2}"" -UserAssignment {3} -Source VIRTUAL_CENTER -VM {4} -enableHTMLAccess ${5}}}catch{{$retNewManualPool.ErrorDescription=$_.Exception.Message}}", createPool.PoolName, createPool.PoolDisplayName, createPool.Description, createPool.UserAssignment, poolvm, createPool.enableHTMLAccess);

                        #region Horizon v7.1
                        // New-HVPool -Manual -PoolName <String> [-PoolDisplayName <String>] [-Description <String>] [-AccessGroup <String>] [-GlobalEntitlement <String>] -UserAssignment <String> [-AutomaticAssignment <Boolean>] [-Enable <Boolean>] [-ConnectionServerRestrictions <String[]>] [-allowUsersToResetMachines <Boolean>] [-supportedDisplayProtocols <String[]>] [-defaultDisplayProtocol <String>] [-allowUsersToChooseProtocol <Int32>] [-enableHTMLAccess <Boolean>] [-Quality <String>] [-Throttling <String>] [-Vcenter <String>] [-TransparentPageSharingScope <String>] -Source <String> -VM <String[]> [-HvServer <Object>] [-WhatIf] [-Confirm] [<CommonParameters>]
                        // -Source(수동풀VM 소스) : 지원되는값 ('VIRTUAL_CENTER' : vCenter관리 VM) or ('UNMANAGED' : 물리적 시스템,  VM >> vCenter관리 VM XX)
                        #endregion
                        #region Horizon v7.7
                        //sb.AppendFormat(@"try {{Add-ManualPool -Pool_id ""{0}"" -Description ""{1}"" -DisplayName ""{2}"" -PowerPolicy ""{3}"" -Vc_name ""{4}"" -Id (Get-DesktopVM -name {5}).id -IsUserResetAllowed ${6} -AutoLogoffTime ""{7}"" -Persistence Persistent -FolderId / -DefaultProtocol ""{8}"" -AllowProtocolOverride ${9} -FlashQuality ""{10}"" -FlashThrottling ""{11}"" -ErrorAction Stop}}catch{{$retAddManualPool.ErrorDescription=$_.Exception.Message}}",poolIdentity, description, displayName, powerPolicy, vcenterserver, vmName, isUserResetAllowed, autoLogOffTime, defaultProtocol, allowedPorocolOverride, flashQuality, flashThrottling);
                        #endregion

                        string[] scripts = new string[3];
                        scripts[0] = "$retNewManualPool=\"\" | select ErrorDescription";
                        scripts[1] = sb.ToString();
                        Trace.WriteLine(scripts[1]);
                        scripts[2] = "$retNewManualPool";

                        for (int i = 0; i < scripts.Length; i++)
                        {
                            pPs.AddScript(scripts[i]);
                        }
                        // Success Return Value : {@ErrorDescription=}
                        result = pPs.Invoke();

                        if (result.Count == 0 || (result.Count > 0 && result[0] == null))
                        {
                            Trace.WriteLine("[CreatePool] HorizonView.CreateManualPool Failed");
                            throw new CliException(CliException.Reason.NewPool);
                        }
                        #region 권한부여
                        // ###############################################################################
                        // 사용자 권한 부여 추가 (Dedicate 일시)
                        // ###############################################################################
                        if (createPool.UserAssignment == "DEDICATED")
                        {
                            // New-HVEntitlement -User domain\username -ResourceName $pool -Type User -HvServer $vcs
                            // New-HVEntitlement -User [email protected] -ResourceName mypool
                            // New-HVEntitlement -User domain\group -ResourceName 'poolname' -Type Group
                        }
                        #endregion
                        retValue = GetResult <T>(result);
                    }
                }
            }
            catch (Exception ex)
            {
                throw new CliException(CliException.Reason.NewPool, "VMWare.HorizonView.ManualPool Exception", ex);
            }

            return(retValue);
        }
示例#5
0
        /// <summary>
        /// Full Clone Create
        /// </summary>
        /// <param name="createPool"></param>
        private T CreateFullClonePool <T>(CreatePoolModel createPool)
        {
            Collection <PSObject> result = null;
            T retValue = default(T);

            #region FullClone 기본 Process
            // # (AD 서버에 DHCP 서버구성후) DHCP > 일반 권장 구성 사항 >> 실 환경에서 고정 IP를 사용해야 하면 배포시 1. 사용자 지정규격 항목 직접 IP 설정, 2. 부팅 스크립트 설정을 통해 고정 IP를 사용
            // # OS 설치, VM Tools 설치, OS Optimizing, 기본 Profile 설정, Util 설치, Hostname 변경, 도메인 가입, View Agent 설치 작업이 완료된 Master Image를 템플릿 변환 준비
            // 01. 작업시작 Log
            // 02. 작업 정보 조회
            // 03. 풀 정보 조회
            // 04. 사용자 확인
            // 05. vCenter 연결 확인
            // 06. 네트워크 대역대 확인
            // 07. 미 할당된 VM
            // 08. VM 이름 생성 및 예약
            // 09. VM 폴더 생성
            // 10. VM 복제
            // 11. VM 기본정보
            // 12. VM 전원 On

            // Naming Method Pattern 사용 FullClone 풀 생성 (DEDICATED)
            // New-HVPool -FullClone -PoolName "FullClone" -PoolDisplayName "FullClonePra" -Description "create full clone" -UserAssignment DEDICATED -Template 'powerCLI-VM-TEMPLATE' -VmFolder 'vmware' -HostOrCluster 'CS-1' -ResourcePool 'CS-1' -Datastores 'datastore1' -NamingMethod PATTERN -NamingPattern 'FullCln1' -SysPrepName vmwarecust -CustType SYS_PREP -NetBiosName adviewdev -DomainAdmin root
            #endregion

            try
            {
                using (runSpace = RunspaceFactory.CreateRunspace())
                {
                    runSpace.Open();
                    using (PowerShell pPs = PowerShell.Create())
                    {
                        pPs.Runspace = runSpace;
                        foreach (var item in Commands)
                        {
                            pPs.AddScript(item);
                        }
                        result = pPs.Invoke();
                        if (result.Count == 0 || (result.Count > 0 && result[0] == null))
                        {
                            Trace.WriteLine("[Connect] HorizonView.Connection Failed");
                            throw new CliException(CliException.Reason.Connection);
                        }

                        string datastores = string.Empty;
                        for (int i = 0; i < createPool.Datastores.Length; i++)
                        {
                            datastores += i == 0 ? "'" + createPool.Datastores[i] + "'" : " ,'" + createPool.Datastores[i] + "'";
                        }

                        StringBuilder sb = new StringBuilder();
                        sb.AppendFormat(@"try {{New-HVPool -FullClone -PoolName ""{0}"" -PoolDisplayName ""{1}"" -Description ""{2}"" -UserAssignment {3} -Template ""{4}"" -VmFolder ""{5}"" -HostOrCluster ""{6}"" -ResourcePool ""{7}"" -Datastores {8} -NamingMethod ""{9}"" -NamingPattern ""{10}"" ", createPool.PoolName, createPool.PoolDisplayName, createPool.Description, createPool.UserAssignment, createPool.Template, createPool.VmFolder, createPool.HostOrCluster, createPool.ResourcePool, datastores, createPool.NamingMethod, createPool.NamingPattern);

                        //-SysPrepName vmwarecust               // 사용할 사용자정의 스펙 - Full,Linked Clone
                        //-CustType SYS_PREP                    // 사용할 사용자정의 유형('CLONE_PREP', 'QUICK_PREP', 'SYS_PREP', 'NONE') - Full,Linked Clone
                        //-NetBiosName namurnd                  // 도메인 NetBios Name - Full,Linked,Instant Clone
                        // ***** 도메인 관리자 이름을 넣었을때 Horizon 오류남...ㅜㅜ *****
                        // New-HVPool : 지정한 명명된 매개 변수를 사용하여 매개 변수 집합을 확인할 수 없습니다.
                        // ***********************************************************
                        sb.AppendFormat(@" -SysPrepName ""{0}"" -CustType ""{1}"" -NetBiosName ""{2}"" ", createPool.SysPrepName, createPool.CustType, createPool.NetBiosName);
                        sb.AppendFormat(@" -ErrorAction Stop}}catch{{$retFullClonePool.ErrorDescription=$_.Exception.Message}}");

                        string[] scripts = new string[3];
                        scripts[0] = "$retFullClonePool=\"\" | select ErrorDescription";
                        scripts[1] = sb.ToString();
                        Trace.WriteLine(scripts[1]);
                        scripts[2] = "$retFullClonePool";

                        for (int i = 0; i < scripts.Length; i++)
                        {
                            pPs.AddScript(scripts[i]);
                        }
                        // Success Return Value : {@ErrorDescription=}
                        result = pPs.Invoke();

                        if (result.Count == 0 || (result.Count > 0 && result[0] == null))
                        {
                            Trace.WriteLine("[CreatePool] HorizonView.CreateFullClonePool Failed");
                            throw new CliException(CliException.Reason.NewPool);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw new CliException(CliException.Reason.NewPool, "VMWare.HorizonView.FullClone Exception", ex);
            }

            #region 권한부여
            // ###############################################################################
            // 사용자 권한 부여 추가 (Dedicate 일시)
            // ###############################################################################
            if (createPool.UserAssignment == "DEDICATED")
            {
                // New-HVEntitlement -User domain\username -ResourceName $pool -Type User -HvServer $vcs
                // New-HVEntitlement -User [email protected] -ResourceName mypool
                // New-HVEntitlement -User domain\group -ResourceName 'poolname' -Type Group
            }
            #endregion
            return(retValue);
        }
示例#6
0
        /// <summary>
        /// Linked Clone Create (createPool.)
        /// </summary>
        /// <param name="createPool"></param>
        private T CreateLinkedClonePool <T>(CreatePoolModel createPool)
        {
            Collection <PSObject> result = null;
            T retValue = default(T);

            /*
             * New-HVPool -LinkedClone -PoolName 'vmwarepool' -UserAssignment FLOATING -ParentVM 'Agent_vmware' -SnapshotVM 'kb-hotfix' -VmFolder 'vmware' -HostOrCluster 'CS-1' -ResourcePool 'CS-1' -Datastores 'datastore1' -NamingMethod PATTERN -PoolDisplayName 'vmware linkedclone pool' -Description  'created linkedclone pool from ps' -EnableProvisioning $true -StopProvisioningOnError $false -NamingPattern  "vmware2" -MinReady 0 -MaximumCount 1 -SpareCount 1 -ProvisioningTime UP_FRONT -SysPrepName vmwarecust -CustType SYS_PREP -NetBiosName adviewdev -DomainAdmin root
             */
            try
            {
                using (runSpace = RunspaceFactory.CreateRunspace())
                {
                    runSpace.Open();
                    using (PowerShell pPs = PowerShell.Create())
                    {
                        pPs.Runspace = runSpace;
                        foreach (var item in Commands)
                        {
                            pPs.AddScript(item);
                        }
                        result = pPs.Invoke();
                        if (result.Count == 0 || (result.Count > 0 && result[0] == null))
                        {
                            Trace.WriteLine("[Connect] HorizonView.Connection Failed");
                            throw new CliException(CliException.Reason.Connection);
                        }

                        string datastores = string.Empty;
                        for (int i = 0; i < createPool.Datastores.Length; i++)
                        {
                            datastores += i == 0 ? "'" + createPool.Datastores[i] + "'" : " ,'" + createPool.Datastores[i] + "'";
                        }


                        StringBuilder sb = new StringBuilder();
                        // Try&Catch로 진행 >> Exception확인 // Debugging시 Invoke Result확인
                        sb.AppendFormat(@"try {{New-HVPool -LinkedClone -PoolName ""{0}"" -PoolDisplayName ""{1}"" -Description ""{2}"" -UserAssignment {3} -ParentVM ""{4}"" -SnapshotVM ""{5}"" -VmFolder ""{6}"" -HostOrCluster ""{7}"" -ResourcePool ""{8}"" -Datastores {9} -NamingMethod ""{10}"" -NamingPattern ""{11}"" ", createPool.PoolName, createPool.PoolDisplayName, createPool.Description, createPool.UserAssignment, createPool.ParentVM, createPool.SnapshotVM, createPool.VmFolder, createPool.HostOrCluster, createPool.ResourcePool, datastores, createPool.NamingMethod, createPool.NamingPattern);

                        //-EnableProvisioning $true             // 프로비저닝 사용
                        //-StopProvisioningOnError $false       // 오류시 프로비저닝 중지
                        //-RedirectWindowsProfile               // LinkedClone Floating >> false (기본값:true)
                        sb.AppendFormat(@" -EnableProvisioning ${0} -StopProvisioningOnError ${1} -RedirectWindowsProfile ${2}", createPool.EnableProvisioning, createPool.StopProvisioningOnError, createPool.RedirectWindowsProfile);

                        //-MinReady 0                           // View Composer 유지보수작업에 준비된(프로비저닝된) 시스템 최소수. (default 0) // LinkedClone
                        //-MaximumCount 1                       // 풀에있는 최대 시스템 수(default 1) - Full,Linked,Instant Clone
                        //-SpareCount 1                         // 풀에서 예비 전원이 켜진 시스템 수.(default 1)
                        sb.AppendFormat(@" -MinReady {0} -MaximumCount {1} -SpareCount {2}", createPool.MinReady, createPool.MaximumCount, createPool.SpareCount);

                        //-ProvisioningTime UP_FRONT            // 프로비저닝 시기 결정 (ON_DEMAND/UP_FRONT)
                        //-SysPrepName vmwarecust               // 사용할 사용자정의 스펙 - Full,Linked Clone
                        //-CustType SYS_PREP                    // 사용할 사용자정의 유형('CLONE_PREP', 'QUICK_PREP', 'SYS_PREP', 'NONE') - Full,Linked Clone
                        //-NetBiosName namurnd                  // 도메인 NetBios Name - Full,Linked,Instant Clone
                        //-DomainAdmin root                     // 도메인 가입시 도메인 관리자 이름 - Full,Linked,Instant Clone
                        sb.AppendFormat(@" -ProvisioningTime {0} -SysPrepName ""{1}"" -CustType ""{2}"" -NetBiosName ""{3}"" -DomainAdmin ""{4}""", createPool.ProvisioningTime, createPool.SysPrepName, createPool.CustType, createPool.NetBiosName, createPool.DomainAdmin);
                        sb.AppendFormat(@" -ErrorAction Stop}}catch{{$retLinkedClonePool.ErrorDescription=$_.Exception.Message}}");

                        string[] scripts = new string[3];
                        scripts[0] = "$retLinkedClonePool=\"\" | select ErrorDescription";
                        scripts[1] = sb.ToString();
                        Trace.WriteLine(scripts[1]);
                        scripts[2] = "$retLinkedClonePool";

                        for (int i = 0; i < scripts.Length; i++)
                        {
                            pPs.AddScript(scripts[i]);
                        }
                        // Success Return Value : {@ErrorDescription=}
                        result = pPs.Invoke();

                        if (result.Count == 0 || (result.Count > 0 && result[0] == null))
                        {
                            Trace.WriteLine("[CreatePool] HorizonView.CreateLinkedClonePool Failed");
                            throw new CliException(CliException.Reason.NewPool);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw new CliException(CliException.Reason.NewPool, "VMWare.HorizonView.LinkedClone Exception", ex);
            }

            #region 권한부여
            // ###############################################################################
            // 사용자 권한 부여 추가 (Dedicate 일시)
            // ###############################################################################
            if (createPool.UserAssignment == "DEDICATED")
            {
                // New-HVEntitlement -User domain\username -ResourceName $pool -Type User -HvServer $vcs
                // New-HVEntitlement -User [email protected] -ResourceName mypool
                // New-HVEntitlement -User domain\group -ResourceName 'poolname' -Type Group
            }
            #endregion
            return(retValue);
        }