2  * Copyright 2016-2017, Nokia Corporation
 
   4  * Licensed under the Apache License, Version 2.0 (the "License");
 
   5  * you may not use this file except in compliance with the License.
 
   6  * You may obtain a copy of the License at
 
   8  *     http://www.apache.org/licenses/LICENSE-2.0
 
  10  * Unless required by applicable law or agreed to in writing, software
 
  11  * distributed under the License is distributed on an "AS IS" BASIS,
 
  12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  13  * See the License for the specific language governing permissions and
 
  14  * limitations under the License.
 
  16 package org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.onap.vfc;
 
  18 import com.google.common.collect.Lists;
 
  19 import com.google.gson.Gson;
 
  20 import com.google.gson.JsonObject;
 
  21 import com.nokia.cbam.lcm.v32.model.*;
 
  22 import com.nokia.cbam.lcm.v32.model.VnfInfo;
 
  23 import io.reactivex.Observable;
 
  24 import java.nio.file.Paths;
 
  25 import java.util.ArrayList;
 
  26 import java.util.Iterator;
 
  27 import java.util.List;
 
  28 import org.junit.Before;
 
  29 import org.junit.Test;
 
  30 import org.mockito.ArgumentCaptor;
 
  31 import org.mockito.InjectMocks;
 
  32 import org.mockito.Mock;
 
  33 import org.mockito.Mockito;
 
  34 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.CatalogManager;
 
  35 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.LifecycleManager;
 
  36 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.TestBase;
 
  37 import org.onap.vnfmdriver.model.*;
 
  38 import org.onap.vnfmdriver.model.ScaleDirection;
 
  39 import retrofit2.Call;
 
  41 import static java.nio.file.Files.readAllBytes;
 
  43 import static junit.framework.TestCase.*;
 
  44 import static org.mockito.Mockito.*;
 
  45 import static org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.CbamRestApiProvider.NOKIA_LCM_API_VERSION;
 
  46 import static org.springframework.test.util.ReflectionTestUtils.setField;
 
  48 public class TestVfcGrantManager extends TestBase {
 
  50     private ArgumentCaptor<GrantVNFRequest> grantRequest = ArgumentCaptor.forClass(GrantVNFRequest.class);
 
  51     private GrantVNFResponseVim vim = new GrantVNFResponseVim();
 
  52     private GrantVNFResponse grantResponse = new GrantVNFResponse();
 
  54     private CatalogManager cbamCatalogManager;
 
  56     private VfcGrantManager vfcGrantManager;
 
  59     public void initMocks() throws Exception {
 
  60         setField(VfcGrantManager.class, "logger", logger);
 
  61         Call<GrantVNFResponse> grantVNFResponseCall = buildCall(grantResponse);
 
  62         when(nsLcmApi.grantvnf(grantRequest.capture())).thenReturn(grantVNFResponseCall);
 
  63         grantResponse.setVim(vim);
 
  67      * test grant request for instantiation
 
  70     public void testGrantDuringInstantiation() throws Exception {
 
  71         String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.instantiation.yaml").toURI())));
 
  73         vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, "level1", cbamVnfdContent, JOB_ID);
 
  75         assertEquals(1, grantRequest.getAllValues().size());
 
  76         GrantVNFRequest request = grantRequest.getValue();
 
  77         assertVduInGrant(request.getAddResource(), "vdu1", 1);
 
  78         assertVduInGrant(request.getAddResource(), "vdu2", 2);
 
  79         assertEquals(0, request.getRemoveResource().size());
 
  80         assertBasicGrantAttributes(request, org.onap.vnfmdriver.model.OperationType.INSTANTIATE);
 
  84      * test failure logging & propagation during grant request for instantiation
 
  87     public void testFailureDuringGrantPreparation() throws Exception {
 
  88         String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.instantiation.yaml").toURI())));
 
  91             vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, "missingLevel", cbamVnfdContent, JOB_ID);
 
  94         } catch (RuntimeException e) {
 
  95             verify(logger).error(Mockito.eq("Unable to prepare grant request for instantiation"), Mockito.any(RuntimeException.class));
 
  96             verifyNoMoreInteractions(nsLcmApi);
 
 101      * test grant request for instantiation
 
 104     public void testFailureDuringGrantRequest() throws Exception {
 
 105         String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.instantiation.yaml").toURI())));
 
 106         RuntimeException expectedException = new RuntimeException("a");
 
 107         when(nsLcmApi.grantvnf(Mockito.any())).thenThrow(expectedException);
 
 110             vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, "level1", cbamVnfdContent, JOB_ID);
 
 113         } catch (RuntimeException e) {
 
 114             verify(logger).error("Unable to request grant", expectedException);
 
 119      * No grant is requested for termination if the the VNF is not instantiated
 
 122     public void testNoGrantIsRequestedIfNotInstantiated() {
 
 123         VnfInfo vnf = new VnfInfo();
 
 125         vnf.setInstantiationState(InstantiationState.NOT_INSTANTIATED);
 
 127         vfcGrantManager.requestGrantForTerminate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, vnf, JOB_ID);
 
 129         verifyNoMoreInteractions(nsLcmApi);
 
 133      * grant is requested for termination if the the VNF is instantiated
 
 136     public void testGrantIsRequestedIfInstantiated() {
 
 137         VnfInfo vnf = new VnfInfo();
 
 139         vnf.setInstantiationState(InstantiationState.INSTANTIATED);
 
 140         InstantiatedVnfInfo instantiatedVnfInfo = new InstantiatedVnfInfo();
 
 141         VnfcResourceInfo vnfc = new VnfcResourceInfo();
 
 142         vnfc.setId("vnfcId1");
 
 143         vnfc.setVduId("vdu1");
 
 144         instantiatedVnfInfo.setVnfcResourceInfo(new ArrayList<>());
 
 145         instantiatedVnfInfo.getVnfcResourceInfo().add(vnfc);
 
 146         vnf.setInstantiatedVnfInfo(instantiatedVnfInfo);
 
 147         VnfProperty prop = new VnfProperty();
 
 148         prop.setName(LifecycleManager.ONAP_CSAR_ID);
 
 149         prop.setValue(ONAP_CSAR_ID);
 
 150         vnf.setVnfConfigurableProperties(new ArrayList<>());
 
 151         vnf.getVnfConfigurableProperties().add(prop);
 
 153         vfcGrantManager.requestGrantForTerminate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, vnf, JOB_ID);
 
 155         assertEquals(1, grantRequest.getAllValues().size());
 
 156         GrantVNFRequest request = grantRequest.getValue();
 
 157         assertVduInGrant(request.getRemoveResource(), "vdu1", 1);
 
 158         assertVduInGrant(request.getRemoveResource(), "vdu2", 0);
 
 159         assertEquals(0, request.getAddResource().size());
 
 160         assertBasicGrantAttributes(request, org.onap.vnfmdriver.model.OperationType.TERMINAL);
 
 164      * grant is requested for termination if the the VNF is instantiated even if has no VNFCs
 
 167     public void testGrantIsRequestedIfInstantiatedWithNoVnfcs() {
 
 168         VnfInfo vnf = new VnfInfo();
 
 170         vnf.setInstantiationState(InstantiationState.INSTANTIATED);
 
 171         InstantiatedVnfInfo instantiatedVnfInfo = new InstantiatedVnfInfo();
 
 172         vnf.setInstantiatedVnfInfo(instantiatedVnfInfo);
 
 173         VnfProperty prop = new VnfProperty();
 
 174         prop.setName(LifecycleManager.ONAP_CSAR_ID);
 
 175         prop.setValue(ONAP_CSAR_ID);
 
 176         vnf.setVnfConfigurableProperties(new ArrayList<>());
 
 177         vnf.getVnfConfigurableProperties().add(prop);
 
 179         vfcGrantManager.requestGrantForTerminate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, vnf, JOB_ID);
 
 181         assertEquals(1, grantRequest.getAllValues().size());
 
 182         GrantVNFRequest request = grantRequest.getValue();
 
 183         assertVduInGrant(request.getRemoveResource(), "vdu1", 0);
 
 184         assertVduInGrant(request.getRemoveResource(), "vdu2", 0);
 
 185         assertEquals(0, request.getAddResource().size());
 
 186         assertBasicGrantAttributes(request, org.onap.vnfmdriver.model.OperationType.TERMINAL);
 
 190      * test failure logging & propagation during grant request for instantiation
 
 193     public void testFailureDuringTerminationGrantPreparation() throws Exception {
 
 194         VnfInfo vnf = new VnfInfo();
 
 196         vnf.setInstantiatedVnfInfo(null);
 
 197         vnf.setInstantiationState(InstantiationState.INSTANTIATED);
 
 200             vfcGrantManager.requestGrantForTerminate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, vnf, JOB_ID);
 
 203         } catch (RuntimeException e) {
 
 204             verify(logger).error(Mockito.eq("Unable to prepare grant request for termination"), Mockito.any(RuntimeException.class));
 
 205             verifyNoMoreInteractions(nsLcmApi);
 
 210      * failure is to request grant is logged
 
 213     public void testFailureToRequestGrantIsLogged() throws Exception {
 
 214         VnfInfo vnf = new VnfInfo();
 
 216         vnf.setInstantiationState(InstantiationState.INSTANTIATED);
 
 217         InstantiatedVnfInfo instantiatedVnfInfo = new InstantiatedVnfInfo();
 
 218         VnfcResourceInfo vnfc = new VnfcResourceInfo();
 
 219         vnfc.setId("vnfcId1");
 
 220         vnfc.setVduId("vdu1");
 
 221         instantiatedVnfInfo.setVnfcResourceInfo(new ArrayList<>());
 
 222         instantiatedVnfInfo.getVnfcResourceInfo().add(vnfc);
 
 223         vnf.setInstantiatedVnfInfo(instantiatedVnfInfo);
 
 224         VnfProperty prop = new VnfProperty();
 
 225         prop.setName(LifecycleManager.ONAP_CSAR_ID);
 
 226         prop.setValue(ONAP_CSAR_ID);
 
 227         vnf.setVnfConfigurableProperties(new ArrayList<>());
 
 228         vnf.getVnfConfigurableProperties().add(prop);
 
 229         RuntimeException expectedException = new RuntimeException();
 
 230         when(nsLcmApi.grantvnf(Mockito.any())).thenThrow(expectedException);
 
 233             vfcGrantManager.requestGrantForTerminate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, vnf, JOB_ID);
 
 236         } catch (RuntimeException e) {
 
 237             verify(logger).error(Mockito.eq("Unable to request grant"), Mockito.eq(expectedException));
 
 242      * failure is to request grant is logged
 
 245     public void testFailureToRequestGrantForScaleIsLogged() throws Exception {
 
 246         String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.scale.yaml").toURI())));
 
 247         VnfScaleRequest scaleRequest = new VnfScaleRequest();
 
 248         scaleRequest.setType(ScaleDirection.OUT);
 
 249         scaleRequest.setAspectId("aspect1");
 
 250         scaleRequest.setNumberOfSteps("2");
 
 251         RuntimeException expectedException = new RuntimeException();
 
 252         when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenThrow(expectedException);
 
 255             vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
 
 258         } catch (RuntimeException e) {
 
 259             verify(logger).error(Mockito.eq("Unable to query VNF myVnfId"), Mockito.eq(expectedException));
 
 260             assertEquals(e.getCause(), expectedException);
 
 265      * test grant request for scale out
 
 268     public void testGrantDuringScaleOut() throws Exception {
 
 269         String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.scale.yaml").toURI())));
 
 270         VnfScaleRequest scaleRequest = new VnfScaleRequest();
 
 271         scaleRequest.setType(ScaleDirection.OUT);
 
 272         scaleRequest.setAspectId("aspect1");
 
 273         scaleRequest.setNumberOfSteps("2");
 
 274         VnfInfo vnf = new VnfInfo();
 
 275         Observable<VnfInfo> vnfInfoObservable = buildObservable(vnf);
 
 276         when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(vnfInfoObservable);
 
 277         vnf.setVnfdId(CBAM_VNFD_ID);
 
 278         when(cbamCatalogManager.getCbamVnfdContent(VNFM_ID, CBAM_VNFD_ID)).thenReturn(cbamVnfdContent);
 
 280         vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
 
 282         assertEquals(1, grantRequest.getAllValues().size());
 
 283         GrantVNFRequest request = grantRequest.getValue();
 
 284         assertVduInGrant(request.getAddResource(), "vdu1", 4);
 
 285         assertVduInGrant(request.getAddResource(), "vdu2", 2);
 
 286         assertEquals(0, request.getRemoveResource().size());
 
 287         assertBasicGrantAttributes(request, org.onap.vnfmdriver.model.OperationType.SCALEOUT);
 
 291      * test grant request for scale out without VDUs
 
 294     public void testGrantDuringScaleOutWithoutVdus() throws Exception {
 
 295         String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.scale.yaml").toURI())));
 
 296         VnfScaleRequest scaleRequest = new VnfScaleRequest();
 
 297         scaleRequest.setType(ScaleDirection.OUT);
 
 298         scaleRequest.setAspectId("aspectWithOutVdu");
 
 299         scaleRequest.setNumberOfSteps("2");
 
 300         VnfInfo vnf = new VnfInfo();
 
 301         Observable<VnfInfo> vnfInfoObservable = buildObservable(vnf);
 
 302         when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(vnfInfoObservable);
 
 303         vnf.setVnfdId(CBAM_VNFD_ID);
 
 304         when(cbamCatalogManager.getCbamVnfdContent(VNFM_ID, CBAM_VNFD_ID)).thenReturn(cbamVnfdContent);
 
 306         vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
 
 308         assertEquals(1, grantRequest.getAllValues().size());
 
 309         GrantVNFRequest request = grantRequest.getValue();
 
 310         assertVduInGrant(request.getAddResource(), "vdu1", 0);
 
 311         assertVduInGrant(request.getAddResource(), "vdu2", 0);
 
 312         assertEquals(0, request.getRemoveResource().size());
 
 313         assertBasicGrantAttributes(request, org.onap.vnfmdriver.model.OperationType.SCALEOUT);
 
 317      * test grant request for scale out without resources
 
 320     public void testGrantDuringScaleOutForEmptyAspect() throws Exception {
 
 321         String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.scale.yaml").toURI())));
 
 322         VnfScaleRequest scaleRequest = new VnfScaleRequest();
 
 323         scaleRequest.setType(ScaleDirection.OUT);
 
 324         scaleRequest.setAspectId("emptyAspect");
 
 325         scaleRequest.setNumberOfSteps("2");
 
 326         VnfInfo vnf = new VnfInfo();
 
 327         when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(vnf));
 
 328         vnf.setVnfdId(CBAM_VNFD_ID);
 
 329         when(cbamCatalogManager.getCbamVnfdContent(VNFM_ID, CBAM_VNFD_ID)).thenReturn(cbamVnfdContent);
 
 332             vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
 
 334         } catch (Exception e) {
 
 335             assertEquals("Missing child emptyAspect", e.getMessage());
 
 340      * test grant request for scale in
 
 343     public void testGrantDuringScaleIn() throws Exception {
 
 344         String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.scale.yaml").toURI())));
 
 345         VnfScaleRequest scaleRequest = new VnfScaleRequest();
 
 346         scaleRequest.setType(ScaleDirection.IN);
 
 347         scaleRequest.setAspectId("aspect1");
 
 348         scaleRequest.setNumberOfSteps("2");
 
 349         VnfInfo vnf = new VnfInfo();
 
 350         when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(vnf));
 
 351         vnf.setVnfdId(CBAM_VNFD_ID);
 
 352         when(cbamCatalogManager.getCbamVnfdContent(VNFM_ID, CBAM_VNFD_ID)).thenReturn(cbamVnfdContent);
 
 354         vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
 
 356         assertEquals(1, grantRequest.getAllValues().size());
 
 357         GrantVNFRequest request = grantRequest.getValue();
 
 358         assertVduInGrant(request.getRemoveResource(), "vdu1", 4);
 
 359         assertVduInGrant(request.getRemoveResource(), "vdu2", 2);
 
 360         assertEquals(0, request.getAddResource().size());
 
 361         assertBasicGrantAttributes(request, org.onap.vnfmdriver.model.OperationType.SCALEIN);
 
 365      * test grant request for healing
 
 368     public void testGrantDuringHealing() throws Exception {
 
 370         VnfHealRequest healRequest = new VnfHealRequest();
 
 371         VnfHealRequestAffectedvm affectedVm = new VnfHealRequestAffectedvm();
 
 372         affectedVm.setVduid("vdu1");
 
 373         healRequest.setAffectedvm(affectedVm);
 
 374         vfcGrantManager.requestGrantForHeal(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, healRequest, JOB_ID);
 
 376         assertEquals(1, grantRequest.getAllValues().size());
 
 377         GrantVNFRequest request = grantRequest.getValue();
 
 378         assertVduInGrant(request.getAddResource(), "vdu1", 1);
 
 379         assertVduInGrant(request.getRemoveResource(), "vdu1", 1);
 
 380         assertBasicGrantAttributes(request, org.onap.vnfmdriver.model.OperationType.HEAL);
 
 384     public void testPOJO() {
 
 385         VfcGrantManager.AdditionalGrantParams additionalGrantParams = new VfcGrantManager.AdditionalGrantParams(VNFM_ID, VIM_ID);
 
 386         assertEquals(VNFM_ID, additionalGrantParams.getVnfmId());
 
 387         assertEquals(VIM_ID, additionalGrantParams.getVimId());
 
 390     private void assertBasicGrantAttributes(GrantVNFRequest request, org.onap.vnfmdriver.model.OperationType type) {
 
 391         assertEquals(JOB_ID, request.getJobId());
 
 392         assertEquals(type, request.getLifecycleOperation());
 
 393         assertEquals(ONAP_CSAR_ID, request.getVnfDescriptorId());
 
 394         assertEquals(VNF_ID, request.getVnfInstanceId());
 
 395         JsonObject additionalParams = new Gson().toJsonTree(request.getAdditionalParam()).getAsJsonObject();
 
 396         assertEquals(VIM_ID, additionalParams.get("vimId").getAsString());
 
 397         assertEquals(VNFM_ID, additionalParams.get("vnfmId").getAsString());
 
 400     private void assertVduInGrant(List<ResourceChange> changes, String vduName, int count) {
 
 401         ArrayList<ResourceChange> clonedChanges = Lists.newArrayList(changes);
 
 402         for (int i = 0; i < count + 1; i++) {
 
 403             Iterator<ResourceChange> iter = clonedChanges.iterator();
 
 404             boolean found = false;
 
 405             while (iter.hasNext()) {
 
 406                 ResourceChange change = iter.next();
 
 407                 if (change.getVdu().equals(vduName)) {