From 89ad26af6134b817ac2a04eb861d7c5a68f9885d Mon Sep 17 00:00:00 2001 From: Denes Nemeth Date: Tue, 22 May 2018 16:21:32 +0200 Subject: [PATCH] Process VNF property passed instantiation input Change-Id: Ia4f6eeacb8bf346b5e1f56d8a953ce7691f3c2c7 Signed-off-by: Denes Nemeth Issue-ID: VFC-728 --- nokiav2/docs/.gitignore | 1 + .../docs/sample/vnfm.instantiation.request.json | 14 +++ .../simple/cbam.instantiation.request.json | 14 +-- nokiav2/docs/sampleVnfs/simple/sdc.json | 1 + nokiav2/docs/sampleVnfs/simple/simple.csar | Bin 12047 -> 12123 bytes .../vfc.ns.instantiation.request.direct.json | 6 + .../simpleDual/cbam.instantiation.request.json | 8 +- nokiav2/docs/sampleVnfs/simpleDual/simpleDual.csar | Bin 11371 -> 12325 bytes .../vfc.ns.instantiation.request.direct.json | 6 + nokiav2/docs/sampleVnfs/simple_cmcc/sdc.json | 1 + .../vfc.ns.instantiation.request.direct.json | 6 + .../nokia/packagetransformer/OnapVnfdBuilder.java | 4 + .../vnfm/svnfm/nokia/vnfm/LifecycleManager.java | 19 +++- .../svnfm/nokia/vnfm/TestLifecycleManager.java | 124 ++++++++++++++++++--- .../packageconverter/empty.vnfd.onap.yaml | 4 + .../packageconverter/nodes.vnfd.onap.yaml | 4 + 16 files changed, 184 insertions(+), 28 deletions(-) create mode 100644 nokiav2/docs/sample/vnfm.instantiation.request.json create mode 100644 nokiav2/docs/sampleVnfs/simple/sdc.json create mode 100644 nokiav2/docs/sampleVnfs/simple/vfc.ns.instantiation.request.direct.json create mode 100644 nokiav2/docs/sampleVnfs/simpleDual/vfc.ns.instantiation.request.direct.json create mode 100644 nokiav2/docs/sampleVnfs/simple_cmcc/sdc.json create mode 100644 nokiav2/docs/sampleVnfs/simple_cmcc/vfc.ns.instantiation.request.direct.json diff --git a/nokiav2/docs/.gitignore b/nokiav2/docs/.gitignore index a96ddfc2..bd19fff5 100644 --- a/nokiav2/docs/.gitignore +++ b/nokiav2/docs/.gitignore @@ -1,3 +1,4 @@ _build .DS_Store internal.rst +ims diff --git a/nokiav2/docs/sample/vnfm.instantiation.request.json b/nokiav2/docs/sample/vnfm.instantiation.request.json new file mode 100644 index 00000000..8b111b2b --- /dev/null +++ b/nokiav2/docs/sample/vnfm.instantiation.request.json @@ -0,0 +1,14 @@ +{ + "vnfInstanceName": "vnfc3bc829b-6057-4001-ad04-7c6", + "extVirtualLink": [], + "vnfPackageId": "c3bc829b-6057-4001-ad04-7c6bfdf30138", + "additionalParam": { + "inputs": { + "location": "Nokia_RegionOne" + }, + "extVirtualLinks": [], + "properties": "{\"etsi_config\": \"{'zones': [{'resourceId': 'compute-a', 'id': 'zoneInfoId'}], 'extVirtualLinks': [{'resourceId': 'pub_net', 'extCps': [{'cpdId': 'universal_ecp'}]}], 'vimType': 'OPENSTACK_V3_INFO', 'instantiationLevel': 'default', 'softwareImages': [{'vnfdSoftwareImageId': 'server_image', 'resourceId': 'ubuntu.16.04'}], 'computeResourceFlavours': [{'resourceId': 'm1.small', 'vnfdVirtualComputeDescId': 'server_compute'}], 'flavourId': 'scalable'}\", \"id\": \"c3bc829b-6057-4001-ad04-7c6bfdf30138\", \"availability_zone_max_count\": \"1\"}", + "vimId": "Nokia_RegionOne" + }, + "vnfDescriptorId": "c3bc829b-6057-4001-ad04-7c6bfdf30138" +} \ No newline at end of file diff --git a/nokiav2/docs/sampleVnfs/simple/cbam.instantiation.request.json b/nokiav2/docs/sampleVnfs/simple/cbam.instantiation.request.json index 5ec6acbc..a85ca0ae 100644 --- a/nokiav2/docs/sampleVnfs/simple/cbam.instantiation.request.json +++ b/nokiav2/docs/sampleVnfs/simple/cbam.instantiation.request.json @@ -41,20 +41,20 @@ "vims": [ { "accessInfo": { - "username": "develadm", - "tenant": "devel", - "password": "develpass", + "username": "", + "tenant": "", + "password": "", "region": "RegionOne" - }, + }, "interfaceInfo": { - "endpoint": "https://10.41.49.107:5000/v2.0/", + "endpoint": "https://:5000/v2.0/", "trustedCertificates": [], "skipCertificateVerification": true, - "skipCertificateHostnameCheck": true + "skipCertificateHostnameCheck": true }, "vimInfoType": "OPENSTACK_V2_INFO", "id": "vim_id" } - ], + ], "instantiationLevelId": "default" } diff --git a/nokiav2/docs/sampleVnfs/simple/sdc.json b/nokiav2/docs/sampleVnfs/simple/sdc.json new file mode 100644 index 00000000..e6da9e17 --- /dev/null +++ b/nokiav2/docs/sampleVnfs/simple/sdc.json @@ -0,0 +1 @@ +{ "computeResourceFlavours": [ { "vnfdVirtualComputeDescId": "server_compute", "resourceId": "m1.small" } ], "extVirtualLinks": [ { "extCps": [ { "cpdId": "universal_ecp" } ], "resourceId": "pub_net" } ], "zones": [ { "resourceId": "compute-a", "id": "zoneInfoId" } ], "flavourId": "scalable", "vimType": "OPENSTACK_V3_INFO", "instantiationLevel": "default", "softwareImages": [ { "resourceId": "ubuntu.16.04", "vnfdSoftwareImageId": "server_image" } ] } diff --git a/nokiav2/docs/sampleVnfs/simple/simple.csar b/nokiav2/docs/sampleVnfs/simple/simple.csar index da3637fe5ff01f30af7561c89377864b480d4e39..fc03b56acc2f9a930841a56b567260d58ccf637b 100644 GIT binary patch delta 1253 zcmeB=yB#+nhR-p4n@`X0Q`;Gs7#O@*CuZq$%(~4S4Z;%_O4oDGQr!Jxo7!oC1dT4$ zvsVLjt%Q}jXQ@UmCpw!{5)~|xVqH@eOJYeL2j(B$HaB5&bP}r@mGdM z_qwWQ#p-mo>#R29&}=$k+#uGgGX1dd+^G-VU*ay`b46dAKl#PYz||_}gr=TJyl?zn z=YNQdRrj2|fB(#7cDrIx?{7ZUXI4t1PNr3Hl-Il?tIj0qoBX`BpsWx~SX zbpIgx@-vw{o?n&*n|(RbF3%Cq_gj`HwO811o~xxw;VTof4=-+6$g8~B+uS|lz4)>$ z@#AMtC;6JbK4iFFBy5k?*=zAL9$nTFms%KEIR7^rLxj6n>?}L|l^fNrFRhPg`qcU_ zF?0Sj`SsVPZ>x;YnYC-i;SDmvGXHX>9G3E(vGS)u;ZFy@IR;N>tG(0vcg9vCN9xsg z=gJ`2y=M*zwkp3|CU@Z9SFzLY?;X6#c70B7wp4lTwKs=i0!(>1a=YBSg=<*jY6wCaI@O+N^(!k7%L60Zd?i8E7$Xf1N zK*dK5^@?qGYQC4VoJz}m${QF};&a$z!K4ztQ`=T^mMobWym-a3fKT@8PDPkHQXsFC^N)s}Yr^X&5Jsr8Hj-pni_ z3=9mDCo$dQ^Fm1>lk1q3Io1G^2MCWQkrAInHqT;>QbQ|6CNt^SvVe+^$%U%YljC&c z7&lC=)v;ATO-T$45__MmW~I+gtF8aQ-bu28NF;3=Ap^GLsW^)VVnsn2qM@MS<|dh0^uLvlRFK z*rs+uAVH(6^z79DRV!ho?o}??pZC>mn!Dp$mdfXY8-B>ipH!cv=@F>4X3NzzC)&8~bznl%fjs7mEJkGy!ZBpHheNUuU#U8GB=K1i*YO|9IyMw;Fyxl3dYzp&tS%!jn zGQTWqX9Xqu?wgxzZ1VG;`qr}jzxK?~kNup#Dfd+o*Wp(_AAVfR=r@g;SMoXY3YSlu zOyN57dcQkye`Z!0+%S1!&;N4sn{%g`Yy{;`n0#gUw*GrW;b%TEZXL_pxxw2fO->Sj zI%!p*Lr3wR%@u9yAHH_JcKDW2mG&9sPx_yh%l@3Jc<`3o_jhiOw^@Dv>wEjMSo5As z6(*^vE=!J`|CXX@=Jq`^!uyXJ;UcSyGFx6#tiqIjIlOhXZWBM1U zPd4H0%HmN?e7W`Uzxq29wrcFoFPIYJ^VHF!Q<34n%MCjRr*Hm+yg#Zp+}QGe=koQp zR+TUwt-Qe6=GiA6{$B6&Kc>kWn4XD5qeZ?1gABvuJRK=e?CSz!9)w3@e;CI8=6kG3 zYJ8}9f3lyBEtApQ$%5+QlXTf8uhNlY?qXt?e3nUa@)I2;CCs!U!2klla)Y6vF^!o4 zlyYR5bU_A)PL9!4W1KX(SvP@sKP$szEe@H", + "tenant": "", + "password": "", "region": "RegionOne" }, "interfaceInfo": { - "endpoint": "https://10.41.49.107:5000/v2.0/", + "endpoint": "https://:5000/v2.0/", "trustedCertificates": [], "skipCertificateVerification": true, "skipCertificateHostnameCheck": true diff --git a/nokiav2/docs/sampleVnfs/simpleDual/simpleDual.csar b/nokiav2/docs/sampleVnfs/simpleDual/simpleDual.csar index 7b0b57f031dec2d249d05420a528278a00dbbadd..3a43b7888ff919376abd2c35398e821bd2b65c51 100644 GIT binary patch delta 1541 zcmaDIu{2==A0wYq+cux?ywfbrm>3u=*(b{|Ds$Y|Wr+si$?lA@^$U0Z*tYDfKmtdX z>e;ISx>mwU-Lq7xKkuuX@^;6yS*p(ZUk^_BDYx>t`l-em#iGuoMp_z1cKH`7<5C2y zPOLtabtXFSWzEFw@+@#vKAE~<;bNgbu@w)$E&p@$Pa21jlDWw9lTKuXS{Jpxzay%@6v1GciQCi^Y1)UltNEF*~?k z$ML64{pKzH-TmpGxugHj&3UCY|Ih{r4!-&;rxIJ$e6G|;WdC&VlQCFpUUp~RpP5w` zZeMwx|ND!Ib=Ay9Wv=Q=rB|EpzE+(UYumh8dQP#KU#860lWEIOSx!xEzObZXi^akG zho|qZX`agYqUVA%kNrv6@F!ujDmI--%w5l6{)yfU{YEvPf04$8YL1%t_wO4feoZds{;}FTYWsi7wdYTH!9m5AbGYnVhF3vAKo$f@(c83l{?jI091`m;oht7-Se+QqwZ?GD|Y^^NRIDLpT|j zCG}XMLAbPnn}Lz#DM|cv&Y4=(tY~P+^&*%4Uw4DI}oTLxACc zW0@ucS{7l2WRc1CD$;tGSplLKm}wXq8uy^-oot~c%K}dOx|-sATnt5F5b!Ai;L*h-1KKZu z&~DQfH z&ZaK^zDu8ECoeN_L}5?5t~#)NJ;k!CXK;3dbIzt|N+UVi>{L0Ya%d3Z6i*gU@Fje` zowcws0i6+ghv7H55D=RNZ)1pC_GZLsEoq@7(Ie?Bd*VHJ=A;g6Xr)+3% z<%*2KBCWv^d&%2_C<^o*!cT inputs = new HashMap(); public String vimId; + + public String properties; } private VnfInstantiateRequest prepareInstantiationRequest(VimInfo.VimInfoTypeEnum cloudType) { @@ -1673,6 +1676,23 @@ public class TestLifecycleManager extends TestBase { instantiationRequest.setVnfDescriptorId(ONAP_CSAR_ID); instantiationRequest.setVnfInstanceDescription("myDescription"); instantiationRequest.setVnfInstanceName("vnfName"); + externalVirtualLink.setCpdId("myCpdId"); + externalVirtualLink.setResourceId("myNetworkProviderId"); + externalVirtualLink.setVlInstanceId("myEVlId"); + externalVirtualLink.setResourceSubnetId("notUsedSubnetId"); + instantiationRequest.setExtVirtualLink(new ArrayList<>()); + instantiationRequest.getExtVirtualLink().add(externalVirtualLink); + buildAdditionalParams(cloudType); + String params = new Gson().toJson(additionalParam); + X x = new X(); + x.inputs.put(ONAP_CSAR_ID, params); + x.vimId = VIM_ID; + JsonElement additionalParam = new Gson().toJsonTree(x); + instantiationRequest.setAdditionalParam(additionalParam); + return instantiationRequest; + } + + private void buildAdditionalParams(VimInfo.VimInfoTypeEnum cloudType) { additionalParam.setInstantiationLevel("level1"); switch (cloudType) { case OPENSTACK_V2_INFO: @@ -1713,12 +1733,6 @@ public class TestLifecycleManager extends TestBase { ecp2.setNumDynamicAddresses(2); evl.getExtCps().add(ecp2); additionalParam.getExtVirtualLinks().add(evl); - externalVirtualLink.setCpdId("myCpdId"); - externalVirtualLink.setResourceId("myNetworkProviderId"); - externalVirtualLink.setVlInstanceId("myEVlId"); - externalVirtualLink.setResourceSubnetId("notUsedSubnetId"); - instantiationRequest.setExtVirtualLink(new ArrayList<>()); - instantiationRequest.getExtVirtualLink().add(externalVirtualLink); additionalParam.getExtManagedVirtualLinks().add(extManVl); ZoneInfo zone = new ZoneInfo(); zone.setId("zoneId"); @@ -1731,13 +1745,6 @@ public class TestLifecycleManager extends TestBase { image.setVnfdSoftwareImageId("imageId"); additionalParam.getSoftwareImages().add(image); additionalParam.setAdditionalParams(new JsonParser().parse("{ \"a\" : \"b\" }")); - String params = new Gson().toJson(additionalParam); - X x = new X(); - x.inputs.put(ONAP_CSAR_ID, params); - x.vimId = VIM_ID; - JsonElement additionalParam = new Gson().toJsonTree(x); - instantiationRequest.setAdditionalParam(additionalParam); - return instantiationRequest; } /** @@ -1748,4 +1755,91 @@ public class TestLifecycleManager extends TestBase { assertEquals("regionId", LifecycleManager.getRegionName("cloudOwner_regionId")); assertEquals("cloudOwner", LifecycleManager.getCloudOwner("cloudOwner_regionId")); } + + /** + * additional params of instantiation may be passed as VNF property + */ + @Test + public void testVnfConfigurationBasedOnPackageParameters() throws Exception { + VnfInstantiateRequest instantiationRequest = prepareInstantiationRequest(VimInfo.VimInfoTypeEnum.OPENSTACK_V3_INFO); + when(vnfApi.vnfsPost(createRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(vnfInfo)); + additionalParam.setInstantiationLevel(INSTANTIATION_LEVEL); + when(vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, INSTANTIATION_LEVEL, cbamVnfdContent, JOB_ID)).thenReturn(grantResponse); + grantResponse.setVimId(VIM_ID); + GrantVNFResponseVimAccessInfo accessInfo = new GrantVNFResponseVimAccessInfo(); + accessInfo.setTenant(TENANT); + grantResponse.setAccessInfo(accessInfo); + ArgumentCaptor actualInstantiationRequest = ArgumentCaptor.forClass(InstantiateVnfRequest.class); + when(vnfApi.vnfsVnfInstanceIdInstantiatePost(eq(VNF_ID), actualInstantiationRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(instantiationOperationExecution)); + X x = new X(); + JsonObject root = new JsonObject(); + root.addProperty(LifecycleManager.ETSI_CONFIG, new Gson().toJson(additionalParam)); + x.properties = new Gson().toJson(root); + x.vimId = VIM_ID; + JsonElement additionalParam = new Gson().toJsonTree(x); + instantiationRequest.setAdditionalParam(additionalParam); + //when + VnfInstantiateResponse response = lifecycleManager.createAndInstantiate(VNFM_ID, instantiationRequest, restResponse); + waitForJobToFinishInJobManager(finished); + assertEquals(1, actualInstantiationRequest.getValue().getVims().size()); + //verify + OPENSTACKV3INFO actualVim = (OPENSTACKV3INFO) actualInstantiationRequest.getValue().getVims().get(0); + assertEquals(VIM_ID, actualVim.getId()); + assertEquals(VimInfo.VimInfoTypeEnum.OPENSTACK_V3_INFO, actualVim.getVimInfoType()); + assertEquals(Boolean.valueOf(parseBoolean(vimInfo.getSslInsecure())), actualVim.getInterfaceInfo().isSkipCertificateVerification()); + assertEquals("cloudUrl", actualVim.getInterfaceInfo().getEndpoint()); + //FIXME assertEquals();actualVim.getInterfaceInfo().getTrustedCertificates()); + assertEquals("vimPassword", actualVim.getAccessInfo().getPassword()); + assertEquals("regionId", actualVim.getAccessInfo().getRegion()); + assertEquals("myTenant", actualVim.getAccessInfo().getProject()); + assertEquals("myDomain", actualVim.getAccessInfo().getDomain()); + assertEquals("vimUsername", actualVim.getAccessInfo().getUsername()); + assertTrue(actualVim.getInterfaceInfo().isSkipCertificateVerification()); + assertTrue(actualVim.getInterfaceInfo().isSkipCertificateHostnameCheck()); + } + + /** + * additional params of instantiation may be passed as VNF property + */ + @Test + public void testVnfConfigurationBasedOnPackageParametersMissingPropertiesEtsiConfig() throws Exception { + VnfInstantiateRequest instantiationRequest = prepareInstantiationRequest(VimInfo.VimInfoTypeEnum.OPENSTACK_V3_INFO); + when(vnfApi.vnfsPost(createRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(vnfInfo)); + additionalParam.setInstantiationLevel(INSTANTIATION_LEVEL); + when(vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, INSTANTIATION_LEVEL, cbamVnfdContent, JOB_ID)).thenReturn(grantResponse); + grantResponse.setVimId(VIM_ID); + GrantVNFResponseVimAccessInfo accessInfo = new GrantVNFResponseVimAccessInfo(); + accessInfo.setTenant(TENANT); + grantResponse.setAccessInfo(accessInfo); + ArgumentCaptor actualInstantiationRequest = ArgumentCaptor.forClass(InstantiateVnfRequest.class); + when(vnfApi.vnfsVnfInstanceIdInstantiatePost(eq(VNF_ID), actualInstantiationRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(instantiationOperationExecution)); + X x = new X(); + JsonObject root = new JsonObject(); + root.addProperty(LifecycleManager.ETSI_CONFIG, new Gson().toJson(additionalParam)); + x.properties = "{ }"; + new Gson().toJson(root); + x.inputs.put(ONAP_CSAR_ID, new Gson().toJson(additionalParam)); + x.vimId = VIM_ID; + JsonElement additionalParam = new Gson().toJsonTree(x); + instantiationRequest.setAdditionalParam(additionalParam); + //when + VnfInstantiateResponse response = lifecycleManager.createAndInstantiate(VNFM_ID, instantiationRequest, restResponse); + waitForJobToFinishInJobManager(finished); + assertEquals(1, actualInstantiationRequest.getValue().getVims().size()); + //verify + OPENSTACKV3INFO actualVim = (OPENSTACKV3INFO) actualInstantiationRequest.getValue().getVims().get(0); + assertEquals(VIM_ID, actualVim.getId()); + assertEquals(VimInfo.VimInfoTypeEnum.OPENSTACK_V3_INFO, actualVim.getVimInfoType()); + assertEquals(Boolean.valueOf(parseBoolean(vimInfo.getSslInsecure())), actualVim.getInterfaceInfo().isSkipCertificateVerification()); + assertEquals("cloudUrl", actualVim.getInterfaceInfo().getEndpoint()); + //FIXME assertEquals();actualVim.getInterfaceInfo().getTrustedCertificates()); + assertEquals("vimPassword", actualVim.getAccessInfo().getPassword()); + assertEquals("regionId", actualVim.getAccessInfo().getRegion()); + assertEquals("myTenant", actualVim.getAccessInfo().getProject()); + assertEquals("myDomain", actualVim.getAccessInfo().getDomain()); + assertEquals("vimUsername", actualVim.getAccessInfo().getUsername()); + assertTrue(actualVim.getInterfaceInfo().isSkipCertificateVerification()); + assertTrue(actualVim.getInterfaceInfo().isSkipCertificateHostnameCheck()); + verify(logger).info("The instantiation input for VNF with {} CSAR id does not have an " + LifecycleManager.ETSI_CONFIG + " section", ONAP_CSAR_ID); + } } diff --git a/nokiav2/driver/src/test/resources/unittests/packageconverter/empty.vnfd.onap.yaml b/nokiav2/driver/src/test/resources/unittests/packageconverter/empty.vnfd.onap.yaml index 1cbc8ef7..6650bd91 100644 --- a/nokiav2/driver/src/test/resources/unittests/packageconverter/empty.vnfd.onap.yaml +++ b/nokiav2/driver/src/test/resources/unittests/packageconverter/empty.vnfd.onap.yaml @@ -11,4 +11,8 @@ metadata: vnfdVersion: 1.0 topology_template: + inputs: + etsi_config: + type: string + description: The ETSI configuration node_templates: diff --git a/nokiav2/driver/src/test/resources/unittests/packageconverter/nodes.vnfd.onap.yaml b/nokiav2/driver/src/test/resources/unittests/packageconverter/nodes.vnfd.onap.yaml index 49446544..5a3871af 100644 --- a/nokiav2/driver/src/test/resources/unittests/packageconverter/nodes.vnfd.onap.yaml +++ b/nokiav2/driver/src/test/resources/unittests/packageconverter/nodes.vnfd.onap.yaml @@ -11,6 +11,10 @@ metadata: vnfdVersion: 1.0 topology_template: + inputs: + etsi_config: + type: string + description: The ETSI configuration node_templates: vduNode: type: tosca.nodes.nfv.VDU.Compute -- 2.16.6