2  * ============LICENSE_START=======================================================
 
   4  * ================================================================================
 
   5  * Copyright (C) 2017-2018 AT&T Intellectual Property. All rights reserved.
 
   6  * ================================================================================
 
   7  * Copyright (C) 2017 Amdocs
 
   8  * ================================================================================
 
   9  * Modifications (C) 2018 Ericsson
 
  10  * =============================================================================
 
  11  * Licensed under the Apache License, Version 2.0 (the "License");
 
  12  * you may not use this file except in compliance with the License.
 
  13  * You may obtain a copy of the License at
 
  15  *      http://www.apache.org/licenses/LICENSE-2.0
 
  17  * Unless required by applicable law or agreed to in writing, software
 
  18  * distributed under the License is distributed on an "AS IS" BASIS,
 
  19  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  20  * See the License for the specific language governing permissions and
 
  21  * limitations under the License.
 
  23  * ============LICENSE_END=========================================================
 
  26 package org.onap.appc.dg.common.impl;
 
  28 import java.util.HashMap;
 
  29 import java.util.HashSet;
 
  32 import org.junit.Before;
 
  33 import org.junit.Test;
 
  34 import org.junit.runner.RunWith;
 
  35 import org.mockito.Matchers;
 
  36 import org.onap.appc.dg.common.VnfExecutionFlow;
 
  37 import org.onap.appc.dg.dependencymanager.DependencyManager;
 
  38 import org.onap.appc.dg.dependencymanager.exception.DependencyModelNotFound;
 
  39 import org.onap.appc.dg.dependencymanager.impl.DependencyModelFactory;
 
  40 import org.onap.appc.dg.flowbuilder.exception.InvalidDependencyModelException;
 
  41 import org.onap.appc.dg.objects.Node;
 
  42 import org.onap.appc.dg.objects.VnfcDependencyModel;
 
  43 import org.onap.appc.domainmodel.Vnfc;
 
  44 import org.onap.ccsdk.sli.core.sli.SvcLogicContext;
 
  45 import org.osgi.framework.FrameworkUtil;
 
  46 import org.powermock.api.mockito.PowerMockito;
 
  47 import org.powermock.core.classloader.annotations.PrepareForTest;
 
  48 import org.powermock.modules.junit4.PowerMockRunner;
 
  49 import org.powermock.reflect.Whitebox;
 
  50 import com.att.eelf.configuration.EELFLogger;
 
  51 import com.att.eelf.configuration.EELFManager;
 
  53 @RunWith(PowerMockRunner.class)
 
  54 @PrepareForTest({FrameworkUtil.class,DependencyManager.class,DependencyModelFactory.class})
 
  55 @SuppressWarnings("unchecked")
 
  56 public class VnfExecutionFlowImplTest {
 
  58     private final EELFLogger logger = EELFManager.getInstance().getLogger(VnfExecutionFlowImplTest.class);
 
  62         logger.setLevel(EELFLogger.Level.DEBUG);
 
  66     public void testPositiveFlow() throws DependencyModelNotFound, InvalidDependencyModelException {
 
  67         Map<String, String> params = prepareParams();
 
  68         SvcLogicContext context = prepareContext();
 
  69         VnfcDependencyModel dependencyModel = readDependencyModel();
 
  71         PowerMockito.mockStatic(DependencyModelFactory.class);
 
  72         DependencyManager dependencyManager = PowerMockito.mock(DependencyManager.class);
 
  74         PowerMockito.when(DependencyModelFactory.createDependencyManager()).thenReturn(dependencyManager);
 
  75         PowerMockito.when(dependencyManager.getVnfcDependencyModel(Matchers.any(), Matchers.any()))
 
  76                 .thenReturn(dependencyModel);
 
  78         VnfExecutionFlow vnfExecutionFlow = new VnfExecutionFlowImpl();
 
  79         Whitebox.setInternalState(vnfExecutionFlow, "logger", logger);
 
  80         vnfExecutionFlow.getVnfExecutionFlowData(params,context);
 
  84     public void testComplexFlow() throws DependencyModelNotFound, InvalidDependencyModelException {
 
  85         Map<String, String> params = prepareParams();
 
  86         SvcLogicContext context = prepareContextForComplexDependency();
 
  87         VnfcDependencyModel dependencyModel = readComplexDependencyModel();
 
  89         PowerMockito.mockStatic(DependencyModelFactory.class);
 
  90         DependencyManager dependencyManager = PowerMockito.mock(DependencyManager.class);
 
  92         PowerMockito.when(DependencyModelFactory.createDependencyManager()).thenReturn(dependencyManager);
 
  93         PowerMockito.when(dependencyManager.getVnfcDependencyModel(Matchers.any(), Matchers.any()))
 
  94                 .thenReturn(dependencyModel);
 
  96         VnfExecutionFlow vnfExecutionFlow = new VnfExecutionFlowImpl();
 
  97         Whitebox.setInternalState(vnfExecutionFlow, "logger", logger);
 
  98         vnfExecutionFlow.getVnfExecutionFlowData(params,context);
 
 101     @Test(expected = RuntimeException.class)
 
 102     public void testCycleFlow() throws DependencyModelNotFound, InvalidDependencyModelException {
 
 103         Map<String, String> params = prepareParams();
 
 104         SvcLogicContext context = prepareContextForComplexDependency();
 
 105         VnfcDependencyModel dependencyModel = readCyclicDependencyModel();
 
 106         PowerMockito.mockStatic(DependencyModelFactory.class);
 
 107         DependencyManager dependencyManager = PowerMockito.mock(DependencyManager.class);
 
 109         PowerMockito.when(DependencyModelFactory.createDependencyManager()).thenReturn(dependencyManager);
 
 110         PowerMockito.when(dependencyManager.getVnfcDependencyModel(Matchers.any(), Matchers.any()))
 
 111                 .thenReturn(dependencyModel);
 
 113         VnfExecutionFlow vnfExecutionFlow = new VnfExecutionFlowImpl();
 
 114         Whitebox.setInternalState(vnfExecutionFlow, "logger", logger);
 
 115         vnfExecutionFlow.getVnfExecutionFlowData(params,context);
 
 118     private VnfcDependencyModel readCyclicDependencyModel() {
 
 120         Vnfc a = createVnfc("A","Active-Passive",null,false);
 
 121         Vnfc b = createVnfc("B","Active-Active",null,false);
 
 122         Vnfc c = createVnfc("C","Active-Active",null,false);
 
 123         Vnfc d = createVnfc("D","Active-Active",null,false);
 
 124         Vnfc e = createVnfc("E","Active-Active",null,false);
 
 125         Vnfc f = createVnfc("F","Active-Active",null,false);
 
 126         Vnfc g = createVnfc("G","Active-Active",null,false);
 
 128         Node aNode = new Node(a);
 
 129         Node bNode = new Node(b);
 
 130         Node cNode = new Node(c);
 
 131         Node dNode = new Node(d);
 
 132         Node eNode = new Node(e);
 
 133         Node fNode = new Node(f);
 
 134         Node gNode = new Node(g);
 
 143         Set<Node<Vnfc>> dependencies = new HashSet<>();
 
 144         dependencies.add(aNode);
 
 145         dependencies.add(bNode);
 
 146         dependencies.add(cNode);
 
 147         dependencies.add(dNode);
 
 148         dependencies.add(eNode);
 
 149         dependencies.add(fNode);
 
 150         dependencies.add(gNode);
 
 152         return new VnfcDependencyModel(dependencies);
 
 156     private Vnfc createVnfc(String vnfcType,String resilienceType,String vnfcName,boolean mandatory) {
 
 157         Vnfc vnfc = new Vnfc();
 
 158         vnfc.setVnfcType(vnfcType);
 
 159         vnfc.setResilienceType(resilienceType);
 
 160         vnfc.setVnfcName(vnfcName);
 
 161         vnfc.setMandatory(mandatory);
 
 165     private SvcLogicContext prepareContextForComplexDependency() {
 
 166         SvcLogicContext context = new SvcLogicContext();
 
 167         context.setAttribute("input.action-identifiers.vnf-id","1");
 
 168         context.setAttribute("vnf.type","vSCP");
 
 169         context.setAttribute("vnf.vnfcCount","7");
 
 171         context.setAttribute("vnf.vnfc[0].name","A");
 
 172         context.setAttribute("vnf.vnfc[0].type","A");
 
 173         context.setAttribute("vnf.vnfc[0].vm_count","2");
 
 174         context.setAttribute("vnf.vnfc[0].vm[0].url","A1");
 
 175         context.setAttribute("vnf.vnfc[0].vm[1].url","A2");
 
 177         context.setAttribute("vnf.vnfc[1].name","B");
 
 178         context.setAttribute("vnf.vnfc[1].type","B");
 
 179         context.setAttribute("vnf.vnfc[1].vm_count","5");
 
 180         context.setAttribute("vnf.vnfc[1].vm[0].url","B1");
 
 181         context.setAttribute("vnf.vnfc[1].vm[1].url","B2");
 
 182         context.setAttribute("vnf.vnfc[1].vm[2].url","B3");
 
 183         context.setAttribute("vnf.vnfc[1].vm[3].url","B4");
 
 184         context.setAttribute("vnf.vnfc[1].vm[4].url","B5");
 
 186         context.setAttribute("vnf.vnfc[2].name","C");
 
 187         context.setAttribute("vnf.vnfc[2].type","C");
 
 188         context.setAttribute("vnf.vnfc[2].vm_count","4");
 
 189         context.setAttribute("vnf.vnfc[2].vm[0].url","C1");
 
 190         context.setAttribute("vnf.vnfc[2].vm[1].url","C2");
 
 191         context.setAttribute("vnf.vnfc[2].vm[2].url","C3");
 
 192         context.setAttribute("vnf.vnfc[2].vm[3].url","C4");
 
 194         context.setAttribute("vnf.vnfc[3].name","D");
 
 195         context.setAttribute("vnf.vnfc[3].type","D");
 
 196         context.setAttribute("vnf.vnfc[3].vm_count","3");
 
 197         context.setAttribute("vnf.vnfc[3].vm[0].url","D1");
 
 198         context.setAttribute("vnf.vnfc[3].vm[1].url","D2");
 
 199         context.setAttribute("vnf.vnfc[3].vm[2].url","D3");
 
 201         context.setAttribute("vnf.vnfc[4].name","E");
 
 202         context.setAttribute("vnf.vnfc[4].type","E");
 
 203         context.setAttribute("vnf.vnfc[4].vm_count","2");
 
 204         context.setAttribute("vnf.vnfc[4].vm[0].url","E1");
 
 205         context.setAttribute("vnf.vnfc[4].vm[1].url","E2");
 
 207         context.setAttribute("vnf.vnfc[5].name","F");
 
 208         context.setAttribute("vnf.vnfc[5].type","F");
 
 209         context.setAttribute("vnf.vnfc[5].vm_count","1");
 
 210         context.setAttribute("vnf.vnfc[5].vm[0].url","F1");
 
 212         context.setAttribute("vnf.vnfc[6].name","G");
 
 213         context.setAttribute("vnf.vnfc[6].type","G");
 
 214         context.setAttribute("vnf.vnfc[6].vm_count","1");
 
 215         context.setAttribute("vnf.vnfc[6].vm[0].url","G1");
 
 221     private VnfcDependencyModel readComplexDependencyModel() {
 
 222         Vnfc a = createVnfc("A","Active-Passive",null,false);
 
 223         Vnfc b = createVnfc("B","Active-Active",null,false);
 
 224         Vnfc c = createVnfc("C","Active-Active",null,false);
 
 225         Vnfc d = createVnfc("D","Active-Active",null,false);
 
 226         Vnfc e = createVnfc("E","Active-Active",null,false);
 
 227         Vnfc f = createVnfc("F","Active-Active",null,false);
 
 228         Vnfc g = createVnfc("G","Active-Active",null,false);
 
 231         Node aNode = new Node(a);
 
 232         Node bNode = new Node(b);
 
 233         Node cNode = new Node(c);
 
 234         Node dNode = new Node(d);
 
 235         Node eNode = new Node(e);
 
 236         Node fNode = new Node(f);
 
 237         Node gNode = new Node(g);
 
 250         Set<Node<Vnfc>> dependencies = new HashSet<>();
 
 251         dependencies.add(aNode);
 
 252         dependencies.add(bNode);
 
 253         dependencies.add(cNode);
 
 254         dependencies.add(dNode);
 
 255         dependencies.add(eNode);
 
 256         dependencies.add(fNode);
 
 257         dependencies.add(gNode);
 
 259         return new VnfcDependencyModel(dependencies);
 
 262     private VnfcDependencyModel readDependencyModel() {
 
 264         Vnfc smp = createVnfc("SMP","Active-Passive",null,false);
 
 265         Vnfc be = createVnfc("BE","Active-Active",null,false);
 
 266         Vnfc fe = createVnfc("FE","Active-Active",null,false);
 
 269         Node smpNode = new Node(smp);
 
 270         Node beNode = new Node(be);
 
 271         Node feNode = new Node(fe);
 
 273         beNode.addParent(smp);
 
 274         feNode.addParent(be);
 
 275 //        smpNode.addParent(fe);
 
 277         Set<Node<Vnfc>> dependencies = new HashSet<>();
 
 278         dependencies.add(smpNode);
 
 279         dependencies.add(feNode);
 
 280         dependencies.add(beNode);
 
 282         return new VnfcDependencyModel(dependencies);
 
 285     private Map<String, String> prepareParams() {
 
 286         Map<String,String> params = new HashMap<>();
 
 287         params.put(Constants.DEPENDENCY_TYPE,"RESOURCE");
 
 288         params.put(Constants.FLOW_STRATEGY,"FORWARD");
 
 290         params.put(Constants.VNF_TYPE,"vSCP");
 
 291         params.put(Constants.VNF_VERION,"1.00");
 
 295     private SvcLogicContext prepareContext() {
 
 296         SvcLogicContext context = new SvcLogicContext();
 
 297         context.setAttribute("input.action-identifiers.vnf-id","1");
 
 298         context.setAttribute("vnf.type","vSCP");
 
 299         context.setAttribute("vnf.vnfcCount","3");
 
 301         context.setAttribute("vnf.vnfc[0].name","SMPname");
 
 302         context.setAttribute("vnf.vnfc[0].type","SMP");
 
 303         context.setAttribute("vnf.vnfc[0].vm_count","2");
 
 304         context.setAttribute("vnf.vnfc[0].vm[0].url","SMP_URL1");
 
 305         context.setAttribute("vnf.vnfc[0].vm[1].url","SMP_URL2");
 
 307         context.setAttribute("vnf.vnfc[1].name","BEname");
 
 308         context.setAttribute("vnf.vnfc[1].type","BE");
 
 309         context.setAttribute("vnf.vnfc[1].vm_count","5");
 
 310         context.setAttribute("vnf.vnfc[1].vm[0].url","BE_URL1");
 
 311         context.setAttribute("vnf.vnfc[1].vm[1].url","BE_URL2");
 
 312         context.setAttribute("vnf.vnfc[1].vm[2].url","BE_URL3");
 
 313         context.setAttribute("vnf.vnfc[1].vm[3].url","BE_URL4");
 
 314         context.setAttribute("vnf.vnfc[1].vm[4].url","BE_URL5");
 
 316         context.setAttribute("vnf.vnfc[2].name","FEname");
 
 317         context.setAttribute("vnf.vnfc[2].type","FE");
 
 318         context.setAttribute("vnf.vnfc[2].vm_count","2");
 
 319         context.setAttribute("vnf.vnfc[2].vm[0].url","FE_URL1");
 
 320         context.setAttribute("vnf.vnfc[2].vm[1].url","FE_URL2");
 
 325     @Test(expected = RuntimeException.class)
 
 326     public void testMissingVnfcTypeInDependencyModel() throws DependencyModelNotFound, InvalidDependencyModelException {
 
 327         Map<String, String> params = prepareParams();
 
 328         SvcLogicContext context = prepareContext();
 
 329         context.setAttribute("vnf.vnfc[3].name","XEname");
 
 330         context.setAttribute("vnf.vnfc[3].type","XE");
 
 331         context.setAttribute("vnf.vnfc[3].vm_count","2");
 
 332         context.setAttribute("vnf.vnfc[3].vm[0].url","XE_URL1");
 
 333         context.setAttribute("vnf.vnfc[3].vm[1].url","XE_URL2");
 
 334         context.setAttribute("vnf.vnfcCount","4");
 
 336         VnfcDependencyModel dependencyModel = readDependencyModel();
 
 338         PowerMockito.mockStatic(DependencyModelFactory.class);
 
 339         DependencyManager dependencyManager = PowerMockito.mock(DependencyManager.class);
 
 341         PowerMockito.when(DependencyModelFactory.createDependencyManager()).thenReturn(dependencyManager);
 
 342         PowerMockito.when(dependencyManager.getVnfcDependencyModel(Matchers.any(), Matchers.any()))
 
 343                 .thenReturn(dependencyModel);
 
 345         VnfExecutionFlow vnfExecutionFlow = new VnfExecutionFlowImpl();
 
 346         vnfExecutionFlow.getVnfExecutionFlowData(params,context);
 
 349     @Test(expected = RuntimeException.class)
 
 350     public void testMissingMandatoryVnfcTypeInInventoryModel() throws DependencyModelNotFound, InvalidDependencyModelException {
 
 351         Map<String, String> params = prepareParams();
 
 352         SvcLogicContext context = prepareContext();
 
 353         VnfcDependencyModel dependencyModel = readDependencyModel();
 
 355         Vnfc xe = createVnfc("XE","Active-Active",null, true);
 
 356         Node xeNode = new Node(xe);
 
 357         dependencyModel.getDependencies().add(xeNode);
 
 359         PowerMockito.mockStatic(DependencyModelFactory.class);
 
 360         DependencyManager dependencyManager = PowerMockito.mock(DependencyManager.class);
 
 362         PowerMockito.when(DependencyModelFactory.createDependencyManager()).thenReturn(dependencyManager);
 
 363         PowerMockito.when(dependencyManager.getVnfcDependencyModel(Matchers.any(), Matchers.any()))
 
 364                 .thenReturn(dependencyModel);
 
 366         VnfExecutionFlow vnfExecutionFlow = new VnfExecutionFlowImpl();
 
 367         vnfExecutionFlow.getVnfExecutionFlowData(params,context);
 
 371     public void testMissingOptionalVnfcTypeInInventoryModel() throws DependencyModelNotFound, InvalidDependencyModelException {
 
 372         Map<String, String> params = prepareParams();
 
 373         SvcLogicContext context = prepareContext();
 
 374         VnfcDependencyModel dependencyModel = readDependencyModel();
 
 376         Vnfc xe = createVnfc("XE","Active-Active",null, false);
 
 377         Node xeNode = new Node(xe);
 
 378         dependencyModel.getDependencies().add(xeNode);
 
 380         PowerMockito.mockStatic(DependencyModelFactory.class);
 
 381         DependencyManager dependencyManager = PowerMockito.mock(DependencyManager.class);
 
 383         PowerMockito.when(DependencyModelFactory.createDependencyManager()).thenReturn(dependencyManager);
 
 384         PowerMockito.when(dependencyManager.getVnfcDependencyModel(Matchers.any(), Matchers.any()))
 
 385                 .thenReturn(dependencyModel);
 
 387         VnfExecutionFlow vnfExecutionFlow = new VnfExecutionFlowImpl();
 
 388         vnfExecutionFlow.getVnfExecutionFlowData(params,context);
 
 392     public void testMissingOptionalVnfcTypeInInventoryModelWithDependentChild() throws DependencyModelNotFound, InvalidDependencyModelException {
 
 393         Map<String, String> params = prepareParams();
 
 394         SvcLogicContext context = prepareContext();
 
 395         context.setAttribute("vnf.vnfc[3].name","YEname");
 
 396         context.setAttribute("vnf.vnfc[3].type","YE");
 
 397         context.setAttribute("vnf.vnfc[3].vm_count","2");
 
 398         context.setAttribute("vnf.vnfc[3].vm[0].url","YE_URL1");
 
 399         context.setAttribute("vnf.vnfc[3].vm[1].url","YE_URL2");
 
 400         context.setAttribute("vnf.vnfcCount","4");
 
 402         VnfcDependencyModel dependencyModel = readDependencyModel();
 
 404         Vnfc xe = createVnfc("XE","Active-Active",null, false);
 
 405         Vnfc ye = createVnfc("YE","Active-Active",null, true);
 
 406         Node xeNode = new Node(xe);
 
 407         Node yeNode = new Node(ye);
 
 408         yeNode.addParent(xe);
 
 410         dependencyModel.getDependencies().add(yeNode);
 
 411         dependencyModel.getDependencies().add(xeNode);
 
 413         PowerMockito.mockStatic(DependencyModelFactory.class);
 
 414         DependencyManager dependencyManager = PowerMockito.mock(DependencyManager.class);
 
 416         PowerMockito.when(DependencyModelFactory.createDependencyManager()).thenReturn(dependencyManager);
 
 417         PowerMockito.when(dependencyManager.getVnfcDependencyModel(Matchers.any(), Matchers.any()))
 
 418                 .thenReturn(dependencyModel);
 
 420         VnfExecutionFlow vnfExecutionFlow = new VnfExecutionFlowImpl();
 
 421         vnfExecutionFlow.getVnfExecutionFlowData(params,context);