]> review.fuel-infra Code Review - openstack-build/cinder-build.git/commitdiff
Update cloned volumes QoS settings.
authorJohn Griffith <john.griffith@solidfire.com>
Sat, 25 May 2013 23:52:30 +0000 (17:52 -0600)
committerJohn Griffith <john.griffith@solidfire.com>
Thu, 30 May 2013 17:00:31 +0000 (11:00 -0600)
The SolidFire device inherits all settings (including QoS) from
the parent on a clone.  This meant that although we were expecting
QoS to be updated when a clone was issued with a different Volume
Type than the parent volume it was never acted upon.

This change fixes that bug by simply adding the *new* qos settings
to the ModifyVolume call after cloning.

Fixes bug: 1184235

Change-Id: I81786a07312027d543b9f06e54dfbf57e6085bc9
(cherry picked from commit 37fa1ef51ef389ed7ac0affb1dd59ba680ca52df)

cinder/volume/drivers/solidfire.py

index cc227d847f5039889819e0014652427e913ccfe2..dc3e415899aac791ffb42ef17fde9eacf4cfde11 100644 (file)
@@ -307,27 +307,38 @@ class SolidFire(SanISCSIDriver):
         if src_project_id != v_ref['project_id']:
             sfaccount = self._create_sfaccount(v_ref['project_id'])
 
-        if 'qos' in sf_vol:
-            qos = sf_vol['qos']
-
-        attributes = {'uuid': v_ref['id'],
-                      'is_clone': 'True',
-                      'src_uuid': 'src_uuid'}
-
-        if qos:
-            for k, v in qos.items():
-                            attributes[k] = str(v)
-
         params = {'volumeID': int(sf_vol['volumeID']),
                   'name': 'UUID-%s' % v_ref['id'],
-                  'attributes': attributes,
-                  'newAccountID': sfaccount['accountID'],
-                  'qos': qos}
-
+                  'newAccountID': sfaccount['accountID']}
         data = self._issue_api_request('CloneVolume', params)
 
         if (('result' not in data) or ('volumeID' not in data['result'])):
             raise exception.SolidFireAPIDataException(data=data)
+        sf_volume_id = data['result']['volumeID']
+
+        if (self.configuration.sf_allow_tenant_qos and
+                v_ref.get('volume_metadata')is not None):
+            qos = self._set_qos_presets(v_ref)
+
+        ctxt = context.get_admin_context()
+        type_id = v_ref['volume_type_id']
+        if type_id is not None:
+            qos = self._set_qos_by_volume_type(ctxt, type_id)
+
+        # NOTE(jdg): all attributes are copied via clone, need to do an update
+        # to set any that were provided
+        params = {'volumeID': sf_volume_id}
+
+        attributes = {'uuid': v_ref['id'],
+                      'is_clone': 'True',
+                      'src_uuid': src_uuid}
+        if qos:
+            params['qos'] = qos
+            for k, v in qos.items():
+                attributes[k] = str(v)
+
+        params['attributes'] = attributes
+        data = self._issue_api_request('ModifyVolume', params)
 
         sf_volume_id = data['result']['volumeID']
         model_update = self._get_model_info(sfaccount, sf_volume_id)