From 0c9dc5d0e01576969f09edc0c9c72a2aa91b248a 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 --- 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 fd968cc21a5..7a6f7914504 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 b6e85d00233..f83575053f0 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)