Add capabilities of the DMS query
[pti/o2.git] / o2ims / adapter / clients / ocloud_client.py
index 015da1f..a3cd6e0 100644 (file)
@@ -15,6 +15,7 @@
 # client talking to Stx standalone
 
 import uuid
+import json
 from typing import List
 # Optional,  Set
 
@@ -43,7 +44,7 @@ class StxOcloudClient(BaseClient):
     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):
@@ -58,7 +59,7 @@ class StxResourcePoolClient(BaseClient):
     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):
@@ -73,7 +74,7 @@ class StxDmsClient(BaseClient):
     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):
@@ -333,6 +334,50 @@ class StxClientImp(object):
         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:' +
@@ -342,9 +387,10 @@ class StxClientImp(object):
                 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))
@@ -354,9 +400,10 @@ class StxClientImp(object):
         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()
@@ -368,6 +415,7 @@ class StxClientImp(object):
                 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: ' +
@@ -388,6 +436,7 @@ class StxClientImp(object):
             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('.')
@@ -396,6 +445,7 @@ class StxClientImp(object):
             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 = [
@@ -404,6 +454,7 @@ class StxClientImp(object):
                 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: ' +
@@ -536,23 +587,81 @@ class StxClientImp(object):
 
     @ 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)
@@ -560,6 +669,15 @@ class StxClientImp(object):
 
     @ 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)
@@ -567,6 +685,15 @@ class StxClientImp(object):
 
     @ 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
 
@@ -586,4 +713,5 @@ class StxClientImp(object):
     @ 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)))