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)
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)
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()
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)
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)
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
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)
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)
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)
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}}
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)
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')