# assignVmsToCloud.ps1
# version 0.02
# The following function assigns a guest VM into a 'cloud' in Virtual Machine Manager

#$vmNames=Get-Content ~\Desktop\computernames.txt
$vmsList=@'
TESTVM1
TESTVM2
'@
$cloudsList=@(
	'DEV'
	'QA'
	'Stage'
	'Prod'	
)
$rolesList=@('Dev Admins','QA Admins','Stage Admins','Prod Admins')
$vmmServer=$env:computername

function assignVMsToCloud{
	param(
		$vmNames='testVm',
		$cloudsList=@('Dev','QA','Stage','Prod'),
		$rolesList=@('Dev Admins','QA Admins','Stage Admins','Prod Admins'),
        $vmmServer='localhost'
	)

	function assignVmToCloud{
		param(
			$vmName='testVm',
			$cloudAssign='Test',
			$roleName='Administrators',
			$vmmServer='localhost'
		)
		$ErrorActionPreference='Stop'
		try{
			$null=import-module virtualmachinemanager
			$vm=Get-SCVirtualMachine -Name $vmName -VMMServer $vmmServer
			$cloud=Get-SCCloud -Name $cloudAssign -VMMServer $vmmServer
			$userRole=Get-SCUserRole -Name $roleName -VMMServer $vmmServer
			$jobGroup=[System.Guid]::NewGuid().Guid
			if(!$vm){
				write-warning "Unable to find VM named $vmName on VMM Server $vmmServer"
				return $false
			}else{
				if($vm.Cloud.Name -eq $cloudAssign){
					write-host "$vmName has already been assigned to Cloud $cloudAssign"
				}else{
					$null=Set-SCVirtualMachine -VM $vm -Cloud $cloud
				}			
				$null=Set-SCUserRoleQuota -Cloud $cloud -JobGroup $jobGroup
				$null=Set-SCUserRoleQuota -Cloud $cloud -JobGroup $jobGroup -QuotaPerUser
				$null=Add-SCUserRolePermission -Cloud $cloud -JobGroup $jobGroup -AllowLocalAdmin -Checkpoint -CheckpointRestoreOnly -DeployFromTemplateOnly -Deploy -DeployShielded -PauseAndResume -RemoteConnect -Remove -Save -Shutdown -Start -Stop -Store -ManageAzureProfiles
				$null=Grant-SCResource -Resource $vm -JobGroup $jobGroup
				$null=Set-SCUserRole -UserRole $userRole -JobGroup $jobGroup
				$vm=Get-SCVirtualMachine -VMMServer $vmmServer -Name $vmName
				if($vm.Cloud.Name -eq $cloudAssign){
					write-host "$vmName has been assigned to Cloud $cloudAssign successfully" -ForegroundColor Green
					return $true
				}else{
					write-host "$vmName has NOT been assigned to Cloud $cloudAssign" -ForegroundColor Red
					return $false
				}
			}
		}catch{
			write-warning $_
			return $false
		}
	}

	function pickItem($list){
		do {
			try {
				$flag = $true
				clear-host
				for($i=0;$i -lt $list.count; $i++){
					write-host "$i`: $(($list[$i]|out-string))"
				}
				[int]$pick=Read-Host -Prompt "`n--------------------------------------------------------`nPlease type the number corresponding to the desired item`n--------------------------------------------------------"
			}catch{
				$flag = $false
			}
			}
		until ($pick -lt $list.count -and $pick -ge 0 -and $flag)
		$pickIndex=$pick
		$pickedItem=$list[$pickIndex]
		clear-host
		write-host "Selected item:`n--------------------------------------------------------`n$($pickedItem|out-string)"
		return $pickedItem
	}

	$cloudAssign=pickItem $cloudsList
	$roleName=pickItem $rolesList
	if($vmnames){
		$results=[hashtable]@{}
		foreach($vmname in $vmNames){
			$result=assignVmToCloud $vmName $cloudAssign $roleName $vmmServer
			$results+=@{$vmName=$result}
		}
	}else{
		write-warning "`$vmNames variable is empty - cannot proceed."
	}
	return $results
}

$vmNames=@($vmsList -split "`n" -replace "\..*$")
assignVMsToCloud $vmNames $cloudsList $rolesList $vmmServer
# assignVmsToCloud.ps1
# version 0.01
# The following function assigns a guest VM into a 'cloud' in Virtual Machine Manager

$vmNames=@(
	'guest-vm1',
	'guest-vm2',
	'guest-vm3'
)
$cloudAssign='DEV'
$vmmServer=$env:computername
$roleName='Developers'

function assignVmsToCloud{
	param(
		$vmName='testVm',
		$cloudAssign='Test',
		$roleName='Administrators',
        $vmmServer='localhost'
	)
	$ErrorActionPreference='Stop'
	try{
        $null=import-module virtualmachinemanager
		$vm=Get-SCVirtualMachine -Name $vmName -VMMServer $vmmServer
		$cloud=Get-SCCloud -Name $cloudAssign -VMMServer $vmmServer
		$userRole=Get-SCUserRole -Name $roleName -VMMServer $vmmServer
		$jobGroup=[System.Guid]::NewGuid().Guid
        if(!$vm){
            write-warning "Unable to find VM named $vmName on VMM Server $vmmServer"
            return $false
        }elseif($vm.Cloud.Name -eq $cloudAssign){
			write-host "$vmName has already been assigned to Cloud $cloudAssign" -ForegroundColor Green
			return $true
		}else{	
			$null=Set-SCVirtualMachine -VM $vm -Cloud $cloud
			$null=Set-SCUserRoleQuota -Cloud $cloud -JobGroup $jobGroup
			$null=Set-SCUserRoleQuota -Cloud $cloud -JobGroup $jobGroup -QuotaPerUser
			$null=Add-SCUserRolePermission -Cloud $cloud -JobGroup $jobGroup -AllowLocalAdmin -Checkpoint -CheckpointRestoreOnly -DeployFromTemplateOnly -Deploy -DeployShielded -PauseAndResume -RemoteConnect -Remove -Save -Shutdown -Start -Stop -Store -ManageAzureProfiles
			$null=Grant-SCResource -Resource $vm -JobGroup $jobGroup
			$null=Set-SCUserRole -UserRole $userRole -JobGroup $jobGroup
			$vm=Get-SCVirtualMachine -VMMServer $vmmServer -Name $vmName
			if($vm.Cloud.Name -eq $cloudAssign){
				write-host "$vmName has been assigned to Cloud $cloudAssign successfully" -ForegroundColor Green
				return $true
			}else{
				write-host "$vmName has NOT been assigned to Cloud $cloudAssign" -ForegroundColor Red
				return $false
			}
		}
	}catch{
		write-warning $_
		return $false
	}
}

######## Set VM as defined ########
$results=[hashtable]@{}
foreach($vmname in $vmNames){
    $result=assignVmsToCloud $vmName $cloudAssign $roleName $vmmServer
	$results+=@{$vmName=$result}
}
######## Dynamically Gather VM by Keywords and assign to cloud ########
$keyword='stg'
$cloudAssign='STAGE'
$vms=.{$null=import-module virtualmachinemanager;get-vm}
$targetVms=$vms.Name|?{$_ -like "*$keyword*"}

$results=[hashtable]@{}
foreach($vmName in $targetVms){
    $result=assignVmsToCloud $vmName $cloudAssign $roleName $vmmServer
	$results+=@{$vmName=$result}
}