From: Adam Israel Date: Fri, 31 May 2019 13:59:52 +0000 (-0400) Subject: Feature 'ns primitive' X-Git-Tag: v6.0.0~5^2 X-Git-Url: https://osm.etsi.org/gitweb/?a=commitdiff_plain;h=refs%2Fchanges%2F90%2F7590%2F4;p=osm%2FN2VC.git Feature 'ns primitive' This contains a bug fix to enable deployment of NS charms Change-Id: I9a0adc5dc1a357c6ae3d5e50e4a5905a344d8087 Signed-off-by: Adam Israel --- diff --git a/modules/libjuju/juju/model.py b/modules/libjuju/juju/model.py index bd7d430..9a14add 100644 --- a/modules/libjuju/juju/model.py +++ b/modules/libjuju/juju/model.py @@ -845,9 +845,12 @@ class Model: pass # can't stop on a closed conn break for delta in results.deltas: - delta = get_entity_delta(delta) - old_obj, new_obj = self.state.apply_delta(delta) - await self._notify_observers(delta, old_obj, new_obj) + try: + delta = get_entity_delta(delta) + old_obj, new_obj = self.state.apply_delta(delta) + await self._notify_observers(delta, old_obj, new_obj) + except KeyError as e: + log.debug("unknown delta type: %s", e.args[0]) self._watch_received.set() except CancelledError: pass diff --git a/n2vc/vnf.py b/n2vc/vnf.py index 11ce3c8..87d5df4 100644 --- a/n2vc/vnf.py +++ b/n2vc/vnf.py @@ -503,10 +503,19 @@ class N2VC: # Where to deploy the charm to. to=to, ) - - # Map the vdu id<->app name, - # - await self.Relate(model_name, vnfd) + ############################# + # Map the vdu id<->app name # + ############################# + try: + await self.Relate(model_name, vnfd) + except KeyError as ex: + # We don't currently support relations between NS and VNF/VDU charms + self.log.warn("[N2VC] Relations not supported: {}".format(ex)) + except Exception as ex: + # This may happen if not all of the charms needed by the relation + # are ready. We can safely ignore this, because Relate will be + # retried when the endpoint of the relation is deployed. + self.log.warn("[N2VC] Relations not ready") # ####################################### # # Execute initial config primitive(s) # diff --git a/tests/integration/test_hackfest_simple.py b/tests/integration/test_hackfest_simple.py new file mode 100644 index 0000000..829ac3a --- /dev/null +++ b/tests/integration/test_hackfest_simple.py @@ -0,0 +1,189 @@ +""" +Deploy a multi-vdu, multi-charm VNF +""" + +import asyncio +import logging +import pytest +from .. import base + + +# @pytest.mark.serial +class TestCharm(base.TestN2VC): + + NSD_YAML = """ +nsd:nsd-catalog: + nsd: + - id: hackfest-simplecharm-ns + name: hackfest-simplecharm-ns + short-name: hackfest-simplecharm-ns + description: NS with 2 VNFs hackfest-simplecharm-vnf connected by datanet and mgmtnet VLs + version: '1.0' + logo: osm.png + constituent-vnfd: + - vnfd-id-ref: hackfest-simplecharm-vnf + member-vnf-index: '1' + - vnfd-id-ref: hackfest-simplecharm-vnf + member-vnf-index: '2' + vld: + - id: mgmtnet + name: mgmtnet + short-name: mgmtnet + type: ELAN + mgmt-network: 'true' + vim-network-name: mgmt + vnfd-connection-point-ref: + - vnfd-id-ref: hackfest-simplecharm-vnf + member-vnf-index-ref: '1' + vnfd-connection-point-ref: vnf-mgmt + - vnfd-id-ref: hackfest-simplecharm-vnf + member-vnf-index-ref: '2' + vnfd-connection-point-ref: vnf-mgmt + - id: datanet + name: datanet + short-name: datanet + type: ELAN + vnfd-connection-point-ref: + - vnfd-id-ref: hackfest-simplecharm-vnf + member-vnf-index-ref: '1' + vnfd-connection-point-ref: vnf-data + - vnfd-id-ref: hackfest-simplecharm-vnf + member-vnf-index-ref: '2' + vnfd-connection-point-ref: vnf-data + """ + + VNFD_YAML = """ +vnfd:vnfd-catalog: + vnfd: + - id: hackfest-simplecharm-vnf + name: hackfest-simplecharm-vnf + short-name: hackfest-simplecharm-vnf + version: '1.0' + description: A VNF consisting of 2 VDUs connected to an internal VL, and one VDU with cloud-init + logo: osm.png + connection-point: + - id: vnf-mgmt + name: vnf-mgmt + short-name: vnf-mgmt + type: VPORT + - id: vnf-data + name: vnf-data + short-name: vnf-data + type: VPORT + mgmt-interface: + cp: vnf-mgmt + internal-vld: + - id: internal + name: internal + short-name: internal + type: ELAN + internal-connection-point: + - id-ref: mgmtVM-internal + - id-ref: dataVM-internal + vdu: + - id: mgmtVM + name: mgmtVM + image: hackfest3-mgmt + count: '1' + vm-flavor: + vcpu-count: '1' + memory-mb: '1024' + storage-gb: '10' + interface: + - name: mgmtVM-eth0 + position: '1' + type: EXTERNAL + virtual-interface: + type: PARAVIRT + external-connection-point-ref: vnf-mgmt + - name: mgmtVM-eth1 + position: '2' + type: INTERNAL + virtual-interface: + type: PARAVIRT + internal-connection-point-ref: mgmtVM-internal + internal-connection-point: + - id: mgmtVM-internal + name: mgmtVM-internal + short-name: mgmtVM-internal + type: VPORT + cloud-init-file: cloud-config.txt + - id: dataVM + name: dataVM + image: hackfest3-mgmt + count: '1' + vm-flavor: + vcpu-count: '1' + memory-mb: '1024' + storage-gb: '10' + interface: + - name: dataVM-eth0 + position: '1' + type: INTERNAL + virtual-interface: + type: PARAVIRT + internal-connection-point-ref: dataVM-internal + - name: dataVM-xe0 + position: '2' + type: EXTERNAL + virtual-interface: + type: PARAVIRT + external-connection-point-ref: vnf-data + internal-connection-point: + - id: dataVM-internal + name: dataVM-internal + short-name: dataVM-internal + type: VPORT + vnf-configuration: + juju: + charm: simple + initial-config-primitive: + - seq: '1' + name: config + parameter: + - name: ssh-hostname + value: + - name: ssh-username + value: ubuntu + - name: ssh-password + value: osm4u + - seq: '2' + name: touch + parameter: + - name: filename + value: '/home/ubuntu/first-touch' + config-primitive: + - name: touch + parameter: + - name: filename + data-type: STRING + default-value: '/home/ubuntu/touched' + """ + + # @pytest.mark.serial + @pytest.mark.asyncio + async def test_multivdu_multicharm(self, event_loop): + """Deploy and execute the initial-config-primitive of a VNF.""" + + if self.nsd and self.vnfd: + vnf_index = 0 + + for config in self.get_config(): + juju = config['juju'] + charm = juju['charm'] + + await self.deploy( + vnf_index, + charm, + config, + event_loop, + ) + vnf_index += 1 + + while await self.running(): + logging.debug("Waiting for test to finish...") + await asyncio.sleep(15) + # assert False + logging.debug("test_multivdu_multicharm stopped") + + return 'ok'