From 81391595dca425ae58e2294898f09f11d9a32dbc Mon Sep 17 00:00:00 2001 From: Ashlee Young Date: Tue, 22 Sep 2015 12:49:09 -0700 Subject: bringing src to commit tag 65d551b50e782b0c1ea76c1a9ed1c5a801a5a7e4 Change-Id: Ib2da78962eaef856f418636c31b0f5c84286244f --- framework/src/onos/incubator/net/pom.xml | 2 +- .../incubator/net/intf/impl/package-info.java | 20 ++ .../incubator/net/intf/package-info.java | 20 ++ .../incubator/net/meter/impl/package-info.java | 20 ++ .../resource/label/impl/LabelResourceManager.java | 15 ++ .../net/intf/impl/InterfaceManagerTest.java | 287 +++++++++++++++++++++ 6 files changed, 363 insertions(+), 1 deletion(-) create mode 100644 framework/src/onos/incubator/net/src/main/java/org/onosproject/incubator/net/intf/impl/package-info.java create mode 100644 framework/src/onos/incubator/net/src/main/java/org/onosproject/incubator/net/intf/package-info.java create mode 100644 framework/src/onos/incubator/net/src/main/java/org/onosproject/incubator/net/meter/impl/package-info.java create mode 100644 framework/src/onos/incubator/net/src/test/java/org/onosproject/incubator/net/intf/impl/InterfaceManagerTest.java (limited to 'framework/src/onos/incubator/net') diff --git a/framework/src/onos/incubator/net/pom.xml b/framework/src/onos/incubator/net/pom.xml index a0b5391d..e60a2710 100644 --- a/framework/src/onos/incubator/net/pom.xml +++ b/framework/src/onos/incubator/net/pom.xml @@ -23,7 +23,7 @@ org.onosproject onos-incubator - 1.3.0-SNAPSHOT + 1.4.0-SNAPSHOT ../pom.xml diff --git a/framework/src/onos/incubator/net/src/main/java/org/onosproject/incubator/net/intf/impl/package-info.java b/framework/src/onos/incubator/net/src/main/java/org/onosproject/incubator/net/intf/impl/package-info.java new file mode 100644 index 00000000..abdce5a4 --- /dev/null +++ b/framework/src/onos/incubator/net/src/main/java/org/onosproject/incubator/net/intf/impl/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2015 Open Networking Laboratory + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Implementation of service for interacting with interfaces. + */ +package org.onosproject.incubator.net.intf.impl; diff --git a/framework/src/onos/incubator/net/src/main/java/org/onosproject/incubator/net/intf/package-info.java b/framework/src/onos/incubator/net/src/main/java/org/onosproject/incubator/net/intf/package-info.java new file mode 100644 index 00000000..00f42ead --- /dev/null +++ b/framework/src/onos/incubator/net/src/main/java/org/onosproject/incubator/net/intf/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2015 Open Networking Laboratory + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Service for interacting with interfaces. + */ +package org.onosproject.incubator.net.intf; diff --git a/framework/src/onos/incubator/net/src/main/java/org/onosproject/incubator/net/meter/impl/package-info.java b/framework/src/onos/incubator/net/src/main/java/org/onosproject/incubator/net/meter/impl/package-info.java new file mode 100644 index 00000000..5559d90b --- /dev/null +++ b/framework/src/onos/incubator/net/src/main/java/org/onosproject/incubator/net/meter/impl/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2015 Open Networking Laboratory + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Provides implementation of the meter service APIs. + */ +package org.onosproject.incubator.net.meter.impl; diff --git a/framework/src/onos/incubator/net/src/main/java/org/onosproject/incubator/net/resource/label/impl/LabelResourceManager.java b/framework/src/onos/incubator/net/src/main/java/org/onosproject/incubator/net/resource/label/impl/LabelResourceManager.java index 56167c48..8ecf1d29 100644 --- a/framework/src/onos/incubator/net/src/main/java/org/onosproject/incubator/net/resource/label/impl/LabelResourceManager.java +++ b/framework/src/onos/incubator/net/src/main/java/org/onosproject/incubator/net/resource/label/impl/LabelResourceManager.java @@ -1,3 +1,18 @@ +/* + * Copyright 2015 Open Networking Laboratory + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.onosproject.incubator.net.resource.label.impl; import com.google.common.collect.Multimap; diff --git a/framework/src/onos/incubator/net/src/test/java/org/onosproject/incubator/net/intf/impl/InterfaceManagerTest.java b/framework/src/onos/incubator/net/src/test/java/org/onosproject/incubator/net/intf/impl/InterfaceManagerTest.java new file mode 100644 index 00000000..cc2908bc --- /dev/null +++ b/framework/src/onos/incubator/net/src/test/java/org/onosproject/incubator/net/intf/impl/InterfaceManagerTest.java @@ -0,0 +1,287 @@ +/* + * Copyright 2015 Open Networking Laboratory + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.onosproject.incubator.net.intf.impl; + +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import org.junit.Before; +import org.junit.Test; +import org.onlab.packet.Ip4Address; +import org.onlab.packet.IpAddress; +import org.onlab.packet.MacAddress; +import org.onlab.packet.VlanId; +import org.onosproject.incubator.net.config.basics.ConfigException; +import org.onosproject.incubator.net.config.basics.InterfaceConfig; +import org.onosproject.incubator.net.intf.Interface; +import org.onosproject.net.ConnectPoint; +import org.onosproject.net.config.Config; +import org.onosproject.net.config.NetworkConfigEvent; +import org.onosproject.net.config.NetworkConfigListener; +import org.onosproject.net.config.NetworkConfigServiceAdapter; +import org.onosproject.net.host.InterfaceIpAddress; + +import java.util.Collections; +import java.util.Map; +import java.util.Set; + +import static junit.framework.TestCase.assertEquals; +import static org.junit.Assert.assertNull; + +/** + * Unit tests for InterfaceManager. + */ +public class InterfaceManagerTest { + private static final Class CONFIG_CLASS = InterfaceConfig.class; + + private static final int NUM_INTERFACES = 4; + + private Set subjects = Sets.newHashSet(); + private Map configs = Maps.newHashMap(); + + private Set interfaces = Sets.newHashSet(); + + private NetworkConfigListener listener; + + private InterfaceManager interfaceManager; + + @Before + public void setUp() throws Exception { + for (int i = 0; i < NUM_INTERFACES; i++) { + ConnectPoint cp = createConnectPoint(i); + subjects.add(cp); + + Interface intf = createInterface(i); + + interfaces.add(intf); + + InterfaceConfig ic = new TestInterfaceConfig(cp, Sets.newHashSet(intf)); + + configs.put(cp, ic); + } + + TestNetworkConfigService configService = + new TestNetworkConfigService(subjects, configs); + + interfaceManager = new InterfaceManager(); + interfaceManager.configService = configService; + interfaceManager.activate(); + } + + private Interface createInterface(int i) { + ConnectPoint cp = createConnectPoint(i); + + InterfaceIpAddress ia = InterfaceIpAddress.valueOf("192.168." + i + ".1/24"); + + Interface intf = new Interface(cp, + Sets.newHashSet(ia), + MacAddress.valueOf(i), + VlanId.vlanId((short) i)); + + return intf; + } + + private ConnectPoint createConnectPoint(int i) { + return ConnectPoint.deviceConnectPoint("of:000000000000000" + i + "/1"); + } + + @Test + public void testGetInterfaces() throws Exception { + assertEquals(interfaces, interfaceManager.getInterfaces()); + } + + @Test + public void testGetInterfacesByPort() throws Exception { + ConnectPoint cp = ConnectPoint.deviceConnectPoint("of:0000000000000001/1"); + + Set byPort = Collections.singleton(createInterface(1)); + + assertEquals(byPort, interfaceManager.getInterfacesByPort(cp)); + } + + @Test + public void testGetInterfacesByIp() throws Exception { + IpAddress ip = Ip4Address.valueOf("192.168.2.1"); + + Set byIp = Collections.singleton(createInterface(2)); + + assertEquals(byIp, interfaceManager.getInterfacesByIp(ip)); + } + + @Test + public void testGetMatchingInterface() throws Exception { + IpAddress ip = Ip4Address.valueOf("192.168.1.100"); + + Interface matchingIntf = createInterface(1); + + assertEquals(matchingIntf, interfaceManager.getMatchingInterface(ip)); + + // Searching for an IP with no match should return null + ip = Ip4Address.valueOf("1.1.1.1"); + + assertNull(interfaceManager.getMatchingInterface(ip)); + } + + @Test + public void testGetInterfacesByVlan() throws Exception { + VlanId vlanId = VlanId.vlanId((short) 1); + + Set byVlan = Collections.singleton(createInterface(1)); + + assertEquals(byVlan, interfaceManager.getInterfacesByVlan(vlanId)); + } + + @Test + public void testAddInterface() throws Exception { + // Create a new InterfaceConfig which will get added + VlanId vlanId = VlanId.vlanId((short) 1); + ConnectPoint cp = ConnectPoint.deviceConnectPoint("of:0000000000000001/2"); + Interface newIntf = new Interface(cp, + Collections.emptySet(), + MacAddress.valueOf(100), + vlanId); + + InterfaceConfig ic = new TestInterfaceConfig(cp, Collections.singleton(newIntf)); + + subjects.add(cp); + configs.put(cp, ic); + interfaces.add(newIntf); + + NetworkConfigEvent event = new NetworkConfigEvent( + NetworkConfigEvent.Type.CONFIG_ADDED, cp, CONFIG_CLASS); + + assertEquals(NUM_INTERFACES, interfaceManager.getInterfaces().size()); + + // Send in a config event containing a new interface config + listener.event(event); + + // Check the new interface exists in the InterfaceManager's inventory + assertEquals(interfaces, interfaceManager.getInterfaces()); + assertEquals(NUM_INTERFACES + 1, interfaceManager.getInterfaces().size()); + + // There are now two interfaces with vlan ID 1 + Set byVlan = Sets.newHashSet(createInterface(1), newIntf); + assertEquals(byVlan, interfaceManager.getInterfacesByVlan(vlanId)); + } + + @Test + public void testUpdateInterface() throws Exception { + ConnectPoint cp = createConnectPoint(1); + + // Create an interface that is the same as the existing one, but adds a + // new IP address + Interface intf = createInterface(1); + Set addresses = Sets.newHashSet(intf.ipAddresses()); + addresses.add(InterfaceIpAddress.valueOf("192.168.100.1/24")); + intf = new Interface(intf.connectPoint(), addresses, intf.mac(), intf.vlan()); + + // Create a new interface on the same connect point as the existing one + InterfaceIpAddress newAddr = InterfaceIpAddress.valueOf("192.168.101.1/24"); + Interface newIntf = new Interface(cp, + Collections.singleton(newAddr), + MacAddress.valueOf(101), + VlanId.vlanId((short) 101)); + + Set interfaces = Sets.newHashSet(intf, newIntf); + + // New interface config updates the existing interface and adds a new + // interface to the same connect point + InterfaceConfig ic = new TestInterfaceConfig(cp, interfaces); + + configs.put(cp, ic); + + NetworkConfigEvent event = new NetworkConfigEvent( + NetworkConfigEvent.Type.CONFIG_UPDATED, cp, CONFIG_CLASS); + + // Send in the event signalling the interfaces for this connect point + // have been updated + listener.event(event); + + assertEquals(NUM_INTERFACES + 1, interfaceManager.getInterfaces().size()); + assertEquals(interfaces, interfaceManager.getInterfacesByPort(cp)); + } + + @Test + public void testRemoveInterface() throws Exception { + ConnectPoint cp = createConnectPoint(1); + + NetworkConfigEvent event = new NetworkConfigEvent( + NetworkConfigEvent.Type.CONFIG_REMOVED, cp, CONFIG_CLASS); + + assertEquals(NUM_INTERFACES, interfaceManager.getInterfaces().size()); + + // Send in a config event removing an interface config + listener.event(event); + + assertEquals(NUM_INTERFACES - 1, interfaceManager.getInterfaces().size()); + } + + /** + * Test version of NetworkConfigService which allows us to pass in subjects + * and InterfaceConfigs directly. + */ + private class TestNetworkConfigService extends NetworkConfigServiceAdapter { + private final Set subjects; + private final Map configs; + + public TestNetworkConfigService(Set subjects, + Map configs) { + this.subjects = subjects; + this.configs = configs; + } + + @Override + public > Set getSubjects(Class subjectClass, + Class configClass) { + return (Set) subjects; + } + + @Override + public > C getConfig(S subject, Class configClass) { + return (C) configs.get(subject); + } + + @Override + public void addListener(NetworkConfigListener listener) { + InterfaceManagerTest.this.listener = listener; + } + } + + /** + * Test version of InterfaceConfig where we can inject interfaces directly, + * rather than parsing them from JSON. + */ + private class TestInterfaceConfig extends InterfaceConfig { + private final ConnectPoint subject; + private final Set interfaces; + + @Override + public ConnectPoint subject() { + return subject; + } + + public TestInterfaceConfig(ConnectPoint subject, Set interfaces) { + this.subject = subject; + this.interfaces = interfaces; + } + + @Override + public Set getInterfaces() throws ConfigException { + return interfaces; + } + } + +} -- cgit 1.2.3-korg