Adam Litke has uploaded a new change for review.

Change subject: sdm: Move create_volume parent uuids into separate type
......................................................................

sdm: Move create_volume parent uuids into separate type

The schema defines the parent volume reference used in SDM.create_volume
as a distinct type (ParentVolumeInfo).  Implement this in the code.
Parent volume parameters are not required but if provided, both must be
defined.

Change-Id: I81aa1be73cb66ef6ca00d5b6a1997defd9aa8a48
Signed-off-by: Adam Litke <ali...@redhat.com>
---
M tests/storage_sdm_create_volume_test.py
M vdsm/storage/sdm/api/create_volume.py
2 files changed, 41 insertions(+), 18 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/30/55830/1

diff --git a/tests/storage_sdm_create_volume_test.py 
b/tests/storage_sdm_create_volume_test.py
index 079b155..af9a552 100644
--- a/tests/storage_sdm_create_volume_test.py
+++ b/tests/storage_sdm_create_volume_test.py
@@ -87,9 +87,7 @@
     return dict(sd_id=str(uuid.uuid4()), img_id=str(uuid.uuid4()),
                 vol_id=str(uuid.uuid4()), virtual_size=2048,
                 vol_format='RAW', disk_type='SYSTEM',
-                description='test vol',
-                parent_img_id=volume.BLANK_UUID,
-                parent_vol_id=volume.BLANK_UUID, initial_size='0')
+                description='test vol', initial_size='0')
 
 
 class CreateVolumeTests(VdsmTestCase):
@@ -156,23 +154,40 @@
                           storage.sdm.api.create_volume.CreateVolumeInfo, info)
 
     def test_default_parameter(self):
-        defaults = dict(
-            description='',
-            parent_img_id=volume.BLANK_UUID,
-            parent_vol_id=volume.BLANK_UUID,
-            initial_size=0
-        )
-
         info = _get_vol_info()
-        for k in defaults.iterkeys():
-            del info[k]
+        del info['description']
+        del info['initial_size']
 
         info_obj = storage.sdm.api.create_volume.CreateVolumeInfo(info)
-        for k, v in defaults.iteritems():
-            self.assertEqual(v, getattr(info_obj, k))
+        self.assertEqual('', info_obj.description)
+        self.assertEqual(0, info_obj.initial_size)
+        self.assertEqual(volume.BLANK_UUID, info_obj.parent.vol_id)
+        self.assertEqual(volume.BLANK_UUID, info_obj.parent.img_id)
 
     def test_bad_enum_value(self):
         info = _get_vol_info()
         info['vol_format'] = 'foo'
         self.assertRaises(se.InvalidParameterException,
                           storage.sdm.api.create_volume.CreateVolumeInfo, info)
+
+
+class ParentVolumeInfoTests(VdsmTestCase):
+
+    def test_no_params(self):
+        obj = storage.sdm.api.create_volume.ParentVolumeInfo({})
+        self.assertEqual(volume.BLANK_UUID, obj.vol_id)
+        self.assertEqual(volume.BLANK_UUID, obj.img_id)
+
+    def test_incomplete_params_raises(self):
+        self.assertRaises(exception.MissingParameter,
+                          storage.sdm.api.create_volume.ParentVolumeInfo,
+                          {'vol_id': 'foo'})
+        self.assertRaises(exception.MissingParameter,
+                          storage.sdm.api.create_volume.ParentVolumeInfo,
+                          {'img_id': 'foo'})
+
+    def test_complete_params(self):
+        params = {'vol_id': 'foo', 'img_id': 'bar'}
+        obj = storage.sdm.api.create_volume.ParentVolumeInfo(params)
+        for key, val in params.items():
+            self.assertEqual(val, getattr(obj, key))
diff --git a/vdsm/storage/sdm/api/create_volume.py 
b/vdsm/storage/sdm/api/create_volume.py
index a2c895a..53453c5 100644
--- a/vdsm/storage/sdm/api/create_volume.py
+++ b/vdsm/storage/sdm/api/create_volume.py
@@ -41,7 +41,7 @@
     def _run(self):
         vol_format = volume.name2type(self.vol_info.vol_format)
         self.sd_manifest.validateCreateVolumeParams(
-            vol_format, self.vol_info.parent_vol_id)
+            vol_format, self.vol_info.parent.vol_id)
 
         with self.sd_manifest.domain_lock(self.host_id):
             image_res_ns = sd.getNamespace(self.sd_manifest.sdUUID,
@@ -53,7 +53,7 @@
                 artifacts.create(
                     self.vol_info.virtual_size, vol_format,
                     self.vol_info.disk_type, self.vol_info.description,
-                    self.vol_info.parent_vol_id)
+                    self.vol_info.parent.vol_id)
                 artifacts.commit()
 
 
@@ -71,11 +71,19 @@
         self.vol_format = _enum(params, 'vol_format', vol_types)
         self.disk_type = _enum(params, 'disk_type', image.DISK_TYPES.values())
         self.description = params.get('description', '')
-        self.parent_img_id = params.get('parent_img_id', volume.BLANK_UUID)
-        self.parent_vol_id = params.get('parent_vol_id', volume.BLANK_UUID)
+        self.parent = ParentVolumeInfo(params.get('parent', {}))
         self.initial_size = params.get('initial_size', 0)
 
 
+class ParentVolumeInfo(object):
+    def __init__(self, params):
+        # The parameters are optional, but if specified both must be given
+        if ('img_id' in params) != ('vol_id' in params):
+            raise exception.MissingParameter()
+        self.img_id = params.get('img_id', volume.BLANK_UUID)
+        self.vol_id = params.get('vol_id', volume.BLANK_UUID)
+
+
 def _required(params, name):
     if name not in params:
         raise exception.MissingParameter()


-- 
To view, visit https://gerrit.ovirt.org/55830
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I81aa1be73cb66ef6ca00d5b6a1997defd9aa8a48
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Adam Litke <ali...@redhat.com>
_______________________________________________
vdsm-patches mailing list
vdsm-patches@lists.fedorahosted.org
https://lists.fedorahosted.org/mailman/listinfo/vdsm-patches

Reply via email to