From 38549395f8f4a2bd2eca1a8691a4d3c30362e354 Mon Sep 17 00:00:00 2001 From: Tom Swanson Date: Thu, 21 Jul 2016 17:12:10 -0500 Subject: [PATCH] Dell SC: Add dell_server_os configuration option Added dell_server_os option. If a server is created on the Dell DSM via the Dell SC Cinder driver it is created using this as the Server OS type. The default is still Red Hat Linux 6.x. DocImpact Change-Id: I681c40beef56fb29b72cb673edc8eb43cfb553e4 --- .../unit/volume/drivers/dell/test_dellscapi.py | 14 +++++++------- .../volume/drivers/dell/dell_storagecenter_api.py | 15 ++++++++++----- .../drivers/dell/dell_storagecenter_common.py | 6 +++++- .../volume/drivers/dell/dell_storagecenter_fc.py | 6 ++++-- .../drivers/dell/dell_storagecenter_iscsi.py | 6 ++++-- ...C-ServerOS-Config-Option-bd0e018319758e03.yaml | 8 ++++++++ 6 files changed, 38 insertions(+), 17 deletions(-) create mode 100644 releasenotes/notes/Dell-SC-ServerOS-Config-Option-bd0e018319758e03.yaml diff --git a/cinder/tests/unit/volume/drivers/dell/test_dellscapi.py b/cinder/tests/unit/volume/drivers/dell/test_dellscapi.py index f908b2bec..f52e91e51 100644 --- a/cinder/tests/unit/volume/drivers/dell/test_dellscapi.py +++ b/cinder/tests/unit/volume/drivers/dell/test_dellscapi.py @@ -2690,7 +2690,7 @@ class DellSCSanAPITestCase(test.TestCase): mock_close_connection, mock_open_connection, mock_init): - res = self.scapi.create_server(self.WWNS) + res = self.scapi.create_server(self.WWNS, 'Red Hat Linux 6.x') self.assertTrue(mock_create_server.called) self.assertTrue(mock_add_hba.called) self.assertEqual(self.SCSERVER, res, 'Unexpected ScServer') @@ -2719,7 +2719,7 @@ class DellSCSanAPITestCase(test.TestCase): mock_close_connection, mock_open_connection, mock_init): - res = self.scapi.create_server(self.IQN) + res = self.scapi.create_server(self.IQN, 'Red Hat Linux 6.x') self.assertTrue(mock_find_serveros.called) self.assertTrue(mock_find_server_folder.called) self.assertTrue(mock_first_result.called) @@ -2750,7 +2750,7 @@ class DellSCSanAPITestCase(test.TestCase): mock_close_connection, mock_open_connection, mock_init): - res = self.scapi.create_server(self.IQN) + res = self.scapi.create_server(self.IQN, 'Red Hat Binux 6.x') self.assertTrue(mock_find_serveros.called) self.assertEqual(self.SCSERVER, res, 'Unexpected ScServer') @@ -2778,7 +2778,7 @@ class DellSCSanAPITestCase(test.TestCase): mock_close_connection, mock_open_connection, mock_init): - res = self.scapi.create_server(self.IQN) + res = self.scapi.create_server(self.IQN, 'Red Hat Linux 6.x') self.assertTrue(mock_find_server_folder.called) self.assertEqual(self.SCSERVER, res, 'Unexpected ScServer') @@ -2806,7 +2806,7 @@ class DellSCSanAPITestCase(test.TestCase): mock_close_connection, mock_open_connection, mock_init): - res = self.scapi.create_server(self.IQN) + res = self.scapi.create_server(self.IQN, 'Red Hat Linux 6.x') self.assertIsNone(res, 'None expected') @mock.patch.object(dell_storagecenter_api.StorageCenterApi, @@ -2834,7 +2834,7 @@ class DellSCSanAPITestCase(test.TestCase): mock_open_connection, mock_init): # Test create server where _first_result is None - res = self.scapi.create_server(self.IQN) + res = self.scapi.create_server(self.IQN, 'Red Hat Linux 6.x') self.assertIsNone(res, 'None expected') @mock.patch.object(dell_storagecenter_api.StorageCenterApi, @@ -2866,7 +2866,7 @@ class DellSCSanAPITestCase(test.TestCase): mock_open_connection, mock_init): # Tests create server where add hba fails - res = self.scapi.create_server(self.IQN) + res = self.scapi.create_server(self.IQN, 'Red Hat Linux 6.x') self.assertTrue(mock_delete_server.called) self.assertIsNone(res, 'None expected') diff --git a/cinder/volume/drivers/dell/dell_storagecenter_api.py b/cinder/volume/drivers/dell/dell_storagecenter_api.py index 76a102c66..d2903d094 100644 --- a/cinder/volume/drivers/dell/dell_storagecenter_api.py +++ b/cinder/volume/drivers/dell/dell_storagecenter_api.py @@ -1287,6 +1287,7 @@ class StorageCenterApi(object): best for Red Hat and Ubuntu. So we use that. :param osname: The name of the OS to look for. + :param ssn: ssn of the backend SC to use. Default if -1. :returns: InstanceId of the ScServerOperatingSystem object. """ ssn = self._vet_ssn(ssn) @@ -1306,19 +1307,22 @@ class StorageCenterApi(object): return None - def create_server(self, wwnlist, ssn=-1): + def create_server(self, wwnlist, serveros, ssn=-1): """Creates a server with multiple WWNS associated with it. Same as create_server except it can take a list of HBAs. :param wwnlist: A list of FC WWNs or iSCSI IQNs associated with this server. + :param serveros: Name of server OS to use when creating the server. + :param ssn: ssn of the backend SC to use. Default if -1. :returns: Dell server object. """ # Find our folder or make it folder = self._find_server_folder(True, ssn) # Create our server. - scserver = self._create_server('Server_' + wwnlist[0], folder, ssn) + scserver = self._create_server('Server_' + wwnlist[0], folder, + serveros, ssn) if not scserver: return None # Add our HBAs. @@ -1331,7 +1335,7 @@ class StorageCenterApi(object): return None return scserver - def _create_server(self, servername, folder, ssn): + def _create_server(self, servername, folder, serveros, ssn): ssn = self._vet_ssn(ssn) LOG.info(_LI('Creating server %s'), servername) @@ -1341,7 +1345,9 @@ class StorageCenterApi(object): payload['Notes'] = self.notes # We pick Red Hat Linux 6.x because it supports multipath and # will attach luns to paths as they are found. - scserveros = self._find_serveros('Red Hat Linux 6.x', ssn) + scserveros = self._find_serveros(serveros, ssn) + if not scserveros: + scserveros = self._find_serveros(ssn=ssn) if scserveros is not None: payload['OperatingSystem'] = scserveros @@ -1494,7 +1500,6 @@ class StorageCenterApi(object): LOG.info(_LI('Volume mappings for %(name)s: %(mappings)s'), {'name': scvolume.get('name'), 'mappings': mappings}) - return mappings def _find_mapping_profiles(self, scvolume): diff --git a/cinder/volume/drivers/dell/dell_storagecenter_common.py b/cinder/volume/drivers/dell/dell_storagecenter_common.py index b333614b3..c0bdf2ebf 100644 --- a/cinder/volume/drivers/dell/dell_storagecenter_common.py +++ b/cinder/volume/drivers/dell/dell_storagecenter_common.py @@ -60,7 +60,11 @@ common_opts = [ cfg.MultiOpt('excluded_domain_ip', item_type=types.IPAddress(), default=None, - help='Domain IP to be excluded from iSCSI returns.') + help='Domain IP to be excluded from iSCSI returns.'), + cfg.StrOpt('dell_server_os', + default='Red Hat Linux 6.x', + help='Server OS type to use when creating a new server on the ' + 'Storage Center.') ] LOG = logging.getLogger(__name__) diff --git a/cinder/volume/drivers/dell/dell_storagecenter_fc.py b/cinder/volume/drivers/dell/dell_storagecenter_fc.py index b21501411..359ccc47f 100644 --- a/cinder/volume/drivers/dell/dell_storagecenter_fc.py +++ b/cinder/volume/drivers/dell/dell_storagecenter_fc.py @@ -94,7 +94,8 @@ class DellStorageCenterFCDriver(dell_storagecenter_common.DellCommonDriver, # No? Create it. if scserver is None: - scserver = api.create_server(wwpns) + scserver = api.create_server( + wwpns, self.configuration.dell_server_os) # Find the volume on the storage center. scvolume = api.find_volume(volume_name, provider_id, islivevol) if scserver is not None and scvolume is not None: @@ -164,7 +165,8 @@ class DellStorageCenterFCDriver(dell_storagecenter_common.DellCommonDriver, # No? Create it. if secondary is None: secondary = api.create_server( - wwns, sclivevolume['secondaryScSerialNumber']) + wwns, self.configuration.dell_server_os, + sclivevolume['secondaryScSerialNumber']) if secondary: if api.map_secondary_volume(sclivevolume, secondary): # Get mappings. diff --git a/cinder/volume/drivers/dell/dell_storagecenter_iscsi.py b/cinder/volume/drivers/dell/dell_storagecenter_iscsi.py index 454223a27..9f4201319 100644 --- a/cinder/volume/drivers/dell/dell_storagecenter_iscsi.py +++ b/cinder/volume/drivers/dell/dell_storagecenter_iscsi.py @@ -99,7 +99,8 @@ class DellStorageCenterISCSIDriver(dell_storagecenter_common.DellCommonDriver, scserver = api.find_server(initiator_name) # No? Create it. if scserver is None: - scserver = api.create_server([initiator_name]) + scserver = api.create_server( + [initiator_name], self.configuration.dell_server_os) # Find the volume on the storage center. scvolume = api.find_volume(volume_name, provider_id) @@ -177,7 +178,8 @@ class DellStorageCenterISCSIDriver(dell_storagecenter_common.DellCommonDriver, # No? Create it. if secondary is None: secondary = api.create_server( - [initiatorname], sclivevolume['secondaryScSerialNumber']) + [initiatorname], self.configuration.dell_server_os, + sclivevolume['secondaryScSerialNumber']) if secondary: if api.map_secondary_volume(sclivevolume, secondary): # Get our volume and get our properties. diff --git a/releasenotes/notes/Dell-SC-ServerOS-Config-Option-bd0e018319758e03.yaml b/releasenotes/notes/Dell-SC-ServerOS-Config-Option-bd0e018319758e03.yaml new file mode 100644 index 000000000..64617e923 --- /dev/null +++ b/releasenotes/notes/Dell-SC-ServerOS-Config-Option-bd0e018319758e03.yaml @@ -0,0 +1,8 @@ +--- +features: + - dell_server_os option added to the Dell SC driver. + This option allows the selection of the server type + used when creating a server on the Dell DSM during + initialize connection. This is only used if the + server does not exist. Valid values are from the + Dell DSM create server list.