Adding boot-policy reconfiguration
[releng.git] / utils / lab-reconfiguration / reconfigUcsNet.py
index 282eca0..01c4b83 100755 (executable)
@@ -34,6 +34,8 @@ import time
 from UcsSdk import *
 from collections import defaultdict
 
+POD_PREFIX = "POD-2"
+INSTALLER = "POD-21"
 
 def getpassword(prompt):
     if platform.system() == "Linux":
@@ -51,15 +53,32 @@ def get_servers(handle=None):
     orgObj = handle.GetManagedObject(None, OrgOrg.ClassId(), {OrgOrg.DN : "org-root"})[0]
     servers = handle.GetManagedObject(orgObj, LsServer.ClassId())
     for server in servers:
-        if server.Type == 'instance' and "POD-2" in server.Dn:
+        if server.Type == 'instance' and POD_PREFIX in server.Dn:
             yield server
 
 
+def set_boot_policy(handle=None, server=None, policy=None):
+    """
+    Modify Boot policy of server
+    """
+    obj = handle.GetManagedObject(None, LsServer.ClassId(), {
+            LsServer.DN: server.Dn})
+    handle.SetManagedObject(obj, LsServer.ClassId(), {
+            LsServer.BOOT_POLICY_NAME: policy} )
+    print " Configured boot policy: {}".format(policy)
+
+
 def ack_pending(handle=None, server=None):
     """
     Acknowledge pending state of server
     """
-    handle.AddManagedObject(server, LsmaintAck.ClassId(), {LsmaintAck.DN: server.Dn + "/ack", LsmaintAck.DESCR:"", LsmaintAck.ADMIN_STATE:"trigger-immediate", LsmaintAck.SCHEDULER:"", LsmaintAck.POLICY_OWNER:"local"}, True)
+    handle.AddManagedObject(server, LsmaintAck.ClassId(), {
+            LsmaintAck.DN: server.Dn + "/ack",
+            LsmaintAck.DESCR:"",
+            LsmaintAck.ADMIN_STATE:"trigger-immediate",
+            LsmaintAck.SCHEDULER:"",
+            LsmaintAck.POLICY_OWNER:"local"}, True)
+    print " Pending-reboot -> Acknowledged."
 
 
 def get_vnics(handle=None, server=None):
@@ -78,6 +97,7 @@ def get_network_config(handle=None):
     print " d - default, t - tagged"
     for server in get_servers(handle):
         print ' {}'.format(server.Name)
+        print '  Boot policy: {}'.format(server.OperBootPolicyName)
         for vnic in get_vnics(handle, server):
             print '  {}'.format(vnic.Name)
             print '   {}'.format(vnic.Addr)
@@ -134,10 +154,14 @@ def set_network(handle=None, yamlFile=None):
     """
     # add interfaces and bind them with vNIC templates
     print "\nRECONFIGURING VNICs..."
-    network = read_yaml_file(yamlFile)
+    pod_data = read_yaml_file(yamlFile)
+    network = pod_data['network']
+
     for index, server in enumerate(get_servers(handle)):
+        # Assign template to interface
         for iface, data in network.iteritems():
             add_interface(handle, server.Dn, iface, data['template'], data['order'], data['mac-list'][index])
+
         # Remove other interfaces which have not assigned required vnic template
         vnics = get_vnics(handle, server)
         for vnic in vnics:
@@ -145,6 +169,10 @@ def set_network(handle=None, yamlFile=None):
                 remove_interface(handle, vnic.Dn)
                 print "  {} removed, template: {}".format(vnic.Name, vnic.OperNwTemplName)
 
+        # Set boot policy template
+        if not INSTALLER in server.Dn:
+            set_boot_policy(handle, server, pod_data['boot-policy'])
+
 
 if __name__ == "__main__":
     # Latest urllib2 validate certs by default
@@ -180,26 +208,22 @@ if __name__ == "__main__":
         # Change vnic template if specified in cli option
         if (options.yamlFile != None):
             set_network(handle, options.yamlFile)
-
-        time.sleep(3)
-
-        print "\nCheck if acknowledge is needed..."
-        for server in get_servers(handle):
-            print " {}: {}".format(server.Dn, server.OperState)
-            if server.OperState == "pending-reboot":
-                ack_pending(handle,server)
-                print " Acknowledged."
+            time.sleep(5)
 
         print "\nWait until Overall Status of all nodes is OK..."
-        timeout = time.time() + 60*5   #5 minutes timeout
+        timeout = time.time() + 60*10   #10 minutes timeout
         while True:
             list_of_states = []
             for server in get_servers(handle):
+                if server.OperState == "pending-reboot":
+                    ack_pending(handle,server)
                 list_of_states.append(server.OperState)
-            print " {}".format(list_of_states)
-            if all(state == "ok" for state in list_of_states) or time.time() > timeout:
+            print " {}, {} seconds remains.".format(list_of_states, round(timeout-time.time()))
+            if all(state == "ok" for state in list_of_states):
                 break
-            time.sleep(2)
+            if time.time() > timeout:
+                raise Exception("Timeout reached while waiting for OK status.")
+            time.sleep(5)
 
         # Show current vnic MACs and VLANs
         get_network_config(handle)