so we can configure the local myplc (test_plc)
for multi-flavour nodes and slices
options is a TestMain options
+
+ details for a bonding node (like hostname and IP) are
+ computed from the underlying Substrate object and
+ stored in arg-bonding-{buildname}
"""
def __init__(self, test_plc, bonding_spec, substrate, options):
self.bonding_spec = bonding_spec
self.substrate = substrate
self.options = options
+ # a little hacky : minimal provisioning and modify plc_spec on the fly
+ self.provision()
+
def nodefamily(self):
return "{pldistro}-{fcdistro}-{arch}".format(**self.bonding_spec)
+ #################### provisioning
+ def persistent_name(self):
+ return "arg-bonding-{}".format(self.bonding_spec['buildname'])
+ def persistent_store(self):
+ with open(self.persistent_name(),'w') as f:
+ f.write("{} {}\n".format(self.vnode_hostname, self.vnode_ip))
+ def persistent_load(self):
+ try:
+ with open(self.persistent_name()) as f:
+ self.vnode_hostname, self.vnode_ip = f.read().strip().split()
+ return True
+ except:
+ return False
+
+ def provision(self):
+ # locate the first node in our own spec
+ site_spec = self.test_plc.plc_spec['sites'][0]
+ node_spec = site_spec['nodes'][0]
+ # find a free IP for node
+ if self.persistent_load():
+ print("Re-using bonding nodes attributes from {}".format(self.persistent_name()))
+ else:
+ print("Could not load bonding nodes attributes from {}".format(self.persistent_name()))
+ vnode_pool = self.substrate.vnode_pool
+ vnode_pool.sense()
+ try:
+ hostname, mac = vnode_pool.next_free()
+ self.vnode_hostname = self.substrate.fqdn(hostname)
+ self.vnode_ip = vnode_pool.get_ip(hostname)
+ self.vnode_mac = mac
+ self.persistent_store()
+ except:
+ raise Exception("Cannot provision bonding node")
+
+ # implement the node on another IP
+ node_spec['node_fields']['hostname'] = self.vnode_hostname
+ node_spec['interface_fields']['ip'] = self.vnode_ip
+ # with the node flavour that goes with bonding plc
+ for tag in ['arch', 'fcdistro', 'pldistro']:
+ node_spec['tags'][tag] = self.bonding_spec[tag]
+
+ #################### steps
def init_partial(self):
"""
runs partial-repo.sh for the bonding build
node_id = server.AddNode(userauth,
self.test_site.site_spec['site_fields']['login_base'],
self.node_spec['node_fields'])
- server.SetNodePlainBootstrapfs(userauth,
- self.node_spec['node_fields']['hostname'],
- 'YES')
# create as reinstall to avoid user confirmation
- server.UpdateNode(userauth, self.name(), {'boot_state':'reinstall'})
+ server.UpdateNode(userauth, self.name(), { 'boot_state' : 'reinstall' })
# you are supposed to make sure the tags exist
for tagname, tagvalue in self.node_spec['tags'].items():
# keep this our of the way for now
'check_vsys_defaults_ignore', SEP,
# run this first off so it's easier to re-run on another qemu box
- 'qemu_kill_mine', SEP,
- 'nodestate_reinstall', 'qemu_local_init','bootcd', 'qemu_local_config', SEP,
+ 'qemu_kill_mine', 'nodestate_reinstall', 'qemu_local_init','bootcd', 'qemu_local_config', SEP,
'qemu_clean_mine', 'qemu_export', 'qemu_start', 'qemu_timestamp', SEP,
'sfa_install_all', 'sfa_configure', 'cross_sfa_configure', 'sfa_start', 'sfa_import', SEPSFA,
'sfi_configure@1', 'sfa_register_site@1','sfa_register_pi@1', SEPSFA,
### install_rpm
def plc_install(self):
- "yum install myplc, noderepo, and the plain bootstrapfs"
-
- # workaround for getting pgsql8.2 on centos5
- if self.options.fcdistro == "centos5":
- self.run_in_guest("rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm")
+ """
+ yum install myplc, noderepo
+ plain bootstrapfs is not installed anymore
+ """
# compute nodefamily
if self.options.personality == "linux32":
pkgs_list.append("slicerepo-{}".format(nodefamily))
pkgs_list.append("myplc")
pkgs_list.append("noderepo-{}".format(nodefamily))
- pkgs_list.append("nodeimage-{}-plain".format(nodefamily))
pkgs_string=" ".join(pkgs_list)
return self.yum_install(pkgs_list)
def keys_clear_known_hosts(self): pass
def plcapi_urls(self):
+ """
+ attempts to reach the PLCAPI with various forms for the URL
+ """
return PlcapiUrlScanner(self.auth_root(), ip=self.vserverip).scan()
def speed_up_slices(self):
},
'bootmedium_options' : [ 'serial', 'no-hangcheck', 'systemd-debug' ],
# provision for bonding
- 'tags' : {},
+ 'tags' : {
+ # not needed anymore
+ # 'plain-bootstrapfs' : 'YES'
+ },
# boot cd settings
# we should have tags here instead of the hard-wired
# options set for GetBootMedium in TestNode.py