daniel
Committed by Gerrit Code Review

SONA: openstackSwitching

-Added ARP handler
-Added OpenstackSubnet to encode and decode subnet-related message from Openstack
-Rebased with 5896 (Modified DhcpService for OpenStack)

Change-Id: Ic63e5c82d0301fa5c45d1a41548d8dc3a8b1ec57
...@@ -80,6 +80,11 @@ ...@@ -80,6 +80,11 @@
80 <groupId>org.osgi</groupId> 80 <groupId>org.osgi</groupId>
81 <artifactId>org.osgi.core</artifactId> 81 <artifactId>org.osgi.core</artifactId>
82 </dependency> 82 </dependency>
83 + <dependency>
84 + <groupId>org.onosproject</groupId>
85 + <artifactId>onos-app-dhcp-api</artifactId>
86 + <version>${project.version}</version>
87 + </dependency>
83 </dependencies> 88 </dependencies>
84 89
85 <build> 90 <build>
......
...@@ -15,11 +15,20 @@ ...@@ -15,11 +15,20 @@
15 */ 15 */
16 package org.onosproject.openstackswitching; 16 package org.onosproject.openstackswitching;
17 17
18 +import org.onlab.packet.ARP;
19 +import org.onlab.packet.Ethernet;
20 +import org.onlab.packet.Ip4Address;
21 +import org.onlab.packet.MacAddress;
22 +import org.onosproject.net.flow.DefaultTrafficTreatment;
23 +import org.onosproject.net.flow.TrafficTreatment;
24 +import org.onosproject.net.packet.DefaultOutboundPacket;
18 import org.onosproject.net.packet.InboundPacket; 25 import org.onosproject.net.packet.InboundPacket;
26 +import org.onosproject.net.packet.OutboundPacket;
27 +import org.onosproject.net.packet.PacketService;
19 import org.slf4j.Logger; 28 import org.slf4j.Logger;
20 import org.slf4j.LoggerFactory; 29 import org.slf4j.LoggerFactory;
21 - 30 +import java.nio.ByteBuffer;
22 -import java.util.HashMap; 31 +import java.util.Map;
23 32
24 /** 33 /**
25 * It handles ARP packet from VMs. 34 * It handles ARP packet from VMs.
...@@ -28,16 +37,18 @@ public class OpenstackArpHandler { ...@@ -28,16 +37,18 @@ public class OpenstackArpHandler {
28 37
29 private static Logger log = LoggerFactory 38 private static Logger log = LoggerFactory
30 .getLogger(OpenstackArpHandler.class); 39 .getLogger(OpenstackArpHandler.class);
31 - 40 + private PacketService packetService;
32 - HashMap<String, OpenstackPort> openstackPortHashMap; 41 + private Map<String, OpenstackPort> openstackPortMap;
33 42
34 /** 43 /**
35 - * Constructs an OpenstackArpHandler. 44 + * Returns OpenstackArpHandler reference.
36 * 45 *
37 - * @param openstackPortMap port map 46 + * @param openstackPortMap
47 + * @param packetService
38 */ 48 */
39 - public OpenstackArpHandler(HashMap<String, OpenstackPort> openstackPortMap) { 49 + public OpenstackArpHandler(Map<String, OpenstackPort> openstackPortMap, PacketService packetService) {
40 - this.openstackPortHashMap = openstackPortMap; 50 + this.openstackPortMap = openstackPortMap;
51 + this.packetService = packetService;
41 } 52 }
42 53
43 /** 54 /**
...@@ -46,6 +57,50 @@ public class OpenstackArpHandler { ...@@ -46,6 +57,50 @@ public class OpenstackArpHandler {
46 * @param pkt ARP request packet 57 * @param pkt ARP request packet
47 */ 58 */
48 public void processPacketIn(InboundPacket pkt) { 59 public void processPacketIn(InboundPacket pkt) {
49 - log.warn("Received an ARP packet"); 60 + Ethernet ethernet = pkt.parsed();
61 + ARP arp = (ARP) ethernet.getPayload();
62 +
63 + if (arp.getOpCode() == ARP.OP_REQUEST) {
64 + byte[] srcMacAddress = arp.getSenderHardwareAddress();
65 + byte[] srcIPAddress = arp.getSenderProtocolAddress();
66 + byte[] dstIPAddress = arp.getTargetProtocolAddress();
67 +
68 + //Searches the Dst MAC Address based on openstackPortMap
69 + MacAddress macAddress = null;
70 +
71 + OpenstackPort openstackPort = openstackPortMap.values().stream().filter(e -> e.fixedIps().
72 + containsValue(Ip4Address.valueOf(dstIPAddress))).findAny().orElse(null);
73 +
74 + if (openstackPort != null) {
75 + macAddress = openstackPort.macAddress();
76 + log.debug("Found MACAddress: {}", macAddress.toString());
77 + } else {
78 + return;
79 + }
80 +
81 + //Creates a response packet
82 + ARP arpReply = new ARP();
83 + arpReply.setOpCode(ARP.OP_REPLY)
84 + .setHardwareAddressLength(arp.getHardwareAddressLength())
85 + .setHardwareType(arp.getHardwareType())
86 + .setProtocolAddressLength(arp.getProtocolAddressLength())
87 + .setProtocolType(arp.getProtocolType())
88 + .setSenderHardwareAddress(macAddress.toBytes())
89 + .setSenderProtocolAddress(dstIPAddress)
90 + .setTargetHardwareAddress(srcMacAddress)
91 + .setTargetProtocolAddress(srcIPAddress);
92 +
93 + //Sends a response packet
94 + ethernet.setDestinationMACAddress(srcMacAddress)
95 + .setSourceMACAddress(macAddress)
96 + .setEtherType(Ethernet.TYPE_ARP)
97 + .setPayload(arpReply);
98 +
99 + TrafficTreatment.Builder builder = DefaultTrafficTreatment.builder();
100 + builder.setOutput(pkt.receivedFrom().port());
101 + OutboundPacket packet = new DefaultOutboundPacket(pkt.receivedFrom().deviceId(),
102 + builder.build(), ByteBuffer.wrap(ethernet.serialize()));
103 + packetService.emit(packet);
104 + }
50 } 105 }
51 } 106 }
......
1 -/*
2 -* Copyright 2015 Open Networking Laboratory
3 -*
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
7 -*
8 -* http://www.apache.org/licenses/LICENSE-2.0
9 -*
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.
15 -*/
16 -package org.onosproject.openstackswitching;
17 -
18 -import org.onosproject.net.packet.InboundPacket;
19 -import org.slf4j.Logger;
20 -import org.slf4j.LoggerFactory;
21 -
22 -/**
23 - * It handles DHCP request packets.
24 - */
25 -public class OpenstackDhcpHandler {
26 -
27 - private static Logger log = LoggerFactory
28 - .getLogger(OpenstackDhcpHandler.class);
29 -
30 - /**
31 - * Returns OpenstackDhcpHandler reference.
32 - */
33 - public OpenstackDhcpHandler() {
34 -
35 - }
36 -
37 - /**
38 - * Processes DHCP request packets.
39 - *
40 - * @param pkt DHCP request packet
41 - */
42 - public void processPacketIn(InboundPacket pkt) {
43 - log.warn("Received a DHCP packet");
44 - }
45 -}
...@@ -26,8 +26,18 @@ public final class OpenstackNetwork { ...@@ -26,8 +26,18 @@ public final class OpenstackNetwork {
26 private String name; 26 private String name;
27 private String tenantId; 27 private String tenantId;
28 private String segmentId; 28 private String segmentId;
29 - private String networkType;
30 private String id; 29 private String id;
30 + private NetworkType networkType;
31 +
32 + public enum NetworkType {
33 + /**
34 + * Currently only VXLAN moded is supported.
35 + */
36 + VXLAN,
37 + VLAN,
38 + STT,
39 + LOCAL
40 + }
31 41
32 /** 42 /**
33 * Returns the builder object of the OpenstackNetwork class. 43 * Returns the builder object of the OpenstackNetwork class.
...@@ -39,12 +49,12 @@ public final class OpenstackNetwork { ...@@ -39,12 +49,12 @@ public final class OpenstackNetwork {
39 } 49 }
40 50
41 private OpenstackNetwork(String name, String tenantId, String id, String sid, 51 private OpenstackNetwork(String name, String tenantId, String id, String sid,
42 - String type) { 52 + NetworkType type) {
43 this.name = checkNotNull(name); 53 this.name = checkNotNull(name);
44 this.tenantId = checkNotNull(tenantId); 54 this.tenantId = checkNotNull(tenantId);
45 this.segmentId = checkNotNull(sid); 55 this.segmentId = checkNotNull(sid);
46 this.id = checkNotNull(id); 56 this.id = checkNotNull(id);
47 - this.networkType = checkNotNull(type); 57 + this.networkType = type;
48 } 58 }
49 59
50 public String name() { 60 public String name() {
...@@ -63,7 +73,7 @@ public final class OpenstackNetwork { ...@@ -63,7 +73,7 @@ public final class OpenstackNetwork {
63 return this.segmentId; 73 return this.segmentId;
64 } 74 }
65 75
66 - public String networkType() { 76 + public NetworkType networkType() {
67 return this.networkType; 77 return this.networkType;
68 } 78 }
69 79
...@@ -72,7 +82,7 @@ public final class OpenstackNetwork { ...@@ -72,7 +82,7 @@ public final class OpenstackNetwork {
72 private String tenantId; 82 private String tenantId;
73 private String id; 83 private String id;
74 private String sid; 84 private String sid;
75 - private String networkType; 85 + private NetworkType networkType;
76 86
77 public Builder name(String name) { 87 public Builder name(String name) {
78 this.name = name; 88 this.name = name;
...@@ -98,7 +108,7 @@ public final class OpenstackNetwork { ...@@ -98,7 +108,7 @@ public final class OpenstackNetwork {
98 return this; 108 return this;
99 } 109 }
100 110
101 - public Builder networkType(String type) { 111 + public Builder networkType(NetworkType type) {
102 this.networkType = type; 112 this.networkType = type;
103 113
104 return this; 114 return this;
......
1 +/*
2 + * Copyright 2015 Open Networking Laboratory
3 + *
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
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
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.
15 + */
16 +package org.onosproject.openstackswitching;
17 +
18 +import static com.google.common.base.Preconditions.checkNotNull;
19 +
20 +/**
21 + * Represents the subnet information given by Neutron.
22 + *
23 + */
24 +public final class OpenstackSubnet {
25 + private String name;
26 + private boolean enableHhcp;
27 + private String networkId;
28 + private String tenantId;
29 + private String dnsNameservers;
30 + private String gatewayIp;
31 + private String cidr;
32 + private String id;
33 +
34 + private OpenstackSubnet(String name, boolean enableHhcp, String networkId,
35 + String tenantId, String dnsNameservers, String gatewayIp,
36 + String cidr, String id) {
37 + this.name = name;
38 + this.enableHhcp = enableHhcp;
39 + this.networkId = checkNotNull(networkId);
40 + this.tenantId = checkNotNull(tenantId);
41 + this.dnsNameservers = dnsNameservers;
42 + this.gatewayIp = gatewayIp;
43 + this.cidr = checkNotNull(cidr);
44 + this.id = checkNotNull(id);
45 + }
46 +
47 + /**
48 + * Returns OpenstackSubnet builder object.
49 + *
50 + * @return OpenstackSubnet builder
51 + */
52 + public static OpenstackSubnet.Builder builder() {
53 + return new Builder();
54 + }
55 +
56 + public String name() {
57 + return name;
58 + }
59 +
60 + public boolean enableHhcp() {
61 + return enableHhcp;
62 + }
63 +
64 + public String networkId() {
65 + return networkId;
66 + }
67 +
68 + public String tenantId() {
69 + return tenantId;
70 + }
71 +
72 + public String dnsNameservers() {
73 + return dnsNameservers;
74 + }
75 +
76 + public String gatewayIp() {
77 + return gatewayIp;
78 + }
79 +
80 + public String cidr() {
81 + return cidr;
82 + }
83 +
84 + public String id() {
85 + return id;
86 + }
87 +
88 + // TODO : Implement the following functions when necessary
89 +
90 + /**
91 + * OpenstackSubnet Builder class.
92 + *
93 + */
94 + public static final class Builder {
95 + private String name;
96 + private boolean enableDhcp;
97 + private String networkId;
98 + private String tenantId;
99 + private String dnsNameservers;
100 + private String gatewayIp;
101 + private String cidr;
102 + private String id;
103 +
104 + Builder() {}
105 +
106 + public Builder setName(String name) {
107 + this.name = name;
108 +
109 + return this;
110 + }
111 +
112 + public Builder setEnableDhcp(boolean enableDhcp) {
113 + this.enableDhcp = enableDhcp;
114 +
115 + return this;
116 + }
117 +
118 + public Builder setNetworkId(String networkId) {
119 + this.networkId = networkId;
120 +
121 + return this;
122 + }
123 +
124 + public Builder setTenantId(String tenantId) {
125 + this.tenantId = tenantId;
126 +
127 + return this;
128 + }
129 +
130 + public Builder setDnsNameservers(String dnsNameservers) {
131 + this.dnsNameservers = dnsNameservers;
132 +
133 + return this;
134 + }
135 +
136 + public Builder setGatewayIp(String gatewayIp) {
137 + this.gatewayIp = gatewayIp;
138 +
139 + return this;
140 + }
141 +
142 + public Builder setCidr(String cidr) {
143 + this.cidr = cidr;
144 +
145 + return this;
146 + }
147 +
148 + public Builder setId(String id) {
149 + this.id = id;
150 +
151 + return this;
152 + }
153 +
154 + public OpenstackSubnet build() {
155 + return new OpenstackSubnet(name, enableDhcp, networkId, tenantId,
156 + dnsNameservers, gatewayIp, cidr, id);
157 + }
158 + }
159 +}
...@@ -24,13 +24,12 @@ import org.apache.felix.scr.annotations.Reference; ...@@ -24,13 +24,12 @@ import org.apache.felix.scr.annotations.Reference;
24 import org.apache.felix.scr.annotations.ReferenceCardinality; 24 import org.apache.felix.scr.annotations.ReferenceCardinality;
25 import org.apache.felix.scr.annotations.Service; 25 import org.apache.felix.scr.annotations.Service;
26 import org.onlab.packet.Ethernet; 26 import org.onlab.packet.Ethernet;
27 -import org.onlab.packet.IPv4;
28 import org.onlab.packet.Ip4Address; 27 import org.onlab.packet.Ip4Address;
29 import org.onlab.packet.Ip4Prefix; 28 import org.onlab.packet.Ip4Prefix;
30 import org.onlab.packet.MacAddress; 29 import org.onlab.packet.MacAddress;
31 -import org.onlab.packet.UDP;
32 import org.onosproject.core.ApplicationId; 30 import org.onosproject.core.ApplicationId;
33 import org.onosproject.core.CoreService; 31 import org.onosproject.core.CoreService;
32 +import org.onosproject.dhcp.DhcpService;
34 import org.onosproject.net.Device; 33 import org.onosproject.net.Device;
35 import org.onosproject.net.DeviceId; 34 import org.onosproject.net.DeviceId;
36 import org.onosproject.net.Port; 35 import org.onosproject.net.Port;
...@@ -45,8 +44,8 @@ import org.onosproject.net.packet.PacketService; ...@@ -45,8 +44,8 @@ import org.onosproject.net.packet.PacketService;
45 import org.slf4j.Logger; 44 import org.slf4j.Logger;
46 import org.slf4j.LoggerFactory; 45 import org.slf4j.LoggerFactory;
47 46
48 -import java.util.HashMap;
49 import java.util.List; 47 import java.util.List;
48 +import java.util.Map;
50 import java.util.concurrent.ExecutorService; 49 import java.util.concurrent.ExecutorService;
51 import java.util.concurrent.Executors; 50 import java.util.concurrent.Executors;
52 51
...@@ -73,12 +72,14 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { ...@@ -73,12 +72,14 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService {
73 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 72 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
74 protected FlowObjectiveService flowObjectiveService; 73 protected FlowObjectiveService flowObjectiveService;
75 74
75 + @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
76 + protected DhcpService dhcpService;
76 77
77 public static final int DHCP_PORT = 67; 78 public static final int DHCP_PORT = 67;
78 79
79 private ApplicationId appId; 80 private ApplicationId appId;
80 private OpenstackArpHandler arpHandler; 81 private OpenstackArpHandler arpHandler;
81 - private OpenstackDhcpHandler dhcpHandler = new OpenstackDhcpHandler(); 82 +
82 private OpenstackSwitchingRulePopulator rulePopulator; 83 private OpenstackSwitchingRulePopulator rulePopulator;
83 private ExecutorService deviceEventExcutorService = Executors.newFixedThreadPool(10); 84 private ExecutorService deviceEventExcutorService = Executors.newFixedThreadPool(10);
84 85
...@@ -86,12 +87,14 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { ...@@ -86,12 +87,14 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService {
86 private InternalDeviceListener internalDeviceListener = new InternalDeviceListener(); 87 private InternalDeviceListener internalDeviceListener = new InternalDeviceListener();
87 88
88 // Map <port_id, OpenstackPort> 89 // Map <port_id, OpenstackPort>
89 - private HashMap<String, OpenstackPort> openstackPortMap; 90 + private Map<String, OpenstackPort> openstackPortMap;
90 // Map <network_id, OpenstackNetwork> 91 // Map <network_id, OpenstackNetwork>
91 - private HashMap<String, OpenstackNetwork> openstackNetworkMap; 92 + private Map<String, OpenstackNetwork> openstackNetworkMap;
93 + // Map <subnet_id, OpenstackSubner>
94 + private Map<String, OpenstackSubnet> openstackSubnetMap;
92 // Map <vni, List <Entry <portName, host ip>> 95 // Map <vni, List <Entry <portName, host ip>>
93 - private HashMap<String, List<PortInfo>> vniPortMap; 96 + private Map<String, List<PortInfo>> vniPortMap;
94 - private HashMap<Ip4Address, Port> tunnelPortMap; 97 + private Map<Ip4Address, Port> tunnelPortMap;
95 98
96 99
97 @Activate 100 @Activate
...@@ -104,11 +107,11 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { ...@@ -104,11 +107,11 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService {
104 107
105 openstackPortMap = Maps.newHashMap(); 108 openstackPortMap = Maps.newHashMap();
106 openstackNetworkMap = Maps.newHashMap(); 109 openstackNetworkMap = Maps.newHashMap();
110 + openstackSubnetMap = Maps.newHashMap();
111 +
107 vniPortMap = Maps.newHashMap(); 112 vniPortMap = Maps.newHashMap();
108 tunnelPortMap = Maps.newHashMap(); 113 tunnelPortMap = Maps.newHashMap();
109 - 114 + arpHandler = new OpenstackArpHandler(openstackPortMap, packetService);
110 - arpHandler = new OpenstackArpHandler(openstackPortMap);
111 -
112 log.info("Started"); 115 log.info("Started");
113 } 116 }
114 117
...@@ -124,9 +127,43 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { ...@@ -124,9 +127,43 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService {
124 127
125 @Override 128 @Override
126 public void createPorts(OpenstackPort openstackPort) { 129 public void createPorts(OpenstackPort openstackPort) {
130 + //For DHCP purpose
131 + //registerDhcpInfo(openstackPort);
127 openstackPortMap.put(openstackPort.id(), openstackPort); 132 openstackPortMap.put(openstackPort.id(), openstackPort);
128 } 133 }
129 134
135 + /*
136 + private void registerDhcpInfo(OpenstackPort openstackPort) {
137 + Ip4Address ip4Address;
138 + Ip4Address subnetMask;
139 + Ip4Address dhcpServer;
140 + Ip4Address gatewayIPAddress;
141 + Ip4Address domainServer;
142 + OpenstackSubnet openstackSubnet;
143 +
144 + ip4Address = (Ip4Address) openstackPort.fixedIps().values().toArray()[0];
145 +
146 + openstackSubnet = openstackSubnetMap.values().stream()
147 + .filter(n -> n.networkId().equals(openstackPort.networkId()))
148 + .findFirst().get();
149 +
150 + int prefix;
151 + String[] parts = openstackSubnet.cidr().split("/");
152 + prefix = Integer.parseInt(parts[1]);
153 + int mask = 0xffffffff << (32 - prefix);
154 + byte[] bytes = new byte[]{(byte) (mask >>> 24),
155 + (byte) (mask >> 16 & 0xff), (byte) (mask >> 8 & 0xff), (byte) (mask & 0xff)};
156 +
157 + subnetMask = Ip4Address.valueOf(bytes);
158 + gatewayIPAddress = Ip4Address.valueOf(openstackSubnet.gatewayIp());
159 + dhcpServer = gatewayIPAddress;
160 + domainServer = Ip4Address.valueOf("8.8.8.8");
161 +
162 + dhcpService.setStaticMappingOpenstack(openstackPort.macAddress(),
163 + ip4Address, subnetMask, dhcpServer, gatewayIPAddress, domainServer);
164 + }
165 + */
166 +
130 @Override 167 @Override
131 public void deletePorts() { 168 public void deletePorts() {
132 169
...@@ -142,8 +179,15 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { ...@@ -142,8 +179,15 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService {
142 openstackNetworkMap.put(openstackNetwork.id(), openstackNetwork); 179 openstackNetworkMap.put(openstackNetwork.id(), openstackNetwork);
143 } 180 }
144 181
182 +
183 + @Override
184 + public void createSubnet(OpenstackSubnet openstackSubnet) {
185 + openstackSubnetMap.put(openstackSubnet.id(), openstackSubnet);
186 + log.debug("Added Subnet Info {}", openstackNetworkMap.get(openstackSubnet.id()));
187 + }
188 +
145 private void processDeviceAdded(Device device) { 189 private void processDeviceAdded(Device device) {
146 - log.warn("device {} is added", device.id()); 190 + log.debug("device {} is added", device.id());
147 rulePopulator.populateDefaultRules(device.id()); 191 rulePopulator.populateDefaultRules(device.id());
148 } 192 }
149 193
...@@ -152,7 +196,7 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { ...@@ -152,7 +196,7 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService {
152 // TODO: Make it stateless 196 // TODO: Make it stateless
153 // TODO: All the logics need to be processed inside of the rulePopulator class 197 // TODO: All the logics need to be processed inside of the rulePopulator class
154 synchronized (vniPortMap) { 198 synchronized (vniPortMap) {
155 - log.warn("port {} is updated", port.toString()); 199 + log.debug("port {} is updated", port.toString());
156 200
157 updatePortMaps(device, port); 201 updatePortMaps(device, port);
158 if (!port.annotations().value("portName").equals("vxlan")) { 202 if (!port.annotations().value("portName").equals("vxlan")) {
...@@ -163,7 +207,7 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { ...@@ -163,7 +207,7 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService {
163 } 207 }
164 208
165 private void processPortRemoved(Device device, Port port) { 209 private void processPortRemoved(Device device, Port port) {
166 - log.warn("port {} is removed", port.toString()); 210 + log.debug("port {} is removed", port.toString());
167 // TODO: need to update the vniPortMap 211 // TODO: need to update the vniPortMap
168 } 212 }
169 213
...@@ -182,7 +226,7 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { ...@@ -182,7 +226,7 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService {
182 // TODO: Avoid duplicate flow rule set up for VMs in other Cnode 226 // TODO: Avoid duplicate flow rule set up for VMs in other Cnode
183 // (possibly avoided by flowrule subsystem?) 227 // (possibly avoided by flowrule subsystem?)
184 if (tunnelPortMap.get(hostIpAddress) == null) { 228 if (tunnelPortMap.get(hostIpAddress) == null) {
185 - log.warn("There is no tunnel port information"); 229 + log.debug("There is no tunnel port information");
186 return; 230 return;
187 } 231 }
188 String vni = getVniForPort(portName); 232 String vni = getVniForPort(portName);
...@@ -251,20 +295,19 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { ...@@ -251,20 +295,19 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService {
251 .filter(p -> p.id().startsWith(uuid)) 295 .filter(p -> p.id().startsWith(uuid))
252 .findFirst().get(); 296 .findFirst().get();
253 if (port == null) { 297 if (port == null) {
254 - log.warn("No port information for port {}", portName); 298 + log.debug("No port information for port {}", portName);
255 return null; 299 return null;
256 } 300 }
257 301
258 - //OpenstackSubnet subnet = openstackSubnetMap.values().stream() 302 + OpenstackSubnet subnet = openstackSubnetMap.values().stream()
259 - // .filter(s -> s.networkId().equals(port.networkId())) 303 + .filter(s -> s.networkId().equals(port.networkId()))
260 - // .findFirst().get(); 304 + .findFirst().get();
261 - //if (subnet == null) { 305 + if (subnet == null) {
262 - // log.warn("No subnet information for network {}", subnet.id()); 306 + log.debug("No subnet information for network {}", subnet.id());
263 - // return null; 307 + return null;
264 - //} 308 + }
265 309
266 - //return Ip4Prefix.valueOf(subnet.cidr()); 310 + return Ip4Prefix.valueOf(subnet.cidr());
267 - return null;
268 } 311 }
269 312
270 /** 313 /**
...@@ -280,14 +323,14 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { ...@@ -280,14 +323,14 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService {
280 .filter(p -> p.id().startsWith(uuid)) 323 .filter(p -> p.id().startsWith(uuid))
281 .findFirst().get(); 324 .findFirst().get();
282 if (port == null) { 325 if (port == null) {
283 - log.warn("No port information for port {}", portName); 326 + log.debug("No port information for port {}", portName);
284 return null; 327 return null;
285 } 328 }
286 OpenstackNetwork network = openstackNetworkMap.values().stream() 329 OpenstackNetwork network = openstackNetworkMap.values().stream()
287 .filter(n -> n.id().equals(port.networkId())) 330 .filter(n -> n.id().equals(port.networkId()))
288 .findFirst().get(); 331 .findFirst().get();
289 if (network == null) { 332 if (network == null) {
290 - log.warn("No VNI information for network {}", network.id()); 333 + log.debug("No VNI information for network {}", network.id());
291 return null; 334 return null;
292 } 335 }
293 336
...@@ -357,15 +400,6 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService { ...@@ -357,15 +400,6 @@ public class OpenstackSwitchingManager implements OpenstackSwitchingService {
357 400
358 if (ethernet.getEtherType() == Ethernet.TYPE_ARP) { 401 if (ethernet.getEtherType() == Ethernet.TYPE_ARP) {
359 arpHandler.processPacketIn(pkt); 402 arpHandler.processPacketIn(pkt);
360 - } else if (ethernet.getEtherType() == Ethernet.TYPE_IPV4) {
361 - IPv4 ipPacket = (IPv4) ethernet.getPayload();
362 -
363 - if (ipPacket.getProtocol() == IPv4.PROTOCOL_UDP) {
364 - UDP udpPacket = (UDP) ipPacket.getPayload();
365 - if (udpPacket.getDestinationPort() == DHCP_PORT) {
366 - dhcpHandler.processPacketIn(pkt);
367 - }
368 - }
369 } 403 }
370 } 404 }
371 } 405 }
......
...@@ -87,7 +87,6 @@ public class OpenstackSwitchingRulePopulator { ...@@ -87,7 +87,6 @@ public class OpenstackSwitchingRulePopulator {
87 */ 87 */
88 public void populateDefaultRules(DeviceId id) { 88 public void populateDefaultRules(DeviceId id) {
89 89
90 - //setFlowRuleForDHCP(id);
91 setFlowRuleForArp(id); 90 setFlowRuleForArp(id);
92 91
93 log.warn("Default rule has been set"); 92 log.warn("Default rule has been set");
......
...@@ -46,4 +46,10 @@ public interface OpenstackSwitchingService { ...@@ -46,4 +46,10 @@ public interface OpenstackSwitchingService {
46 */ 46 */
47 void createNetwork(OpenstackNetwork openstackNetwork); 47 void createNetwork(OpenstackNetwork openstackNetwork);
48 48
49 + /**
50 + * Store the subnet information created by openstack.
51 + *
52 + * @param openstackSubnet subnet information
53 + */
54 + void createSubnet(OpenstackSubnet openstackSubnet);
49 } 55 }
......
...@@ -54,6 +54,8 @@ public class OpenstackNetworkCodec extends JsonCodec<OpenstackNetwork> { ...@@ -54,6 +54,8 @@ public class OpenstackNetworkCodec extends JsonCodec<OpenstackNetwork> {
54 .id(id); 54 .id(id);
55 55
56 if (!networkInfo.path(NETWORK_TYPE).isMissingNode()) { 56 if (!networkInfo.path(NETWORK_TYPE).isMissingNode()) {
57 + onb.networkType(OpenstackNetwork.NetworkType.valueOf(networkInfo.path(NETWORK_TYPE).
58 + asText().toUpperCase()));
57 onb.name(networkInfo.path(NETWORK_TYPE).asText()); 59 onb.name(networkInfo.path(NETWORK_TYPE).asText());
58 onb.segmentId(networkInfo.path(SEGMENTATION_ID).asText()); 60 onb.segmentId(networkInfo.path(SEGMENTATION_ID).asText());
59 } 61 }
......
1 +/*
2 + * Copyright 2015 Open Networking Laboratory
3 + *
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
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
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.
15 + */
16 +package org.onosproject.openstackswitching.web;
17 +
18 +import com.fasterxml.jackson.databind.JsonNode;
19 +
20 +
21 +import com.fasterxml.jackson.databind.node.ObjectNode;
22 +import org.onosproject.codec.CodecContext;
23 +import org.onosproject.codec.JsonCodec;
24 +import org.onosproject.openstackswitching.OpenstackSubnet;
25 +import org.slf4j.Logger;
26 +import org.slf4j.LoggerFactory;
27 +
28 +/**
29 + * It encodes and decodes the OpenstackSubnet.
30 + */
31 +
32 +public class OpenstackSubnetCodec extends JsonCodec<OpenstackSubnet> {
33 + private static Logger log = LoggerFactory
34 + .getLogger(OpenstackSubnetCodec.class);
35 +
36 + // JSON Field names
37 + private static final String SUBNET = "subnet";
38 + private static final String NAME = "name";
39 + private static final String ENABLE_DHCP = "enable_dhcp";
40 + private static final String NETWORK_ID = "network_id";
41 + private static final String TENANT_ID = "tenant_id";
42 + private static final String DNS_NAMESERVERS = "dns_nameservers";
43 + private static final String GATEWAY_IP = "gateway_ip";
44 + private static final String CIDR = "cidr";
45 + private static final String ID = "id";
46 +
47 + @Override
48 + public OpenstackSubnet decode(ObjectNode json, CodecContext context) {
49 + JsonNode subnetInfo = json.get(SUBNET);
50 +
51 + String name = subnetInfo.path(NAME).asText();
52 + boolean enableDhcp = subnetInfo.path(ENABLE_DHCP).asBoolean();
53 + String networkId = subnetInfo.path(NETWORK_ID).asText();
54 + String tenantId = subnetInfo.path(TENANT_ID).asText();
55 + String dnsNameservsers = subnetInfo.path(DNS_NAMESERVERS).asText();
56 + String gatewayIp = subnetInfo.path(GATEWAY_IP).asText();
57 + String cidr = subnetInfo.path(CIDR).asText();
58 + String id = subnetInfo.path(ID).asText();
59 +
60 + OpenstackSubnet openstackSubnet = OpenstackSubnet.builder()
61 + .setName(name)
62 + .setEnableDhcp(enableDhcp)
63 + .setNetworkId(networkId)
64 + .setTenantId(tenantId)
65 + .setDnsNameservers(dnsNameservsers)
66 + .setGatewayIp(gatewayIp)
67 + .setCidr(cidr)
68 + .setId(id)
69 + .build();
70 + return openstackSubnet;
71 + }
72 +}
1 +/*
2 + * Copyright 2015 Open Networking Laboratory
3 + *
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
7 + *
8 + * http://www.apache.org/licenses/LICENSE-2.0
9 + *
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.
15 + */
16 +package org.onosproject.openstackswitching.web;
17 +
18 +
19 +import com.fasterxml.jackson.databind.ObjectMapper;
20 +import com.fasterxml.jackson.databind.node.ObjectNode;
21 +import org.onosproject.openstackswitching.OpenstackSubnet;
22 +import org.onosproject.openstackswitching.OpenstackSwitchingService;
23 +import org.onosproject.rest.AbstractWebResource;
24 +import org.slf4j.Logger;
25 +import org.slf4j.LoggerFactory;
26 +
27 +import javax.ws.rs.Consumes;
28 +import javax.ws.rs.POST;
29 +import javax.ws.rs.Path;
30 +import javax.ws.rs.Produces;
31 +import javax.ws.rs.core.MediaType;
32 +import javax.ws.rs.core.Response;
33 +import java.io.InputStream;
34 +
35 +@Path("subnets")
36 +public class OpenstackSubnetWebResource extends AbstractWebResource {
37 + protected static final Logger log = LoggerFactory
38 + .getLogger(OpenstackSubnetWebResource.class);
39 +
40 + private static final OpenstackSubnetCodec SUBNET_CODEC = new OpenstackSubnetCodec();
41 +
42 + @POST
43 + @Consumes(MediaType.APPLICATION_JSON)
44 + @Produces(MediaType.APPLICATION_JSON)
45 + public Response createSubnet(InputStream input) {
46 + try {
47 + ObjectMapper mapper = new ObjectMapper();
48 + ObjectNode subnetNode = (ObjectNode) mapper.readTree(input);
49 +
50 + OpenstackSubnet openstackSubnet = SUBNET_CODEC.decode(subnetNode, this);
51 +
52 + OpenstackSwitchingService switchingService = get(OpenstackSwitchingService.class);
53 + switchingService.createSubnet(openstackSubnet);
54 + log.info("REST API subnets is called with {}", subnetNode.toString());
55 + return Response.status(Response.Status.OK).build();
56 + } catch (Exception e) {
57 + log.error("Creates VirtualSubnet failed because of exception {}",
58 + e.toString());
59 + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e.toString())
60 + .build();
61 + }
62 + }
63 +
64 +}
...@@ -31,7 +31,8 @@ ...@@ -31,7 +31,8 @@
31 <param-name>com.sun.jersey.config.property.classnames</param-name> 31 <param-name>com.sun.jersey.config.property.classnames</param-name>
32 <param-value> 32 <param-value>
33 org.onosproject.openstackswitching.web.OpenstackPortWebResource, 33 org.onosproject.openstackswitching.web.OpenstackPortWebResource,
34 - org.onosproject.openstackswitching.web.OpenstackNetworkWebResource 34 + org.onosproject.openstackswitching.web.OpenstackNetworkWebResource,
35 + org.onosproject.openstackswitching.web.OpenstackSubnetWebResource
35 </param-value> 36 </param-value>
36 </init-param> 37 </init-param>
37 <load-on-startup>1</load-on-startup> 38 <load-on-startup>1</load-on-startup>
......