fuel-main/test/integration/__init__.py
2012-08-28 18:49:37 +04:00

148 lines
5.0 KiB
Python

import time, os
from devops.model import Environment, Network, Node, Disk, Cdrom, Interface
from devops.helpers import tcp_ping, wait
import traceback
import logging
import devops
logger = logging.getLogger('integration')
class Ci(object):
hostname = 'nailgun'
domain = 'mirantis.com'
installation_timeout = 1800
chef_timeout = 600
def __init__(self, cache_file=None, iso=None):
self.environment_cache_file = cache_file
self.iso = iso
self.environment = None
if self.environment_cache_file and os.path.exists(self.environment_cache_file):
logger.info("Loading existing integration environment...")
with file(self.environment_cache_file) as f:
environment_id = f.read()
try:
self.environment = devops.load(environment_id)
logger.info("Successfully loaded existing environment")
except Exception, e:
logger.error("Failed to load existing integration environment: " + str(e) + "\n" + traceback.format_exc())
pass
def setup_environment(self):
if self.environment:
return True
if not self.iso:
logger.critical("ISO path missing while trying to build integration environment")
return False
logger.info("Building integration environment")
try:
environment = Environment('integration')
network = Network('default')
environment.networks.append(network)
node = Node('admin')
node.memory = 2048
node.vnc = True
node.disks.append(Disk(size=30*1024**3))
node.interfaces.append(Interface(network))
node.cdrom = Cdrom(isopath=self.iso)
node.boot = ['disk', 'cdrom']
environment.nodes.append(node)
node2 = Node('slave')
node2.memory = 2048
node2.vnc = True
node2.disks.append(Disk(size=30*1024**3))
node2.interfaces.append(Interface(network))
node2.boot = ['network']
environment.nodes.append(node2)
devops.build(environment)
except Exception, e:
logger.error("Failed to build environment: %s\n%s" % (str(e), traceback.format_exc()))
return False
self.environment = environment
try:
node.interfaces[0].ip_addresses = network.ip_addresses[2]
logger.info("Starting admin node")
node.start()
logger.info("Waiting admin node installation software to boot")
# todo await
time.sleep(10)
logger.info("Executing admin node software installation")
node.send_keys("""<Esc><Enter>
<Wait>
/install/vmlinuz initrd=/install/initrd.gz
priority=critical
locale=en_US
file=/cdrom/preseed/manual.seed
vga=788
netcfg/get_ipaddress=%(ip)s
netcfg/get_netmask=%(mask)s
netcfg/get_gateway=%(gw)s
netcfg/get_nameservers=%(gw)s
netcfg/confirm_static=true
netcfg/get_hostname=%(hostname)s
netcfg/get_domai=%(domain)s
<Enter>
""" % { 'ip': node.ip_address,
'mask': network.ip_addresses.netmask,
'gw': network.ip_addresses[1],
'hostname': self.hostname,
'domain': self.domain})
logger.info("Waiting for completion of admin node software installation")
wait(lambda: tcp_ping(node.ip_address, 22), timeout=self.installation_timeout)
logger.info("Got SSH access to admin node, waiting for ports 80 and 8000 to open")
wait(lambda: tcp_ping(node.ip_address, 80) and tcp_ping(node.ip_address, 8000), timeout=self.chef_timeout)
logger.info("Admin node software is installed and ready for use")
devops.save(self.environment)
try:
os.makedirs(os.path.dirname(self.environment_cache_file))
except OSError as e:
logger.warning("Error occured while creating directory: %s", os.path.dirname(self.environment_cache_file))
with file(self.environment_cache_file, 'w') as f:
f.write(self.environment.id)
logger.info("Environment has been saved")
except Exception, e:
devops.save(self.environment)
cache_file = self.environment_cache_file + '.candidate'
try:
os.makedirs(os.path.dirname(cache_file))
except OSError:
logger.warning("Exception occured while making directory: %s" % os.path.dirname(cache_file))
with file(cache_file, 'w') as f:
f.write(self.environment.id)
logger.error("Failed to build environment. Candidate environment cache file is %s" % cache_file)
return False
return True
def destroy_environment(self):
if self.environment:
devops.destroy(self.environment)
if self.environment_cache_file and os.path.exists(self.environment_cache_file):
os.remove(self.environment_cache_file)
return True
ci = None