2 * Copyright (c) 2016 Cisco and/or its affiliates.
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.
17 package io.fd.honeycomb.translate.v3po.interfacesstate;
19 import static org.mockito.Matchers.any;
20 import static org.mockito.Mockito.mock;
21 import static org.mockito.Mockito.verify;
22 import static org.mockito.Mockito.when;
24 import io.fd.honeycomb.translate.spi.read.ReaderCustomizer;
25 import io.fd.honeycomb.translate.vpp.util.NamingContext;
26 import io.fd.honeycomb.vpp.test.read.ReaderCustomizerTest;
27 import java.util.Collections;
28 import java.util.HashMap;
29 import java.util.List;
31 import org.junit.Test;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.InterfaceKey;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppInterfaceStateAugmentation;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.VppInterfaceStateAugmentationBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.L2;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.interfaces.state._interface.L2Builder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.l2.base.attributes.Interconnection;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.l2.base.attributes.interconnection.BridgeBasedBuilder;
41 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
42 import io.fd.vpp.jvpp.core.dto.BridgeDomainDetails;
43 import io.fd.vpp.jvpp.core.dto.BridgeDomainDetailsReplyDump;
44 import io.fd.vpp.jvpp.core.dto.BridgeDomainDump;
45 import io.fd.vpp.jvpp.core.dto.BridgeDomainSwIfDetails;
46 import io.fd.vpp.jvpp.core.dto.SwInterfaceDetails;
48 public class L2CustomizerTest extends ReaderCustomizerTest<L2, L2Builder> {
50 private static final String IFC_CTX_NAME = "ifc-test-instance";
51 private static final String BD_CTX_NAME = "bd-test-instance";
52 private NamingContext interfaceContext;
53 private NamingContext bridgeDomainContext;
55 public L2CustomizerTest() {
56 super(L2.class, VppInterfaceStateAugmentationBuilder.class);
61 interfaceContext = new NamingContext("generatedIfaceName", IFC_CTX_NAME);
62 bridgeDomainContext = new NamingContext("generatedBDName", BD_CTX_NAME);
66 protected ReaderCustomizer<L2, L2Builder> initCustomizer() {
67 return new L2Customizer(api, interfaceContext, bridgeDomainContext);
70 private InstanceIdentifier<L2> getL2Id(final String name) {
71 return InstanceIdentifier.create(InterfacesState.class).child(Interface.class, new InterfaceKey(name))
73 VppInterfaceStateAugmentation.class).child(L2.class);
76 private void whenBridgeDomainSwIfDumpThenReturn(final List<BridgeDomainSwIfDetails> bdSwIfList,
77 final List<BridgeDomainDetails> bridgeDomainDetailses) {
78 final BridgeDomainDetailsReplyDump reply = new BridgeDomainDetailsReplyDump();
79 reply.bridgeDomainSwIfDetails = bdSwIfList;
80 reply.bridgeDomainDetails = bridgeDomainDetailses;
81 when(api.bridgeDomainSwIfDump(any(BridgeDomainDump.class))).thenReturn(future(reply));
85 private BridgeDomainSwIfDetails generateBdSwIfDetails(final int ifId, final int bdId) {
86 final BridgeDomainSwIfDetails bdSwIfDetails = new BridgeDomainSwIfDetails();
87 bdSwIfDetails.swIfIndex = ifId;
88 bdSwIfDetails.shg = 1;
89 bdSwIfDetails.bdId = bdId;
93 private Interconnection generateInterconnection(final int ifId, final String bdName, final Boolean bvi) {
94 final BridgeBasedBuilder bbBuilder = new BridgeBasedBuilder();
95 bbBuilder.setBridgeDomain(bdName);
96 bbBuilder.setSplitHorizonGroup((short) 1);
98 bbBuilder.setBridgedVirtualInterface(bvi);
100 bbBuilder.setBridgedVirtualInterface(false); // false is default
102 return bbBuilder.build();
106 public void testRead() throws Exception {
107 final Map<Integer, SwInterfaceDetails> cachedInterfaceDump = new HashMap<>();
110 final String bdName = "bd001";
111 final String ifName = "eth0.sub0";
112 defineMapping(mappingContext, ifName, ifId, IFC_CTX_NAME);
113 defineMapping(mappingContext, bdName, bdId, BD_CTX_NAME);
115 final SwInterfaceDetails ifaceDetails = new SwInterfaceDetails();
116 ifaceDetails.subId = ifId;
117 cachedInterfaceDump.put(ifId, ifaceDetails);
118 cache.put(InterfaceCustomizer.DUMPED_IFCS_CONTEXT_KEY, cachedInterfaceDump);
120 // BVIinterfaceContext
121 whenBridgeDomainSwIfDumpThenReturn(Collections.singletonList(generateBdSwIfDetails(ifId, bdId)),
122 Collections.singletonList(generateBdDetails(ifId, bdId)));
124 L2Builder builder = mock(L2Builder.class);
125 getCustomizer().readCurrentAttributes(getL2Id(ifName), builder, ctx);
127 verify(builder).setInterconnection(generateInterconnection(ifId, bdName, true));
130 whenBridgeDomainSwIfDumpThenReturn(Collections.singletonList(generateBdSwIfDetails(ifId, bdId)),
131 Collections.singletonList(generateBdDetails(99 /* Different ifc is marked as BVI in bd details */, bdId)));
133 builder = mock(L2Builder.class);
134 getCustomizer().readCurrentAttributes(getL2Id(ifName), builder, ctx);
136 verify(builder).setInterconnection(generateInterconnection(ifId, bdName, null));
139 private BridgeDomainDetails generateBdDetails(final int ifId, final int bdId) {
140 final BridgeDomainDetails bridgeDomainDetails = new BridgeDomainDetails();
141 bridgeDomainDetails.bviSwIfIndex = ifId;
142 bridgeDomainDetails.bdId = bdId;
143 return bridgeDomainDetails;