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):
|
||||
"""..."""
|
||||
_attrs = ['uuid', 'cluster_uuid', 'type', 'name']
|
||||
_attrs = ['uuid', 'cluster_uuid', 'type', 'name', 'deployment_model']
|
||||
|
||||
def __init__(self, apiresource):
|
||||
super(Cluster, self).__init__(apiresource)
|
||||
@ -1347,6 +1347,7 @@ class Cluster(base.APIResourceWrapper):
|
||||
self._uuid = self.uuid
|
||||
self._name = self.name
|
||||
self._type = self.type
|
||||
self._deployment_model = self.deployment_model
|
||||
self._cluster_uuid = self.cluster_uuid
|
||||
else:
|
||||
self._uuid = None
|
||||
@ -1366,11 +1367,23 @@ class Cluster(base.APIResourceWrapper):
|
||||
def type(self):
|
||||
return self._type
|
||||
|
||||
@property
|
||||
def deployment_model(self):
|
||||
return self._deployment_model
|
||||
|
||||
@property
|
||||
def cluster_uuid(self):
|
||||
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):
|
||||
clusters = cgtsclient(request).cluster.list()
|
||||
|
||||
@ -1554,7 +1567,8 @@ class ControllerFS(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):
|
||||
super(CephMon, self).__init__(apiresource)
|
||||
@ -1563,10 +1577,12 @@ class CephMon(base.APIResourceWrapper):
|
||||
self._device_path = self.device_path
|
||||
self._ceph_mon_gib = self.ceph_mon_gib
|
||||
self._hostname = self.hostname
|
||||
self._ihost_uuid = self.ihost_uuid
|
||||
else:
|
||||
self._device_path = None
|
||||
self._ceph_mon_gib = None
|
||||
self._hostname = None
|
||||
self._ihost_uuid = None
|
||||
|
||||
@property
|
||||
def device_path(self):
|
||||
@ -1580,6 +1596,10 @@ class CephMon(base.APIResourceWrapper):
|
||||
def hostname(self):
|
||||
return self._hostname
|
||||
|
||||
@property
|
||||
def ihost_uuid(self):
|
||||
return self._ihost_uuid
|
||||
|
||||
|
||||
class STORAGE(base.APIResourceWrapper):
|
||||
"""..."""
|
||||
@ -1736,20 +1756,38 @@ def storagefs_list(request):
|
||||
# so the first element is enough for obtaining the needed data.
|
||||
|
||||
controllerfs_obj = None
|
||||
ceph_mon_obj = None
|
||||
mon_obj = None
|
||||
|
||||
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):
|
||||
controllerfs = cgtsclient(request).controller_fs.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):
|
||||
controllerfs.append(ceph_mon_list[0])
|
||||
if ceph_mon_list:
|
||||
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]
|
||||
|
||||
@ -2570,18 +2608,33 @@ def is_kubernetes_config(request):
|
||||
return False
|
||||
|
||||
|
||||
def is_system_k8s_aio(request):
|
||||
system_type = get_system_type(request)
|
||||
|
||||
if (system_type == SYSTEM_TYPE_AIO and
|
||||
is_kubernetes_config(request)):
|
||||
return True
|
||||
return False
|
||||
def get_ceph_storage_model(request):
|
||||
cluster = cluster_get(request, constants.CLUSTER_CEPH_DEFAULT_NAME)
|
||||
return cluster.deployment_model
|
||||
|
||||
|
||||
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)
|
||||
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):
|
||||
|
@ -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
|
||||
#
|
||||
@ -33,18 +33,19 @@ class CreateStorageVolume(tables.LinkAction):
|
||||
return reverse(self.url, args=(host_id,))
|
||||
|
||||
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']
|
||||
self.verbose_name = _("Assign Storage Function")
|
||||
|
||||
classes = [c for c in self.classes if c != "disabled"]
|
||||
self.classes = classes
|
||||
|
||||
if host._personality != 'storage' and not is_system_k8s_aio:
|
||||
if not is_host_with_storage:
|
||||
return False
|
||||
|
||||
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:
|
||||
self.classes = [c for c in self.classes] + ['disabled']
|
||||
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
|
||||
#
|
||||
@ -489,8 +489,9 @@ class StorageTab(tabs.TableTab):
|
||||
|
||||
def get_context_data(self, request):
|
||||
context = super(StorageTab, self).get_context_data(request)
|
||||
host = self.tab_group.kwargs['host']
|
||||
try:
|
||||
context['host'] = self.tab_group.kwargs['host']
|
||||
context['host'] = host
|
||||
except Exception:
|
||||
redirect = reverse('horizon:admin:inventory:index')
|
||||
exceptions.handle(self.request,
|
||||
@ -498,8 +499,8 @@ class StorageTab(tabs.TableTab):
|
||||
redirect=redirect)
|
||||
|
||||
context['cinder_backend'] = stx_api.sysinv.get_cinder_backend(request)
|
||||
context['is_system_k8s_aio'] = \
|
||||
stx_api.sysinv.is_system_k8s_aio(request)
|
||||
context['is_host_with_storage'] = \
|
||||
stx_api.sysinv.is_host_with_storage(request, host.uuid)
|
||||
|
||||
return context
|
||||
|
||||
|
@ -9,8 +9,7 @@
|
||||
<div id="partitions">
|
||||
{{ partitions_table.render }}
|
||||
</div>
|
||||
|
||||
{% if host.personality == "Storage" or is_system_k8s_aio %}
|
||||
{% if is_host_with_storage %}
|
||||
<div id="storagevolumes">
|
||||
{{ storagevolumes_table.render }}
|
||||
</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
|
||||
#
|
||||
@ -9,6 +9,7 @@
|
||||
import logging
|
||||
|
||||
import cpu_functions.utils as icpu_utils
|
||||
import sysinv.common.constants as sysinv_const
|
||||
|
||||
from cgtsclient.common import constants
|
||||
from cgtsclient import exc
|
||||
@ -23,6 +24,7 @@ from horizon.utils import validators
|
||||
from horizon import workflows
|
||||
|
||||
from starlingx_dashboard import api as stx_api
|
||||
from starlingx_dashboard.api import sysinv
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
@ -392,7 +394,10 @@ class UpdateHostInfoAction(workflows.Action):
|
||||
self.fields[
|
||||
'interfaceProfile'].widget = forms.widgets.HiddenInput()
|
||||
|
||||
stor_model = sysinv.get_ceph_storage_model(request)
|
||||
if ((personality == 'storage' or
|
||||
(personality == 'controller' and
|
||||
stor_model == sysinv_const.CEPH_CONTROLLER_MODEL) or
|
||||
'worker' in host._subfunctions) and host.disks):
|
||||
# Populate Available Disk Profile Choices
|
||||
try:
|
||||
|
Loading…
Reference in New Issue
Block a user