Example #1
0
 def test__connection_removed_not_present(self):
     vol = objects.Volume(self.backend,
                          name='vol_name', description='vol_desc', size=10)
     conn = objects.Connection(self.backend, connection_info={'conn': {}})
     conn2 = objects.Connection(self.backend, connection_info={'conn': {}})
     vol._connections = [conn2]
     vol._ovo.volume_attachment.objects = [conn2._ovo]
     # Just check it doesn't break or remove any other snaps
     vol._connection_removed(conn)
     self.assertEqual([conn2], vol._connections)
     self.assertEqual([conn2._ovo], vol._ovo.volume_attachment.objects)
Example #2
0
 def test__connection_removed(self):
     vol = objects.Volume(self.backend, size=10)
     conn = objects.Connection(self.backend, connection_info={'conn': {}})
     conn2 = objects.Connection(self.backend, connection_info={'conn': {}})
     conn_other_instance = objects.Connection(self.backend, id=conn.id,
                                              connection_info={'conn': {}})
     conn_other_instance2 = objects.Connection(self.backend, id=conn.id,
                                               connection_info={'conn': {}})
     vol._connections = [conn2, conn_other_instance]
     vol._ovo.volume_attachment.objects = [conn2._ovo,
                                           conn_other_instance2._ovo]
     # Just check it doesn't break or remove any other snaps
     vol._connection_removed(conn)
     self.assertEqual([conn2], vol._connections)
     self.assertEqual([conn2._ovo], vol._ovo.volume_attachment.objects)
Example #3
0
    def test_connections_lazy_loading(self):
        vol = objects.Volume(self.backend, size=10)
        vol._connections = None

        conns = [
            objects.Connection(self.backend,
                               connector={'k': 'v'},
                               volume_id=vol.id,
                               status='attached',
                               attach_mode='rw',
                               connection_info={'conn': {}},
                               name='my_snap')
        ]

        mock_get_conns = self.persistence.get_connections
        mock_get_conns.return_value = conns

        result = vol.connections

        mock_get_conns.called_once_with(volume_id=vol.id)
        self.assertEqual(conns, result)
        self.assertEqual(conns, vol._connections)
        self.assertEqual(1, len(vol._ovo.volume_attachment))
        self.assertEqual(vol._ovo.volume_attachment[0], result[0]._ovo)
        # There is no second call when we reference it again
        mock_get_conns.reset_mock()
        result = vol.connections
        self.assertEqual(conns, result)
        mock_get_conns.not_called()
Example #4
0
    def test_connections_lazy_loading_from_ovo(self, get_all_mock):
        """Test we don't reload connections if data is in OVO."""
        vol = objects.Volume(self.backend, size=10)
        vol._connections = None
        delattr(vol._ovo, '_obj_volume_attachment')

        conns = [objects.Connection(self.backend, connector={'k': 'v'},
                                    volume_id=vol.id, status='attached',
                                    attach_mode='rw',
                                    connection_info={'conn': {}},
                                    name='my_snap')]
        ovo_conns = [conn._ovo for conn in conns]
        ovo_attach_list = cinder_ovos.VolumeAttachmentList(objects=ovo_conns)
        get_all_mock.return_value = ovo_attach_list
        mock_get_conns = self.persistence.get_connections

        ovo_result = vol._ovo.volume_attachment

        mock_get_conns.not_called()
        self.assertEqual(ovo_attach_list, ovo_result)
        # Cinderlib object doesn't have the connections yet
        self.assertIsNone(vol._connections)
        self.assertEqual(1, len(vol._ovo.volume_attachment))
        self.assertEqual(vol._ovo.volume_attachment[0], ovo_result[0])
        # There is no second call when we access the cinderlib object, as the
        # data is retrieved from the OVO that already has it
        result = vol.connections
        mock_get_conns.not_called()
        # Confirm we used the OVO
        self.assertIs(ovo_conns[0], result[0]._ovo)
Example #5
0
 def test__connection_removed_not_loaded(self):
     vol = objects.Volume(self.backend,
                          name='vol_name', description='vol_desc', size=10)
     vol._connections = None
     conn = objects.Connection(self.backend, connection_info={'conn': {}})
     # Just check it doesn't break
     vol._connection_removed(conn)
Example #6
0
 def get_connections(self, connection_id=None, volume_id=None):
     filters = self._build_filter(id=connection_id, volume_id=volume_id)
     LOG.debug('get_connections for %s', filters)
     ovos = cinder_objs.VolumeAttachmentList.get_all(objects.CONTEXT,
                                                     filters)
     # Leverage lazy loading of the volume and backend in Connection
     result = [objects.Connection(None, volume=None, __ovo=ovo)
               for ovo in ovos.objects]
     return result
Example #7
0
 def test_init_no_volume(self):
     self.mock_is_mp.reset_mock()
     kwargs = self.kwargs.copy()
     kwargs['attach_mode'] = 'ro'
     conn = objects.Connection(self.backend, **kwargs)
     self.mock_is_mp.assert_called_once_with(kwargs)
     self.assertEqual(conn.use_multipath, self.mock_is_mp.return_value)
     self.assertEqual(conn.scan_attempts, self.mock_default)
     self.assertEqual(conn.attach_mode, 'ro')
     self.assertIsNone(conn._connector)
Example #8
0
 def test_init_no_volume(self):
     self.mock_is_mp.reset_mock()
     kwargs = {'attach_mode': 'ro',
               'connection_info': {'conn': {'data': {'t': 0}}}}
     conn = objects.Connection(self.backend, **kwargs)
     self.mock_is_mp.assert_called_once_with(kwargs)
     self.assertEqual(conn.use_multipath, self.mock_is_mp.return_value)
     self.assertEqual(conn.scan_attempts, self.mock_default)
     self.assertEqual(conn.attach_mode, 'ro')
     self.assertEqual({'data': {'access_mode': 'ro', 't': 0}},
                      conn.conn_info)
     self.assertIsNone(conn._connector)
Example #9
0
    def test_conn_to_and_from(self):
        vol = objects.Volume(self.backend, size=1, name='disk')
        conn = objects.Connection(self.backend,
                                  volume=vol,
                                  connector={},
                                  connection_info={'conn': {
                                      'data': {}
                                  }})
        json_data = conn.json

        # Confirm vol.json property is equivalent to the non simplified version
        self.assertEqual(json_data, conn.to_json(simplified=False))
        conn2 = objects.Connection.load(json_data)
        self.assertEqual(conn.json, conn2.json)
Example #10
0
    def setUp(self):
        self.original_is_multipathed = objects.Connection._is_multipathed_conn
        self.mock_is_mp = self.patch(
            'cinderlib.objects.Connection._is_multipathed_conn')
        self.mock_default = self.patch(
            'os_brick.initiator.DEVICE_SCAN_ATTEMPTS_DEFAULT')
        super(TestConnection, self).setUp()

        self.vol = objects.Volume(self.backend_name, size=10)
        self.kwargs = {'k1': 'v1', 'k2': 'v2',
                       'connection_info': {'conn': {'data': {'t': 0}}}}
        self.conn = objects.Connection(self.backend, volume=self.vol,
                                       **self.kwargs)
        self.conn._ovo.connection_info = {
            'connector': {'multipath': mock.sentinel.mp_ovo_connector}}
Example #11
0
    def test___connections_get(self):
        """Check we can get volume_attachment from OVO."""
        vol = objects.Volume(self.backend, size=10)
        vol._connections = None
        delattr(vol._ovo, '_obj_volume_attachment')
        conns = [
            objects.Connection(self.backend,
                               connector={'k': 'v'},
                               volume_id=vol.id,
                               status='attached',
                               attach_mode='rw',
                               connection_info={'conn': {}})
        ]

        with mock.patch.object(self.persistence, 'get_connections') \
                as get_conns_mock:
            get_conns_mock.return_value = conns
            res = vol._ovo.volume_attachment
            self.assertIsInstance(res, ovos.VolumeAttachmentList)
            self.assertEqual(1, len(res))
            self.assertEqual(conns[0]._ovo, res.objects[0])
            get_conns_mock.assert_called_once_with(volume_id=vol.id)
Example #12
0
 def test_init_preference_attach_mode(self):
     kwargs = {'attach_mode': 'ro',
               'connection_info': {'conn': {'data': {'access_mode': 'rw'}}}}
     conn = objects.Connection(self.backend, **kwargs)
     self.assertEqual(conn.conn_info['data']['access_mode'], 'ro')