Merge "Add capabilities of the DMS query"
authorJackie Huang <jackie.huang@windriver.com>
Tue, 9 May 2023 09:25:29 +0000 (09:25 +0000)
committerGerrit Code Review <gerrit@o-ran-sc.org>
Tue, 9 May 2023 09:25:29 +0000 (09:25 +0000)
1  2 
o2ims/adapter/clients/ocloud_client.py

@@@ -15,6 -15,7 +15,7 @@@
  # client talking to Stx standalone
  
  import uuid
+ import json
  from typing import List
  # Optional,  Set
  
@@@ -333,6 -334,50 +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:' +
                  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: ' +
          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 = [
          setattr(cluster, 'name', cluster.cloud_name +
                  '.' + cluster.cluster_name)
          setattr(cluster, 'uuid',
 -                uuid.uuid3(uuid.NAMESPACE_URL, cluster.name))
 +                uuid.uuid3(uuid.NAMESPACE_URL, cluster.cluster_name))
          setattr(cluster, 'updated_at', None)
          setattr(cluster, 'created_at', None)
          setattr(cluster, 'events', [])
      @ 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)))