Acked-by: Alin Gabriel Serdean <[email protected]>



-----Mesaj original-----
De la: Lucian Petrut [mailto:[email protected]] 
Trimis: Wednesday, October 8, 2014 8:05 PM
Către: [email protected]
Cc: Alin Serdean; Lucian Petrut
Subiect: [PATCH] Update the WMI Script handling Hyper-V friendly port names

From: Alin Gabriel Serdean <[email protected]>

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 <[email protected]>
Tested-by: Alin Gabriel Serdean <[email protected]>
---
 datapath-windows/misc/OVS.psm1 | 88 +++++++++++++++++++++++++++++++++++++++---
 1 file changed, 83 insertions(+), 5 deletions(-)

diff --git a/datapath-windows/misc/OVS.psm1 b/datapath-windows/misc/OVS.psm1 
index 52ed3ba..b83b263 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
         }
     }
 }
--
1.9.4.msysgit.1

_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev

Reply via email to