]> review.fuel-infra Code Review - openstack-build/cinder-build.git/commitdiff
TgtAdm: Don't change CHAP username/password on live migration
authorTomoki Sekiyama <tomoki.sekiyama@hds.com>
Wed, 7 Jan 2015 00:58:13 +0000 (19:58 -0500)
committerTomoki Sekiyama <tomoki.sekiyama@hds.com>
Wed, 14 Jan 2015 22:45:25 +0000 (17:45 -0500)
This fixes TgtAdm Target Objects not to regenerate random
username/password every time initialize_connection is called,
as TgtAdm doesn't accept the change while the initiator is
connected. This fixes the live-migration of nova instances which
have volumes attached.

Change-Id: I1b48a66da5a0d8726490f50c2ee58352c42d9587
Closes-Bug: #1408162
Related-Bug: #1383509

cinder/tests/targets/test_lio_driver.py
cinder/tests/targets/test_tgt_driver.py
cinder/volume/targets/iet.py
cinder/volume/targets/lio.py
cinder/volume/targets/tgt.py

index 3210572ec3aacced5cd3cc5f606a893fdceb413d..ccee85b48f130b0860b597684442f047c3de95f5 100644 (file)
@@ -49,6 +49,9 @@ class TestLioAdmDriver(test_tgt.TestTgtAdmDriver):
     def test_verify_backing_lun(self):
         pass
 
+    def test_get_target_chap_auth(self):
+        pass
+
     def test_create_iscsi_target_already_exists(self):
         def _fake_execute(*args, **kwargs):
             raise putils.ProcessExecutionError(exit_code=1)
index b88720b34b21397bd36df1e716d79b495c736b6a..bc9c10db6b4984035ce453956ec4d8f15fc86b64 100644 (file)
@@ -249,6 +249,9 @@ class TestTgtAdmDriver(test.TestCase):
                        '_verify_backing_lun',
                        lambda x, y: True)
 
+        self.stubs.Set(self.target,
+                       '_get_target_chap_auth',
+                       lambda x: None)
         self.stubs.Set(vutils,
                        'generate_username',
                        lambda: 'QZJbisGmn9AL954FNF4D')
@@ -267,6 +270,19 @@ class TestTgtAdmDriver(test.TestCase):
                                                    self.testvol_1,
                                                    self.fake_volumes_dir))
 
+        self.stubs.Set(self.target,
+                       '_get_target_chap_auth',
+                       lambda x: ('otzLy2UYbYfnP4zXLG5z',
+                                  '234Zweo38VGBBvrpK9nt'))
+
+        expected_result['auth'] = ('CHAP '
+                                   'otzLy2UYbYfnP4zXLG5z 234Zweo38VGBBvrpK9nt')
+
+        self.assertEqual(expected_result,
+                         self.target.create_export(ctxt,
+                                                   self.testvol_1,
+                                                   self.fake_volumes_dir))
+
     def test_ensure_export(self):
         ctxt = context.get_admin_context()
         with mock.patch.object(self.target, 'create_iscsi_target'):
index 80f04334d03da2a4019054a77b204c9204c3f23c..3e3a2ff80cf44d009856ff3caedcbb93a5c9265f 100644 (file)
@@ -17,6 +17,9 @@ class IetAdm(object):
     def __init__(self, *args, **kwargs):
         super(IetAdm, self).__init__(*args, **kwargs)
 
+    def _get_target_chap_auth(self, name):
+        pass
+
     def ensure_export(self, context, volume, volume_path):
         pass
 
index 90bb964ce2d8e3281f4ede2b0302399c72823bfd..ebe1932645d37194ddcba3b070bb1f91c3da6d16 100644 (file)
@@ -38,6 +38,9 @@ class LioAdm(TgtAdm):
 
         self._verify_rtstool()
 
+    def _get_target_chap_auth(self, name):
+        pass
+
     def remove_export(self, context, volume):
         try:
             iscsi_target = self.db.volume_get_iscsi_target_num(context,
index a0991045a4cd79973ce4b5c3eb196ea4396b0e1e..87fb985998d0eaf1e89e6ea35fd9e0490caa6341 100644 (file)
@@ -306,8 +306,15 @@ class TgtAdm(iscsi.ISCSITarget):
         iscsi_name = "%s%s" % (self.configuration.iscsi_target_prefix,
                                volume['name'])
         iscsi_target, lun = self._get_target_and_lun(context, volume)
-        chap_username = vutils.generate_username()
-        chap_password = vutils.generate_password()
+
+        # Verify we haven't setup a CHAP creds file already
+        # if DNE no big deal, we'll just create it
+        current_chap_auth = self._get_target_chap_auth(iscsi_name)
+        if current_chap_auth:
+            (chap_username, chap_password) = current_chap_auth
+        else:
+            chap_username = vutils.generate_username()
+            chap_password = vutils.generate_password()
         chap_auth = self._iscsi_authentication('IncomingUser', chap_username,
                                                chap_password)
         # NOTE(jdg): For TgtAdm case iscsi_name is the ONLY param we need