kvm recipe : begin refactor

parent 36e23d39
...@@ -37,14 +37,29 @@ import pkg_resources ...@@ -37,14 +37,29 @@ import pkg_resources
class Recipe(BaseSlapRecipe): class Recipe(BaseSlapRecipe):
def _install(self): def _install(self):
self.path_list = []
kvm_conf = self.installKvm(vnc_ip = self.getLocalIPv4Address())
vnc_port = 5900 + kvm_conf['vnc_display']
novnc_conf = self.installNovnc(source_ip = self.getGlobalIPv6Address(),
source_port = 6080,
target_ip = kvm_conf['vnc_ip'],
target_port = vnc_port)
self.linkBinary()
self.computer_partition.setConnectionDict(dict(
vnc_connection_string = "vnc://[%s]:%s" % (vnc_port['vnc_ip'],
vnc_port),
vnc_password = vnc_passwd,
))
return self.path_list
#Get the IP list def installKvm(self, vnc_ip):
kvm_conf = dict(vnc_ip = vnc_ip)
connection_found = False connection_found = False
proxy_ip = self.getGlobalIPv6Address()
proxy_port = 6080
vnc_ip = self.getLocalIPv4Address()
vnc_port = 5901
for tap_interface, dummy in self.parameter_dict['ip_list']: for tap_interface, dummy in self.parameter_dict['ip_list']:
# Get an ip associated to a tap interface # Get an ip associated to a tap interface
if tap_interface: if tap_interface:
...@@ -52,21 +67,26 @@ class Recipe(BaseSlapRecipe): ...@@ -52,21 +67,26 @@ class Recipe(BaseSlapRecipe):
if not connection_found: if not connection_found:
raise NotImplementedError("Do not support ip without tap interface") raise NotImplementedError("Do not support ip without tap interface")
kvm_conf['tap_interface'] = tap_interface
# Disk path # Disk path
disk_path = os.path.join(self.data_root_directory, 'virtual.qcow2') kvm_conf['disk_path'] = os.path.join(self.data_root_directory,
socket_path = os.path.join(self.var_directory, 'qmp_socket') 'virtual.qcow2')
kvm_conf['socket_path'] = os.path.join(self.var_directory, 'qmp_socket')
# XXX Weak password # XXX Weak password
##XXX -Vivien: add an option to generate one password for all instances and/or to input it yourself ##XXX -Vivien: add an option to generate one password for all instances
vnc_passwd = binascii.hexlify(os.urandom(4)) # and/or to input it yourself
kvm_conf['vnc_passwd'] = binascii.hexlify(os.urandom(4))
#XXX pid_file path, database_path, path to python binary and xml path #XXX pid_file path, database_path, path to python binary and xml path
pid_file_path = os.path.join(self.run_directory, 'pid_file') kvm_conf['pid_file_path'] = os.path.join(self.run_directory, 'pid_file')
database_path = os.path.join(self.data_root_directory, 'slapmonitor_database') kvm_conf['database_path'] = os.path.join(self.data_root_directory,
python_path = sys.executable 'slapmonitor_database')
kvm_conf['python_path'] = sys.executable
#xml_path = os.path.join(self.var_directory, 'slapreport.xml' ) #xml_path = os.path.join(self.var_directory, 'slapreport.xml' )
# Create disk if needed # Create disk if needed
if not os.path.exists(disk_path): if not os.path.exists(kvm_conf['disk_path']):
retcode = subprocess.call(["%s create -f qcow2 %s %iG" % ( retcode = subprocess.call(["%s create -f qcow2 %s %iG" % (
self.options['qemu_img_path'], disk_path, self.options['qemu_img_path'], disk_path,
int(self.options['disk_size']))], shell=True) int(self.options['disk_size']))], shell=True)
...@@ -74,41 +94,44 @@ class Recipe(BaseSlapRecipe): ...@@ -74,41 +94,44 @@ class Recipe(BaseSlapRecipe):
raise OSError, "Disk creation failed!" raise OSError, "Disk creation failed!"
# Options nbd_ip and nbd_port are provided by slapos master # Options nbd_ip and nbd_port are provided by slapos master
nbd_ip = self.parameter_dict['nbd_ip'] kvm_conf['nbd_ip'] = self.parameter_dict['nbd_ip']
nbd_port = self.parameter_dict['nbd_port'] kvm_conf['nbd_port'] = self.parameter_dict['nbd_port']
# First octet has to represent a locally administered address # First octet has to represent a locally administered address
octet_list = [254] + [random.randint(0x00, 0xff) for x in range(5)] octet_list = [254] + [random.randint(0x00, 0xff) for x in range(5)]
mac_address = ':'.join(['%02x' % x for x in octet_list]) kvm_conf['mac_address'] = ':'.join(['%02x' % x for x in octet_list])
hostname = "slaposkvm"
#raise NotImplementedError("%s" % self.parameter_dict) kvm_conf['hostname'] = "slaposkvm"
self.computer_partition.setConnectionDict(dict(
vnc_connection_string = "vnc://[%s]:1" % vnc_ip,
vnc_password = vnc_passwd,
))
# Instanciate KVM # Instanciate KVM
kvm_runner_path = self.instanciate("kvm", [vnc_ip, tap_interface, nbd_ip, nbd_port, pid_file_path, disk_path, mac_address, socket_path, hostname]) kvm_runner_path = self.instanciate("kvm", kvm_conf)
self.path_list.append(kvm_runner_path)
# Instanciate KVM controller # Instanciate KVM controller
kvm_controller_runner_path = self.instanciate("kvm_controller", [socket_path, vnc_passwd, python_path]) kvm_controller_runner_path = self.instanciate("kvm_controller", kvm_conf)
#XXX Instanciate Slapmonitor self.path_list.append(kvm_controller_runner_path)
##slapmonitor_runner_path = self.instanciate("slapmonitor", [database_path, pid_file_path, python_path]) # Instanciate Slapmonitor
#XXX Instanciate Slapreport ##slapmonitor_runner_path = self.instanciate("slapmonitor",
##slapreport_runner_path = self.instanciate("slapreport", [database_path, python_path]) # [database_path, pid_file_path, python_path])
#XXX Instanciate Websockify # Instanciate Slapreport
websockify_runner_path = self.instanciate("websockify", [python_path, vnc_ip, proxy_ip, vnc_port, proxy_port]) ##slapreport_runner_path = self.instanciate("slapreport",
# [database_path, python_path])
kvm_conf['vnc_display'] = 1
return kvm_conf
def installNoVnc(self, source_ip, source_port, target_ip, target_port):
# Instanciate Websockify
websockify_runner_path = self.instanciate("websockify",
[python_path, vnc_ip, proxy_ip, vnc_port, proxy_port])
self.path_list.append(websockify_runner_path)
return [kvm_runner_path, kvm_controller_runner_path, websockify_runner_path]
def instanciate(self, name, list): def instanciate(self, name, list):
""" """
Define the path to the wrapper of the thing you are instanciating Define the path to the wrapper of the thing you are instanciating
Parameters : name of what you are instanciating, list of arguments for the configuration dictionnary of the wrapper Parameters : name of what you are instanciating, list of arguments for the
configuration dictionnary of the wrapper
Returns : path to the running wrapper Returns : path to the running wrapper
""" """
...@@ -126,3 +149,25 @@ class Recipe(BaseSlapRecipe): ...@@ -126,3 +149,25 @@ class Recipe(BaseSlapRecipe):
self.substituteTemplate(name_wrapper_template_location, name_config)) self.substituteTemplate(name_wrapper_template_location, name_config))
return name_runner_path return name_runner_path
def linkBinary(self):
"""Links binaries to instance's bin directory for easier exposal"""
for linkline in self.options.get('link_binary_list', '').splitlines():
if not linkline:
continue
target = linkline.split()
if len(target) == 1:
target = target[0]
path, linkname = os.path.split(target)
else:
linkname = target[1]
target = target[0]
link = os.path.join(self.bin_directory, linkname)
if os.path.lexists(link):
if not os.path.islink(link):
raise zc.buildout.UserError(
'Target link already %r exists but it is not link' % link)
os.unlink(link)
os.symlink(target, link)
self.logger.debug('Created link %r -> %r' % (link, target))
self.path_list.append(link)
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment