From 46f1e0a129b8165a21a23e8e45c9021680f2382f Mon Sep 17 00:00:00 2001 From: John Griffith Date: Sat, 25 May 2013 17:52:30 -0600 Subject: [PATCH] Update cloned volumes QoS settings. 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 | 41 +++++++++++++++++++----------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/cinder/volume/drivers/solidfire.py b/cinder/volume/drivers/solidfire.py index cc227d847..dc3e41589 100644 --- a/cinder/volume/drivers/solidfire.py +++ b/cinder/volume/drivers/solidfire.py @@ -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) -- 2.45.2