# client talking to Stx standalone
import uuid
-from o2common.service.client.base_client import BaseClient
+import json
from typing import List
# Optional, Set
-from o2ims.domain import stx_object as ocloudModel
-from o2common.config import config
-from o2ims.domain.resource_type import ResourceTypeEnum
-# from dcmanagerclient.api import client
from cgtsclient.client import get_client as get_stx_client
from cgtsclient.exc import EndpointException
from dcmanagerclient.api.client import client as get_dc_client
+from o2common.config import config
+from o2common.service.client.base_client import BaseClient
+from o2ims.domain import stx_object as ocloudModel
+from o2ims.domain.resource_type import ResourceTypeEnum
+
from o2common.helper import o2logging
logger = o2logging.get_logger(__name__)
def _get(self, id) -> ocloudModel.StxGenericModel:
return self.driver.getInstanceInfo()
- def _list(self, **filters):
+ def _list(self, **filters) -> List[ocloudModel.StxGenericModel]:
return [self.driver.getInstanceInfo()]
def _set_stx_client(self):
def _get(self, id) -> ocloudModel.StxGenericModel:
return self.driver.getResourcePoolDetail(id)
- def _list(self, **filters):
+ def _list(self, **filters) -> List[ocloudModel.StxGenericModel]:
return self.driver.getResourcePoolList(**filters)
def _set_stx_client(self):
def _get(self, name) -> ocloudModel.StxGenericModel:
return self.driver.getK8sDetail(name)
- def _list(self, **filters):
+ def _list(self, **filters) -> List[ocloudModel.StxGenericModel]:
return self.driver.getK8sList(**filters)
def _set_stx_client(self):
return self.driver.getPserver(id)
def _list(self, **filters) -> List[ocloudModel.StxGenericModel]:
- filters['resourcepoolid']
return self.driver.getPserverList(**filters)
def _set_stx_client(self):
os_client_args = config.get_stx_access_info(
region_name=subcloud[0].name,
subcloud_hostname=subcloud[0].oam_floating_ip)
- logger.warning(os_client_args)
+ # logger.info(os_client_args)
config_client = get_stx_client(**os_client_args)
except EndpointException as e:
msg = e.format_message()
os_client_args = config.get_stx_access_info(
region_name=subcloud[0].name, sub_is_https=True,
subcloud_hostname=subcloud[0].oam_floating_ip)
- logger.warning(os_client_args)
+ # logger.info(os_client_args)
config_client = get_stx_client(**os_client_args)
else:
raise ValueError('Stx endpoint exception: %s' % msg)
- else:
+ except Exception:
raise ValueError('cgtsclient get subcloud client failed')
+
return config_client
def setStxClient(self, resource_pool_id):
ResourceTypeEnum.OCLOUD, systems[0]) if systems else None
def getSubcloudList(self):
+ self.dcclient = self.getDcmanagerClient()
subs = self.dcclient.subcloud_manager.list_subclouds()
known_subs = [sub for sub in subs if sub.sync_status != 'unknown']
return known_subs
systems = self.stxclient.isystem.list()
logger.debug('systems:' + str(systems[0].to_dict()))
return ocloudModel.StxGenericModel(
- ResourceTypeEnum.RESOURCE_POOL, systems[0]) if systems else None
+ ResourceTypeEnum.RESOURCE_POOL,
+ self._respoolconverter(systems[0])) if systems else None
def getPserverList(self, **filters) -> List[ocloudModel.StxGenericModel]:
hosts = self.stxclient.ihost.list()
return [ocloudModel.StxGenericModel(
ResourceTypeEnum.PSERVER, self._hostconverter(host))
for host in hosts if host and (host.availability == 'available'
+ or host.availability == 'online'
or host.availability == 'degraded')]
def getPserver(self, id) -> ocloudModel.StxGenericModel:
return ocloudModel.StxGenericModel(
ResourceTypeEnum.PSERVER, self._hostconverter(host))
+ def _checkLabelExistOnHost(self, label_key, hostid) -> bool:
+ labels = self.stxclient.label.list(hostid)
+ return any(label_key == label.label_key for label in labels)
+
+ def _checkLabelExistOnCluster(self, label_key) -> bool:
+ hosts = self.stxclient.ihost.list()
+
+ def find_label_on_host():
+ result = next(
+ (
+ (host, True)
+ for host in hosts
+ if self._checkLabelExistOnHost(label_key, host.uuid)
+ ),
+ (None, False),
+ )
+
+ if result[1]:
+ logger.info("host %s has the label %s" %
+ (result[0].hostname, label_key))
+
+ return result[1]
+
+ return find_label_on_host()
+
+ # return any(self._checkLabelExistOnHost(label_key, host.uuid) for host
+ # in hosts)
+
+ def _setK8sCapabilities(self, k8scluster):
+ capabilities = {}
+ if self._checkLabelExistOnCluster('OS'):
+ logger.debug("low latency host inside of the cluster")
+ capabilities['OS'] = 'low_latency'
+ setattr(k8scluster, 'capabilities', json.dumps(capabilities))
+ return k8scluster
+
+ def getLabelList(self, **filters) -> List[ocloudModel.StxGenericModel]:
+ hostid = filters.get('hostid', None)
+ assert (hostid is not None), 'missing hostid to query label list'
+ labels = self.stxclient.label.list(hostid)
+ return [ocloudModel.StxGenericModel(
+ ResourceTypeEnum.PSERVER_LABEL,
+ self._labelconverter(label)) for label in labels if label]
+
def getK8sList(self, **filters) -> List[ocloudModel.StxGenericModel]:
systems = self.stxclient.isystem.list()
logger.debug('system controller distributed_cloud_role:' +
systems[0].distributed_cloud_role != 'systemcontroller':
k8sclusters = self.stxclient.kube_cluster.list()
setattr(k8sclusters[0], 'cloud_name', systems[0].name)
- logger.debug('k8sresources[0]:' + str(k8sclusters[0].to_dict()))
- # logger.debug('k8sresources[0] cluster_api_endpoint: ' +
- # str(k8sclusters[0].cluster_api_endpoint))
+ k8sclusters[0] = self._setK8sCapabilities(k8sclusters[0])
+ # logger.debug('k8sresources[0]:' + str(k8sclusters[0].to_dict()))
+ logger.debug('k8sresources[0] cluster_api_endpoint: ' +
+ str(k8sclusters[0].cluster_api_endpoint))
return [ocloudModel.StxGenericModel(
ResourceTypeEnum.DMS,
self._k8sconverter(k8sres), self._k8shasher(k8sres))
if config.get_system_controller_as_respool():
k8sclusters = self.stxclient.kube_cluster.list()
setattr(k8sclusters[0], 'cloud_name', systems[0].name)
- logger.debug('k8sresources[0]:' + str(k8sclusters[0].to_dict()))
- # logger.debug('k8sresources[0] cluster_api_endpoint: ' +
- # str(k8sclusters[0].cluster_api_endpoint))
+ k8sclusters[0] = self._setK8sCapabilities(k8sclusters[0])
+ # logger.debug('k8sresources[0]:' + str(k8sclusters[0].to_dict()))
+ logger.debug('k8sresources[0] cluster_api_endpoint: ' +
+ str(k8sclusters[0].cluster_api_endpoint))
k8s_list.append(k8sclusters[0])
subclouds = self.getSubcloudList()
systems = subcloud_stxclient.isystem.list()
k8sclusters = subcloud_stxclient.kube_cluster.list()
setattr(k8sclusters[0], 'cloud_name', systems[0].name)
+ k8sclusters[0] = self._setK8sCapabilities(k8sclusters[0])
logger.debug('k8sresources[0]:' +
str(k8sclusters[0].to_dict()))
# logger.debug('k8sresources[0] cluster_api_endpoint: ' +
k8sclusters = self.stxclient.kube_cluster.list()
# logger.debug("k8sresources[0]:" + str(k8sclusters[0].to_dict()))
setattr(k8sclusters[0], 'cloud_name', systems[0].name)
+ k8sclusters[0] = self._setK8sCapabilities(k8sclusters[0])
k8scluster = k8sclusters.pop()
else:
sname = name.split('.')
if cloud_name == systems[0].name:
k8scluster = self.stxclient.kube_cluster.get(k8s_name)
setattr(k8scluster, 'cloud_name', cloud_name)
+ k8scluster = self._setK8sCapabilities(k8scluster)
else:
subclouds = self.getSubcloudList()
subcloud_id = [
subcloud_stxclient = self.getSubcloudClient(subcloud_id)
k8scluster = subcloud_stxclient.kube_cluster.get(k8s_name)
setattr(k8scluster, 'cloud_name', cloud_name)
+ k8scluster = self._setK8sCapabilities(k8scluster)
# logger.debug('k8sresources[0]:' +
# str(k8sclusters[0].to_dict()))
# logger.debug('k8sresources[0] cluster_api_endpoint: ' +
@ staticmethod
def _hostconverter(host):
+ selected_keys = [
+ "hostname", "personality", "id", "mgmt_ip", "mgmt_mac",
+ "software_load", "capabilities",
+ "operational", "availability", "administrative",
+ "boot_device", "rootfs_device", "install_state", "subfunctions",
+ "clock_synchronization", "max_cpu_mhz_allowed"
+ ]
+ content = host.to_dict()
+ filtered = dict(
+ filter(lambda item: item[0] in selected_keys, content.items()))
+ setattr(host, 'filtered', filtered)
setattr(host, 'name', host.hostname)
return host
+ @ staticmethod
+ def _labelconverter(label):
+ selected_keys = [
+ "uuid", "label_key", "label_value", "host_uuid"
+ ]
+ content = label.to_dict()
+ print(content)
+ filtered = dict(
+ filter(lambda item: item[0] in selected_keys, content.items()))
+ setattr(label, 'filtered', filtered)
+ setattr(label, 'name', label.uuid.split(
+ '-', 1)[0] + '-label-' + label.label_key)
+ setattr(label, 'updated_at', None)
+ setattr(label, 'created_at', None)
+ return label
+
@ staticmethod
def _cpuconverter(cpu):
+ selected_keys = [
+ "cpu", "core", "thread", "allocated_function", "numa_node",
+ "cpu_model", "cpu_family"
+ ]
+ content = cpu.to_dict()
+ filtered = dict(
+ filter(lambda item: item[0] in selected_keys, content.items()))
+ setattr(cpu, 'filtered', filtered)
setattr(cpu, 'name', cpu.ihost_uuid.split(
'-', 1)[0] + '-cpu-'+str(cpu.cpu))
return cpu
@ staticmethod
def _memconverter(mem):
+ selected_keys = [
+ "memtotal_mib", "memavail_mib", "vm_hugepages_use_1G",
+ "vm_hugepages_possible_1G", "hugepages_configured",
+ "vm_hugepages_avail_1G", "vm_hugepages_nr_1G",
+ "vm_hugepages_nr_4K", "vm_hugepages_nr_2M",
+ "vm_hugepages_possible_2M", "vm_hugepages_avail_2M",
+ "platform_reserved_mib", "numa_node"
+ ]
+ content = mem.to_dict()
+ filtered = dict(
+ filter(lambda item: item[0] in selected_keys, content.items()))
+ setattr(mem, 'filtered', filtered)
setattr(mem, 'name', mem.ihost_uuid.split('-', 1)[0] +
'-mem-node-'+str(mem.numa_node))
return mem
@ staticmethod
def _ethconverter(eth):
+ selected_keys = [
+ "name", "namedisplay", "dev_id", "pdevice", "capabilities",
+ "type", "driver", "mac", "numa_node",
+ "pciaddr", "pclass", "psvendor", "psdevice",
+ "sriov_totalvfs", "sriov_numvfs", "dpdksupport",
+ "sriov_vf_driver", "sriov_vf_pdevice_id", "interface_uuid"
+ ]
+ content = eth.to_dict()
+ filtered = dict(
+ filter(lambda item: item[0] in selected_keys, content.items()))
+ setattr(eth, 'filtered', filtered)
setattr(eth, 'name', eth.host_uuid.split('-', 1)[0] + '-'+eth.name)
setattr(eth, 'updated_at', None)
setattr(eth, 'created_at', None)
@ staticmethod
def _ifconverter(ifs):
+ selected_keys = [
+ "ifname", "iftype", "imac", "vlan_id", "imtu",
+ "ifclass", "uses", "max_tx_rate",
+ "sriov_vf_driver", "sriov_numvfs", "ptp_role"
+ ]
+ content = ifs.to_dict()
+ filtered = dict(
+ filter(lambda item: item[0] in selected_keys, content.items()))
+ setattr(ifs, 'filtered', filtered)
setattr(ifs, 'name', ifs.ihost_uuid.split('-', 1)[0] + '-'+ifs.ifname)
setattr(ifs, 'updated_at', None)
setattr(ifs, 'created_at', None)
@ staticmethod
def _devconverter(dev):
+ selected_keys = [
+ "name", "pdevice", "pciaddr", "pvendor_id", "pvendor",
+ "pclass_id", "pclass", "psvendor", "psdevice",
+ "sriov_totalvfs", "sriov_numvfs", "numa_node"
+ ]
+ content = dev.to_dict()
+ filtered = dict(
+ filter(lambda item: item[0] in selected_keys, content.items()))
+ setattr(dev, 'filtered', filtered)
setattr(dev, 'name', dev.host_uuid.split('-', 1)[0] + '-'+dev.name)
return dev
@ staticmethod
def _k8shasher(cluster):
return str(hash((cluster.cluster_name, cluster.cloud_name,
- cluster.cluster_api_endpoint, cluster.admin_user)))
+ cluster.cluster_api_endpoint, cluster.admin_user,
+ cluster.capabilities)))