2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
\r
4 * This program and the accompanying materials are made available under the
\r
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
\r
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
\r
9 package org.opendaylight.groupbasedpolicy.renderer.ofoverlay.flow;
\r
11 import java.util.Collections;
\r
12 import java.util.HashMap;
\r
13 import java.util.List;
\r
14 import java.util.Map;
\r
15 import java.util.Objects;
\r
16 import java.util.Set;
\r
18 import org.junit.Before;
\r
19 import org.junit.Test;
\r
20 import org.opendaylight.groupbasedpolicy.renderer.ofoverlay.PolicyManager.FlowMap;
\r
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress;
\r
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
\r
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address;
\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoint.fields.L3Address;
\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoint.fields.L3AddressBuilder;
\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.endpoints.Endpoint;
\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayContext;
\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.OfOverlayNodeConfigBuilder;
\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.ofoverlay.rev140528.nodes.node.TunnelBuilder;
\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatch;
\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4Match;
\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6Match;
\r
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.overlay.rev150105.TunnelTypeVxlan;
\r
37 import org.slf4j.Logger;
\r
38 import org.slf4j.LoggerFactory;
\r
40 import com.google.common.collect.ImmutableList;
\r
41 import com.google.common.collect.ImmutableSet;
\r
43 import static org.junit.Assert.*;
\r
45 public class PortSecurityTest extends FlowTableTest {
\r
46 protected static final Logger LOG =
\r
47 LoggerFactory.getLogger(PortSecurityTest.class);
\r
51 public void setup() throws Exception {
\r
53 table = new PortSecurity(ctx);
\r
58 public void testDefaultDeny() throws Exception {
\r
59 FlowMap fm = dosync(null);
\r
61 Map<String, Flow> flowMap = new HashMap<>();
\r
62 for (Flow f : fm.getTableForNode(nodeId, (short) 0).getFlow()) {
\r
63 flowMap.put(f.getId().getValue(), f);
\r
64 Long etherType = null;
\r
65 if (f.getMatch() != null) {
\r
66 etherType = f.getMatch().getEthernetMatch().getEthernetType().getType().getValue();
\r
68 if (f.getMatch() == null || FlowUtils.ARP.equals(etherType) || FlowUtils.IPv4.equals(etherType)
\r
69 || FlowUtils.IPv6.equals(etherType)) {
\r
71 assertEquals(FlowUtils.dropInstructions(), f.getInstructions());
\r
74 assertEquals(4, count);
\r
75 int numberOfFlows = fm.getTableForNode(nodeId, (short) 0).getFlow().size();
\r
76 fm = dosync(flowMap);
\r
77 assertEquals(numberOfFlows, fm.getTableForNode(nodeId, (short) 0).getFlow().size());
\r
81 public void testNonLocalAllow() throws Exception {
\r
83 .addSwitch(new NodeId("openflow:1"),
\r
84 new NodeConnectorId("openflow:1:1"),
\r
85 ImmutableSet.of(new NodeConnectorId("openflow:1:2")),
\r
86 new OfOverlayNodeConfigBuilder().setTunnel(
\r
87 ImmutableList.of(new TunnelBuilder()
\r
88 .setTunnelType(TunnelTypeVxlan.class)
\r
89 .setNodeConnectorId(new NodeConnectorId("openflow:1:1"))
\r
90 .build())).build());
\r
91 FlowMap fm = dosync(null);
\r
92 assertNotEquals(0 ,fm.getTableForNode(nodeId, (short) 0).getFlow().size());
\r
95 HashMap<String, Flow> flowMap = new HashMap<>();
\r
96 Set<String> ncs = ImmutableSet.of("openflow:1:1", "openflow:1:2");
\r
97 for (Flow f : fm.getTableForNode(nodeId, (short) 0).getFlow()) {
\r
98 flowMap.put(f.getId().getValue(), f);
\r
99 if (f.getMatch() != null && f.getMatch().getInPort() != null &&
\r
100 ncs.contains(f.getMatch().getInPort().getValue())) {
\r
101 assertEquals(f.getInstructions(),
\r
102 FlowUtils.gotoTableInstructions((short)(table.getTableId()+1)));
\r
106 assertEquals(2, count);
\r
107 int numberOfFlows = fm.getTableForNode(nodeId, (short) 0).getFlow().size();
\r
108 fm = dosync(flowMap);
\r
109 assertEquals(numberOfFlows, fm.getTableForNode(nodeId, (short) 0).getFlow().size());
\r
113 public void testL2() throws Exception {
\r
114 List<L3Address> l3 = Collections.emptyList();
\r
115 Endpoint ep = localEP()
\r
119 endpointManager.addEndpoint(ep);
\r
121 FlowMap fm = dosync(null);
\r
122 assertNotEquals(0 ,fm.getTableForNode(nodeId, (short) 0).getFlow().size());
\r
125 HashMap<String, Flow> flowMap = new HashMap<>();
\r
126 for (Flow f : fm.getTableForNode(nodeId, (short) 0).getFlow()) {
\r
127 flowMap.put(f.getId().getValue(), f);
\r
128 if (f.getMatch() != null &&
\r
129 f.getMatch().getEthernetMatch() != null &&
\r
130 f.getMatch().getEthernetMatch().getEthernetSource() != null &&
\r
131 Objects.equals(ep.getMacAddress(),
\r
132 f.getMatch().getEthernetMatch()
\r
133 .getEthernetSource().getAddress()) &&
\r
134 Objects.equals(ep.getAugmentation(OfOverlayContext.class).getNodeConnectorId(),
\r
135 f.getMatch().getInPort())) {
\r
137 assertEquals(FlowUtils.gotoTableInstructions((short)(table.getTableId()+1)),
\r
138 f.getInstructions());
\r
141 assertEquals(2, count);
\r
142 int numberOfFlows = fm.getTableForNode(nodeId, (short) 0).getFlow().size();
\r
143 fm = dosync(flowMap);
\r
144 assertEquals(numberOfFlows, fm.getTableForNode(nodeId, (short) 0).getFlow().size());
\r
148 public void testL3() throws Exception {
\r
149 Endpoint ep = localEP()
\r
150 .setL3Address(ImmutableList.of(new L3AddressBuilder()
\r
151 .setIpAddress(new IpAddress(new Ipv4Address("10.10.10.10")))
\r
153 new L3AddressBuilder()
\r
154 .setIpAddress(new IpAddress(new Ipv6Address("2001:db8:85a3::8a2e:370:7334")))
\r
158 endpointManager.addEndpoint(ep);
\r
160 FlowMap fm = dosync(null);
\r
161 assertNotEquals(0 ,fm.getTableForNode(nodeId, (short) 0).getFlow().size());
\r
164 HashMap<String, Flow> flowMap = new HashMap<>();
\r
165 for (Flow f : fm.getTableForNode(nodeId, (short) 0).getFlow()) {
\r
166 flowMap.put(f.getId().getValue(), f);
\r
167 if (f.getMatch() != null &&
\r
168 Objects.equals(ep.getAugmentation(OfOverlayContext.class).getNodeConnectorId(),
\r
169 f.getMatch().getInPort()) &&
\r
170 ((f.getMatch().getLayer3Match() != null &&
\r
171 f.getMatch().getLayer3Match() instanceof Ipv4Match &&
\r
172 ((Ipv4Match)f.getMatch().getLayer3Match()).getIpv4Source() != null &&
\r
173 Objects.equals(ep.getL3Address().get(0).getIpAddress().getIpv4Address().getValue(),
\r
174 ((Ipv4Match)f.getMatch().getLayer3Match()).getIpv4Source().getValue().split("/")[0])) ||
\r
175 (f.getMatch().getLayer3Match() != null &&
\r
176 f.getMatch().getLayer3Match() instanceof Ipv4Match &&
\r
177 ((Ipv4Match)f.getMatch().getLayer3Match()).getIpv4Destination() != null &&
\r
178 Objects.equals("255.255.255.255",
\r
179 ((Ipv4Match)f.getMatch().getLayer3Match()).getIpv4Destination().getValue().split("/")[0])) ||
\r
180 (f.getMatch().getLayer3Match() != null &&
\r
181 f.getMatch().getLayer3Match() instanceof ArpMatch &&
\r
182 Objects.equals(ep.getL3Address().get(0).getIpAddress().getIpv4Address().getValue(),
\r
183 ((ArpMatch)f.getMatch().getLayer3Match()).getArpSourceTransportAddress().getValue().split("/")[0])) ||
\r
184 (f.getMatch().getLayer3Match() != null &&
\r
185 f.getMatch().getLayer3Match() instanceof Ipv6Match &&
\r
186 Objects.equals(ep.getL3Address().get(1).getIpAddress().getIpv6Address().getValue(),
\r
187 ((Ipv6Match)f.getMatch().getLayer3Match()).getIpv6Source().getValue().split("/")[0])))) {
\r
189 assertEquals(FlowUtils.gotoTableInstructions((short)(table.getTableId()+1)),
\r
190 f.getInstructions());
\r
193 assertEquals(4, count);
\r
194 int numberOfFlows = fm.getTableForNode(nodeId, (short) 0).getFlow().size();
\r
195 fm = dosync(flowMap);
\r
196 assertEquals(numberOfFlows, fm.getTableForNode(nodeId, (short) 0).getFlow().size());
\r