Merge "Ceph for standard: Enable Ceph for a standard configuration"
This commit is contained in:
commit
c50f62d13f
@ -1338,7 +1338,7 @@ def extoam_list(request):
|
|||||||
|
|
||||||
class Cluster(base.APIResourceWrapper):
|
class Cluster(base.APIResourceWrapper):
|
||||||
"""..."""
|
"""..."""
|
||||||
_attrs = ['uuid', 'cluster_uuid', 'type', 'name']
|
_attrs = ['uuid', 'cluster_uuid', 'type', 'name', 'deployment_model']
|
||||||
|
|
||||||
def __init__(self, apiresource):
|
def __init__(self, apiresource):
|
||||||
super(Cluster, self).__init__(apiresource)
|
super(Cluster, self).__init__(apiresource)
|
||||||
@ -1347,6 +1347,7 @@ class Cluster(base.APIResourceWrapper):
|
|||||||
self._uuid = self.uuid
|
self._uuid = self.uuid
|
||||||
self._name = self.name
|
self._name = self.name
|
||||||
self._type = self.type
|
self._type = self.type
|
||||||
|
self._deployment_model = self.deployment_model
|
||||||
self._cluster_uuid = self.cluster_uuid
|
self._cluster_uuid = self.cluster_uuid
|
||||||
else:
|
else:
|
||||||
self._uuid = None
|
self._uuid = None
|
||||||
@ -1366,11 +1367,23 @@ class Cluster(base.APIResourceWrapper):
|
|||||||
def type(self):
|
def type(self):
|
||||||
return self._type
|
return self._type
|
||||||
|
|
||||||
|
@property
|
||||||
|
def deployment_model(self):
|
||||||
|
return self._deployment_model
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def cluster_uuid(self):
|
def cluster_uuid(self):
|
||||||
return self._cluster_uuid
|
return self._cluster_uuid
|
||||||
|
|
||||||
|
|
||||||
|
def cluster_get(request, name):
|
||||||
|
clusters = cgtsclient(request).cluster.list()
|
||||||
|
for c in clusters:
|
||||||
|
if name == c.name:
|
||||||
|
return Cluster(c)
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
def cluster_list(request):
|
def cluster_list(request):
|
||||||
clusters = cgtsclient(request).cluster.list()
|
clusters = cgtsclient(request).cluster.list()
|
||||||
|
|
||||||
@ -1554,7 +1567,8 @@ class ControllerFS(base.APIResourceWrapper):
|
|||||||
|
|
||||||
class CephMon(base.APIResourceWrapper):
|
class CephMon(base.APIResourceWrapper):
|
||||||
"""..."""
|
"""..."""
|
||||||
_attrs = ['device_path', 'ceph_mon_gib', 'hostname', 'uuid', 'link']
|
_attrs = ['device_path', 'ceph_mon_gib', 'hostname',
|
||||||
|
'ihost_uuid', 'uuid', 'link']
|
||||||
|
|
||||||
def __init__(self, apiresource):
|
def __init__(self, apiresource):
|
||||||
super(CephMon, self).__init__(apiresource)
|
super(CephMon, self).__init__(apiresource)
|
||||||
@ -1563,10 +1577,12 @@ class CephMon(base.APIResourceWrapper):
|
|||||||
self._device_path = self.device_path
|
self._device_path = self.device_path
|
||||||
self._ceph_mon_gib = self.ceph_mon_gib
|
self._ceph_mon_gib = self.ceph_mon_gib
|
||||||
self._hostname = self.hostname
|
self._hostname = self.hostname
|
||||||
|
self._ihost_uuid = self.ihost_uuid
|
||||||
else:
|
else:
|
||||||
self._device_path = None
|
self._device_path = None
|
||||||
self._ceph_mon_gib = None
|
self._ceph_mon_gib = None
|
||||||
self._hostname = None
|
self._hostname = None
|
||||||
|
self._ihost_uuid = None
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def device_path(self):
|
def device_path(self):
|
||||||
@ -1580,6 +1596,10 @@ class CephMon(base.APIResourceWrapper):
|
|||||||
def hostname(self):
|
def hostname(self):
|
||||||
return self._hostname
|
return self._hostname
|
||||||
|
|
||||||
|
@property
|
||||||
|
def ihost_uuid(self):
|
||||||
|
return self._ihost_uuid
|
||||||
|
|
||||||
|
|
||||||
class STORAGE(base.APIResourceWrapper):
|
class STORAGE(base.APIResourceWrapper):
|
||||||
"""..."""
|
"""..."""
|
||||||
@ -1736,20 +1756,38 @@ def storagefs_list(request):
|
|||||||
# so the first element is enough for obtaining the needed data.
|
# so the first element is enough for obtaining the needed data.
|
||||||
|
|
||||||
controllerfs_obj = None
|
controllerfs_obj = None
|
||||||
ceph_mon_obj = None
|
mon_obj = None
|
||||||
|
|
||||||
if ceph_mon_list:
|
if ceph_mon_list:
|
||||||
ceph_mon_obj = ceph_mon_list[0]
|
# Get storage-0 configuration
|
||||||
|
for mon_obj in ceph_mon_list:
|
||||||
|
if mon_obj.hostname == constants.STORAGE_0_HOSTNAME:
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
mon_obj = ceph_mon_list[0]
|
||||||
|
|
||||||
return [STORAGE(controllerfs_obj, ceph_mon_obj)]
|
return [STORAGE(controllerfs_obj, mon_obj)]
|
||||||
|
|
||||||
|
|
||||||
def controllerfs_list(request):
|
def controllerfs_list(request):
|
||||||
controllerfs = cgtsclient(request).controller_fs.list()
|
controllerfs = cgtsclient(request).controller_fs.list()
|
||||||
ceph_mon_list = cgtsclient(request).ceph_mon.list()
|
ceph_mon_list = cgtsclient(request).ceph_mon.list()
|
||||||
|
hosts = cgtsclient(request).ihost.list()
|
||||||
|
|
||||||
if ceph_mon_list and not is_system_k8s_aio(request):
|
if ceph_mon_list:
|
||||||
controllerfs.append(ceph_mon_list[0])
|
host = None
|
||||||
|
for host in hosts:
|
||||||
|
# Get any unlocked controller,
|
||||||
|
# both have the same configuration
|
||||||
|
if (host.personality == constants.CONTROLLER and
|
||||||
|
host.administrative == constants.ADMIN_UNLOCKED):
|
||||||
|
break
|
||||||
|
|
||||||
|
if host and is_host_with_storage(request, host.uuid):
|
||||||
|
for mon in ceph_mon_list:
|
||||||
|
if mon.hostname == host.hostname:
|
||||||
|
controllerfs.append(mon)
|
||||||
|
break
|
||||||
|
|
||||||
return [ControllerFS(n) for n in controllerfs]
|
return [ControllerFS(n) for n in controllerfs]
|
||||||
|
|
||||||
@ -2570,18 +2608,33 @@ def is_kubernetes_config(request):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def is_system_k8s_aio(request):
|
def get_ceph_storage_model(request):
|
||||||
system_type = get_system_type(request)
|
cluster = cluster_get(request, constants.CLUSTER_CEPH_DEFAULT_NAME)
|
||||||
|
return cluster.deployment_model
|
||||||
if (system_type == SYSTEM_TYPE_AIO and
|
|
||||||
is_kubernetes_config(request)):
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
|
|
||||||
def is_host_with_storage(request, host_id):
|
def is_host_with_storage(request, host_id):
|
||||||
|
storage_model = get_ceph_storage_model(request)
|
||||||
|
|
||||||
|
if storage_model == constants.CEPH_AIO_SX_MODEL:
|
||||||
|
# We have a single host, no need to query further
|
||||||
|
return True
|
||||||
|
|
||||||
host = host_get(request, host_id)
|
host = host_get(request, host_id)
|
||||||
return 'storage' in host.subfunctions or is_system_k8s_aio(request)
|
|
||||||
|
if storage_model == constants.CEPH_STORAGE_MODEL:
|
||||||
|
if host._personality == constants.STORAGE:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
elif storage_model == constants.CEPH_CONTROLLER_MODEL:
|
||||||
|
if host._personality == constants.CONTROLLER:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
# Storage model is undefined
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
class DataNetwork(base.APIResourceWrapper):
|
class DataNetwork(base.APIResourceWrapper):
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2013-2015, 2017 Wind River Systems, Inc.
|
# Copyright (c) 2013-2019 Wind River Systems, Inc.
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
#
|
#
|
||||||
@ -33,18 +33,19 @@ class CreateStorageVolume(tables.LinkAction):
|
|||||||
return reverse(self.url, args=(host_id,))
|
return reverse(self.url, args=(host_id,))
|
||||||
|
|
||||||
def allowed(self, request, datum):
|
def allowed(self, request, datum):
|
||||||
is_system_k8s_aio = sysinv.is_system_k8s_aio(request)
|
host_id = self.table.kwargs['host_id']
|
||||||
|
is_host_with_storage = sysinv.is_host_with_storage(request, host_id)
|
||||||
host = self.table.kwargs['host']
|
host = self.table.kwargs['host']
|
||||||
self.verbose_name = _("Assign Storage Function")
|
self.verbose_name = _("Assign Storage Function")
|
||||||
|
|
||||||
classes = [c for c in self.classes if c != "disabled"]
|
classes = [c for c in self.classes if c != "disabled"]
|
||||||
self.classes = classes
|
self.classes = classes
|
||||||
|
|
||||||
if host._personality != 'storage' and not is_system_k8s_aio:
|
if not is_host_with_storage:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
if host._administrative == 'unlocked':
|
if host._administrative == 'unlocked':
|
||||||
if 'storage' in host._subfunctions or is_system_k8s_aio:
|
if is_host_with_storage:
|
||||||
if "disabled" not in self.classes:
|
if "disabled" not in self.classes:
|
||||||
self.classes = [c for c in self.classes] + ['disabled']
|
self.classes = [c for c in self.classes] + ['disabled']
|
||||||
self.verbose_name = string_concat(self.verbose_name, ' ',
|
self.verbose_name = string_concat(self.verbose_name, ' ',
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2013-2018 Wind River Systems, Inc.
|
# Copyright (c) 2013-2019 Wind River Systems, Inc.
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
#
|
#
|
||||||
@ -489,8 +489,9 @@ class StorageTab(tabs.TableTab):
|
|||||||
|
|
||||||
def get_context_data(self, request):
|
def get_context_data(self, request):
|
||||||
context = super(StorageTab, self).get_context_data(request)
|
context = super(StorageTab, self).get_context_data(request)
|
||||||
|
host = self.tab_group.kwargs['host']
|
||||||
try:
|
try:
|
||||||
context['host'] = self.tab_group.kwargs['host']
|
context['host'] = host
|
||||||
except Exception:
|
except Exception:
|
||||||
redirect = reverse('horizon:admin:inventory:index')
|
redirect = reverse('horizon:admin:inventory:index')
|
||||||
exceptions.handle(self.request,
|
exceptions.handle(self.request,
|
||||||
@ -498,8 +499,8 @@ class StorageTab(tabs.TableTab):
|
|||||||
redirect=redirect)
|
redirect=redirect)
|
||||||
|
|
||||||
context['cinder_backend'] = stx_api.sysinv.get_cinder_backend(request)
|
context['cinder_backend'] = stx_api.sysinv.get_cinder_backend(request)
|
||||||
context['is_system_k8s_aio'] = \
|
context['is_host_with_storage'] = \
|
||||||
stx_api.sysinv.is_system_k8s_aio(request)
|
stx_api.sysinv.is_host_with_storage(request, host.uuid)
|
||||||
|
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
@ -9,8 +9,7 @@
|
|||||||
<div id="partitions">
|
<div id="partitions">
|
||||||
{{ partitions_table.render }}
|
{{ partitions_table.render }}
|
||||||
</div>
|
</div>
|
||||||
|
{% if is_host_with_storage %}
|
||||||
{% if host.personality == "Storage" or is_system_k8s_aio %}
|
|
||||||
<div id="storagevolumes">
|
<div id="storagevolumes">
|
||||||
{{ storagevolumes_table.render }}
|
{{ storagevolumes_table.render }}
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2013-2018 Wind River Systems, Inc.
|
# Copyright (c) 2013-2019 Wind River Systems, Inc.
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
#
|
#
|
||||||
@ -9,6 +9,7 @@
|
|||||||
import logging
|
import logging
|
||||||
|
|
||||||
import cpu_functions.utils as icpu_utils
|
import cpu_functions.utils as icpu_utils
|
||||||
|
import sysinv.common.constants as sysinv_const
|
||||||
|
|
||||||
from cgtsclient.common import constants
|
from cgtsclient.common import constants
|
||||||
from cgtsclient import exc
|
from cgtsclient import exc
|
||||||
@ -23,6 +24,7 @@ from horizon.utils import validators
|
|||||||
from horizon import workflows
|
from horizon import workflows
|
||||||
|
|
||||||
from starlingx_dashboard import api as stx_api
|
from starlingx_dashboard import api as stx_api
|
||||||
|
from starlingx_dashboard.api import sysinv
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -392,7 +394,10 @@ class UpdateHostInfoAction(workflows.Action):
|
|||||||
self.fields[
|
self.fields[
|
||||||
'interfaceProfile'].widget = forms.widgets.HiddenInput()
|
'interfaceProfile'].widget = forms.widgets.HiddenInput()
|
||||||
|
|
||||||
|
stor_model = sysinv.get_ceph_storage_model(request)
|
||||||
if ((personality == 'storage' or
|
if ((personality == 'storage' or
|
||||||
|
(personality == 'controller' and
|
||||||
|
stor_model == sysinv_const.CEPH_CONTROLLER_MODEL) or
|
||||||
'worker' in host._subfunctions) and host.disks):
|
'worker' in host._subfunctions) and host.disks):
|
||||||
# Populate Available Disk Profile Choices
|
# Populate Available Disk Profile Choices
|
||||||
try:
|
try:
|
||||||
|
Loading…
Reference in New Issue
Block a user