<#
-Copyright 2014 Cloudbase Solutions Srl
+Copyright 2014, 2015 Cloudbase Solutions Srl
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
limitations under the License.
#>
+$WMI_JOB_STATUS_STARTED = 4096
+$WMI_JOB_STATE_RUNNING = 4
+$WMI_JOB_STATE_COMPLETED = 7
+
$hvassembly = [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.HyperV.PowerShell")
function Set-VMNetworkAdapterOVSPort
[Microsoft.HyperV.PowerShell.VMNetworkAdapter]$VMNetworkAdapter,
[parameter(Mandatory=$true)]
+ [ValidateLength(1, 48)]
[string]$OVSPortName
)
process
{
$ns = "root\virtualization\v2"
$EscapedId = $VMNetworkAdapter.Id.Replace('\', '\\')
+
+ $sd = gwmi -namespace $ns -class Msvm_EthernetPortAllocationSettingData -Filter "ElementName = '$OVSPortName'"
+ if($sd)
+ {
+ if($sd.InstanceId.Contains($VMNetworkAdapter.Id))
+ {
+ throw "The OVS port name '$OVSPortName' is already assigned to this port."
+ }
+ throw "Cannot assign the OVS port name '$OVSPortName' as it is already assigned to an other port."
+ }
+
$sd = gwmi -namespace $ns -class Msvm_EthernetPortAllocationSettingData -Filter "InstanceId like '$EscapedId%'"
if($sd)
$retVal = $vsms.ModifyResourceSettings(@($sd.GetText(1)))
try
{
- Check-WMIReturnValue $retVal
+ CheckWMIReturnValue $retVal
}
catch
{
}
}
-function Check-WMIReturnValue($retVal)
+function Get-VMNetworkAdapterByOVSPort
+{
+ [CmdletBinding()]
+ param
+ (
+
+ [parameter(Mandatory=$true)]
+ [ValidateLength(1, 48)]
+ [string]$OVSPortName
+ )
+ process
+ {
+ $ns = "root\virtualization\v2"
+
+ $sd = gwmi -namespace $ns -class Msvm_EthernetPortAllocationSettingData -Filter "ElementName = '$OVSPortName'"
+ if($sd)
+ {
+ return $sd
+ }
+ }
+}
+
+function Get-VMByOVSPort
+{
+ [CmdletBinding()]
+ param
+ (
+ [parameter(Mandatory=$true)]
+ [ValidateLength(1, 48)]
+ [string]$OVSPortName
+ )
+ process
+ {
+ $ns = "root\virtualization\v2"
+
+ $vms = gwmi -namespace $ns -class Msvm_VirtualSystemSettingData
+ ForEach($vm in $vms)
+ {
+ $ports = gwmi -Namespace $ns -Query "
+ Associators of {$vm} Where
+ ResultClass = Msvm_EthernetPortAllocationSettingData"
+ if ($ports.ElementName -eq $OVSPortName)
+ {
+ return $vm
+ }
+ }
+ }
+}
+
+#This function returns the Msvm_VirtualSystemSettingData given a VMName
+function Get-VMNetworkAdapterWithOVSPort
+{
+ [CmdletBinding()]
+ param
+ (
+ [parameter(Mandatory=$true)]
+ [ValidateLength(1, 1024)]
+ [string]$vmName
+ )
+ process
+ {
+ $ns = "root\virtualization\v2"
+ $vm = {}
+ $ports = {}
+
+ $vm = gwmi -namespace $ns -class Msvm_VirtualSystemSettingData -Filter "ElementName = '$VMName'"
+
+ $ports = gwmi -Namespace $ns -Query "
+ Associators of {$vm} Where
+ ResultClass = Msvm_EthernetPortAllocationSettingData"
+
+ return $ports
+ }
+}
+
+function CheckWMIReturnValue($retVal)
{
if ($retVal.ReturnValue -ne 0)
{
- if ($retVal.ReturnValue -eq 4096)
+ if ($retVal.ReturnValue -eq $WMI_JOB_STATUS_STARTED)
{
do
{
$job = [wmi]$retVal.Job
}
- while ($job.JobState -eq 4)
+ while ($job.JobState -eq $WMI_JOB_STATE_RUNNING)
- if ($job.JobState -ne 7)
+ if ($job.JobState -ne $WMI_JOB_STATE_COMPLETED)
{
- throw "Job Failed"
+ echo $job.ReturnValue
+ $errorString = "Job Failed. Job State: " + $job.JobState.ToString()
+ if ($job.__CLASS -eq "Msvm_ConcreteJob")
+ {
+ $errorString += " Error Code: " + $job.ErrorCode.ToString()
+ $errorString += " Error Details: " + $job.ErrorDescription
+ }
+ else
+ {
+ $error = $job.GetError()
+ if ($error.Error)
+ {
+ $errorString += " Error:" + $error.Error
+ }
+ }
+ throw $errorString
}
}
else
{
- throw "Job Failed"
+ throw "Job Failed. Return Value: {0}" -f $job.ReturnValue
}
}
}
+
+function Set-VMNetworkAdapterOVSPortDirect
+{
+ [CmdletBinding()]
+ param
+ (
+ [parameter(Mandatory=$true)]
+ [ValidateLength(1, 1024)]
+ [string]$vmName,
+
+ [parameter(Mandatory=$true)]
+ [ValidateLength(1, 48)]
+ [string]$OVSPortName
+ )
+ process
+ {
+ $vnic = 0
+
+ if ($vmName)
+ {
+ $vnic = Get-VMNetworkAdapter -VMName $vmName
+ }
+ # XXX the vnic index should be provided by the caller
+ $vnic[0] | Set-VMNetworkAdapterOVSPort -OVSPortName $OVSPortName
+ }
+}
+
+Export-ModuleMember -function Set-*, Get-*