import optparse
import platform
import yaml
+import time
from UcsSdk import *
from collections import defaultdict
+POD_PREFIX = "POD-2"
+INSTALLER = "POD-21"
def getpassword(prompt):
if platform.system() == "Linux":
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)
+ print " Pending-reboot -> Acknowledged."
+
+
def get_vnics(handle=None, server=None):
"""
Return list of vnics for given server
Print current network config
"""
print "\nCURRENT NETWORK CONFIG:"
+ 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)
vnicIfs = handle.ConfigResolveChildren(VnicEtherIf.ClassId(), vnic.Dn, None, YesOrNo.TRUE)
for vnicIf in vnicIfs.OutConfigs.GetChild():
- print ' Vlan: {}'.format(vnicIf.Vnet)
+ if vnicIf.DefaultNet == 'yes':
+ print ' Vlan: {}d'.format(vnicIf.Vnet)
+ else:
+ print ' Vlan: {}t'.format(vnicIf.Vnet)
-def add_interface(handle=None, lsServerDn=None, vnicEther=None, templName=None, order=None):
+def add_interface(handle=None, lsServerDn=None, vnicEther=None, templName=None, order=None, macAddr=None):
"""
Add interface to server specified by server.DN name
"""
VnicEther.ORDER: order,
"adminHostPort": "ANY",
VnicEther.ADMIN_VCON: "any",
+ VnicEther.ADDR: macAddr,
VnicEther.NW_TEMPL_NAME: templName,
VnicEther.MTU: "1500"}
handle.AddManagedObject(obj, VnicEther.ClassId(), params, True)
Configure VLANs on POD according specified network
"""
# add interfaces and bind them with vNIC templates
- # TODO: make sure MAC address for admin is still same
print "\nRECONFIGURING VNICs..."
- network = read_yaml_file(yamlFile)
- for server in get_servers(handle):
+ 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'])
+ 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:
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
handle.Login(options.ip, options.userName, options.password)
+ # Change vnic template if specified in cli option
if (options.yamlFile != None):
- print options.yamlFile
set_network(handle, options.yamlFile)
+ time.sleep(5)
+
+ print "\nWait until Overall Status of all nodes is OK..."
+ 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 " {}, {} seconds remains.".format(list_of_states, round(timeout-time.time()))
+ if all(state == "ok" for state in list_of_states):
+ break
+ 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)
handle.Logout()