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 org.junit.Before;
 
  24 import org.junit.Test;
 
  25 import org.mockito.ArgumentCaptor;
 
  26 import org.mockito.InjectMocks;
 
  27 import org.mockito.Mock;
 
  28 import org.mockito.Mockito;
 
  29 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.CatalogManager;
 
  30 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.LifecycleManager;
 
  31 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.TestBase;
 
  32 import org.onap.vnfmdriver.ApiException;
 
  33 import org.onap.vnfmdriver.model.*;
 
  34 import org.onap.vnfmdriver.model.ScaleDirection;
 
  36 import java.nio.file.Paths;
 
  37 import java.util.ArrayList;
 
  38 import java.util.Iterator;
 
  39 import java.util.List;
 
  41 import static java.nio.file.Files.readAllBytes;
 
  42 import static junit.framework.TestCase.*;
 
  43 import static org.mockito.Mockito.*;
 
  44 import static org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.CbamRestApiProvider.NOKIA_LCM_API_VERSION;
 
  45 import static org.springframework.test.util.ReflectionTestUtils.setField;
 
  47 public class TestVfcGrantManager extends TestBase {
 
  49     private ArgumentCaptor<GrantVNFRequest> grantRequest = ArgumentCaptor.forClass(GrantVNFRequest.class);
 
  50     private GrantVNFResponseVim vim = new GrantVNFResponseVim();
 
  51     private GrantVNFResponse grantResponse = new GrantVNFResponse();
 
  53     private CatalogManager cbamCatalogManager;
 
  55     private VfcGrantManager vfcGrantManager;
 
  58     public void initMocks() throws Exception {
 
  59         setField(VfcGrantManager.class, "logger", logger);
 
  60         when(nsLcmApi.grantvnf(grantRequest.capture())).thenReturn(grantResponse);
 
  61         grantResponse.setVim(vim);
 
  65      * test grant request for instantiation
 
  68     public void testGrantDuringInstantiation() throws Exception {
 
  69         String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.instantiation.yaml").toURI())));
 
  71         vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, "level1", cbamVnfdContent, JOB_ID);
 
  73         assertEquals(1, grantRequest.getAllValues().size());
 
  74         GrantVNFRequest request = grantRequest.getValue();
 
  75         assertVduInGrant(request.getAddResource(), "vdu1", 1);
 
  76         assertVduInGrant(request.getAddResource(), "vdu2", 2);
 
  77         assertEquals(0, request.getRemoveResource().size());
 
  78         assertBasicGrantAttributes(request, org.onap.vnfmdriver.model.OperationType.INSTANTIATE);
 
  82      * test failure logging & propagation during grant request for instantiation
 
  85     public void testFailureDuringGrantPreparation() throws Exception {
 
  86         String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.instantiation.yaml").toURI())));
 
  89             vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, "missingLevel", cbamVnfdContent, JOB_ID);
 
  92         } catch (RuntimeException e) {
 
  93             verify(logger).error(Mockito.eq("Unable to prepare grant request for instantiation"), Mockito.any(RuntimeException.class));
 
  94             verifyNoMoreInteractions(nsLcmApi);
 
  99      * test grant request for instantiation
 
 102     public void testFailureDuringGrantRequest() throws Exception {
 
 103         String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.instantiation.yaml").toURI())));
 
 104         ApiException expectedException = new ApiException("a");
 
 105         when(nsLcmApi.grantvnf(Mockito.any())).thenThrow(expectedException);
 
 108             vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, "level1", cbamVnfdContent, JOB_ID);
 
 111         } catch (RuntimeException e) {
 
 112             verify(logger).error("Unable to request grant", expectedException);
 
 117      * No grant is requested for termination if the the VNF is not instantiated
 
 120     public void testNoGrantIsRequestedIfNotInstantiated() {
 
 121         VnfInfo vnf = new VnfInfo();
 
 123         vnf.setInstantiationState(InstantiationState.NOT_INSTANTIATED);
 
 125         vfcGrantManager.requestGrantForTerminate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, vnf, JOB_ID);
 
 127         verifyNoMoreInteractions(nsLcmApi);
 
 131      * grant is requested for termination if the the VNF is instantiated
 
 134     public void testGrantIsRequestedIfInstantiated() {
 
 135         VnfInfo vnf = new VnfInfo();
 
 137         vnf.setInstantiationState(InstantiationState.INSTANTIATED);
 
 138         InstantiatedVnfInfo instantiatedVnfInfo = new InstantiatedVnfInfo();
 
 139         VnfcResourceInfo vnfc = new VnfcResourceInfo();
 
 140         vnfc.setId("vnfcId1");
 
 141         vnfc.setVduId("vdu1");
 
 142         instantiatedVnfInfo.setVnfcResourceInfo(new ArrayList<>());
 
 143         instantiatedVnfInfo.getVnfcResourceInfo().add(vnfc);
 
 144         vnf.setInstantiatedVnfInfo(instantiatedVnfInfo);
 
 145         VnfProperty prop = new VnfProperty();
 
 146         prop.setName(LifecycleManager.ONAP_CSAR_ID);
 
 147         prop.setValue(ONAP_CSAR_ID);
 
 148         vnf.setVnfConfigurableProperties(new ArrayList<>());
 
 149         vnf.getVnfConfigurableProperties().add(prop);
 
 151         vfcGrantManager.requestGrantForTerminate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, vnf, JOB_ID);
 
 153         assertEquals(1, grantRequest.getAllValues().size());
 
 154         GrantVNFRequest request = grantRequest.getValue();
 
 155         assertVduInGrant(request.getRemoveResource(), "vdu1", 1);
 
 156         assertVduInGrant(request.getRemoveResource(), "vdu2", 0);
 
 157         assertEquals(0, request.getAddResource().size());
 
 158         assertBasicGrantAttributes(request, org.onap.vnfmdriver.model.OperationType.TERMINAL);
 
 162      * test failure logging & propagation during grant request for instantiation
 
 165     public void testFailureDuringTerminationGrantPreparation() throws Exception {
 
 166         VnfInfo vnf = new VnfInfo();
 
 168         vnf.setInstantiatedVnfInfo(null);
 
 169         vnf.setInstantiationState(InstantiationState.INSTANTIATED);
 
 172             vfcGrantManager.requestGrantForTerminate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, vnf, JOB_ID);
 
 175         } catch (RuntimeException e) {
 
 176             verify(logger).error(Mockito.eq("Unable to prepare grant request for termination"), Mockito.any(RuntimeException.class));
 
 177             verifyNoMoreInteractions(nsLcmApi);
 
 182      * failuire is to request grant is logged
 
 185     public void testFailureToRequestGrantIsLogged() throws Exception {
 
 186         VnfInfo vnf = new VnfInfo();
 
 188         vnf.setInstantiationState(InstantiationState.INSTANTIATED);
 
 189         InstantiatedVnfInfo instantiatedVnfInfo = new InstantiatedVnfInfo();
 
 190         VnfcResourceInfo vnfc = new VnfcResourceInfo();
 
 191         vnfc.setId("vnfcId1");
 
 192         vnfc.setVduId("vdu1");
 
 193         instantiatedVnfInfo.setVnfcResourceInfo(new ArrayList<>());
 
 194         instantiatedVnfInfo.getVnfcResourceInfo().add(vnfc);
 
 195         vnf.setInstantiatedVnfInfo(instantiatedVnfInfo);
 
 196         VnfProperty prop = new VnfProperty();
 
 197         prop.setName(LifecycleManager.ONAP_CSAR_ID);
 
 198         prop.setValue(ONAP_CSAR_ID);
 
 199         vnf.setVnfConfigurableProperties(new ArrayList<>());
 
 200         vnf.getVnfConfigurableProperties().add(prop);
 
 201         ApiException expectedException = new ApiException();
 
 202         when(nsLcmApi.grantvnf(Mockito.any())).thenThrow(expectedException);
 
 205             vfcGrantManager.requestGrantForTerminate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, vnf, JOB_ID);
 
 208         } catch (RuntimeException e) {
 
 209             verify(logger).error(Mockito.eq("Unable to request grant"), Mockito.eq(expectedException));
 
 214      * failuire is to request grant is logged
 
 217     public void testFailureToRequestGrantForScaleIsLogged() throws Exception {
 
 218         String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.scale.yaml").toURI())));
 
 219         VnfScaleRequest scaleRequest = new VnfScaleRequest();
 
 220         scaleRequest.setType(ScaleDirection.OUT);
 
 221         scaleRequest.setAspectId("aspect1");
 
 222         scaleRequest.setNumberOfSteps("2");
 
 223         com.nokia.cbam.lcm.v32.ApiException expectedException = new com.nokia.cbam.lcm.v32.ApiException();
 
 224         when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenThrow(expectedException);
 
 227             vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
 
 230         } catch (RuntimeException e) {
 
 231             verify(logger).error(Mockito.eq("Unable to query VNF myVnfId"), Mockito.eq(expectedException));
 
 232             assertEquals(e.getCause(), expectedException);
 
 237      * test grant request for scale out
 
 240     public void testGrantDuringScaleOut() throws Exception {
 
 241         String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.scale.yaml").toURI())));
 
 242         VnfScaleRequest scaleRequest = new VnfScaleRequest();
 
 243         scaleRequest.setType(ScaleDirection.OUT);
 
 244         scaleRequest.setAspectId("aspect1");
 
 245         scaleRequest.setNumberOfSteps("2");
 
 246         VnfInfo vnf = new VnfInfo();
 
 247         when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(vnf);
 
 248         vnf.setVnfdId(CBAM_VNFD_ID);
 
 249         when(cbamCatalogManager.getCbamVnfdContent(VNFM_ID, CBAM_VNFD_ID)).thenReturn(cbamVnfdContent);
 
 251         vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
 
 253         assertEquals(1, grantRequest.getAllValues().size());
 
 254         GrantVNFRequest request = grantRequest.getValue();
 
 255         assertVduInGrant(request.getAddResource(), "vdu1", 4);
 
 256         assertVduInGrant(request.getAddResource(), "vdu2", 2);
 
 257         assertEquals(0, request.getRemoveResource().size());
 
 258         assertBasicGrantAttributes(request, org.onap.vnfmdriver.model.OperationType.SCALEOUT);
 
 262      * test grant request for scale in
 
 265     public void testGrantDuringScaleIn() throws Exception {
 
 266         String cbamVnfdContent = new String(readAllBytes(Paths.get(TestVfcGrantManager.class.getResource("/unittests/vnfd.scale.yaml").toURI())));
 
 267         VnfScaleRequest scaleRequest = new VnfScaleRequest();
 
 268         scaleRequest.setType(ScaleDirection.IN);
 
 269         scaleRequest.setAspectId("aspect1");
 
 270         scaleRequest.setNumberOfSteps("2");
 
 271         VnfInfo vnf = new VnfInfo();
 
 272         when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(vnf);
 
 273         vnf.setVnfdId(CBAM_VNFD_ID);
 
 274         when(cbamCatalogManager.getCbamVnfdContent(VNFM_ID, CBAM_VNFD_ID)).thenReturn(cbamVnfdContent);
 
 276         vfcGrantManager.requestGrantForScale(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, scaleRequest, JOB_ID);
 
 278         assertEquals(1, grantRequest.getAllValues().size());
 
 279         GrantVNFRequest request = grantRequest.getValue();
 
 280         assertVduInGrant(request.getRemoveResource(), "vdu1", 4);
 
 281         assertVduInGrant(request.getRemoveResource(), "vdu2", 2);
 
 282         assertEquals(0, request.getAddResource().size());
 
 283         assertBasicGrantAttributes(request, org.onap.vnfmdriver.model.OperationType.SCALEIN);
 
 287      * test grant request for healing
 
 290     public void testGrantDuringHealing() throws Exception {
 
 292         VnfHealRequest healRequest = new VnfHealRequest();
 
 293         VnfHealRequestAffectedvm affectedVm = new VnfHealRequestAffectedvm();
 
 294         affectedVm.setVduid("vdu1");
 
 295         healRequest.setAffectedvm(affectedVm);
 
 296         vfcGrantManager.requestGrantForHeal(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, healRequest, JOB_ID);
 
 298         assertEquals(1, grantRequest.getAllValues().size());
 
 299         GrantVNFRequest request = grantRequest.getValue();
 
 300         assertVduInGrant(request.getAddResource(), "vdu1", 1);
 
 301         assertVduInGrant(request.getRemoveResource(), "vdu1", 1);
 
 302         assertBasicGrantAttributes(request, org.onap.vnfmdriver.model.OperationType.HEAL);
 
 306     public void testPOJO() {
 
 307         VfcGrantManager.AdditionalGrantParams additionalGrantParams = new VfcGrantManager.AdditionalGrantParams(VNFM_ID, VIM_ID);
 
 308         assertEquals(VNFM_ID, additionalGrantParams.getVnfmId());
 
 309         assertEquals(VIM_ID, additionalGrantParams.getVimId());
 
 312     private void assertBasicGrantAttributes(GrantVNFRequest request, org.onap.vnfmdriver.model.OperationType type) {
 
 313         assertEquals(JOB_ID, request.getJobId());
 
 314         assertEquals(type, request.getLifecycleOperation());
 
 315         assertEquals(ONAP_CSAR_ID, request.getVnfDescriptorId());
 
 316         assertEquals(VNF_ID, request.getVnfInstanceId());
 
 317         JsonObject additionalParams = new Gson().toJsonTree(request.getAdditionalParam()).getAsJsonObject();
 
 318         assertEquals(VIM_ID, additionalParams.get("vimId").getAsString());
 
 319         assertEquals(VNFM_ID, additionalParams.get("vnfmId").getAsString());
 
 322     private void assertVduInGrant(List<ResourceChange> changes, String vduName, int count) {
 
 323         ArrayList<ResourceChange> clonedChanges = Lists.newArrayList(changes);
 
 324         for (int i = 0; i < count + 1; i++) {
 
 325             Iterator<ResourceChange> iter = clonedChanges.iterator();
 
 326             boolean found = false;
 
 327             while (iter.hasNext()) {
 
 328                 ResourceChange change = iter.next();
 
 329                 if (change.getVdu().equals(vduName)) {