Remove the DRBDManage Driver
The DRBDManage driver was marked unsupported in the Stein release. It is replaced by the new LINSTOR driver. Change-Id: Idf236113f6354db71b6651c7b55ab4189271412a
This commit is contained in:
parent
30b731ac2e
commit
fbab79dee2
@ -38,6 +38,7 @@ SUCCESS = uc.Code.SUCCESS
|
|||||||
FAILURE = uc.Code.FAILURE
|
FAILURE = uc.Code.FAILURE
|
||||||
WARNING = uc.Code.WARNING
|
WARNING = uc.Code.WARNING
|
||||||
REMOVED_DRVRS = ["coprhd",
|
REMOVED_DRVRS = ["coprhd",
|
||||||
|
"drbdmanage",
|
||||||
"disco",
|
"disco",
|
||||||
"hgst", ]
|
"hgst", ]
|
||||||
|
|
||||||
|
@ -87,8 +87,6 @@ from cinder.volume.drivers.dell_emc.vnx import common as \
|
|||||||
cinder_volume_drivers_dell_emc_vnx_common
|
cinder_volume_drivers_dell_emc_vnx_common
|
||||||
from cinder.volume.drivers.dell_emc import xtremio as \
|
from cinder.volume.drivers.dell_emc import xtremio as \
|
||||||
cinder_volume_drivers_dell_emc_xtremio
|
cinder_volume_drivers_dell_emc_xtremio
|
||||||
from cinder.volume.drivers import drbdmanagedrv as \
|
|
||||||
cinder_volume_drivers_drbdmanagedrv
|
|
||||||
from cinder.volume.drivers.fujitsu.eternus_dx import eternus_dx_common as \
|
from cinder.volume.drivers.fujitsu.eternus_dx import eternus_dx_common as \
|
||||||
cinder_volume_drivers_fujitsu_eternus_dx_eternusdxcommon
|
cinder_volume_drivers_fujitsu_eternus_dx_eternusdxcommon
|
||||||
from cinder.volume.drivers.fusionstorage import dsware as \
|
from cinder.volume.drivers.fusionstorage import dsware as \
|
||||||
@ -297,7 +295,6 @@ def list_opts():
|
|||||||
cinder_volume_drivers_dell_emc_unity_driver.UNITY_OPTS,
|
cinder_volume_drivers_dell_emc_unity_driver.UNITY_OPTS,
|
||||||
cinder_volume_drivers_dell_emc_vnx_common.VNX_OPTS,
|
cinder_volume_drivers_dell_emc_vnx_common.VNX_OPTS,
|
||||||
cinder_volume_drivers_dell_emc_xtremio.XTREMIO_OPTS,
|
cinder_volume_drivers_dell_emc_xtremio.XTREMIO_OPTS,
|
||||||
cinder_volume_drivers_drbdmanagedrv.drbd_opts,
|
|
||||||
cinder_volume_drivers_fujitsu_eternus_dx_eternusdxcommon.
|
cinder_volume_drivers_fujitsu_eternus_dx_eternusdxcommon.
|
||||||
FJ_ETERNUS_DX_OPT_opts,
|
FJ_ETERNUS_DX_OPT_opts,
|
||||||
cinder_volume_drivers_hpe_hpe3parcommon.hpe3par_opts,
|
cinder_volume_drivers_hpe_hpe3parcommon.hpe3par_opts,
|
||||||
|
@ -1,716 +0,0 @@
|
|||||||
# Copyright (c) 2014 LINBIT HA Solutions GmbH
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
import collections
|
|
||||||
import eventlet
|
|
||||||
import six
|
|
||||||
import sys
|
|
||||||
import time
|
|
||||||
|
|
||||||
import mock
|
|
||||||
from oslo_utils import importutils
|
|
||||||
from oslo_utils import timeutils
|
|
||||||
|
|
||||||
from cinder import context
|
|
||||||
from cinder import test
|
|
||||||
from cinder.volume import configuration as conf
|
|
||||||
|
|
||||||
|
|
||||||
class mock_dbus(object):
|
|
||||||
def __init__(self):
|
|
||||||
pass
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def Array(defaults, signature=None):
|
|
||||||
return defaults
|
|
||||||
|
|
||||||
|
|
||||||
class mock_dm_consts(object):
|
|
||||||
|
|
||||||
TQ_GET_PATH = "get_path"
|
|
||||||
|
|
||||||
NODE_ADDR = "addr"
|
|
||||||
|
|
||||||
CSTATE_PREFIX = "cstate:"
|
|
||||||
TSTATE_PREFIX = "tstate:"
|
|
||||||
|
|
||||||
FLAG_UPD_POOL = "upd_pool"
|
|
||||||
FLAG_UPDATE = "update"
|
|
||||||
FLAG_DRBDCTRL = "drbdctrl"
|
|
||||||
FLAG_STORAGE = "storage"
|
|
||||||
FLAG_EXTERNAL = "external"
|
|
||||||
FLAG_DEPLOY = "deploy"
|
|
||||||
|
|
||||||
FLAG_DISKLESS = "diskless"
|
|
||||||
FLAG_CONNECT = "connect"
|
|
||||||
FLAG_UPD_CON = "upd_con"
|
|
||||||
FLAG_RECONNECT = "reconnect"
|
|
||||||
FLAG_OVERWRITE = "overwrite"
|
|
||||||
FLAG_DISCARD = "discard"
|
|
||||||
FLAG_UPD_CONFIG = "upd_config"
|
|
||||||
FLAG_STANDBY = "standby"
|
|
||||||
FLAG_QIGNORE = "qignore"
|
|
||||||
FLAG_REMOVE = "remove"
|
|
||||||
|
|
||||||
AUX_PROP_PREFIX = "aux:"
|
|
||||||
|
|
||||||
BOOL_TRUE = "true"
|
|
||||||
BOOL_FALSE = "false"
|
|
||||||
|
|
||||||
VOL_ID = "vol_id"
|
|
||||||
|
|
||||||
|
|
||||||
class mock_dm_exc(object):
|
|
||||||
|
|
||||||
DM_SUCCESS = 0
|
|
||||||
DM_INFO = 1
|
|
||||||
DM_EEXIST = 101
|
|
||||||
DM_ENOENT = 102
|
|
||||||
DM_ERROR = 1000
|
|
||||||
|
|
||||||
|
|
||||||
class mock_dm_utils(object):
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def _aux_prop_name(key):
|
|
||||||
if six.text_type(key).startswith(mock_dm_consts.AUX_PROP_PREFIX):
|
|
||||||
return key[len(mock_dm_consts.AUX_PROP_PREFIX):]
|
|
||||||
else:
|
|
||||||
return None
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def aux_props_to_dict(props):
|
|
||||||
aux_props = {}
|
|
||||||
for (key, val) in props.items():
|
|
||||||
aux_key = mock_dm_utils._aux_prop_name(key)
|
|
||||||
if aux_key is not None:
|
|
||||||
aux_props[aux_key] = val
|
|
||||||
return aux_props
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def dict_to_aux_props(props):
|
|
||||||
aux_props = {}
|
|
||||||
for (key, val) in props.items():
|
|
||||||
aux_key = mock_dm_consts.AUX_PROP_PREFIX + six.text_type(key)
|
|
||||||
aux_props[aux_key] = six.text_type(val)
|
|
||||||
return aux_props
|
|
||||||
|
|
||||||
|
|
||||||
def public_keys(c):
|
|
||||||
return [n for n in c.__dict__.keys() if not n.startswith("_")]
|
|
||||||
|
|
||||||
|
|
||||||
sys.modules['dbus'] = mock_dbus
|
|
||||||
sys.modules['drbdmanage'] = collections.namedtuple(
|
|
||||||
'module', ['consts', 'exceptions', 'utils'])
|
|
||||||
sys.modules['drbdmanage.utils'] = collections.namedtuple(
|
|
||||||
'module', public_keys(mock_dm_utils))
|
|
||||||
sys.modules['drbdmanage.consts'] = collections.namedtuple(
|
|
||||||
'module', public_keys(mock_dm_consts))
|
|
||||||
sys.modules['drbdmanage.exceptions'] = collections.namedtuple(
|
|
||||||
'module', public_keys(mock_dm_exc))
|
|
||||||
|
|
||||||
import cinder.volume.drivers.drbdmanagedrv as drv
|
|
||||||
|
|
||||||
drv.dbus = mock_dbus
|
|
||||||
drv.dm_const = mock_dm_consts
|
|
||||||
drv.dm_utils = mock_dm_utils
|
|
||||||
drv.dm_exc = mock_dm_exc
|
|
||||||
|
|
||||||
|
|
||||||
def create_configuration(object):
|
|
||||||
configuration = mock.MockObject(conf.Configuration)
|
|
||||||
configuration.san_is_local = False
|
|
||||||
configuration.append_config_values(mock.IgnoreArg())
|
|
||||||
return configuration
|
|
||||||
|
|
||||||
|
|
||||||
class DrbdManageFakeDriver(object):
|
|
||||||
|
|
||||||
resources = {}
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
self.calls = []
|
|
||||||
self.cur = -1
|
|
||||||
|
|
||||||
def call_count(self):
|
|
||||||
return len(self.calls)
|
|
||||||
|
|
||||||
def next_call(self):
|
|
||||||
self.cur += 1
|
|
||||||
return self.calls[self.cur][0]
|
|
||||||
|
|
||||||
def call_parm(self, arg_idx):
|
|
||||||
return self.calls[self.cur][arg_idx]
|
|
||||||
|
|
||||||
def run_external_plugin(self, name, props):
|
|
||||||
self.calls.append(["run_external_plugin", name, props])
|
|
||||||
|
|
||||||
call_okay = [[mock_dm_exc.DM_SUCCESS, "ACK", []]]
|
|
||||||
not_done_yet = (call_okay,
|
|
||||||
dict(timeout=mock_dm_consts.BOOL_FALSE,
|
|
||||||
result=mock_dm_consts.BOOL_FALSE))
|
|
||||||
success = (call_okay,
|
|
||||||
dict(timeout=mock_dm_consts.BOOL_FALSE,
|
|
||||||
result=mock_dm_consts.BOOL_TRUE))
|
|
||||||
got_timeout = (call_okay,
|
|
||||||
dict(timeout=mock_dm_consts.BOOL_TRUE,
|
|
||||||
result=mock_dm_consts.BOOL_FALSE))
|
|
||||||
|
|
||||||
if "retry" not in props:
|
|
||||||
# Fake success, to not slow tests down
|
|
||||||
return success
|
|
||||||
|
|
||||||
if props["retry"] > 1:
|
|
||||||
props["retry"] -= 1
|
|
||||||
return not_done_yet
|
|
||||||
|
|
||||||
if props.get("run-into-timeout"):
|
|
||||||
return got_timeout
|
|
||||||
|
|
||||||
return success
|
|
||||||
|
|
||||||
def list_resources(self, res, serial, prop, req):
|
|
||||||
self.calls.append(["list_resources", res, prop, req])
|
|
||||||
if ('aux:cinder-id' in prop and
|
|
||||||
prop['aux:cinder-id'].startswith("deadbeef")):
|
|
||||||
return ([[mock_dm_exc.DM_ENOENT, "none", []]],
|
|
||||||
[])
|
|
||||||
else:
|
|
||||||
return ([[mock_dm_exc.DM_SUCCESS, "ACK", []]],
|
|
||||||
[("res", dict(prop))])
|
|
||||||
|
|
||||||
def create_resource(self, res, props):
|
|
||||||
self.calls.append(["create_resource", res, props])
|
|
||||||
return [[mock_dm_exc.DM_SUCCESS, "ack", []]]
|
|
||||||
|
|
||||||
def create_volume(self, res, size, props):
|
|
||||||
self.calls.append(["create_volume", res, size, props])
|
|
||||||
return [[mock_dm_exc.DM_SUCCESS, "ack", []],
|
|
||||||
[mock_dm_exc.DM_INFO,
|
|
||||||
"create_volume",
|
|
||||||
[(mock_dm_consts.VOL_ID, '2')]]]
|
|
||||||
|
|
||||||
def auto_deploy(self, res, red, delta, site_clients):
|
|
||||||
self.calls.append(["auto_deploy", res, red, delta, site_clients])
|
|
||||||
return [[mock_dm_exc.DM_SUCCESS, "ack", []] * red]
|
|
||||||
|
|
||||||
def list_volumes(self, res, ser, prop, req):
|
|
||||||
self.calls.append(["list_volumes", res, ser, prop, req])
|
|
||||||
if ('aux:cinder-id' in prop and
|
|
||||||
prop['aux:cinder-id'].startswith("deadbeef")):
|
|
||||||
return ([[mock_dm_exc.DM_SUCCESS, "none", []]],
|
|
||||||
[])
|
|
||||||
else:
|
|
||||||
return ([[mock_dm_exc.DM_SUCCESS, "ACK", []]],
|
|
||||||
[("res", dict(), [(2, dict(prop))])
|
|
||||||
])
|
|
||||||
|
|
||||||
def remove_volume(self, res, nr, force):
|
|
||||||
self.calls.append(["remove_volume", res, nr, force])
|
|
||||||
return [[mock_dm_exc.DM_SUCCESS, "ack", []]]
|
|
||||||
|
|
||||||
def text_query(self, cmd):
|
|
||||||
self.calls.append(["text_query", cmd])
|
|
||||||
if cmd[0] == mock_dm_consts.TQ_GET_PATH:
|
|
||||||
return ([(mock_dm_exc.DM_SUCCESS, "ack", [])], ['/dev/drbd0'])
|
|
||||||
return ([(mock_dm_exc.DM_ERROR, 'unknown command', [])], [])
|
|
||||||
|
|
||||||
def list_assignments(self, nodes, res, ser, prop, req):
|
|
||||||
self.calls.append(["list_assignments", nodes, res, ser, prop, req])
|
|
||||||
if ('aux:cinder-id' in prop and
|
|
||||||
prop['aux:cinder-id'].startswith("deadbeef")):
|
|
||||||
return ([[mock_dm_exc.DM_SUCCESS, "none", []]],
|
|
||||||
[])
|
|
||||||
else:
|
|
||||||
return ([[mock_dm_exc.DM_SUCCESS, "ACK", []]],
|
|
||||||
[("node", "res", dict(), [(2, dict(prop))])
|
|
||||||
])
|
|
||||||
|
|
||||||
def create_snapshot(self, res, snap, nodes, props):
|
|
||||||
self.calls.append(["create_snapshot", res, snap, nodes, props])
|
|
||||||
return [[mock_dm_exc.DM_SUCCESS, "ack", []]]
|
|
||||||
|
|
||||||
def list_snapshots(self, res, sn, serial, prop, req):
|
|
||||||
self.calls.append(["list_snapshots", res, sn, serial, prop, req])
|
|
||||||
if ('aux:cinder-id' in prop and
|
|
||||||
prop['aux:cinder-id'].startswith("deadbeef")):
|
|
||||||
return ([[mock_dm_exc.DM_SUCCESS, "none", []]],
|
|
||||||
[])
|
|
||||||
else:
|
|
||||||
return ([[mock_dm_exc.DM_SUCCESS, "ACK", []]],
|
|
||||||
[("res", [("snap", dict(prop))])
|
|
||||||
])
|
|
||||||
|
|
||||||
def remove_snapshot(self, res, snap, force):
|
|
||||||
self.calls.append(["remove_snapshot", res, snap, force])
|
|
||||||
return [[mock_dm_exc.DM_SUCCESS, "ack", []]]
|
|
||||||
|
|
||||||
def resize_volume(self, res, vol, ser, size, delta):
|
|
||||||
self.calls.append(["resize_volume", res, vol, ser, size, delta])
|
|
||||||
return [[mock_dm_exc.DM_SUCCESS, "ack", []]]
|
|
||||||
|
|
||||||
def restore_snapshot(self, res, snap, new, rprop, vprops):
|
|
||||||
self.calls.append(["restore_snapshot", res, snap, new, rprop, vprops])
|
|
||||||
return [[mock_dm_exc.DM_SUCCESS, "ack", []]]
|
|
||||||
|
|
||||||
def assign(self, host, resource, props):
|
|
||||||
self.calls.append(["assign", host, resource, props])
|
|
||||||
return [[mock_dm_exc.DM_SUCCESS, "ack", []]]
|
|
||||||
|
|
||||||
def create_node(self, name, prop):
|
|
||||||
self.calls.append(["create_node", name, prop])
|
|
||||||
if name.startswith('EXIST'):
|
|
||||||
return [(mock_dm_exc.DM_EEXIST, "none", [])]
|
|
||||||
else:
|
|
||||||
return [(mock_dm_exc.DM_SUCCESS, "ack", [])]
|
|
||||||
|
|
||||||
def set_drbdsetup_props(self, options):
|
|
||||||
self.calls.append(["set_drbdsetup_props", options])
|
|
||||||
return [[mock_dm_exc.DM_SUCCESS, "ack", []]]
|
|
||||||
|
|
||||||
def modify_resource(self, res, ser, props):
|
|
||||||
self.calls.append(["modify_resource", res, ser, props])
|
|
||||||
return [[mock_dm_exc.DM_SUCCESS, "ack", []]]
|
|
||||||
|
|
||||||
|
|
||||||
class DrbdManageIscsiTestCase(test.TestCase):
|
|
||||||
|
|
||||||
def _fake_safe_get(self, key):
|
|
||||||
if key == 'target_helper':
|
|
||||||
return 'fake'
|
|
||||||
|
|
||||||
if key.endswith('_policy'):
|
|
||||||
return '{}'
|
|
||||||
|
|
||||||
if key.endswith('_options'):
|
|
||||||
return '{}'
|
|
||||||
|
|
||||||
return None
|
|
||||||
|
|
||||||
def _fake_safe_get_with_options(self, key):
|
|
||||||
if key == 'drbdmanage_net_options':
|
|
||||||
return('{"connect-int": "4", "allow-two-primaries": "yes", '
|
|
||||||
'"ko-count": "30"}')
|
|
||||||
if key == 'drbdmanage_resource_options':
|
|
||||||
return '{"auto-promote-timeout": "300"}'
|
|
||||||
if key == 'drbdmanage_disk_options':
|
|
||||||
return '{"c-min-rate": "4M"}'
|
|
||||||
|
|
||||||
return self._fake_safe_get(key)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def _fake_sleep(amount):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
self.ctxt = context.get_admin_context()
|
|
||||||
self._mock = mock.Mock()
|
|
||||||
self.configuration = mock.Mock(conf.Configuration)
|
|
||||||
self.configuration.san_is_local = True
|
|
||||||
self.configuration.reserved_percentage = 1
|
|
||||||
|
|
||||||
super(DrbdManageIscsiTestCase, self).setUp()
|
|
||||||
|
|
||||||
self.mock_object(importutils, 'import_object',
|
|
||||||
self.fake_import_object)
|
|
||||||
self.mock_object(drv.DrbdManageBaseDriver,
|
|
||||||
'call_or_reconnect',
|
|
||||||
self.fake_issue_dbus_call)
|
|
||||||
self.mock_object(drv.DrbdManageBaseDriver,
|
|
||||||
'dbus_connect',
|
|
||||||
self.fake_issue_dbus_connect)
|
|
||||||
self.mock_object(drv.DrbdManageBaseDriver,
|
|
||||||
'_wait_for_node_assignment',
|
|
||||||
self.fake_wait_node_assignment)
|
|
||||||
|
|
||||||
self.configuration.safe_get = self._fake_safe_get
|
|
||||||
|
|
||||||
self.mock_object(eventlet, 'sleep', self._fake_sleep)
|
|
||||||
|
|
||||||
# Infrastructure
|
|
||||||
def fake_import_object(self, what, configuration, db, executor):
|
|
||||||
return None
|
|
||||||
|
|
||||||
def fake_issue_dbus_call(self, fn, *args):
|
|
||||||
return fn(*args)
|
|
||||||
|
|
||||||
def fake_wait_node_assignment(self, *args, **kwargs):
|
|
||||||
return True
|
|
||||||
|
|
||||||
def fake_issue_dbus_connect(self):
|
|
||||||
self.odm = DrbdManageFakeDriver()
|
|
||||||
|
|
||||||
def call_or_reconnect(self, method, *params):
|
|
||||||
return method(*params)
|
|
||||||
|
|
||||||
def fake_is_external_node(self, name):
|
|
||||||
return False
|
|
||||||
|
|
||||||
# Tests per se
|
|
||||||
|
|
||||||
def test_create_volume(self):
|
|
||||||
testvol = {'project_id': 'testprjid',
|
|
||||||
'name': 'testvol',
|
|
||||||
'size': 1,
|
|
||||||
'id': 'deadbeef-8068-11e4-98c0-5254008ea111',
|
|
||||||
'volume_type_id': 'drbdmanage',
|
|
||||||
'created_at': timeutils.utcnow()}
|
|
||||||
|
|
||||||
dmd = drv.DrbdManageIscsiDriver(configuration=self.configuration)
|
|
||||||
dmd.drbdmanage_devs_on_controller = False
|
|
||||||
dmd.odm = DrbdManageFakeDriver()
|
|
||||||
dmd.create_volume(testvol)
|
|
||||||
self.assertEqual(8, dmd.odm.call_count())
|
|
||||||
self.assertEqual("create_resource", dmd.odm.next_call())
|
|
||||||
self.assertEqual("set_drbdsetup_props", dmd.odm.next_call())
|
|
||||||
self.assertEqual("set_drbdsetup_props", dmd.odm.next_call())
|
|
||||||
self.assertEqual("set_drbdsetup_props", dmd.odm.next_call())
|
|
||||||
self.assertEqual("list_volumes", dmd.odm.next_call())
|
|
||||||
self.assertEqual("create_volume", dmd.odm.next_call())
|
|
||||||
self.assertEqual(1048576, dmd.odm.call_parm(2))
|
|
||||||
self.assertEqual("auto_deploy", dmd.odm.next_call())
|
|
||||||
|
|
||||||
def test_create_volume_with_options(self):
|
|
||||||
testvol = {'project_id': 'testprjid',
|
|
||||||
'name': 'testvol',
|
|
||||||
'size': 1,
|
|
||||||
'id': 'deadbeef-8068-11e4-98c0-5254008ea111',
|
|
||||||
'volume_type_id': 'drbdmanage',
|
|
||||||
'created_at': timeutils.utcnow()}
|
|
||||||
|
|
||||||
self.configuration.safe_get = self._fake_safe_get_with_options
|
|
||||||
dmd = drv.DrbdManageIscsiDriver(configuration=self.configuration)
|
|
||||||
dmd.drbdmanage_devs_on_controller = False
|
|
||||||
dmd.odm = DrbdManageFakeDriver()
|
|
||||||
dmd.create_volume(testvol)
|
|
||||||
|
|
||||||
self.assertEqual(8, dmd.odm.call_count())
|
|
||||||
|
|
||||||
self.assertEqual("create_resource", dmd.odm.next_call())
|
|
||||||
|
|
||||||
self.assertEqual("set_drbdsetup_props", dmd.odm.next_call())
|
|
||||||
self.assertEqual("reso", dmd.odm.call_parm(1)["type"])
|
|
||||||
self.assertEqual("300", dmd.odm.call_parm(1)["auto-promote-timeout"])
|
|
||||||
|
|
||||||
self.assertEqual("set_drbdsetup_props", dmd.odm.next_call())
|
|
||||||
self.assertEqual("neto", dmd.odm.call_parm(1)["type"])
|
|
||||||
self.assertEqual("30", dmd.odm.call_parm(1)["ko-count"])
|
|
||||||
|
|
||||||
self.assertEqual("set_drbdsetup_props", dmd.odm.next_call())
|
|
||||||
self.assertEqual("disko", dmd.odm.call_parm(1)["type"])
|
|
||||||
self.assertEqual("4M", dmd.odm.call_parm(1)["c-min-rate"])
|
|
||||||
|
|
||||||
self.assertEqual("list_volumes", dmd.odm.next_call())
|
|
||||||
|
|
||||||
self.assertEqual("create_volume", dmd.odm.next_call())
|
|
||||||
self.assertEqual(1048576, dmd.odm.call_parm(2))
|
|
||||||
|
|
||||||
self.assertEqual("auto_deploy", dmd.odm.next_call())
|
|
||||||
|
|
||||||
def test_create_volume_controller_all_vols(self):
|
|
||||||
testvol = {'project_id': 'testprjid',
|
|
||||||
'name': 'testvol',
|
|
||||||
'size': 1,
|
|
||||||
'id': 'deadbeef-8068-11e4-98c0-5254008ea111',
|
|
||||||
'volume_type_id': 'drbdmanage',
|
|
||||||
'created_at': timeutils.utcnow()}
|
|
||||||
|
|
||||||
dmd = drv.DrbdManageIscsiDriver(configuration=self.configuration)
|
|
||||||
dmd.drbdmanage_devs_on_controller = True
|
|
||||||
dmd.odm = DrbdManageFakeDriver()
|
|
||||||
dmd.create_volume(testvol)
|
|
||||||
self.assertEqual("create_resource", dmd.odm.next_call())
|
|
||||||
self.assertEqual("set_drbdsetup_props", dmd.odm.next_call())
|
|
||||||
self.assertEqual("set_drbdsetup_props", dmd.odm.next_call())
|
|
||||||
self.assertEqual("set_drbdsetup_props", dmd.odm.next_call())
|
|
||||||
self.assertEqual("list_volumes", dmd.odm.next_call())
|
|
||||||
self.assertEqual("create_volume", dmd.odm.next_call())
|
|
||||||
self.assertEqual(1048576, dmd.odm.call_parm(2))
|
|
||||||
self.assertEqual("auto_deploy", dmd.odm.next_call())
|
|
||||||
self.assertEqual("run_external_plugin", dmd.odm.next_call())
|
|
||||||
self.assertEqual("assign", dmd.odm.next_call())
|
|
||||||
self.assertEqual(9, dmd.odm.call_count())
|
|
||||||
|
|
||||||
def test_delete_volume(self):
|
|
||||||
testvol = {'project_id': 'testprjid',
|
|
||||||
'name': 'testvol',
|
|
||||||
'size': 1,
|
|
||||||
'id': 'ba253fd0-8068-11e4-98c0-5254008ea111',
|
|
||||||
'volume_type_id': 'drbdmanage',
|
|
||||||
'created_at': timeutils.utcnow()}
|
|
||||||
|
|
||||||
dmd = drv.DrbdManageIscsiDriver(configuration=self.configuration)
|
|
||||||
dmd.odm = DrbdManageFakeDriver()
|
|
||||||
dmd.delete_volume(testvol)
|
|
||||||
self.assertEqual("list_volumes", dmd.odm.next_call())
|
|
||||||
self.assertEqual(testvol['id'], dmd.odm.call_parm(3)["aux:cinder-id"])
|
|
||||||
self.assertEqual("remove_volume", dmd.odm.next_call())
|
|
||||||
|
|
||||||
def test_local_path(self):
|
|
||||||
testvol = {'project_id': 'testprjid',
|
|
||||||
'name': 'testvol',
|
|
||||||
'size': 1,
|
|
||||||
'id': 'ba253fd0-8068-11e4-98c0-5254008ea111',
|
|
||||||
'volume_type_id': 'drbdmanage',
|
|
||||||
'created_at': timeutils.utcnow()}
|
|
||||||
|
|
||||||
dmd = drv.DrbdManageIscsiDriver(configuration=self.configuration)
|
|
||||||
dmd.odm = DrbdManageFakeDriver()
|
|
||||||
data = dmd.local_path(testvol)
|
|
||||||
self.assertTrue(data.startswith("/dev/drbd"))
|
|
||||||
|
|
||||||
def test_create_snapshot(self):
|
|
||||||
testsnap = {'id': 'ca253fd0-8068-11e4-98c0-5254008ea111',
|
|
||||||
'volume_id': 'ba253fd0-8068-11e4-98c0-5254008ea111'}
|
|
||||||
|
|
||||||
dmd = drv.DrbdManageIscsiDriver(configuration=self.configuration)
|
|
||||||
dmd.odm = DrbdManageFakeDriver()
|
|
||||||
dmd.create_snapshot(testsnap)
|
|
||||||
self.assertEqual("list_volumes", dmd.odm.next_call())
|
|
||||||
self.assertEqual("list_assignments", dmd.odm.next_call())
|
|
||||||
self.assertEqual("create_snapshot", dmd.odm.next_call())
|
|
||||||
self.assertIn('node', dmd.odm.call_parm(3))
|
|
||||||
|
|
||||||
def test_delete_snapshot(self):
|
|
||||||
testsnap = {'id': 'ca253fd0-8068-11e4-98c0-5254008ea111'}
|
|
||||||
|
|
||||||
dmd = drv.DrbdManageIscsiDriver(configuration=self.configuration)
|
|
||||||
dmd.odm = DrbdManageFakeDriver()
|
|
||||||
dmd.delete_snapshot(testsnap)
|
|
||||||
self.assertEqual("list_snapshots", dmd.odm.next_call())
|
|
||||||
self.assertEqual("remove_snapshot", dmd.odm.next_call())
|
|
||||||
|
|
||||||
def test_extend_volume(self):
|
|
||||||
testvol = {'project_id': 'testprjid',
|
|
||||||
'name': 'testvol',
|
|
||||||
'size': 1,
|
|
||||||
'id': 'ba253fd0-8068-11e4-98c0-5254008ea111',
|
|
||||||
'volume_type_id': 'drbdmanage',
|
|
||||||
'created_at': timeutils.utcnow()}
|
|
||||||
|
|
||||||
dmd = drv.DrbdManageIscsiDriver(configuration=self.configuration)
|
|
||||||
dmd.odm = DrbdManageFakeDriver()
|
|
||||||
dmd.extend_volume(testvol, 5)
|
|
||||||
self.assertEqual("list_volumes", dmd.odm.next_call())
|
|
||||||
self.assertEqual(testvol['id'], dmd.odm.call_parm(3)["aux:cinder-id"])
|
|
||||||
self.assertEqual("resize_volume", dmd.odm.next_call())
|
|
||||||
self.assertEqual("res", dmd.odm.call_parm(1))
|
|
||||||
self.assertEqual(2, dmd.odm.call_parm(2))
|
|
||||||
self.assertEqual(-1, dmd.odm.call_parm(3))
|
|
||||||
self.assertEqual(5242880, dmd.odm.call_parm(4))
|
|
||||||
|
|
||||||
def test_create_cloned_volume(self):
|
|
||||||
srcvol = {'project_id': 'testprjid',
|
|
||||||
'name': 'testvol',
|
|
||||||
'size': 1,
|
|
||||||
'id': 'ba253fd0-8068-11e4-98c0-5254008ea111',
|
|
||||||
'volume_type_id': 'drbdmanage',
|
|
||||||
'created_at': timeutils.utcnow()}
|
|
||||||
|
|
||||||
newvol = {'id': 'ca253fd0-8068-11e4-98c0-5254008ea111'}
|
|
||||||
|
|
||||||
dmd = drv.DrbdManageIscsiDriver(configuration=self.configuration)
|
|
||||||
dmd.odm = DrbdManageFakeDriver()
|
|
||||||
dmd.create_cloned_volume(newvol, srcvol)
|
|
||||||
self.assertEqual("list_volumes", dmd.odm.next_call())
|
|
||||||
self.assertEqual("list_assignments", dmd.odm.next_call())
|
|
||||||
self.assertEqual("create_snapshot", dmd.odm.next_call())
|
|
||||||
self.assertEqual("run_external_plugin", dmd.odm.next_call())
|
|
||||||
self.assertEqual("list_snapshots", dmd.odm.next_call())
|
|
||||||
self.assertEqual("restore_snapshot", dmd.odm.next_call())
|
|
||||||
self.assertEqual("set_drbdsetup_props", dmd.odm.next_call())
|
|
||||||
self.assertEqual("set_drbdsetup_props", dmd.odm.next_call())
|
|
||||||
self.assertEqual("set_drbdsetup_props", dmd.odm.next_call())
|
|
||||||
self.assertEqual("run_external_plugin", dmd.odm.next_call())
|
|
||||||
self.assertEqual("list_snapshots", dmd.odm.next_call())
|
|
||||||
self.assertEqual("remove_snapshot", dmd.odm.next_call())
|
|
||||||
|
|
||||||
def test_create_cloned_volume_larger_size(self):
|
|
||||||
srcvol = {'project_id': 'testprjid',
|
|
||||||
'name': 'testvol',
|
|
||||||
'size': 1,
|
|
||||||
'id': 'ba253fd0-8068-11e4-98c0-5254008ea111',
|
|
||||||
'volume_type_id': 'drbdmanage',
|
|
||||||
'created_at': timeutils.utcnow()}
|
|
||||||
|
|
||||||
newvol = {'size': 5,
|
|
||||||
'id': 'ca253fd0-8068-11e4-98c0-5254008ea111'}
|
|
||||||
|
|
||||||
dmd = drv.DrbdManageIscsiDriver(configuration=self.configuration)
|
|
||||||
dmd.odm = DrbdManageFakeDriver()
|
|
||||||
dmd.create_cloned_volume(newvol, srcvol)
|
|
||||||
self.assertEqual("list_volumes", dmd.odm.next_call())
|
|
||||||
self.assertEqual("list_assignments", dmd.odm.next_call())
|
|
||||||
self.assertEqual("create_snapshot", dmd.odm.next_call())
|
|
||||||
self.assertEqual("run_external_plugin", dmd.odm.next_call())
|
|
||||||
self.assertEqual("list_snapshots", dmd.odm.next_call())
|
|
||||||
self.assertEqual("restore_snapshot", dmd.odm.next_call())
|
|
||||||
self.assertEqual("set_drbdsetup_props", dmd.odm.next_call())
|
|
||||||
self.assertEqual("set_drbdsetup_props", dmd.odm.next_call())
|
|
||||||
self.assertEqual("set_drbdsetup_props", dmd.odm.next_call())
|
|
||||||
self.assertEqual("run_external_plugin", dmd.odm.next_call())
|
|
||||||
|
|
||||||
# resize image checks
|
|
||||||
self.assertEqual("list_volumes", dmd.odm.next_call())
|
|
||||||
self.assertEqual(newvol['id'], dmd.odm.call_parm(3)["aux:cinder-id"])
|
|
||||||
self.assertEqual("resize_volume", dmd.odm.next_call())
|
|
||||||
self.assertEqual("res", dmd.odm.call_parm(1))
|
|
||||||
self.assertEqual(2, dmd.odm.call_parm(2))
|
|
||||||
self.assertEqual(-1, dmd.odm.call_parm(3))
|
|
||||||
self.assertEqual(5242880, dmd.odm.call_parm(4))
|
|
||||||
|
|
||||||
self.assertEqual("run_external_plugin", dmd.odm.next_call())
|
|
||||||
|
|
||||||
self.assertEqual("list_snapshots", dmd.odm.next_call())
|
|
||||||
self.assertEqual("remove_snapshot", dmd.odm.next_call())
|
|
||||||
|
|
||||||
def test_create_volume_from_snapshot(self):
|
|
||||||
snap = {'project_id': 'testprjid',
|
|
||||||
'name': 'testvol',
|
|
||||||
'volume_size': 1,
|
|
||||||
'id': 'ba253fd0-8068-11e4-98c0-5254008ea111',
|
|
||||||
'volume_type_id': 'drbdmanage',
|
|
||||||
'created_at': timeutils.utcnow()}
|
|
||||||
|
|
||||||
newvol = {'id': 'ca253fd0-8068-11e4-98c0-5254008ea111'}
|
|
||||||
|
|
||||||
dmd = drv.DrbdManageIscsiDriver(configuration=self.configuration)
|
|
||||||
dmd.odm = DrbdManageFakeDriver()
|
|
||||||
dmd.create_volume_from_snapshot(newvol, snap)
|
|
||||||
self.assertEqual("list_snapshots", dmd.odm.next_call())
|
|
||||||
self.assertEqual("restore_snapshot", dmd.odm.next_call())
|
|
||||||
self.assertEqual("set_drbdsetup_props", dmd.odm.next_call())
|
|
||||||
self.assertEqual("set_drbdsetup_props", dmd.odm.next_call())
|
|
||||||
self.assertEqual("set_drbdsetup_props", dmd.odm.next_call())
|
|
||||||
self.assertEqual("run_external_plugin", dmd.odm.next_call())
|
|
||||||
|
|
||||||
def test_create_volume_from_snapshot_larger_size(self):
|
|
||||||
snap = {'project_id': 'testprjid',
|
|
||||||
'name': 'testvol',
|
|
||||||
'volume_size': 1,
|
|
||||||
'id': 'ba253fd0-8068-11e4-98c0-5254008ea111',
|
|
||||||
'volume_type_id': 'drbdmanage',
|
|
||||||
'created_at': timeutils.utcnow()}
|
|
||||||
|
|
||||||
newvol = {'size': 5,
|
|
||||||
'id': 'ca253fd0-8068-11e4-98c0-5254008ea111'}
|
|
||||||
|
|
||||||
dmd = drv.DrbdManageIscsiDriver(configuration=self.configuration)
|
|
||||||
dmd.odm = DrbdManageFakeDriver()
|
|
||||||
dmd.create_volume_from_snapshot(newvol, snap)
|
|
||||||
self.assertEqual("list_snapshots", dmd.odm.next_call())
|
|
||||||
self.assertEqual("restore_snapshot", dmd.odm.next_call())
|
|
||||||
self.assertEqual("set_drbdsetup_props", dmd.odm.next_call())
|
|
||||||
self.assertEqual("set_drbdsetup_props", dmd.odm.next_call())
|
|
||||||
self.assertEqual("set_drbdsetup_props", dmd.odm.next_call())
|
|
||||||
self.assertEqual("run_external_plugin", dmd.odm.next_call())
|
|
||||||
|
|
||||||
def test_unit_conversions(self):
|
|
||||||
dmd = drv.DrbdManageIscsiDriver(configuration=self.configuration)
|
|
||||||
|
|
||||||
self.assertEqual(1048576, dmd._vol_size_to_dm(1))
|
|
||||||
self.assertEqual(1, dmd._vol_size_to_cinder(1048576))
|
|
||||||
|
|
||||||
self.assertEqual(5368709120, dmd._vol_size_to_dm(5120))
|
|
||||||
self.assertEqual(5120, dmd._vol_size_to_cinder(5368709120))
|
|
||||||
|
|
||||||
self.assertEqual(10737418240, dmd._vol_size_to_dm(10240))
|
|
||||||
self.assertEqual(10240, dmd._vol_size_to_cinder(10737418240))
|
|
||||||
|
|
||||||
|
|
||||||
class DrbdManageDrbdTestCase(DrbdManageIscsiTestCase):
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
super(DrbdManageDrbdTestCase, self).setUp()
|
|
||||||
|
|
||||||
self.mock_object(drv.DrbdManageDrbdDriver,
|
|
||||||
'_is_external_node',
|
|
||||||
self.fake_is_external_node)
|
|
||||||
|
|
||||||
def test_drbd_create_export(self):
|
|
||||||
volume = {'project_id': 'testprjid',
|
|
||||||
'name': 'testvol',
|
|
||||||
'size': 1,
|
|
||||||
'id': 'ba253fd0-8068-11e4-98c0-5254008ea111',
|
|
||||||
'volume_type_id': 'drbdmanage',
|
|
||||||
'created_at': timeutils.utcnow()}
|
|
||||||
|
|
||||||
connector = {'host': 'node99',
|
|
||||||
'ip': '127.0.0.99'}
|
|
||||||
|
|
||||||
dmd = drv.DrbdManageDrbdDriver(configuration=self.configuration)
|
|
||||||
dmd.odm = DrbdManageFakeDriver()
|
|
||||||
|
|
||||||
x = dmd.create_export({}, volume, connector)
|
|
||||||
self.assertEqual("list_volumes", dmd.odm.next_call())
|
|
||||||
self.assertEqual("create_node", dmd.odm.next_call())
|
|
||||||
self.assertEqual("assign", dmd.odm.next_call())
|
|
||||||
# local_path
|
|
||||||
self.assertEqual("list_volumes", dmd.odm.next_call())
|
|
||||||
self.assertEqual("text_query", dmd.odm.next_call())
|
|
||||||
self.assertEqual("local", x["driver_volume_type"])
|
|
||||||
|
|
||||||
|
|
||||||
class DrbdManageCommonTestCase(DrbdManageIscsiTestCase):
|
|
||||||
def test_drbd_policy_loop_timeout(self):
|
|
||||||
dmd = drv.DrbdManageDrbdDriver(configuration=self.configuration)
|
|
||||||
dmd.odm = DrbdManageFakeDriver()
|
|
||||||
|
|
||||||
res = dmd._call_policy_plugin('void', {},
|
|
||||||
{'retry': 4,
|
|
||||||
'run-into-timeout': True})
|
|
||||||
self.assertFalse(res)
|
|
||||||
self.assertEqual(4, dmd.odm.call_count())
|
|
||||||
self.assertEqual("run_external_plugin", dmd.odm.next_call())
|
|
||||||
self.assertEqual("run_external_plugin", dmd.odm.next_call())
|
|
||||||
self.assertEqual("run_external_plugin", dmd.odm.next_call())
|
|
||||||
self.assertEqual("run_external_plugin", dmd.odm.next_call())
|
|
||||||
|
|
||||||
def test_drbd_policy_loop_success(self):
|
|
||||||
dmd = drv.DrbdManageDrbdDriver(configuration=self.configuration)
|
|
||||||
dmd.odm = DrbdManageFakeDriver()
|
|
||||||
|
|
||||||
res = dmd._call_policy_plugin('void',
|
|
||||||
{'base': 'data',
|
|
||||||
'retry': 4},
|
|
||||||
{'override': 'xyz'})
|
|
||||||
self.assertTrue(res)
|
|
||||||
self.assertEqual(4, dmd.odm.call_count())
|
|
||||||
self.assertEqual("run_external_plugin", dmd.odm.next_call())
|
|
||||||
self.assertEqual("run_external_plugin", dmd.odm.next_call())
|
|
||||||
self.assertEqual("run_external_plugin", dmd.odm.next_call())
|
|
||||||
self.assertEqual("run_external_plugin", dmd.odm.next_call())
|
|
||||||
|
|
||||||
def test_drbd_policy_loop_simple(self):
|
|
||||||
dmd = drv.DrbdManageDrbdDriver(configuration=self.configuration)
|
|
||||||
dmd.odm = DrbdManageFakeDriver()
|
|
||||||
|
|
||||||
res = dmd._call_policy_plugin('policy-name',
|
|
||||||
{'base': "value",
|
|
||||||
'over': "ignore"},
|
|
||||||
{'over': "ride",
|
|
||||||
'starttime': 0})
|
|
||||||
self.assertTrue(res)
|
|
||||||
|
|
||||||
self.assertEqual(1, dmd.odm.call_count())
|
|
||||||
self.assertEqual("run_external_plugin", dmd.odm.next_call())
|
|
||||||
self.assertEqual('policy-name', dmd.odm.call_parm(1))
|
|
||||||
incoming = dmd.odm.call_parm(2)
|
|
||||||
|
|
||||||
self.assertGreaterEqual(4, abs(float(incoming['starttime']) -
|
|
||||||
time.time()))
|
|
||||||
self.assertEqual('value', incoming['base'])
|
|
||||||
self.assertEqual('ride', incoming['over'])
|
|
File diff suppressed because it is too large
Load Diff
@ -1,33 +0,0 @@
|
|||||||
========================
|
|
||||||
DRBD driver (Deprecated)
|
|
||||||
========================
|
|
||||||
|
|
||||||
The DRBD driver allows Cinder to use DRBDmanage instances.
|
|
||||||
|
|
||||||
.. note::
|
|
||||||
The LINBIT DRBDManage volume driver is moving to maintenance mode in Stein
|
|
||||||
Release and will be removed in T Release.
|
|
||||||
|
|
||||||
Configuration
|
|
||||||
~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Set the following option in the ``cinder.conf`` file for the DRBD transport:
|
|
||||||
|
|
||||||
.. code-block:: ini
|
|
||||||
|
|
||||||
volume_driver = cinder.volume.drivers.drbdmanagedrv.DrbdManageDrbdDriver
|
|
||||||
|
|
||||||
Or use the following for iSCSI transport:
|
|
||||||
|
|
||||||
.. code-block:: ini
|
|
||||||
|
|
||||||
volume_driver = cinder.volume.drivers.drbdmanagedrv.DrbdManageIscsiDriver
|
|
||||||
|
|
||||||
|
|
||||||
The following table contains the configuration options supported by the
|
|
||||||
DRBD drivers:
|
|
||||||
|
|
||||||
.. config-table::
|
|
||||||
:config-target: DRBD
|
|
||||||
|
|
||||||
cinder.volume.drivers.drbdmanagedrv
|
|
@ -114,9 +114,6 @@ title=Kaminario Storage Driver (iSCSI, FC)
|
|||||||
[driver.lenovo]
|
[driver.lenovo]
|
||||||
title=Lenovo Storage Driver (FC, iSCSI)
|
title=Lenovo Storage Driver (FC, iSCSI)
|
||||||
|
|
||||||
[driver.linbit_drbd]
|
|
||||||
title=LinBit DRDB Driver (DRBD)
|
|
||||||
|
|
||||||
[driver.linbit_linstor]
|
[driver.linbit_linstor]
|
||||||
title=LINBIT DRBD/LINSTOR Driver (DRBD)
|
title=LINBIT DRBD/LINSTOR Driver (DRBD)
|
||||||
|
|
||||||
@ -238,7 +235,6 @@ driver.inspur=complete
|
|||||||
driver.inspur_as13000=complete
|
driver.inspur_as13000=complete
|
||||||
driver.kaminario=complete
|
driver.kaminario=complete
|
||||||
driver.lenovo=complete
|
driver.lenovo=complete
|
||||||
driver.linbit_drbd=complete
|
|
||||||
driver.linbit_linstor=complete
|
driver.linbit_linstor=complete
|
||||||
driver.lvm=complete
|
driver.lvm=complete
|
||||||
driver.nec=complete
|
driver.nec=complete
|
||||||
@ -304,7 +300,6 @@ driver.inspur=complete
|
|||||||
driver.inspur_as13000=complete
|
driver.inspur_as13000=complete
|
||||||
driver.kaminario=complete
|
driver.kaminario=complete
|
||||||
driver.lenovo=complete
|
driver.lenovo=complete
|
||||||
driver.linbit_drbd=complete
|
|
||||||
driver.linbit_linstor=complete
|
driver.linbit_linstor=complete
|
||||||
driver.lvm=complete
|
driver.lvm=complete
|
||||||
driver.nec=complete
|
driver.nec=complete
|
||||||
@ -370,7 +365,6 @@ driver.inspur=complete
|
|||||||
driver.inspur_as13000=missing
|
driver.inspur_as13000=missing
|
||||||
driver.kaminario=missing
|
driver.kaminario=missing
|
||||||
driver.lenovo=missing
|
driver.lenovo=missing
|
||||||
driver.linbit_drbd=missing
|
|
||||||
driver.linbit_linstor=missing
|
driver.linbit_linstor=missing
|
||||||
driver.lvm=missing
|
driver.lvm=missing
|
||||||
driver.nec=missing
|
driver.nec=missing
|
||||||
@ -437,7 +431,6 @@ driver.inspur=complete
|
|||||||
driver.inspur_as13000=missing
|
driver.inspur_as13000=missing
|
||||||
driver.kaminario=missing
|
driver.kaminario=missing
|
||||||
driver.lenovo=missing
|
driver.lenovo=missing
|
||||||
driver.linbit_drbd=missing
|
|
||||||
driver.linbit_linstor=missing
|
driver.linbit_linstor=missing
|
||||||
driver.lvm=missing
|
driver.lvm=missing
|
||||||
driver.nec=complete
|
driver.nec=complete
|
||||||
@ -505,7 +498,6 @@ driver.inspur=complete
|
|||||||
driver.inspur_as13000=missing
|
driver.inspur_as13000=missing
|
||||||
driver.kaminario=complete
|
driver.kaminario=complete
|
||||||
driver.lenovo=missing
|
driver.lenovo=missing
|
||||||
driver.linbit_drbd=missing
|
|
||||||
driver.linbit_linstor=missing
|
driver.linbit_linstor=missing
|
||||||
driver.lvm=missing
|
driver.lvm=missing
|
||||||
driver.nec=missing
|
driver.nec=missing
|
||||||
@ -574,7 +566,6 @@ driver.inspur=complete
|
|||||||
driver.inspur_as13000=missing
|
driver.inspur_as13000=missing
|
||||||
driver.kaminario=missing
|
driver.kaminario=missing
|
||||||
driver.lenovo=missing
|
driver.lenovo=missing
|
||||||
driver.linbit_drbd=missing
|
|
||||||
driver.linbit_linstor=missing
|
driver.linbit_linstor=missing
|
||||||
driver.lvm=missing
|
driver.lvm=missing
|
||||||
driver.nec=missing
|
driver.nec=missing
|
||||||
@ -642,7 +633,6 @@ driver.inspur=missing
|
|||||||
driver.inspur_as13000=complete
|
driver.inspur_as13000=complete
|
||||||
driver.kaminario=complete
|
driver.kaminario=complete
|
||||||
driver.lenovo=missing
|
driver.lenovo=missing
|
||||||
driver.linbit_drbd=missing
|
|
||||||
driver.linbit_linstor=missing
|
driver.linbit_linstor=missing
|
||||||
driver.lvm=complete
|
driver.lvm=complete
|
||||||
driver.nec=complete
|
driver.nec=complete
|
||||||
@ -711,7 +701,6 @@ driver.inspur=missing
|
|||||||
driver.inspur_as13000=missing
|
driver.inspur_as13000=missing
|
||||||
driver.kaminario=missing
|
driver.kaminario=missing
|
||||||
driver.lenovo=missing
|
driver.lenovo=missing
|
||||||
driver.linbit_drbd=missing
|
|
||||||
driver.linbit_linstor=missing
|
driver.linbit_linstor=missing
|
||||||
driver.lvm=missing
|
driver.lvm=missing
|
||||||
driver.nec=complete
|
driver.nec=complete
|
||||||
@ -780,7 +769,6 @@ driver.inspur=missing
|
|||||||
driver.inspur_as13000=complete
|
driver.inspur_as13000=complete
|
||||||
driver.kaminario=missing
|
driver.kaminario=missing
|
||||||
driver.lenovo=missing
|
driver.lenovo=missing
|
||||||
driver.linbit_drbd=missing
|
|
||||||
driver.linbit_linstor=missing
|
driver.linbit_linstor=missing
|
||||||
driver.lvm=complete
|
driver.lvm=complete
|
||||||
driver.nec=missing
|
driver.nec=missing
|
||||||
@ -846,7 +834,6 @@ driver.inspur=missing
|
|||||||
driver.inspur_as13000=missing
|
driver.inspur_as13000=missing
|
||||||
driver.kaminario=missing
|
driver.kaminario=missing
|
||||||
driver.lenovo=missing
|
driver.lenovo=missing
|
||||||
driver.linbit_drbd=missing
|
|
||||||
driver.linbit_linstor=missing
|
driver.linbit_linstor=missing
|
||||||
driver.lvm=complete
|
driver.lvm=complete
|
||||||
driver.nec=missing
|
driver.nec=missing
|
||||||
|
@ -67,6 +67,7 @@ release.
|
|||||||
* CoprHD Storage Driver (FC, iSCSI, ScaleIO)
|
* CoprHD Storage Driver (FC, iSCSI, ScaleIO)
|
||||||
|
|
||||||
* Stein
|
* Stein
|
||||||
|
* DRBDManage Driver
|
||||||
* HGST Flash Storage Suite Driver (vgc)
|
* HGST Flash Storage Suite Driver (vgc)
|
||||||
* ITRI DISCO Driver
|
* ITRI DISCO Driver
|
||||||
* NetApp E-Series Driver
|
* NetApp E-Series Driver
|
||||||
|
@ -2,9 +2,6 @@
|
|||||||
# certain drivers. This file is not managed by
|
# certain drivers. This file is not managed by
|
||||||
# requirements tools.
|
# requirements tools.
|
||||||
|
|
||||||
# DRBD
|
|
||||||
dbus # MIT
|
|
||||||
|
|
||||||
# HPE 3PAR
|
# HPE 3PAR
|
||||||
python-3parclient>=4.1.0 # Apache-2.0
|
python-3parclient>=4.1.0 # Apache-2.0
|
||||||
|
|
||||||
|
@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
upgrade:
|
||||||
|
- The DRBDManage driver is now removed. Customers using the
|
||||||
|
DRBDManage driver should not upgrade Cinder without first
|
||||||
|
migrating all volumes from their DRBDManage backend to a
|
||||||
|
supported storage backend such as LINSTOR. Failure to migrate
|
||||||
|
volumes will result in not being able to access volumes backed
|
||||||
|
by the DRBDManage storage backend.
|
||||||
|
deprecations:
|
||||||
|
- The DRBDManage driver is deprecated as of the Stein release and
|
||||||
|
is removed in the Train release. Users should use the new
|
||||||
|
LINSTOR driver instead.
|
Loading…
x
Reference in New Issue
Block a user