From 44f01a560347914798d8f913696d0e495ee076f8 Mon Sep 17 00:00:00 2001 From: "Zhang Rong(Jon)" Date: Thu, 9 Dec 2021 13:58:11 +0800 Subject: [PATCH] Add get detail of a resource to API; remove the dependency of the domain in the view layer 1. Get detail of a resource from API, include their children node 2. Remove the dependency of the domain in the view layer, return domain object and list from the repo layer Issue-ID: INF-237 Signed-off-by: Zhang Rong(Jon) Change-Id: I2441e07c4f72e8ed80fe18ef87bb23917c6efc91 --- o2app/entrypoints/resource_watcher.py | 13 ++- o2app/service/handlers.py | 11 +- o2common/domain/base.py | 18 ++++ o2ims/adapter/clients/ocloud_sa_client.py | 99 +++++++++++------ o2ims/adapter/ocloud_repository.py | 41 ++++++-- o2ims/adapter/orm.py | 1 + o2ims/domain/commands.py | 7 +- o2ims/domain/ocloud.py | 37 +++++-- o2ims/domain/ocloud_repo.py | 4 +- o2ims/domain/resource_type.py | 5 +- o2ims/service/auditor/ocloud_handler.py | 6 +- o2ims/service/auditor/pserver_cpu_handler.py | 3 +- o2ims/service/auditor/pserver_eth_handler.py | 117 +++++++++++++++++++++ o2ims/service/auditor/pserver_handler.py | 3 +- o2ims/service/auditor/pserver_if_handler.py | 5 +- o2ims/service/auditor/pserver_mem_handler.py | 3 +- o2ims/service/auditor/pserver_port_handler.py | 17 +-- o2ims/service/watcher/pserver_eth_watcher.py | 38 +++++++ o2ims/service/watcher/pserver_port_watcher.py | 10 +- o2ims/views/ocloud_dto.py | 50 ++++++++- o2ims/views/ocloud_route.py | 4 +- o2ims/views/ocloud_view.py | 71 +++++-------- .../integration-ocloud/test_clientdriver_stx_sa.py | 21 +++- tests/integration/test_ocloud_repository.py | 2 +- tests/integration/test_ocloud_route.py | 2 +- tests/integration/test_ocloud_view.py | 4 +- tests/unit/test_ocloud.py | 108 +++++++++++-------- 27 files changed, 514 insertions(+), 186 deletions(-) create mode 100644 o2ims/service/auditor/pserver_eth_handler.py create mode 100644 o2ims/service/watcher/pserver_eth_watcher.py diff --git a/o2app/entrypoints/resource_watcher.py b/o2app/entrypoints/resource_watcher.py index b7ad799..a7bf4b3 100644 --- a/o2app/entrypoints/resource_watcher.py +++ b/o2app/entrypoints/resource_watcher.py @@ -37,8 +37,11 @@ from o2ims.adapter.clients.ocloud_sa_client import StxMemClient from o2ims.service.watcher.pserver_if_watcher import PServerIfWatcher from o2ims.adapter.clients.ocloud_sa_client import StxIfClient -from o2ims.service.watcher.pserver_port_watcher import PServerPortWatcher -from o2ims.adapter.clients.ocloud_sa_client import StxPortClient +from o2ims.service.watcher.pserver_port_watcher import PServerIfPortWatcher +from o2ims.adapter.clients.ocloud_sa_client import StxIfPortClient + +from o2ims.service.watcher.pserver_eth_watcher import PServerEthWatcher +from o2ims.adapter.clients.ocloud_sa_client import StxEthClient from o2common.helper import o2logging logger = o2logging.get_logger(__name__) @@ -70,9 +73,11 @@ class WatcherService(cotyledon.Service): child_pserver.addchild( PServerMemWatcher(StxMemClient(), self.bus)) child_pserver.addchild( + PServerEthWatcher(StxEthClient(), self.bus)) + child_if = child_pserver.addchild( PServerIfWatcher(StxIfClient(), self.bus)) - child_pserver.addchild( - PServerPortWatcher(StxPortClient(), self.bus)) + # child_if.addchild( + # PServerIfPortWatcher(StxIfPortClient(), self.bus)) self.worker.add_watcher(root) diff --git a/o2app/service/handlers.py b/o2app/service/handlers.py index b551ca6..d68b295 100644 --- a/o2app/service/handlers.py +++ b/o2app/service/handlers.py @@ -14,6 +14,8 @@ # pylint: disable=unused-argument from __future__ import annotations +from o2dms.service.nfdeployment_handler import install_nfdeployment +from o2dms.service.nfdeployment_handler import publish_nfdeployment_created # from dataclasses import asdict from typing import List, Dict, Callable, Type # TYPE_CHECKING @@ -23,9 +25,8 @@ from o2dms.domain import commands as o2dms_cmmands from o2dms.domain import events as o2dms_events from o2ims.service.auditor import ocloud_handler, dms_handler, \ resourcepool_handler, pserver_handler, pserver_cpu_handler, \ - pserver_mem_handler, pserver_port_handler, pserver_if_handler -from o2dms.service.nfdeployment_handler import publish_nfdeployment_created -from o2dms.service.nfdeployment_handler import install_nfdeployment + pserver_mem_handler, pserver_port_handler, pserver_if_handler,\ + pserver_eth_handler # if TYPE_CHECKING: # from . import unit_of_work @@ -48,7 +49,7 @@ COMMAND_HANDLERS = { commands.UpdatePserverCpu: pserver_cpu_handler.update_pserver_cpu, commands.UpdatePserverMem: pserver_mem_handler.update_pserver_mem, commands.UpdatePserverIf: pserver_if_handler.update_pserver_if, - commands.UpdatePserverPort: pserver_port_handler.update_pserver_port, + commands.UpdatePserverIfPort: pserver_port_handler.update_pserver_port, + commands.UpdatePserverEth: pserver_eth_handler.update_pserver_eth, o2dms_cmmands.InstallNfDeployment: install_nfdeployment - } # type: Dict[Type[commands.Command], Callable] diff --git a/o2common/domain/base.py b/o2common/domain/base.py index dfd4b25..63d1659 100644 --- a/o2common/domain/base.py +++ b/o2common/domain/base.py @@ -14,13 +14,31 @@ from datetime import datetime from typing import List +from sqlalchemy.inspection import inspect from .events import Event class AgRoot: + def __init__(self) -> None: self.hash = "" self.updatetime = datetime.now() self.createtime = datetime.now() self.events = [] # type: List[Event] # self.id = "" + + +class Serializer(object): + + def serialize(self): + # d = {c: getattr(self, c) for c in inspect(self).attrs.keys()} + # if 'createtime' in d: + # d['createtime'] = d['createtime'].isoformat() + # if 'updatetime' in d: + # d['updatetime'] = d['updatetime'].isoformat() + # return d + return {c: getattr(self, c) for c in inspect(self).attrs.keys()} + + @staticmethod + def serialize_list(li): + return [m.serialize() for m in li] diff --git a/o2ims/adapter/clients/ocloud_sa_client.py b/o2ims/adapter/clients/ocloud_sa_client.py index 31c9069..97592d3 100644 --- a/o2ims/adapter/clients/ocloud_sa_client.py +++ b/o2ims/adapter/clients/ocloud_sa_client.py @@ -93,7 +93,6 @@ class StxCpuClient(BaseClient): class StxMemClient(BaseClient): def __init__(self): super().__init__() - # self._pserver_id = pserver_id self.driver = StxSaClientImp() def _get(self, id) -> ocloudModel.StxGenericModel: @@ -103,23 +102,21 @@ class StxMemClient(BaseClient): return self.driver.getMemList(**filters) -class StxPortClient(BaseClient): +class StxEthClient(BaseClient): def __init__(self): super().__init__() - # self._pserver_id = pserver_id self.driver = StxSaClientImp() def _get(self, id) -> ocloudModel.StxGenericModel: - return self.driver.getPort(id) + return self.driver.getEthernet(id) def _list(self, **filters) -> List[ocloudModel.StxGenericModel]: - return self.driver.getPortList(**filters) + return self.driver.getEthernetList(**filters) class StxIfClient(BaseClient): def __init__(self): super().__init__() - # self._pserver_id = pserver_id self.driver = StxSaClientImp() def _get(self, id) -> ocloudModel.StxGenericModel: @@ -129,6 +126,18 @@ class StxIfClient(BaseClient): return self.driver.getIfList(**filters) +class StxIfPortClient(BaseClient): + def __init__(self): + super().__init__() + self.driver = StxSaClientImp() + + def _get(self, id) -> ocloudModel.StxGenericModel: + return self.driver.getPort(id) + + def _list(self, **filters) -> List[ocloudModel.StxGenericModel]: + return self.driver.getPortList(**filters) + + # internal driver which implement client call to Stx Standalone instance class StxSaClientImp(object): def __init__(self, stx_client=None): @@ -142,27 +151,27 @@ class StxSaClientImp(object): def getInstanceInfo(self) -> ocloudModel.StxGenericModel: systems = self.stxclient.isystem.list() - logger.debug("systems:" + str(systems[0].to_dict())) + logger.debug('systems:' + str(systems[0].to_dict())) return ocloudModel.StxGenericModel( ResourceTypeEnum.OCLOUD, systems[0]) if systems else None def getPserverList(self, **filters) -> List[ocloudModel.StxGenericModel]: # resourcepoolid = filters.get("resourcepoolid", None) hosts = self.stxclient.ihost.list() - logger.debug("host 1:" + str(hosts[0].to_dict())) + logger.debug('host 1:' + str(hosts[0].to_dict())) return [ocloudModel.StxGenericModel( ResourceTypeEnum.PSERVER, self._hostconverter(host)) for host in hosts if host] def getPserver(self, id) -> ocloudModel.StxGenericModel: host = self.stxclient.ihost.get(id) - logger.debug("host:" + str(host.to_dict())) + logger.debug('host:' + str(host.to_dict())) return ocloudModel.StxGenericModel( ResourceTypeEnum.PSERVER, self._hostconverter(host)) def getK8sList(self, **filters) -> List[ocloudModel.StxGenericModel]: k8sclusters = self.stxclient.kube_cluster.list() - logger.debug("k8sresources[0]:" + str(k8sclusters[0].to_dict())) + logger.debug('k8sresources[0]:' + str(k8sclusters[0].to_dict())) return [ocloudModel.StxGenericModel( ResourceTypeEnum.DMS, self._k8sconverter(k8sres), self._k8shasher(k8sres)) @@ -178,14 +187,14 @@ class StxSaClientImp(object): if not k8scluster: return None - logger.debug("k8sresource:" + str(k8scluster.to_dict())) + logger.debug('k8sresource:' + str(k8scluster.to_dict())) return ocloudModel.StxGenericModel( ResourceTypeEnum.DMS, self._k8sconverter(k8scluster), self._k8shasher(k8scluster)) def getCpuList(self, **filters) -> List[ocloudModel.StxGenericModel]: - hostid = filters.get("hostid", None) - assert (hostid is not None), "missing hostid to query icpu list" + hostid = filters.get('hostid', None) + assert (hostid is not None), 'missing hostid to query icpu list' cpulist = self.stxclient.icpu.list(hostid) return [ocloudModel.StxGenericModel( ResourceTypeEnum.PSERVER_CPU, @@ -197,8 +206,8 @@ class StxSaClientImp(object): ResourceTypeEnum.PSERVER_CPU, self._cpuconverter(cpuinfo)) def getMemList(self, **filters) -> List[ocloudModel.StxGenericModel]: - hostid = filters.get("hostid", None) - assert (hostid is not None), "missing hostid to query imem list" + hostid = filters.get('hostid', None) + assert (hostid is not None), 'missing hostid to query imem list' memlist = self.stxclient.imemory.list(hostid) return [ocloudModel.StxGenericModel( ResourceTypeEnum.PSERVER_RAM, @@ -209,22 +218,22 @@ class StxSaClientImp(object): return ocloudModel.StxGenericModel( ResourceTypeEnum.PSERVER_RAM, self._memconverter(meminfo)) - def getPortList(self, **filters) -> List[ocloudModel.StxGenericModel]: - hostid = filters.get("hostid", None) - assert (hostid is not None), "missing hostid to query port list" - portlist = self.stxclient.port.list(hostid) + def getEthernetList(self, **filters) -> List[ocloudModel.StxGenericModel]: + hostid = filters.get('hostid', None) + assert (hostid is not None), 'missing hostid to query port list' + ethlist = self.stxclient.ethernet_port.list(hostid) return [ocloudModel.StxGenericModel( - ResourceTypeEnum.PSERVER_PORT, - port) for port in portlist if port] + ResourceTypeEnum.PSERVER_ETH, + self._ethconverter(eth)) for eth in ethlist if eth] - def getPort(self, id) -> ocloudModel.StxGenericModel: - portinfo = self.stxclient.port.get(id) + def getEthernet(self, id) -> ocloudModel.StxGenericModel: + ethinfo = self.stxclient.ethernet_port.get(id) return ocloudModel.StxGenericModel( - ResourceTypeEnum.PSERVER_PORT, portinfo) + ResourceTypeEnum.PSERVER_ETH, self._ethconverter(ethinfo)) def getIfList(self, **filters) -> List[ocloudModel.StxGenericModel]: - hostid = filters.get("hostid", None) - assert (hostid is not None), "missing hostid to query iinterface list" + hostid = filters.get('hostid', None) + assert (hostid is not None), 'missing hostid to query iinterface list' iflist = self.stxclient.iinterface.list(hostid) return [ocloudModel.StxGenericModel( ResourceTypeEnum.PSERVER_IF, @@ -235,6 +244,19 @@ class StxSaClientImp(object): return ocloudModel.StxGenericModel( ResourceTypeEnum.PSERVER_IF, self._ifconverter(ifinfo)) + def getPortList(self, **filters) -> List[ocloudModel.StxGenericModel]: + ifid = filters.get('interfaceid', None) + assert (ifid is not None), 'missing interface id to query port list' + portlist = self.stxclient.iinterface.list_ports(ifid) + return [ocloudModel.StxGenericModel( + ResourceTypeEnum.PSERVER_IF_PORT, + port) for port in portlist if port] + + def getPort(self, id) -> ocloudModel.StxGenericModel: + portinfo = self.stxclient.port.get(id) + return ocloudModel.StxGenericModel( + ResourceTypeEnum.PSERVER_IF_PORT, portinfo) + def _getIsystems(self): return self.stxclient.isystem.list() @@ -250,36 +272,45 @@ class StxSaClientImp(object): @ staticmethod def _hostconverter(host): - setattr(host, "name", host.hostname) + setattr(host, 'name', host.hostname) return host @ staticmethod def _cpuconverter(cpu): - setattr(cpu, "name", "cpu-"+str(cpu.cpu)) + setattr(cpu, 'name', cpu.ihost_uuid.split( + '-', 1)[0] + '-cpu-'+str(cpu.cpu)) return cpu @ staticmethod def _memconverter(mem): - setattr(mem, "name", "mem-node-"+str(mem.numa_node)) + setattr(mem, 'name', mem.ihost_uuid.split('-', 1)[0] + + '-mem-node-'+str(mem.numa_node)) return mem + @ staticmethod + def _ethconverter(eth): + setattr(eth, 'name', eth.host_uuid.split('-', 1)[0] + '-'+eth.name) + setattr(eth, 'updated_at', None) + setattr(eth, 'created_at', None) + return eth + @ staticmethod def _ifconverter(ifs): - setattr(ifs, "name", ifs.ifname) + setattr(ifs, 'name', ifs.ihost_uuid.split('-', 1)[0] + '-'+ifs.ifname) setattr(ifs, 'updated_at', None) setattr(ifs, 'created_at', None) return ifs @ staticmethod def _k8sconverter(cluster): - setattr(cluster, "name", cluster.cluster_name) - setattr(cluster, "uuid", + setattr(cluster, 'name', cluster.cluster_name) + setattr(cluster, 'uuid', uuid.uuid3(uuid.NAMESPACE_URL, cluster.cluster_name)) setattr(cluster, 'updated_at', None) setattr(cluster, 'created_at', None) setattr(cluster, 'events', []) - logger.debug("k8s cluster name/uuid:" + - cluster.name + "/" + str(cluster.uuid)) + logger.debug('k8s cluster name/uuid:' + + cluster.name + '/' + str(cluster.uuid)) return cluster @ staticmethod diff --git a/o2ims/adapter/ocloud_repository.py b/o2ims/adapter/ocloud_repository.py index bc3557d..ab1d5c4 100644 --- a/o2ims/adapter/ocloud_repository.py +++ b/o2ims/adapter/ocloud_repository.py @@ -13,7 +13,7 @@ # limitations under the License. from typing import List -# from o2ims.adapter import orm + from o2ims.domain import ocloud from o2ims.domain.ocloud_repo import OcloudRepository, ResourceTypeRepository,\ ResourcePoolRepository, ResourceRepository, DeploymentManagerRepository,\ @@ -36,8 +36,7 @@ class OcloudSqlAlchemyRepository(OcloudRepository): oCloudId=ocloud_id).first() def _list(self) -> List[ocloud.Ocloud]: - return self.session.query(ocloud.Ocloud).order_by( - ocloud.Ocloud.name).all() + return self.session.query(ocloud.Ocloud) def _update(self, ocloud: ocloud.Ocloud): self.session.add(ocloud) @@ -56,7 +55,7 @@ class ResouceTypeSqlAlchemyRepository(ResourceTypeRepository): resourceTypeId=resource_type_id).first() def _list(self) -> List[ocloud.ResourceType]: - return self.session.query() + return self.session.query(ocloud.ResourceType) def _update(self, resourceType: ocloud.ResourceType): self.session.add(resourceType) @@ -75,7 +74,7 @@ class ResourcePoolSqlAlchemyRepository(ResourcePoolRepository): resourcePoolId=resource_pool_id).first() def _list(self) -> List[ocloud.ResourcePool]: - return self.session.query() + return self.session.query(ocloud.ResourcePool) def _update(self, resourcePool: ocloud.ResourcePool): self.session.add(resourcePool) @@ -90,11 +89,31 @@ class ResourceSqlAlchemyRepository(ResourceRepository): self.session.add(resource) def _get(self, resource_id) -> ocloud.Resource: + # return self.session.query(ocloud.Resource).filter_by( + # resourceId=resource_id).first() + # topq = uow.session.query(orm.resource).filter( + # orm.resource.c.resourceId == resourceId).\ + # cte('cte', recursive=True) + # bootomq = uow.session.query(orm.resource).join( + # topq, orm.resource.c.parentId == topq.c.resourceId) + # res = uow.session.query(topq.union(bootomq)) + def recursive(id): + res = self.session.query(ocloud.Resource).filter_by( + resourceId=id).first() + if res is not None: + query = self.session.query(ocloud.Resource).filter_by( + parentId=res.resourceId) + children = [] + for r in query: + child = recursive(r.resourceId) + children.append(child) + res.set_children(children) + return res + return recursive(resource_id) + + def _list(self, resourcepool_id) -> List[ocloud.Resource]: return self.session.query(ocloud.Resource).filter_by( - resourceId=resource_id).first() - - def _list(self) -> List[ocloud.Resource]: - return self.session.query() + resourcePoolId=resourcepool_id) def _update(self, resource: ocloud.Resource): self.session.add(resource) @@ -113,7 +132,7 @@ class DeploymentManagerSqlAlchemyRepository(DeploymentManagerRepository): deploymentManagerId=deployment_manager_id).first() def _list(self) -> List[ocloud.DeploymentManager]: - return self.session.query() + return self.session.query(ocloud.DeploymentManager) def _update(self, deployment_manager: ocloud.DeploymentManager): self.session.add(deployment_manager) @@ -132,7 +151,7 @@ class SubscriptionSqlAlchemyRepository(SubscriptionRepository): subscriptionId=subscription_id).first() def _list(self) -> List[ocloud.Subscription]: - return self.session.query() + return self.session.query(ocloud.Subscription) def _update(self, subscription: ocloud.Subscription): self.session.add(subscription) diff --git a/o2ims/adapter/orm.py b/o2ims/adapter/orm.py index 05a8dc7..7ad7a20 100644 --- a/o2ims/adapter/orm.py +++ b/o2ims/adapter/orm.py @@ -102,6 +102,7 @@ resource = Table( Column("resourceId", String(255), primary_key=True), Column("resourceTypeId", ForeignKey("resourcetype.resourceTypeId")), Column("resourcePoolId", ForeignKey("resourcepool.resourcePoolId")), + Column("name", String(255)), # Column("globalAssetId", String(255)), Column("parentId", String(255)), Column("description", String(255)), diff --git a/o2ims/domain/commands.py b/o2ims/domain/commands.py index 8cd8243..657b48f 100644 --- a/o2ims/domain/commands.py +++ b/o2ims/domain/commands.py @@ -67,11 +67,16 @@ class UpdatePserverMem(UpdateResource): pass +@dataclass +class UpdatePserverEth(UpdateResource): + pass + + @dataclass class UpdatePserverIf(UpdateResource): pass @dataclass -class UpdatePserverPort(UpdateResource): +class UpdatePserverIfPort(UpdateResource): pass diff --git a/o2ims/domain/ocloud.py b/o2ims/domain/ocloud.py index ec41c0e..e3584ed 100644 --- a/o2ims/domain/ocloud.py +++ b/o2ims/domain/ocloud.py @@ -13,8 +13,9 @@ # limitations under the License. from __future__ import annotations +import json -from o2common.domain.base import AgRoot +from o2common.domain.base import AgRoot, Serializer # from dataclasses import dataclass # from datetime import date # from typing import Optional, List, Set @@ -22,7 +23,7 @@ from .resource_type import ResourceTypeEnum # from uuid import UUID -class Subscription(AgRoot): +class Subscription(AgRoot, Serializer): def __init__(self, id: str, callback: str, consumersubid: str = '', filter: str = '') -> None: super().__init__() @@ -33,7 +34,7 @@ class Subscription(AgRoot): self.filter = filter -class DeploymentManager(AgRoot): +class DeploymentManager(AgRoot, Serializer): def __init__(self, id: str, name: str, ocloudid: str, dmsendpoint: str, description: str = '', supportedLocations: str = '', capabilities: str = '', @@ -51,7 +52,7 @@ class DeploymentManager(AgRoot): self.extensions = [] -class ResourcePool(AgRoot): +class ResourcePool(AgRoot, Serializer): def __init__(self, id: str, name: str, location: str, ocloudid: str, gLocationId: str = '', description: str = '') -> None: @@ -66,7 +67,7 @@ class ResourcePool(AgRoot): self.extensions = [] -class ResourceType(AgRoot): +class ResourceType(AgRoot, Serializer): def __init__(self, typeid: str, name: str, typeEnum: ResourceTypeEnum, ocloudid: str, vender: str = '', model: str = '', version: str = '', @@ -84,9 +85,9 @@ class ResourceType(AgRoot): self.extensions = [] -class Resource(AgRoot): +class Resource(AgRoot, Serializer): def __init__(self, resourceId: str, resourceTypeId: str, - resourcePoolId: str, parentId: str = '', + resourcePoolId: str, name: str, parentId: str = '', gAssetId: str = '', elements: str = '', description: str = '') -> None: super().__init__() @@ -94,14 +95,34 @@ class Resource(AgRoot): self.version_number = 0 self.resourceTypeId = resourceTypeId self.resourcePoolId = resourcePoolId + self.name = name self.globalAssetId = gAssetId self.parentId = parentId self.elements = elements self.description = description + self.children = [] self.extensions = [] + def set_children(self, children: list): + self.children = children + + def serialize(self): + d = Serializer.serialize(self) + + if 'elements' in d and d['elements'] != '': + d['elements'] = json.loads(d['elements']) + + if not hasattr(self, 'children') or len(self.children) == 0: + return d + else: + d['children'] = [] + + for child in self.children: + d['children'].append(child.serialize()) + return d + -class Ocloud(AgRoot): +class Ocloud(AgRoot, Serializer): def __init__(self, ocloudid: str, name: str, imsendpoint: str, globalcloudId: str = '', description: str = '', version_number: int = 0) -> None: diff --git a/o2ims/domain/ocloud_repo.py b/o2ims/domain/ocloud_repo.py index 9fd2965..b224a68 100644 --- a/o2ims/domain/ocloud_repo.py +++ b/o2ims/domain/ocloud_repo.py @@ -136,8 +136,8 @@ class ResourceRepository(abc.ABC): self.seen.add(resource) return resource - def list(self) -> List[ocloud.Resource]: - return self._list() + def list(self, resourcepool_id) -> List[ocloud.Resource]: + return self._list(resourcepool_id) def update(self, resource: ocloud.Resource): self._update(resource) diff --git a/o2ims/domain/resource_type.py b/o2ims/domain/resource_type.py index f94e688..eaddb87 100644 --- a/o2ims/domain/resource_type.py +++ b/o2ims/domain/resource_type.py @@ -8,8 +8,9 @@ class ResourceTypeEnum(Enum): PSERVER = 11 PSERVER_CPU = 12 PSERVER_RAM = 13 - PSERVER_PORT = 14 - PSERVER_IF = 15 + PSERVER_IF = 14 + PSERVER_IF_PORT = 15 + PSERVER_ETH = 16 class InvalidOcloudState(Exception): diff --git a/o2ims/service/auditor/ocloud_handler.py b/o2ims/service/auditor/ocloud_handler.py index c8c1e1b..c0d8eaf 100644 --- a/o2ims/service/auditor/ocloud_handler.py +++ b/o2ims/service/auditor/ocloud_handler.py @@ -43,9 +43,9 @@ def update_ocloud( stxobj = cmd.data with uow: oclouds = uow.oclouds.list() - if oclouds and len(oclouds) > 1: + if oclouds and oclouds.count() > 1: raise InvalidOcloudState("More than 1 ocloud is found") - elif not oclouds or len(oclouds) == 0: + elif not oclouds or oclouds.count() == 0: logger.info("add ocloud:" + stxobj.name + " update_at: " + str(stxobj.updatetime) + " id: " + str(stxobj.id) @@ -56,7 +56,7 @@ def update_ocloud( logger.info("Add the ocloud: " + stxobj.id + ", name: " + stxobj.name) else: - localmodel = oclouds.pop() + localmodel = oclouds.first() if is_outdated(localmodel, stxobj): logger.info("update ocloud:" + stxobj.name + " update_at: " + str(stxobj.updatetime) diff --git a/o2ims/service/auditor/pserver_cpu_handler.py b/o2ims/service/auditor/pserver_cpu_handler.py index d447057..76141bc 100644 --- a/o2ims/service/auditor/pserver_cpu_handler.py +++ b/o2ims/service/auditor/pserver_cpu_handler.py @@ -97,7 +97,8 @@ def create_by(stxobj: StxGenericModel, parent: Resource, resourcetype_id: str)\ gAssetId = '' # TODO: global ID description = "A CPU resource of the physical server" resource = Resource(stxobj.id, resourcetype_id, resourcepool_id, - parent_id, gAssetId, stxobj.content, description) + stxobj.name, parent_id, gAssetId, stxobj.content, + description) resource.createtime = stxobj.createtime resource.updatetime = stxobj.updatetime resource.hash = stxobj.hash diff --git a/o2ims/service/auditor/pserver_eth_handler.py b/o2ims/service/auditor/pserver_eth_handler.py new file mode 100644 index 0000000..e65440a --- /dev/null +++ b/o2ims/service/auditor/pserver_eth_handler.py @@ -0,0 +1,117 @@ +# Copyright (C) 2021 Wind River Systems, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# pylint: disable=unused-argument +from __future__ import annotations +import uuid +# import json + +from o2ims.domain import commands +from o2ims.domain.stx_object import StxGenericModel +from o2common.service.unit_of_work import AbstractUnitOfWork +from o2ims.domain.resource_type import MismatchedModel +from o2ims.domain.ocloud import Resource, ResourceType + +from o2common.helper import o2logging +logger = o2logging.get_logger(__name__) + + +class InvalidResourceType(Exception): + pass + + +def update_pserver_eth( + cmd: commands.UpdatePserverEth, + uow: AbstractUnitOfWork +): + stxobj = cmd.data + with uow: + p_resource = uow.resources.get(cmd.parentid) + resourcepool = uow.resource_pools.get(p_resource.resourcePoolId) + + res = uow.session.execute( + ''' + SELECT "resourceTypeId", "oCloudId", "name" + FROM resourcetype + WHERE "resourceTypeEnum" = :resource_type_enum + ''', + dict(resource_type_enum=stxobj.type.name) + ) + first = res.first() + if first is None: + resourcetype_id = str(uuid.uuid4()) + uow.resource_types.add(ResourceType( + resourcetype_id, + 'pserver_ethernet', stxobj.type, + resourcepool.oCloudId)) + else: + resourcetype_id = first['resourceTypeId'] + + resource = uow.resources.get(stxobj.id) + if not resource: + logger.info("add the ethernet of pserver:" + stxobj.name + + " update_at: " + str(stxobj.updatetime) + + " id: " + str(stxobj.id) + + " hash: " + str(stxobj.hash)) + localmodel = create_by(stxobj, p_resource, resourcetype_id) + uow.resources.add(localmodel) + + logger.info("Add the ethernet of pserver: " + stxobj.id + + ", name: " + stxobj.name) + else: + localmodel = resource + if is_outdated(localmodel, stxobj): + logger.info("update ethernet of pserver:" + stxobj.name + + " update_at: " + str(stxobj.updatetime) + + " id: " + str(stxobj.id) + + " hash: " + str(stxobj.hash)) + update_by(localmodel, stxobj, p_resource) + uow.resources.update(localmodel) + + logger.info("Update the ethernet of pserver: " + stxobj.id + + ", name: " + stxobj.name) + uow.commit() + + +def is_outdated(resource: Resource, stxobj: StxGenericModel): + return True if resource.hash != stxobj.hash else False + + +def create_by(stxobj: StxGenericModel, parent: Resource, resourcetype_id: str)\ + -> Resource: + # content = json.loads(stxobj.content) + resourcetype_id = resourcetype_id + resourcepool_id = parent.resourcePoolId + parent_id = parent.resourceId + gAssetId = '' # TODO: global ID + description = "An ethernet resource of the physical server" + resource = Resource(stxobj.id, resourcetype_id, resourcepool_id, + stxobj.name, parent_id, gAssetId, stxobj.content, + description) + resource.createtime = stxobj.createtime + resource.updatetime = stxobj.updatetime + resource.hash = stxobj.hash + + return resource + + +def update_by(target: Resource, stxobj: StxGenericModel, + parentid: str) -> None: + if target.resourceId != stxobj.id: + raise MismatchedModel("Mismatched Id") + target.createtime = stxobj.createtime + target.updatetime = stxobj.updatetime + target.hash = stxobj.hash + target.version_number = target.version_number + 1 + target.events = [] diff --git a/o2ims/service/auditor/pserver_handler.py b/o2ims/service/auditor/pserver_handler.py index f5f526a..63b0534 100644 --- a/o2ims/service/auditor/pserver_handler.py +++ b/o2ims/service/auditor/pserver_handler.py @@ -98,7 +98,8 @@ def create_by(stxobj: StxGenericModel, parentid: str, resourcetype_id: str) \ gAssetId = '' # TODO: global ID description = "A physical server resource" resource = Resource(stxobj.id, resourcetype_id, resourcepool_id, - parent_id, gAssetId, stxobj.content, description) + stxobj.name, parent_id, gAssetId, stxobj.content, + description) resource.createtime = stxobj.createtime resource.updatetime = stxobj.updatetime resource.hash = stxobj.hash diff --git a/o2ims/service/auditor/pserver_if_handler.py b/o2ims/service/auditor/pserver_if_handler.py index 174f709..7ee2df2 100644 --- a/o2ims/service/auditor/pserver_if_handler.py +++ b/o2ims/service/auditor/pserver_if_handler.py @@ -95,9 +95,10 @@ def create_by(stxobj: StxGenericModel, parent: Resource, resourcetype_id: str)\ resourcepool_id = parent.resourcePoolId parent_id = parent.resourceId gAssetId = '' # TODO: global ID - description = "A interface resource of the physical server" + description = "An interface resource of the physical server" resource = Resource(stxobj.id, resourcetype_id, resourcepool_id, - parent_id, gAssetId, stxobj.content, description) + stxobj.name, parent_id, gAssetId, stxobj.content, + description) resource.createtime = stxobj.createtime resource.updatetime = stxobj.updatetime resource.hash = stxobj.hash diff --git a/o2ims/service/auditor/pserver_mem_handler.py b/o2ims/service/auditor/pserver_mem_handler.py index 42bccb7..a07072b 100644 --- a/o2ims/service/auditor/pserver_mem_handler.py +++ b/o2ims/service/auditor/pserver_mem_handler.py @@ -97,7 +97,8 @@ def create_by(stxobj: StxGenericModel, parent: Resource, resourcetype_id: str)\ gAssetId = '' # TODO: global ID description = "A memory resource of the physical server" resource = Resource(stxobj.id, resourcetype_id, resourcepool_id, - parent_id, gAssetId, stxobj.content, description) + stxobj.name, parent_id, gAssetId, stxobj.content, + description) resource.createtime = stxobj.createtime resource.updatetime = stxobj.updatetime resource.hash = stxobj.hash diff --git a/o2ims/service/auditor/pserver_port_handler.py b/o2ims/service/auditor/pserver_port_handler.py index df62f14..41bed8e 100644 --- a/o2ims/service/auditor/pserver_port_handler.py +++ b/o2ims/service/auditor/pserver_port_handler.py @@ -32,7 +32,7 @@ class InvalidResourceType(Exception): def update_pserver_port( - cmd: commands.UpdatePserverPort, + cmd: commands.UpdatePserverIfPort, uow: AbstractUnitOfWork ): stxobj = cmd.data @@ -53,33 +53,33 @@ def update_pserver_port( resourcetype_id = str(uuid.uuid4()) uow.resource_types.add(ResourceType( resourcetype_id, - 'pserver_port', stxobj.type, + 'pserver_if_port', stxobj.type, resourcepool.oCloudId)) else: resourcetype_id = first['resourceTypeId'] resource = uow.resources.get(stxobj.id) if not resource: - logger.info("add the port of pserver:" + stxobj.name + logger.info("add the port of pserver interface:" + stxobj.name + " update_at: " + str(stxobj.updatetime) + " id: " + str(stxobj.id) + " hash: " + str(stxobj.hash)) localmodel = create_by(stxobj, p_resource, resourcetype_id) uow.resources.add(localmodel) - logger.info("Add the port of pserver: " + stxobj.id + logger.info("Add the port of pserver interface: " + stxobj.id + ", name: " + stxobj.name) else: localmodel = resource if is_outdated(localmodel, stxobj): - logger.info("update port of pserver:" + stxobj.name + logger.info("update port of pserver interface:" + stxobj.name + " update_at: " + str(stxobj.updatetime) + " id: " + str(stxobj.id) + " hash: " + str(stxobj.hash)) update_by(localmodel, stxobj, p_resource) uow.resources.update(localmodel) - logger.info("Update the port of pserver: " + stxobj.id + logger.info("Update the port of pserver interface: " + stxobj.id + ", name: " + stxobj.name) uow.commit() @@ -95,9 +95,10 @@ def create_by(stxobj: StxGenericModel, parent: Resource, resourcetype_id: str)\ resourcepool_id = parent.resourcePoolId parent_id = parent.resourceId gAssetId = '' # TODO: global ID - description = "A port resource of the physical server" + description = "A port resource of the interface" resource = Resource(stxobj.id, resourcetype_id, resourcepool_id, - parent_id, gAssetId, stxobj.content, description) + stxobj.name, parent_id, gAssetId, stxobj.content, + description) resource.createtime = stxobj.createtime resource.updatetime = stxobj.updatetime resource.hash = stxobj.hash diff --git a/o2ims/service/watcher/pserver_eth_watcher.py b/o2ims/service/watcher/pserver_eth_watcher.py new file mode 100644 index 0000000..6aa6a13 --- /dev/null +++ b/o2ims/service/watcher/pserver_eth_watcher.py @@ -0,0 +1,38 @@ +# Copyright (C) 2021 Wind River Systems, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from o2ims.domain.stx_object import StxGenericModel +from o2common.service.client.base_client import BaseClient +# from o2common.service.unit_of_work import AbstractUnitOfWork +from o2ims.service.watcher.resource_watcher import ResourceWatcher +from o2ims.domain import commands +from o2common.service.messagebus import MessageBus + +from o2common.helper import o2logging +logger = o2logging.get_logger(__name__) + + +class PServerEthWatcher(ResourceWatcher): + def __init__(self, client: BaseClient, + bus: MessageBus) -> None: + super().__init__(client, bus) + + def _targetname(self): + return "pserver_ethernet" + + def _probe(self, parent: StxGenericModel): + hostid = parent.id + newmodels = self._client.list(hostid=hostid) + return [commands.UpdatePserverEth(data=m, parentid=hostid) + for m in newmodels] diff --git a/o2ims/service/watcher/pserver_port_watcher.py b/o2ims/service/watcher/pserver_port_watcher.py index 9ab6c7d..f8d29c9 100644 --- a/o2ims/service/watcher/pserver_port_watcher.py +++ b/o2ims/service/watcher/pserver_port_watcher.py @@ -23,16 +23,16 @@ from o2common.helper import o2logging logger = o2logging.get_logger(__name__) -class PServerPortWatcher(ResourceWatcher): +class PServerIfPortWatcher(ResourceWatcher): def __init__(self, client: BaseClient, bus: MessageBus) -> None: super().__init__(client, bus) def _targetname(self): - return "pserver_port" + return "pserver_if_port" def _probe(self, parent: StxGenericModel): - hostid = parent.id - newmodels = self._client.list(hostid=hostid) - return [commands.UpdatePserverPort(data=m, parentid=hostid) + interfaceid = parent.id + newmodels = self._client.list(interfaceid=interfaceid) + return [commands.UpdatePserverIfPort(data=m, parentid=interfaceid) for m in newmodels] diff --git a/o2ims/views/ocloud_dto.py b/o2ims/views/ocloud_dto.py index 1a489e1..c1782bf 100644 --- a/o2ims/views/ocloud_dto.py +++ b/o2ims/views/ocloud_dto.py @@ -70,22 +70,64 @@ class ResourceDTO: description='Resource ID'), 'resourceTypeId': fields.String, 'resourcePoolId': fields.String, + 'name': fields.String, 'parentId': fields.String, 'description': fields.String, } ) - resource_get = api_ims_inventory_v1.model( - "ResourceGetDto", - { + def recursive_resource_mapping(iteration_number=2): + resource_json_mapping = { 'resourceId': fields.String(required=True, description='Resource ID'), 'resourceTypeId': fields.String, 'resourcePoolId': fields.String, + 'name': fields.String, 'parentId': fields.String, 'description': fields.String, + 'elements': fields.String, } - ) + if iteration_number: + resource_json_mapping['children'] = fields.List( + fields.Nested(ResourceDTO.recursive_resource_mapping( + iteration_number-1))) + return api_ims_inventory_v1.model( + 'ResourceGetDto' + str(iteration_number), resource_json_mapping) + + def _recursive_resource_mapping(self, iteration_number=2): + resource_json_mapping = { + 'resourceId': fields.String(required=True, + description='Resource ID'), + 'resourceTypeId': fields.String, + 'resourcePoolId': fields.String, + 'name': fields.String, + 'parentId': fields.String, + 'description': fields.String, + } + if iteration_number: + resource_json_mapping['children'] = fields.List( + fields.Nested(self._recursive_resource_mapping( + iteration_number-1))) + # print(type(resource_json_mapping['children'])) + if resource_json_mapping['children'] is None: + del resource_json_mapping['children'] + return resource_json_mapping + + def get_resource_get(self): + return api_ims_inventory_v1.model( + 'ResourceGetDto', + { + 'resourceId': fields.String(required=True, + description='Resource ID'), + 'resourceTypeId': fields.String, + 'resourcePoolId': fields.String, + 'name': fields.String, + 'parentId': fields.String, + 'description': fields.String, + 'children': fields.List(fields.Nested( + self._recursive_resource_mapping())) + } + ) class DeploymentManagerDTO: diff --git a/o2ims/views/ocloud_route.py b/o2ims/views/ocloud_route.py index 6d5e8e3..a01021e 100644 --- a/o2ims/views/ocloud_route.py +++ b/o2ims/views/ocloud_route.py @@ -117,7 +117,9 @@ class ResourcesListRouter(Resource): @api_ims_inventory_v1.response(404, 'Resource not found') class ResourceGetRouter(Resource): - model = ResourceDTO.resource_get + # dto = ResourceDTO() + # model = dto.get_resource_get() + model = ResourceDTO.recursive_resource_mapping() @api_ims_inventory_v1.doc('Get resource') @api_ims_inventory_v1.marshal_with(model) diff --git a/o2ims/views/ocloud_view.py b/o2ims/views/ocloud_view.py index 9404d9a..f970517 100644 --- a/o2ims/views/ocloud_view.py +++ b/o2ims/views/ocloud_view.py @@ -13,10 +13,7 @@ # limitations under the License. import uuid -from sqlalchemy import select -from o2ims.adapter.orm import ocloud, resource, resourcetype, \ - resourcepool, deploymentmanager, subscription from o2common.service import unit_of_work from o2ims.views.ocloud_dto import SubscriptionDTO from o2ims.domain.ocloud import Subscription @@ -24,97 +21,79 @@ from o2ims.domain.ocloud import Subscription def oclouds(uow: unit_of_work.AbstractUnitOfWork): with uow: - res = uow.session.execute(select(ocloud)) - return [dict(r) for r in res] + li = uow.oclouds.list() + return [r.serialize() for r in li] def ocloud_one(ocloudid: str, uow: unit_of_work.AbstractUnitOfWork): with uow: - res = uow.session.execute( - select(ocloud).where(ocloud.c.oCloudId == ocloudid)) - first = res.first() - return None if first is None else dict(first) + first = uow.oclouds.get(ocloudid) + return first.serialize() if first is not None else None def resource_types(uow: unit_of_work.AbstractUnitOfWork): with uow: - res = uow.session.execute(select(resourcetype)) - return [dict(r) for r in res] + li = uow.resource_types.list() + return [r.serialize() for r in li] def resource_type_one(resourceTypeId: str, uow: unit_of_work.AbstractUnitOfWork): with uow: - res = uow.session.execute(select(resourcetype).where( - resourcetype.c.resourceTypeId == resourceTypeId)) - first = res.first() - return None if first is None else dict(first) + first = uow.resource_types.get(resourceTypeId) + print(first) + return first.serialize() if first is not None else None def resource_pools(uow: unit_of_work.AbstractUnitOfWork): with uow: - res = uow.session.execute(select(resourcepool)) - return [dict(r) for r in res] + li = uow.resource_pools.list() + return [r.serialize() for r in li] def resource_pool_one(resourcePoolId: str, uow: unit_of_work.AbstractUnitOfWork): with uow: - res = uow.session.execute(select(resourcepool).where( - resourcepool.c.resourcePoolId == resourcePoolId)) - first = res.first() - return None if first is None else dict(first) + first = uow.resource_pools.get(resourcePoolId) + return first.serialize() if first is not None else None def resources(resourcePoolId: str, uow: unit_of_work.AbstractUnitOfWork): with uow: - res = uow.session.execute(select(resource).where( - resource.c.resourcePoolId == resourcePoolId)) - return [dict(r) for r in res] + li = uow.resources.list(resourcePoolId) + return [r.serialize() for r in li] def resource_one(resourceId: str, uow: unit_of_work.AbstractUnitOfWork): with uow: - # topq = uow.session.query(resource).filter( - # resource.c.resourceId == resourceId).cte('cte', recursive=True) - # bootomq = uow.session.query(resource).join( - # topq, resource.c.parentId == topq.c.resourceId) - # res = uow.session.query(topq.union(bootomq)) - # print(res) - res = uow.session.execute(select(resource).where( - resource.c.resourceId == resourceId)) - first = res.first() - return None if first is None else dict(first) + first = uow.resources.get(resourceId) + return first.serialize() if first is not None else None def deployment_managers(uow: unit_of_work.AbstractUnitOfWork): with uow: - res = uow.session.execute(select(deploymentmanager)) - return [dict(r) for r in res] + li = uow.deployment_managers.list() + return [r.serialize() for r in li] def deployment_manager_one(deploymentManagerId: str, uow: unit_of_work.AbstractUnitOfWork): with uow: - res = uow.session.execute(select(deploymentmanager).where( - deploymentmanager.c.deploymentManagerId == deploymentManagerId)) - first = res.first() - return None if first is None else dict(first) + first = uow.deployment_managers.get(deploymentManagerId) + return first.serialize() if first is not None else None def subscriptions(uow: unit_of_work.AbstractUnitOfWork): with uow: - res = uow.session.execute(select(subscription)) - return [dict(r) for r in res] + li = uow.subscriptions.list() + return [r.serialize() for r in li] def subscription_one(subscriptionId: str, uow: unit_of_work.AbstractUnitOfWork): with uow: - res = uow.session.execute(select(subscription).where( - subscription.c.subscriptionId == subscriptionId)) - first = res.first() - return None if first is None else dict(first) + first = uow.subscriptions.get(subscriptionId) + return first.serialize() if first is not None else None def subscription_create(subscriptionDto: SubscriptionDTO.subscription, diff --git a/tests/integration-ocloud/test_clientdriver_stx_sa.py b/tests/integration-ocloud/test_clientdriver_stx_sa.py index 5423953..b2bd8c8 100644 --- a/tests/integration-ocloud/test_clientdriver_stx_sa.py +++ b/tests/integration-ocloud/test_clientdriver_stx_sa.py @@ -102,6 +102,20 @@ def test_get_mem_list(real_stx_aio_client): assert mem1.id == mem2.id +def test_get_eth_list(real_stx_aio_client): + stxSaClientImp = StxSaClientImp(real_stx_aio_client) + assert stxSaClientImp is not None + hostlist = stxSaClientImp.getPserverList() + assert len(hostlist) > 0 + + ethlist = stxSaClientImp.getEthernetList(hostid=hostlist[0].id) + assert len(ethlist) > 0 + eth1 = ethlist[0] + eth2 = stxSaClientImp.getEthernet(eth1.id) + assert eth1 != eth2 + assert eth1.id == eth2.id + + def test_get_if_list(real_stx_aio_client): stxSaClientImp = StxSaClientImp(real_stx_aio_client) assert stxSaClientImp is not None @@ -116,13 +130,16 @@ def test_get_if_list(real_stx_aio_client): assert if1.id == if2.id -def test_get_port_list(real_stx_aio_client): +def test_get_if_port_list(real_stx_aio_client): stxSaClientImp = StxSaClientImp(real_stx_aio_client) assert stxSaClientImp is not None hostlist = stxSaClientImp.getPserverList() assert len(hostlist) > 0 - portlist = stxSaClientImp.getPortList(hostid=hostlist[0].id) + iflist = stxSaClientImp.getIfList(hostid=hostlist[0].id) + assert len(iflist) > 0 + + portlist = stxSaClientImp.getPortList(interfaceid=iflist[0].id) assert len(portlist) > 0 port1 = portlist[0] port2 = stxSaClientImp.getPort(port1.id) diff --git a/tests/integration/test_ocloud_repository.py b/tests/integration/test_ocloud_repository.py index 38bce21..6a67447 100644 --- a/tests/integration/test_ocloud_repository.py +++ b/tests/integration/test_ocloud_repository.py @@ -137,7 +137,7 @@ def test_add_resource(sqlite_session_factory): resource_type_id1 = str(uuid.uuid4()) resource_pool_id1 = str(uuid.uuid4()) resource1 = ocloud.Resource( - resource_id1, resource_type_id1, resource_pool_id1) + resource_id1, resource_type_id1, resource_pool_id1, 'resource1') repo.add(resource1) assert repo.get(resource_id1) == resource1 diff --git a/tests/integration/test_ocloud_route.py b/tests/integration/test_ocloud_route.py index 441e56d..7a7d936 100644 --- a/tests/integration/test_ocloud_route.py +++ b/tests/integration/test_ocloud_route.py @@ -103,7 +103,7 @@ def test_route_resources(sqlite_flask_uow): resource_type_id1 = str(uuid.uuid4()) resource_pool_id1 = str(uuid.uuid4()) resource1 = ocloud.Resource( - resource_id1, resource_type_id1, resource_pool_id1) + resource_id1, resource_type_id1, resource_pool_id1, 'resource1') uow.resources.add(resource1) uow.commit() diff --git a/tests/integration/test_ocloud_view.py b/tests/integration/test_ocloud_view.py index 2fb7d73..d44bedf 100644 --- a/tests/integration/test_ocloud_view.py +++ b/tests/integration/test_ocloud_view.py @@ -132,7 +132,7 @@ def test_view_resources(sqlite_uow): resource_type_id1 = str(uuid.uuid4()) resource_pool_id1 = str(uuid.uuid4()) resource1 = ocloud.Resource( - resource_id1, resource_type_id1, resource_pool_id1) + resource_id1, resource_type_id1, resource_pool_id1, 'resource1') with sqlite_uow as uow: uow.resources.add(resource1) uow.commit() @@ -146,7 +146,7 @@ def test_view_resource_one(sqlite_uow): resource_type_id1 = str(uuid.uuid4()) resource_pool_id1 = str(uuid.uuid4()) resource1 = ocloud.Resource( - resource_id1, resource_type_id1, resource_pool_id1) + resource_id1, resource_type_id1, resource_pool_id1, 'resource1') # Query return None resource_res = ocloud_view.resource_one(resource_id1, sqlite_uow) diff --git a/tests/unit/test_ocloud.py b/tests/unit/test_ocloud.py index 95bd9cd..c92cb22 100644 --- a/tests/unit/test_ocloud.py +++ b/tests/unit/test_ocloud.py @@ -13,6 +13,7 @@ # limitations under the License. import uuid +from unittest.mock import MagicMock from o2ims.domain import ocloud from o2ims.domain import resource_type as rt @@ -71,7 +72,7 @@ def test_new_resource(): resource_type_id1 = str(uuid.uuid4()) resource_pool_id1 = str(uuid.uuid4()) resource1 = ocloud.Resource( - resource_id1, resource_type_id1, resource_pool_id1) + resource_id1, resource_type_id1, resource_pool_id1, 'resource1') assert resource_id1 is not None and resource1.resourceId == resource_id1 @@ -97,25 +98,30 @@ def test_view_olcouds(mock_uow): session, uow = mock_uow ocloud1_UUID = str(uuid.uuid4) - session.return_value.execute.return_value = [ - {"oCloudId": ocloud1_UUID}] + ocloud1 = MagicMock() + ocloud1.serialize.return_value = { + 'oCloudId': ocloud1_UUID, 'name': 'ocloud1'} + session.return_value.query.return_value = [ocloud1] ocloud_list = ocloud_view.oclouds(uow) - assert str(ocloud_list[0].get("oCloudId")) == ocloud1_UUID + # assert str(ocloud_list[0].get("oCloudId")) == ocloud1_UUID + assert len(ocloud_list) == 1 def test_view_olcoud_one(mock_uow): session, uow = mock_uow ocloud1_UUID = str(uuid.uuid4) - session.return_value.execute.return_value.first.return_value = None + session.return_value.query.return_value.filter_by.return_value.first.\ + return_value.serialize.return_value = None # Query return None ocloud_res = ocloud_view.ocloud_one(ocloud1_UUID, uow) assert ocloud_res is None - session.return_value.execute.return_value.first.return_value = { - "oCloudId": ocloud1_UUID} + session.return_value.query.return_value.filter_by.return_value.first.\ + return_value.serialize.return_value = { + "oCloudId": ocloud1_UUID} ocloud_res = ocloud_view.ocloud_one(ocloud1_UUID, uow) assert str(ocloud_res.get("oCloudId")) == ocloud1_UUID @@ -125,9 +131,10 @@ def test_view_resource_types(mock_uow): session, uow = mock_uow resource_type_id1 = str(uuid.uuid4()) - session.return_value.execute.return_value = [ - {"resourceTypeId": resource_type_id1} - ] + restype1 = MagicMock() + restype1.serialize.return_value = { + "resourceTypeId": resource_type_id1} + session.return_value.query.return_value = [restype1] resource_type_list = ocloud_view.resource_types(uow) assert str(resource_type_list[0].get( @@ -138,15 +145,17 @@ def test_view_resource_type_one(mock_uow): session, uow = mock_uow resource_type_id1 = str(uuid.uuid4()) - session.return_value.execute.return_value.first.return_value = None + session.return_value.query.return_value.filter_by.return_value.first.\ + return_value.serialize.return_value = None # Query return None resource_type_res = ocloud_view.resource_type_one( resource_type_id1, uow) assert resource_type_res is None - session.return_value.execute.return_value.first.return_value = { - "resourceTypeId": resource_type_id1} + session.return_value.query.return_value.filter_by.return_value.first.\ + return_value.serialize.return_value = { + "resourceTypeId": resource_type_id1} resource_type_res = ocloud_view.resource_type_one(resource_type_id1, uow) assert str(resource_type_res.get("resourceTypeId")) == resource_type_id1 @@ -156,9 +165,10 @@ def test_view_resource_pools(mock_uow): session, uow = mock_uow resource_pool_id1 = str(uuid.uuid4()) - session.return_value.execute.return_value = [ - {"resourcePoolId": resource_pool_id1} - ] + respool1 = MagicMock() + respool1.serialize.return_value = { + "resourcePoolId": resource_pool_id1} + session.return_value.query.return_value = [respool1] resource_pool_list = ocloud_view.resource_pools(uow) assert str(resource_pool_list[0].get( @@ -169,16 +179,18 @@ def test_view_resource_pool_one(mock_uow): session, uow = mock_uow resource_pool_id1 = str(uuid.uuid4()) - session.return_value.execute.return_value.first.return_value = None + session.return_value.query.return_value.filter_by.return_value.first.\ + return_value.serialize.return_value = None # Query return None resource_pool_res = ocloud_view.resource_pool_one( resource_pool_id1, uow) assert resource_pool_res is None - session.return_value.execute.return_value.first.return_value = { - "resourcePoolId": resource_pool_id1 - } + session.return_value.query.return_value.filter_by.return_value.first.\ + return_value.serialize.return_value = { + "resourcePoolId": resource_pool_id1 + } resource_pool_res = ocloud_view.resource_pool_one(resource_pool_id1, uow) assert str(resource_pool_res.get("resourcePoolId")) == resource_pool_id1 @@ -189,10 +201,12 @@ def test_view_resources(mock_uow): resource_id1 = str(uuid.uuid4()) resource_pool_id1 = str(uuid.uuid4()) - session.return_value.execute.return_value = [{ + res1 = MagicMock() + res1.serialize.return_value = { "resourceId": resource_id1, "resourcePoolId": resource_pool_id1 - }] + } + session.return_value.query.return_value.filter_by.return_value = [res1] resource_list = ocloud_view.resources(resource_pool_id1, uow) assert str(resource_list[0].get("resourceId")) == resource_id1 @@ -204,16 +218,18 @@ def test_view_resource_one(mock_uow): resource_id1 = str(uuid.uuid4()) resource_pool_id1 = str(uuid.uuid4()) - session.return_value.execute.return_value.first.return_value = None + session.return_value.query.return_value.filter_by.return_value.first.\ + return_value.serialize.return_value = None # Query return None resource_res = ocloud_view.resource_one(resource_id1, uow) assert resource_res is None - session.return_value.execute.return_value.first.return_value = { - "resourceId": resource_id1, - "resourcePoolId": resource_pool_id1 - } + session.return_value.query.return_value.filter_by.return_value.first.\ + return_value.serialize.return_value = { + "resourceId": resource_id1, + "resourcePoolId": resource_pool_id1 + } resource_res = ocloud_view.resource_one(resource_id1, uow) assert str(resource_res.get("resourceId")) == resource_id1 @@ -223,9 +239,11 @@ def test_view_deployment_managers(mock_uow): session, uow = mock_uow deployment_manager_id1 = str(uuid.uuid4()) - session.return_value.execute.return_value = [{ + dm1 = MagicMock() + dm1.serialize.return_value = { "deploymentManagerId": deployment_manager_id1, - }] + } + session.return_value.query.return_value = [dm1] deployment_manager_list = ocloud_view.deployment_managers(uow) assert str(deployment_manager_list[0].get( @@ -236,16 +254,18 @@ def test_view_deployment_manager_one(mock_uow): session, uow = mock_uow deployment_manager_id1 = str(uuid.uuid4()) - session.return_value.execute.return_value.first.return_value = None + session.return_value.query.return_value.filter_by.return_value.first.\ + return_value.serialize.return_value = None # Query return None deployment_manager_res = ocloud_view.deployment_manager_one( deployment_manager_id1, uow) assert deployment_manager_res is None - session.return_value.execute.return_value.first.return_value = { - "deploymentManagerId": deployment_manager_id1, - } + session.return_value.query.return_value.filter_by.return_value.first.\ + return_value.serialize.return_value = { + "deploymentManagerId": deployment_manager_id1, + } deployment_manager_res = ocloud_view.deployment_manager_one( deployment_manager_id1, uow) @@ -257,9 +277,11 @@ def test_view_subscriptions(mock_uow): session, uow = mock_uow subscription_id1 = str(uuid.uuid4()) - session.return_value.execute.return_value = [{ + sub1 = MagicMock() + sub1.serialize.return_value = { "subscriptionId": subscription_id1, - }] + } + session.return_value.query.return_value = [sub1] subscription_list = ocloud_view.subscriptions(uow) assert str(subscription_list[0].get( @@ -270,16 +292,18 @@ def test_view_subscription_one(mock_uow): session, uow = mock_uow subscription_id1 = str(uuid.uuid4()) - session.return_value.execute.return_value.first.return_value = None + session.return_value.query.return_value.filter_by.return_value.first.\ + return_value.serialize.return_value = None # Query return None subscription_res = ocloud_view.subscription_one( subscription_id1, uow) assert subscription_res is None - session.return_value.execute.return_value.first.return_value = { - "subscriptionId": subscription_id1, - } + session.return_value.query.return_value.filter_by.return_value.first.\ + return_value.serialize.return_value = { + "subscriptionId": subscription_id1, + } subscription_res = ocloud_view.subscription_one( subscription_id1, uow) @@ -289,7 +313,7 @@ def test_view_subscription_one(mock_uow): def test_flask_get_list(mock_flask_uow): session, app = mock_flask_uow - session.return_value.execute.return_value = [] + session.query.return_value = [] apibase = config.get_o2ims_api_base() with app.test_client() as client: @@ -315,7 +339,9 @@ def test_flask_get_list(mock_flask_uow): def test_flask_get_one(mock_flask_uow): session, app = mock_flask_uow - session.return_value.execute.return_value.first.return_value = None + + session.return_value.query.return_value.filter_by.return_value.\ + first.return_value = None apibase = config.get_o2ims_api_base() with app.test_client() as client: -- 2.16.6