From af092c5401e6721df4ddfa5a93a0fe155fc8782d Mon Sep 17 00:00:00 2001 From: zhangchao010 Date: Wed, 9 Oct 2013 15:37:49 +0800 Subject: [PATCH] Support Huawei driver upgrade from grizzly to havana To make the driver upgrade from grizzly to higher versions, the patch checks the old host name firstly when creating and deleting host in Huawei storage system. If the old host name exists: *get and use it directly when adding host. *delete it directly when deleting host. Closes-bug 1237189 Change-Id: I82a9dbc1ef0bb0b91771afea4aadec5afe65eecf (cherry picked from commit 0c9dc5d0e01576969f09edc0c9c72a2aa91b248a) --- cinder/volume/drivers/huawei/huawei_t.py | 6 +++-- cinder/volume/drivers/huawei/ssh_common.py | 27 +++++++++++++++++----- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/cinder/volume/drivers/huawei/huawei_t.py b/cinder/volume/drivers/huawei/huawei_t.py index fd968cc21a..7a6f791450 100644 --- a/cinder/volume/drivers/huawei/huawei_t.py +++ b/cinder/volume/drivers/huawei/huawei_t.py @@ -106,7 +106,8 @@ def initialize_connection(self, volume, connector): self._get_iscsi_params(connector['initiator']) # First, add a host if not added before. - host_id = self.common.add_host(connector['host']) + host_id = self.common.add_host(connector['host'], + connector['initiator']) # Then, add the iSCSI port to the host. self._add_iscsi_port_to_host(host_id, connector) @@ -324,7 +325,8 @@ def terminate_connection(self, volume, connector, **kwargs): self.common._update_login_info() host_id = self.common.remove_map(volume['provider_location'], - connector['host']) + connector['host'], + connector['initiator']) if not self.common._get_host_map_info(host_id): self._remove_iscsi_port(host_id, connector) diff --git a/cinder/volume/drivers/huawei/ssh_common.py b/cinder/volume/drivers/huawei/ssh_common.py index b6e85d0023..f83575053f 100644 --- a/cinder/volume/drivers/huawei/ssh_common.py +++ b/cinder/volume/drivers/huawei/ssh_common.py @@ -892,7 +892,7 @@ def map_volume(self, host_id, volume_id): return hostlun_id - def add_host(self, host_name): + def add_host(self, host_name, initiator=None): """Create a host and add it to hostgroup.""" # Create an OpenStack hostgroup if not created before. hostgroup_name = HOST_GROUP_NAME @@ -902,6 +902,14 @@ def add_host(self, host_name): self.hostgroup_id = self._get_hostgroup_id(hostgroup_name) # Create a host and add it to the hostgroup. + # Check the old host name to support the upgrade from grizzly to + # higher versions. + if initiator: + old_host_name = HOST_NAME_PREFIX + str(hash(initiator)) + old_host_id = self._get_host_id(old_host_name, self.hostgroup_id) + if old_host_id is not None: + return old_host_id + host_name = HOST_NAME_PREFIX + host_name host_id = self._get_host_id(host_name, self.hostgroup_id) if host_id is None: @@ -1003,13 +1011,20 @@ def change_lun_ctr(self, lun_id, ctr): 'LUN %s' % lun_id, cli_cmd, out) - def remove_map(self, volume_id, host_name): + def remove_map(self, volume_id, host_name, initiator=None): """Remove host map.""" - host_name = HOST_NAME_PREFIX + host_name - host_id = self._get_host_id(host_name, self.hostgroup_id) + # Check the old host name to support the upgrade from grizzly to + # higher versions. + host_id = None + if initiator: + old_host_name = HOST_NAME_PREFIX + str(hash(initiator)) + host_id = self._get_host_id(old_host_name, self.hostgroup_id) if host_id is None: - LOG.error(_('remove_map: Host %s does not exist.') % host_name) - raise exception.HostNotFound(host=host_name) + host_name = HOST_NAME_PREFIX + host_name + host_id = self._get_host_id(host_name, self.hostgroup_id) + if host_id is None: + LOG.error(_('remove_map: Host %s does not exist.') % host_name) + raise exception.HostNotFound(host=host_name) if not self._check_volume_created(volume_id): LOG.error(_('remove_map: Volume %s does not exist.') % volume_id)