summaryrefslogtreecommitdiff
path: root/datapath-windows/misc
diff options
context:
space:
mode:
authorLucian Petrut <lpetrut@cloudbasesolutions.com>2014-10-08 20:05:02 +0300
committerBen Pfaff <blp@nicira.com>2014-10-08 10:51:31 -0700
commit8d0ba416d45a2bd679d4677ba636f6f769cd9cf3 (patch)
treefba702630fa9011e7f92e1fdca689fd7314b8243 /datapath-windows/misc
parentef31e854e70134a051cb12ab7daa46ba72e25b88 (diff)
downloadopenvswitch-8d0ba416d45a2bd679d4677ba636f6f769cd9cf3.tar.gz
Update the WMI Script handling Hyper-V friendly port names
This patch ensures that the friendly port name has no more than 16 characters and also if it is not in use. The method which checks the WMI jobs has been updated in order to provide relevant error codes/descriptions. Methods retrieving the according VM and VM network adapter mapped to an OVS port have been added as well. They are called: Get-VMNetworkAdapterByOVSPort Get-VMByOVSPort Example of usage: 2 import-module .\OVS.psm1 3 $vnic = Get-VMNetworkAdapter test_2_1 4 $vnic[0] | Set-VMNetworkAdapterOVSPort -OVSPortName ovs-port-1 5 $vnic[1] | Set-VMNetworkAdapterOVSPort -OVSPortName ovs-port-1 6 $vnic[0] | Set-VMNetworkAdapterOVSPort -OVSPortName ovs-port-2 7 $vnic[1] | Set-VMNetworkAdapterOVSPort -OVSPortName ovs-port-1 8 Get-VMNetworkAdapterByOVSPort ovs-port-1 9 Get-VMByOVSPort ovs-port-2 Signed-off-by: Lucian Petrut <lpetrut@cloudbasesolutions.com> Tested-by: Alin Gabriel Serdean <aserdean@cloudbasesolutions.com> Acked-by: Alin Gabriel Serdean <aserdean@cloudbasesolutions.com> Signed-off-by: Ben Pfaff <blp@nicira.com>
Diffstat (limited to 'datapath-windows/misc')
-rw-r--r--datapath-windows/misc/OVS.psm188
1 files changed, 83 insertions, 5 deletions
diff --git a/datapath-windows/misc/OVS.psm1 b/datapath-windows/misc/OVS.psm1
index 52ed3ba0b..b83b26314 100644
--- a/datapath-windows/misc/OVS.psm1
+++ b/datapath-windows/misc/OVS.psm1
@@ -14,6 +14,10 @@ See the License for the specific language governing permissions and
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
@@ -25,12 +29,23 @@ function Set-VMNetworkAdapterOVSPort
[Microsoft.HyperV.PowerShell.VMNetworkAdapter]$VMNetworkAdapter,
[parameter(Mandatory=$true)]
+ [ValidateLength(1, 16)]
[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)
@@ -51,26 +66,89 @@ function Set-VMNetworkAdapterOVSPort
}
}
+function Get-VMNetworkAdapterByOVSPort
+{
+ [CmdletBinding()]
+ param
+ (
+
+ [parameter(Mandatory=$true)]
+ [ValidateLength(1, 16)]
+ [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, 16)]
+ [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
+ }
+ }
+ }
+}
+
function Check-WMIReturnValue($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
}
}
}