fuel-main/devops/samples/install_admin.py
2012-09-12 17:43:43 +04:00

116 lines
2.8 KiB
Python

#!/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()