directory structure reorganized in devops (fixing last devops commit)

This commit is contained in:
Vladimir Kozhukalov 2012-06-09 17:44:13 +04:00
parent 65d1a7d841
commit 191105d2fd
5 changed files with 262 additions and 0 deletions

4
bin/devops Executable file
View File

@ -0,0 +1,4 @@
#!/bin/sh
exec python -m devops "$@"

11
devops/libvirt_cleanup Executable file
View File

@ -0,0 +1,11 @@
#!/bin/bash
function virsh { command virsh "$@" | tail -n +3; }
function foreach { xargs --no-run-if-empty -n 1 "$@"; }
virsh list --all | awk '{print $2}' | foreach virsh destroy
virsh list --all | awk '{print $2}' | foreach virsh undefine
virsh net-list --all | awk '{print $1}' | foreach virsh net-destroy
virsh net-list --all | awk '{print $1}' | foreach virsh net-undefine

109
samples/install_admin.py Normal file
View File

@ -0,0 +1,109 @@
#!/usr/bin/env python
# vim: ts=4 sw=4
import os
import sys
import time
import shutil
from optparse import OptionParser
from devops.model import Environment, Network, Node, Disk, Cdrom, Interface
from devops.controller import Controller
from devops.network import IpNetworksPool
from devops.driver.libvirt import Libvirt
from devops.helpers import tcp_ping, wait
ADMIN_ISO_NAME = 'nailgun-ubuntu-12.04-amd64.last.iso'
ADMIN_ISO_URL = "http://mc0n1-srt.srt.mirantis.net/%s" % ADMIN_ISO_NAME
ADMIN_ISO_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', ADMIN_ISO_NAME))
def log(message):
print(message)
def download_iso():
print("Downloading installation iso")
os.system("cd '%s'; wget --timestamping '%s'" % (os.path.dirname(ADMIN_ISO_PATH), ADMIN_ISO_URL))
print("Finished downloading installation iso")
def main():
parser = OptionParser()
(options, args) = parser.parse_args()
if len(args) != 1:
print("Usage: python install_admin.py <admin_disk_path>")
sys.exit(1)
admin_disk_path = args[0]
download_iso()
environment = Environment('admin')
network = Network('default')
environment.networks.append(network)
admin_node = Node('admin')
admin_node.vnc = True
admin_node.cdrom = Cdrom(isopath=ADMIN_ISO_PATH)
admin_node.disks.append(Disk(size=8*1024**3))
admin_node.interfaces.append(Interface(network))
admin_node.boot += ['disk', 'cdrom']
environment.nodes.append(admin_node)
log("Creating environment")
controller = Controller(Libvirt())
controller.build_environment(environment)
log("Starting node")
try:
admin_node.start()
log("Node started. VNC is available at port %d" % admin_node.vnc_port)
log("Waiting node to boot")
time.sleep(10)
ip = network.ip_addresses
log("Sending user input")
admin_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=%(ipaddress)s
netcfg/get_netmask=%(netmask)s
netcfg/get_gateway=%(gateway)s
netcfg/get_nameservers=%(gateway)s
netcfg/confirm_static=true
<Enter>""" % { 'ipaddress': ip[2], 'netmask': ip.netmask, 'gateway': ip[1] })
log("Waiting for node to install")
wait(lambda: tcp_ping(ip[2], 22))
log("Stopping node")
admin_node.stop()
log("Copying node's disk image")
shutil.copy(admin_node.disks[0].path, admin_disk_path)
print("Admin image creation completed. Image is stored at %s" % admin_disk_path)
log("Destroying environment")
controller.destroy_environment(environment)
except:
log("Error occurred, leaving environment for inspection")
raise
if __name__ == '__main__':
main()

View File

@ -0,0 +1,42 @@
import unittest
import devops
from devops.helpers import wait, TimeoutError
import time
ISO_URL = 'http://mc0n1-srt.srt.mirantis.net/livecd.iso'
class TestNodeIpAddress(unittest.TestCase):
def setUp(self):
self.env = devops.load("""
networks:
- network: net1
dhcp_server: True
nodes:
- node: foo
networks: net1
cdrom: '%s'
vnc: True
""" % ISO_URL)
devops.build(self.env)
def tearDown(self):
devops.destroy(self.env)
def test_ip_address_detection(self):
node = self.env.nodes[0]
network = self.env.networks[0]
node.start()
# Wait for ISOLINUX to boot
time.sleep(10)
# Trigger ISOLINUX menu selection
node.send_keys('<Enter>')
try:
wait(lambda: len(node.ip_addresses) > 0, timeout=60)
except TimeoutError:
self.fail("Node didn't get ip_address in specified amount of time")
self.assertEqual(node.ip_address, node.ip_addresses[0])
self.assertTrue(node.ip_address in network.ip_addresses)

96
samples/run.py Normal file
View File

@ -0,0 +1,96 @@
import time
import devops
from devops.helpers import wait, tcp_ping
import logging
MASTER_AND_SLAVE_CONFIG = """
name: 'Sample environment'
networks:
- network: internal
- network: external
nodes:
- node: master
disk: '5Gb'
cdrom: http://mc0n1-srt.srt.mirantis.net/nailgun-ubuntu-12.04-amd64.last.iso
networks: ['external', 'internal']
vnc: True
- node: slave
networks: ['internal']
vnc: True
"""
def main():
logging.basicConfig(level=logging.WARN)
logger = logging.getLogger('test.integration')
logger.setLevel(logging.INFO)
environment = devops.load(MASTER_AND_SLAVE_CONFIG)
logger.info("Building environment")
devops.build(environment)
logger.info("Environment ready")
try:
external_network = environment.network['external']
master_node = environment.node['master']
slave_node = environment.node['slave']
logger.info("Starting master node")
master_node.start()
logger.info("VNC to master is available on %d" % master_node.vnc_port)
logger.info("Waiting master node to boot")
time.sleep(15)
logger.info("Sending user input")
ip = external_network.ip_addresses
host_ip = ip[1]
master_ip = ip[2]
netmask = ip.netmask
master_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=%s
netcfg/get_netmask=%s
netcfg/get_gateway=%s
netcfg/get_nameservers=%s
netcfg/confirm_static=true
<Enter>""" % (master_ip, netmask, host_ip, host_ip))
logger.info("Finished sending user input")
logger.info("Waiting master node to install")
wait(lambda: tcp_ping(master_ip, 22))
logger.info("Starting slave node")
slave_node.start()
logger.info("VNC to slave node at port %d" % slave_node.vnc_port)
logger.info("Waiting slave node to configure network")
wait(lambda: len(slave_node.ip_addresses) > 0, timeout=120)
logger.info("Slave node has IP address %s" % slave_node.ip_addresses[0])
except:
devops.save(environment)
logger.warn("Environment has been saved as %s" % environment.id)
raise
if __name__ == '__main__':
main()