add separated disk for ceph in multi-nodes virtual deploy 29/34629/2
authorAlex Yang <yangyang1@zte.com.cn>
Thu, 11 May 2017 16:08:01 +0000 (00:08 +0800)
committerAlex Yang <yangyang1@zte.com.cn>
Mon, 15 May 2017 14:44:38 +0000 (22:44 +0800)
Change-Id: Ic3f67bb889c20e95916a1052f0cfa1e238f133a8
Signed-off-by: Alex Yang <yangyang1@zte.com.cn>
deploy/config/schemas.py
deploy/config/vm_environment/zte-virtual2/deploy.yml
deploy/environment.py
deploy/libvirt_utils.py

index 52ded2b..7cc2c80 100644 (file)
@@ -13,6 +13,7 @@ from jsonschema import Draft4Validator, FormatChecker
 MIN_DAISY_DISK_SIZE = 50
 # minimal size of root_lv_size is 102400 mega-bytes
 MIN_NODE_DISK_SIZE = 110
+MIN_CEPH_DISK_SIZE = 110
 
 hosts_schema = {
     'type': 'array',
@@ -36,7 +37,8 @@ disks_schema = {
     'properties': {
         'daisy': {'type': 'integer', 'minimum': MIN_DAISY_DISK_SIZE},
         'controller': {'type': 'integer', 'minimum': MIN_NODE_DISK_SIZE},
-        'compute': {'type': 'integer', 'minimum': MIN_NODE_DISK_SIZE}
+        'compute': {'type': 'integer', 'minimum': MIN_NODE_DISK_SIZE},
+        'ceph': {'type': 'integer', 'minimum': MIN_CEPH_DISK_SIZE}
     }
 }
 
index e086e7c..646fa13 100644 (file)
@@ -19,7 +19,8 @@ disks:
   daisy: 50\r
   controller: 110\r
   compute: 110\r
+  ceph: 110\r
 daisy_passwd: 'r00tme'\r
 daisy_ip: '10.20.11.2'\r
 daisy_gateway: '10.20.11.1'\r
-ceph_disk_name: ''\r
+ceph_disk_name: '/dev/sdb'\r
index 21a0970..d18bf55 100644 (file)
@@ -13,6 +13,7 @@ import time
 
 from config.schemas import (
     MIN_NODE_DISK_SIZE,
+    MIN_CEPH_DISK_SIZE
 )
 from daisy_server import (
     DaisyServer
@@ -176,7 +177,7 @@ class VirtualEnvironment(DaisyEnvironmentBase):
 
         create_vm(template,
                   name=self.daisy_server_info['name'],
-                  disk_file=self.daisy_server_info['image'])
+                  disks=[self.daisy_server_info['image']])
 
     def create_daisy_server(self):
         self.create_daisy_server_image()
@@ -206,7 +207,16 @@ class VirtualEnvironment(DaisyEnvironmentBase):
             template = node['template']
         disk_file = path_join(self.storage_dir, name + '.qcow2')
         create_virtual_disk(disk_file, size)
-        create_vm(template, name, disk_file)
+
+        disks = [disk_file]
+        ceph_disk_name = self.deploy_struct.get('ceph_disk_name', '')
+        if ceph_disk_name and ceph_disk_name != '/dev/sda' and 'CONTROLLER_LB' in roles:
+            ceph_size = self.deploy_struct.get('disks', {}).get('ceph', MIN_CEPH_DISK_SIZE)
+            ceph_disk_file = path_join(self.storage_dir, name + '_data.qcow2')
+            create_virtual_disk(ceph_disk_file, ceph_size)
+            disks.append(ceph_disk_file)
+
+        create_vm(template, name, disks)
 
     def create_nodes(self):
         # TODO: support virtNetTemplatePath in deploy.yml
index cd20378..8c694c1 100644 (file)
@@ -10,6 +10,7 @@
 import commands
 import libvirt
 import os
+import string
 import xml.etree.ElementTree as ET
 
 from utils import (
@@ -47,13 +48,25 @@ def modify_vm_name(root, vm_name):
     name_elem.text = vm_name
 
 
-def modify_vm_disk_file(root, disk_file):
-    for disk in root.findall('./devices/disk'):
-        if 'device' in disk.attrib and disk.attrib['device'] == 'disk':
-            for source in disk.iterfind('source'):
-                if 'file' in source.attrib:
-                    source.attrib['file'] = disk_file
-                    break
+def modify_vm_disk_file(root, disks):
+    dev_list = ['hd' + ch for ch in string.ascii_lowercase]
+    devices = root.find('./devices')
+    for disk in devices.findall('disk'):
+        if disk.attrib['device'] == 'disk':
+            devices.remove(disk)
+        else:
+            target = disk.find('target')
+            dev = target.attrib['dev']
+            if dev in dev_list:
+                dev_list.remove(dev)
+
+    for disk_file in disks:
+        dev = dev_list.pop(0)
+        disk = ET.Element('disk', attrib={'device': 'disk', 'type': 'file'})
+        disk.append(ET.Element('driver', attrib={'name': 'qemu', 'type': 'qcow2'}))
+        disk.append(ET.Element('source', attrib={'file': disk_file}))
+        disk.append(ET.Element('target', attrib={'dev': dev, 'bus': 'ide'}))
+        devices.append(disk)
 
 
 def create_virtual_disk(disk_file, size):
@@ -66,16 +79,16 @@ def create_virtual_disk(disk_file, size):
         err_exit('Fail to create qemu image !')
 
 
-def create_vm(template, name=None, disk_file=None):
+def create_vm(template, name=None, disks=None):
     LI('Begin to create VM %s' % template)
 
-    if name or disk_file:
+    if name or disks:
         tree = ET.ElementTree(file=template)
         root = tree.getroot()
         if name:
             modify_vm_name(root, name)
-        if disk_file:
-            modify_vm_disk_file(root, disk_file)
+        if disks:
+            modify_vm_disk_file(root, disks)
 
         temp_file = path_join(WORKSPACE, 'tmp.xml')
         tree.write(temp_file)