Refactoring of OpenstackSwitching and OpenstackRouting
Change-Id: Ib7caea98006274dcdfebfe27c07e3533730ab23e
diff --git a/apps/cordvtn/pom.xml b/apps/cordvtn/pom.xml
index bb0895a..560bdc0 100644
--- a/apps/cordvtn/pom.xml
+++ b/apps/cordvtn/pom.xml
@@ -103,7 +103,7 @@
</dependency>
<dependency>
<groupId>org.onosproject</groupId>
- <artifactId>onos-app-openstackswitching-api</artifactId>
+ <artifactId>onos-app-openstacknetworking-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
diff --git a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordService.java b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordService.java
index 97651b7..d661966 100644
--- a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordService.java
+++ b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordService.java
@@ -19,8 +19,8 @@
import org.onlab.packet.IpAddress;
import org.onlab.packet.IpPrefix;
import org.onosproject.net.Host;
-import org.onosproject.openstackswitching.OpenstackNetwork;
-import org.onosproject.openstackswitching.OpenstackSubnet;
+import org.onosproject.openstacknetworking.OpenstackNetwork;
+import org.onosproject.openstacknetworking.OpenstackSubnet;
import java.util.Map;
import java.util.Objects;
diff --git a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtn.java b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtn.java
index 7503c08..400c6ce 100644
--- a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtn.java
+++ b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtn.java
@@ -62,10 +62,10 @@
import org.onosproject.net.packet.PacketService;
import org.onosproject.net.provider.AbstractProvider;
import org.onosproject.net.provider.ProviderId;
-import org.onosproject.openstackswitching.OpenstackNetwork;
-import org.onosproject.openstackswitching.OpenstackPort;
-import org.onosproject.openstackswitching.OpenstackSubnet;
-import org.onosproject.openstackswitching.OpenstackSwitchingService;
+import org.onosproject.openstacknetworking.OpenstackNetworkingService;
+import org.onosproject.openstacknetworking.OpenstackNetwork;
+import org.onosproject.openstacknetworking.OpenstackPort;
+import org.onosproject.openstacknetworking.OpenstackSubnet;
import org.slf4j.Logger;
import java.util.List;
@@ -123,7 +123,7 @@
protected GroupService groupService;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
- protected OpenstackSwitchingService openstackService;
+ protected OpenstackNetworkingService openstackService;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected DhcpService dhcpService;
diff --git a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtnRuleInstaller.java b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtnRuleInstaller.java
index afd6b2c..f6c23b4 100644
--- a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtnRuleInstaller.java
+++ b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtnRuleInstaller.java
@@ -71,8 +71,8 @@
import org.onosproject.net.group.GroupDescription;
import org.onosproject.net.group.GroupKey;
import org.onosproject.net.group.GroupService;
-import org.onosproject.openstackswitching.OpenstackNetwork;
-import org.onosproject.openstackswitching.OpenstackSubnet;
+import org.onosproject.openstacknetworking.OpenstackNetwork;
+import org.onosproject.openstacknetworking.OpenstackSubnet;
import org.slf4j.Logger;
import java.util.ArrayList;
diff --git a/apps/openstackswitching/api/pom.xml b/apps/openstacknetworking/api/pom.xml
similarity index 79%
rename from apps/openstackswitching/api/pom.xml
rename to apps/openstacknetworking/api/pom.xml
index 2fdab70..b4ad7c1 100644
--- a/apps/openstackswitching/api/pom.xml
+++ b/apps/openstacknetworking/api/pom.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- ~ Copyright 2015 Open Networking Laboratory
+ ~ Copyright 2016 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.
@@ -16,35 +16,34 @@
-->
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.onosproject</groupId>
- <artifactId>onos-openstackswitching</artifactId>
+ <artifactId>onos-app-openstacknetworking</artifactId>
<version>1.5.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
- <artifactId>onos-app-openstackswitching-api</artifactId>
+ <artifactId>onos-app-openstacknetworking-api</artifactId>
<packaging>bundle</packaging>
- <description>SONA Openstack Switching application API</description>
-
<dependencies>
<dependency>
- <groupId>org.onosproject</groupId>
- <artifactId>onos-api</artifactId>
- <version>${project.version}</version>
- </dependency>
- <dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.compendium</artifactId>
</dependency>
<dependency>
- <groupId>org.osgi</groupId>
- <artifactId>org.osgi.core</artifactId>
+ <groupId>org.onosproject</groupId>
+ <artifactId>onos-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.onosproject</groupId>
+ <artifactId>onos-core-serializers</artifactId>
+ <version>${project.version}</version>
</dependency>
</dependencies>
</project>
+
diff --git a/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackExternalGateway.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackExternalGateway.java
new file mode 100644
index 0000000..8f1e741
--- /dev/null
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackExternalGateway.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright 2016 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.openstacknetworking;
+
+import com.google.common.collect.Maps;
+import org.onlab.packet.Ip4Address;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * A configurable external gateway modes extension model in openstack router.
+ */
+public final class OpenstackExternalGateway {
+
+ private final String networkId;
+ private final boolean enablePnat;
+ private final Map<String, Ip4Address> externalFixedIps;
+
+ private OpenstackExternalGateway(String networkId, boolean enablePnat,
+ Map<String, Ip4Address> externalFixedIps) {
+ this.networkId = networkId;
+ this.enablePnat = enablePnat;
+ this.externalFixedIps = externalFixedIps;
+ }
+
+ /**
+ * Returns network ID.
+ *
+ * @return Network ID
+ */
+ public String networkId() {
+ return networkId;
+ }
+
+ /**
+ * Returns the PNAT status for external gateway.
+ *
+ * @return PNAT status
+ */
+ public boolean isEnablePnat() {
+ return enablePnat;
+ }
+
+ /**
+ * Returns external fixed IP informations.
+ *
+ * @return External fixed IP informations
+ */
+ public Map<String, Ip4Address> externalFixedIps() {
+ return externalFixedIps;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+
+ if (o instanceof OpenstackExternalGateway) {
+ OpenstackExternalGateway that = (OpenstackExternalGateway) o;
+
+ return this.networkId.equals(that.networkId) &&
+ this.enablePnat == that.enablePnat &&
+ this.externalFixedIps.equals(that.externalFixedIps);
+ }
+
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(networkId, enablePnat, externalFixedIps);
+ }
+
+ /**
+ * An Openstack External Gateway Builder class.
+ */
+ public static final class Builder {
+ private String networkId;
+ private boolean enablePnat;
+ private Map<String, Ip4Address> externalFixedIps;
+
+ public Builder() {
+ externalFixedIps = Maps.newHashMap();
+ }
+
+ /**
+ * Sets network ID.
+ *
+ * @param networkId Network ID
+ * @return Builder object
+ */
+ public Builder networkId(String networkId) {
+ this.networkId = networkId;
+ return this;
+ }
+
+ /**
+ * Sets whether PNAT status is enabled or not.
+ *
+ * @param enablePnat true if PNAT status is enabled, false otherwise
+ * @return Builder object
+ */
+ public Builder enablePnat(boolean enablePnat) {
+ this.enablePnat = enablePnat;
+ return this;
+ }
+
+ /**
+ * Sets external fixed IP address information.
+ *
+ * @param externalFixedIps External fixed IP information
+ * @return Builder object
+ */
+
+ public Builder externalFixedIps(Map<String, Ip4Address> externalFixedIps) {
+ this.externalFixedIps.putAll(externalFixedIps);
+ return this;
+ }
+
+ /**
+ * Builds an OpenstackExternalGateway object.
+ *
+ * @return OpenstackExternalGateway object
+ */
+ public OpenstackExternalGateway build() {
+ return new OpenstackExternalGateway(networkId, enablePnat, externalFixedIps);
+ }
+ }
+
+}
diff --git a/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackFloatingIP.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackFloatingIP.java
new file mode 100644
index 0000000..bed0289
--- /dev/null
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackFloatingIP.java
@@ -0,0 +1,266 @@
+/*
+ * Copyright 2016 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.openstacknetworking;
+
+import org.onlab.packet.Ip4Address;
+
+import java.util.Objects;
+
+/**
+ * An Openstack Neutron Floating IP Model.
+ */
+public final class OpenstackFloatingIP {
+
+ public enum FloatingIPStatus {
+ UP,
+ DOWN,
+ ACTIVE,
+ }
+
+ private final String tenantId;
+ private final String networkId;
+ private final Ip4Address fixedIpAddress;
+ private final String portId;
+ private final String routerId;
+ private final String id;
+ private final Ip4Address floatingIpAddress;
+ private final FloatingIPStatus status;
+
+ private OpenstackFloatingIP(FloatingIPStatus status, String id, String tenantId,
+ String networkId, Ip4Address fixedIpAddress, String portId,
+ String routerId, Ip4Address floatingIpAddress) {
+ this.status = status;
+ this.id = id;
+ this.tenantId = tenantId;
+ this.networkId = networkId;
+ this.fixedIpAddress = fixedIpAddress;
+ this.portId = portId;
+ this.routerId = routerId;
+ this.floatingIpAddress = floatingIpAddress;
+ }
+
+ /**
+ * Returns floating IP status.
+ *
+ * @return floating IP status
+ */
+ public FloatingIPStatus status() {
+ return status;
+ }
+
+ /**
+ * Returns floating IP`s ID.
+ *
+ * @return floating IP`s ID
+ */
+ public String id() {
+ return id;
+ }
+
+ /**
+ * Returns tenant ID.
+ *
+ * @return tenant ID
+ */
+ public String tenantId() {
+ return tenantId;
+ }
+
+ /**
+ * Returns network ID.
+ *
+ * @return network ID
+ */
+ public String networkId() {
+ return networkId;
+ }
+
+ /**
+ * Returns fixed IP Address.
+ *
+ * @return fixed IP Address
+ */
+ public Ip4Address fixedIpAddress() {
+ return fixedIpAddress;
+ }
+
+ /**
+ * Returns port ID.
+ *
+ * @return port ID
+ */
+ public String portId() {
+ return portId;
+ }
+
+ /**
+ * Returns router ID.
+ *
+ * @return router ID
+ */
+ public String routerId() {
+ return routerId;
+ }
+
+ /**
+ * Returns floating IP address.
+ *
+ * @return Floating IP address
+ */
+ public Ip4Address floatingIpAddress() {
+ return floatingIpAddress;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+
+ if (o instanceof OpenstackFloatingIP) {
+ OpenstackFloatingIP that = (OpenstackFloatingIP) o;
+
+ return this.status.equals(that.status) &&
+ this.id.equals(that.id) &&
+ this.tenantId.equals(that.tenantId) &&
+ this.networkId.equals(that.networkId) &&
+ this.fixedIpAddress.equals(that.fixedIpAddress) &&
+ this.floatingIpAddress.equals(that.floatingIpAddress) &&
+ this.portId.equals(that.portId) &&
+ this.routerId.equals(that.routerId);
+ }
+
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(status, id, tenantId, networkId, floatingIpAddress, fixedIpAddress, portId, routerId);
+ }
+
+ /**
+ * An Openstack Floating IP Builder class.
+ */
+ public static final class Builder {
+ private String tenantId;
+ private String networkId;
+ private Ip4Address fixedIpAddress;
+ private String portId;
+ private String routerId;
+ private String id;
+ private Ip4Address floatingIpAddress;
+ private FloatingIPStatus status;
+
+ /**
+ * Sets tenant ID.
+ *
+ * @param tenantId tenant ID
+ * @return Builder object
+ */
+ public Builder tenantId(String tenantId) {
+ this.tenantId = tenantId;
+ return this;
+ }
+
+ /**
+ * Sets floating IP status.
+ *
+ * @param status Floating IP status
+ * @return Builder object
+ */
+ public Builder status(FloatingIPStatus status) {
+ this.status = status;
+ return this;
+ }
+
+ /**
+ * Sets Floating IP`s ID.
+ *
+ * @param id Floating IP`s ID
+ * @return Builder object
+ */
+ public Builder id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Sets network ID.
+ *
+ * @param networkId Network ID
+ * @return Builder object
+ */
+ public Builder networkId(String networkId) {
+ this.networkId = networkId;
+ return this;
+ }
+
+ /**
+ * Sets fixed IP address.
+ *
+ * @param fixedIpAddress Fixed IP address
+ * @return Builder object
+ */
+ public Builder fixedIpAddress(Ip4Address fixedIpAddress) {
+ this.fixedIpAddress = fixedIpAddress;
+ return this;
+ }
+
+ /**
+ * Sets port ID.
+ *
+ * @param portId port ID
+ * @return Builder object
+ */
+ public Builder portId(String portId) {
+ this.portId = portId;
+ return this;
+ }
+
+ /**
+ * Sets router ID.
+ *
+ * @param routerId router ID
+ * @return Builder object
+ */
+ public Builder routerId(String routerId) {
+ this.routerId = routerId;
+ return this;
+ }
+
+ /**
+ * Sets floating IP address.
+ *
+ * @param floatingIpAddress Floating IP address
+ * @return Builder object
+ */
+ public Builder floatingIpAddress(Ip4Address floatingIpAddress) {
+ this.floatingIpAddress = floatingIpAddress;
+ return this;
+ }
+
+ /**
+ * Builds an OpenstackFloatingIP object.
+ *
+ * @return OpenstackFloatingIP object
+ */
+ public OpenstackFloatingIP build() {
+ return new OpenstackFloatingIP(status, id, tenantId, networkId,
+ fixedIpAddress, portId, routerId, floatingIpAddress);
+
+ }
+ }
+}
diff --git a/apps/openstackswitching/api/src/main/java/org/onosproject/openstackswitching/OpenstackNetwork.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackNetwork.java
similarity index 98%
rename from apps/openstackswitching/api/src/main/java/org/onosproject/openstackswitching/OpenstackNetwork.java
rename to apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackNetwork.java
index c760146..23a0674 100644
--- a/apps/openstackswitching/api/src/main/java/org/onosproject/openstackswitching/OpenstackNetwork.java
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackNetwork.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.onosproject.openstackswitching;
+package org.onosproject.openstacknetworking;
import java.util.Collection;
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackSwitchingConfig.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackNetworkingConfig.java
similarity index 96%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackSwitchingConfig.java
rename to apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackNetworkingConfig.java
index 11eff61..37e9c06 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackSwitchingConfig.java
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackNetworkingConfig.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.onosproject.openstackswitching.impl;
+package org.onosproject.openstacknetworking;
import org.onosproject.core.ApplicationId;
import org.onosproject.net.config.Config;
@@ -22,7 +22,7 @@
/**
* Handles configuration for OpenstackSwitching app.
*/
-public class OpenstackSwitchingConfig extends Config<ApplicationId> {
+public class OpenstackNetworkingConfig extends Config<ApplicationId> {
public static final String DONOTPUSH = "do_not_push_flows";
public static final String NEUTRON_SERVER = "neutron_server";
public static final String KEYSTONE_SERVER = "keystone_server";
diff --git a/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackNetworkingService.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackNetworkingService.java
new file mode 100644
index 0000000..6bd6bf8
--- /dev/null
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackNetworkingService.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright 2015-2016 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.openstacknetworking;
+
+import org.onosproject.net.Port;
+
+import java.util.Collection;
+import java.util.Map;
+
+/**
+ * Handles port management REST API from Openstack for VMs.
+ */
+public interface OpenstackNetworkingService {
+
+ /**
+ * Returns port information list for the network ID given.
+ *
+ * @param networkId Network ID of the ports
+ * @return port information list
+ */
+ Collection<OpenstackPort> ports(String networkId);
+
+ /**
+ * Returns port information list.
+ *
+ * @return port information list
+ */
+ Collection<OpenstackPort> ports();
+ /**
+ * Returns port information for the port given.
+ *
+ * @param port port reference
+ * @return port information
+ */
+ OpenstackPort port(Port port);
+
+ /**
+ * Returns port information for the port ID given.
+ *
+ * @param portId Port ID
+ * @return port information
+ */
+ OpenstackPort port(String portId);
+
+ /**
+ * Returns network information list for the network ID given.
+ *
+ * @param networkId Network ID
+ * @return network information, or null if not present
+ */
+ OpenstackNetwork network(String networkId);
+
+ /**
+ * Returns the information of all openstack networks.
+ *
+ * @return collection of network information
+ */
+ Collection<OpenstackNetwork> networks();
+
+ /**
+ * Returns subnet information for the subnet ID give.
+ *
+ * @param subnetId Subnet ID
+ * @return subnet information, or null if not present
+ */
+ OpenstackSubnet subnet(String subnetId);
+
+ /**
+ * Returns collection of openstack subnet information.
+ *
+ * @return collection of openststack subnet information
+ */
+ Collection<OpenstackSubnet> subnets();
+
+ /**
+ * Returns the router information list.
+ *
+ * @return router information list
+ */
+ Collection<OpenstackRouter> routers();
+
+ /**
+ * Returns the router information for the router ID given.
+ *
+ * @param routerId router ID
+ * @return router information
+ */
+ OpenstackRouter router(String routerId);
+
+ /**
+ * Retruns OpenstackPortInfo map.
+ *
+ * @return OpenstackPortInfo map
+ */
+ Map<String, OpenstackPortInfo> openstackPortInfo();
+
+ /**
+ * Sets configurations specified by net-config.xml file.
+ *
+ * @param neutronUrl neutron server url
+ * @param keystoneUrl keystone server url
+ * @param userName horizon user name
+ * @param pass horizon passowrd
+ */
+ void setConfigurations(String neutronUrl, String keystoneUrl, String userName, String pass);
+
+ /**
+ * Returns Security Group information of the security groupd id given.
+ *
+ * @param id security group id
+ * @return security group information
+ */
+ OpenstackSecurityGroup getSecurityGroup(String id);
+
+}
diff --git a/apps/openstackswitching/api/src/main/java/org/onosproject/openstackswitching/OpenstackPort.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackPort.java
similarity index 99%
rename from apps/openstackswitching/api/src/main/java/org/onosproject/openstackswitching/OpenstackPort.java
rename to apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackPort.java
index a7ae7cb..13bcb0e 100644
--- a/apps/openstackswitching/api/src/main/java/org/onosproject/openstackswitching/OpenstackPort.java
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackPort.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.onosproject.openstackswitching;
+package org.onosproject.openstacknetworking;
import com.google.common.collect.Maps;
import org.onlab.packet.Ip4Address;
diff --git a/apps/openstackswitching/api/src/main/java/org/onosproject/openstackswitching/OpenstackPortInfo.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackPortInfo.java
similarity index 98%
rename from apps/openstackswitching/api/src/main/java/org/onosproject/openstackswitching/OpenstackPortInfo.java
rename to apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackPortInfo.java
index 45b6f59..0099ea9 100644
--- a/apps/openstackswitching/api/src/main/java/org/onosproject/openstackswitching/OpenstackPortInfo.java
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackPortInfo.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.onosproject.openstackswitching;
+package org.onosproject.openstacknetworking;
import org.onlab.packet.Ip4Address;
import org.onlab.packet.MacAddress;
diff --git a/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackRouter.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackRouter.java
new file mode 100644
index 0000000..8e513f1
--- /dev/null
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackRouter.java
@@ -0,0 +1,218 @@
+/*
+ * Copyright 2016 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.openstacknetworking;
+
+import java.util.Objects;
+
+/**
+ * An Openstack Neutron Router Model.
+ */
+public final class OpenstackRouter {
+
+ public enum RouterStatus {
+ UP,
+ DOWN,
+ ACTIVE,
+ }
+
+ private final String tenantId;
+ private final String id;
+ private final String name;
+ private final RouterStatus status;
+ private final boolean adminStateUp;
+ private final OpenstackExternalGateway gatewayExternalInfo;
+
+ private OpenstackRouter(String id, String tenantId, String name, RouterStatus status,
+ boolean adminStateUp, OpenstackExternalGateway gatewayExternalInfo) {
+ this.id = id;
+ this.tenantId = tenantId;
+ this.name = name;
+ this.status = status;
+ this.adminStateUp = adminStateUp;
+ this.gatewayExternalInfo = gatewayExternalInfo;
+
+ }
+
+ /**
+ * Returns tenant ID.
+ *
+ * @return tenant ID
+ */
+ public String tenantId() {
+ return tenantId;
+ }
+
+ /**
+ * Returns router ID.
+ *
+ * @return router ID
+ */
+ public String id() {
+ return id;
+ }
+
+ /**
+ * Returns router name.
+ *
+ * @return router name
+ */
+ public String name() {
+ return name;
+ }
+
+ /**
+ * Returns router status.
+ *
+ * @return router stauts
+ */
+ public RouterStatus status() {
+ return status;
+ }
+
+ /**
+ * Returns whether admin state up or not.
+ *
+ * @return true if admin state up, false otherwise
+ */
+ public boolean adminStateUp() {
+ return adminStateUp;
+ }
+
+ /**
+ * Returns external gateway information.
+ *
+ * @return external gateway information
+ */
+ public OpenstackExternalGateway gatewayExternalInfo() {
+ return gatewayExternalInfo;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+
+ if (o instanceof OpenstackRouter) {
+ OpenstackRouter that = (OpenstackRouter) o;
+
+ return this.adminStateUp == that.adminStateUp &&
+ this.gatewayExternalInfo.equals(that.gatewayExternalInfo) &&
+ this.id.equals(that.id) &&
+ this.name.equals(that.name) &&
+ this.status.equals(that.status) &&
+ this.tenantId.equals(that.tenantId);
+ }
+
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(adminStateUp, gatewayExternalInfo, id, name, status, tenantId);
+ }
+
+ /**
+ * An Openstack Router Builder class.
+ */
+ public static final class Builder {
+
+ private String tenantId;
+ private String id;
+ private String name;
+ private RouterStatus status;
+ private Boolean adminStateUp;
+ private OpenstackExternalGateway gatewayExternalInfo;
+
+ /**
+ * Sets router ID.
+ *
+ * @param id router ID
+ * @return Builder object
+ */
+ public Builder id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Sets router name.
+ *
+ * @param name router name
+ * @return Builder object
+ */
+ public Builder name(String name) {
+ this.name = name;
+ return this;
+ }
+
+ /**
+ * Sets router status.
+ *
+ * @param status router status
+ * @return Builder object
+ */
+ public Builder status(RouterStatus status) {
+ this.status = status;
+ return this;
+ }
+
+ /**
+ * Sets tenant ID.
+ *
+ * @param tenantId Tenant ID
+ * @return Builder object
+ */
+ public Builder tenantId(String tenantId) {
+ this.tenantId = tenantId;
+ return this;
+ }
+
+ /**
+ * Sets whether admin state up or not.
+ *
+ * @param adminStateUp true if admin state is up, false otherwise
+ * @return Builder object
+ */
+ public Builder adminStateUp(boolean adminStateUp) {
+ this.adminStateUp = adminStateUp;
+ return this;
+ }
+
+ /**
+ * Sets external gateway information.
+ *
+ * @param gatewayExternalInfo external gateway information
+ * @return Builder object
+ */
+ public Builder gatewayExternalInfo(OpenstackExternalGateway gatewayExternalInfo) {
+ this.gatewayExternalInfo = gatewayExternalInfo;
+ return this;
+ }
+
+ /**
+ * Builds an OpenstackRouter object.
+ *
+ * @return OpenstasckRouter object
+ */
+ public OpenstackRouter build() {
+ return new OpenstackRouter(id, tenantId, name, status,
+ adminStateUp, gatewayExternalInfo);
+ }
+ }
+
+
+}
diff --git a/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackRouterInterface.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackRouterInterface.java
new file mode 100644
index 0000000..972e6c5
--- /dev/null
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackRouterInterface.java
@@ -0,0 +1,162 @@
+/*
+ * Copyright 2016 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.openstacknetworking;
+
+import java.util.Objects;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * An Openstack Neutron Router Interface Model.
+ */
+public final class OpenstackRouterInterface {
+ private final String id;
+ private final String tenantId;
+ private final String subnetId;
+ private final String portId;
+
+ private OpenstackRouterInterface(String id, String tenantId,
+ String subnetId, String portId) {
+ this.id = checkNotNull(id);
+ this.tenantId = checkNotNull(tenantId);
+ this.subnetId = checkNotNull(subnetId);
+ this.portId = checkNotNull(portId);
+ }
+
+ /**
+ * Returns Router Interface ID.
+ *
+ * @return router interface ID
+ */
+ public String id() {
+ return id;
+ }
+
+ /**
+ * Returns tenant ID.
+ *
+ * @return tenant ID
+ */
+ public String tenantId() {
+ return tenantId;
+ }
+
+ /**
+ * Returns subnet ID.
+ *
+ * @return subnet ID
+ */
+ public String subnetId() {
+ return subnetId;
+ }
+
+ /**
+ * Returns port ID.
+ *
+ * @return port ID
+ */
+ public String portId() {
+ return portId;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+
+ if (o instanceof OpenstackRouterInterface) {
+ OpenstackRouterInterface that = (OpenstackRouterInterface) o;
+
+ return this.id.equals(that.id) &&
+ this.portId.equals(that.portId) &&
+ this.subnetId.equals(that.subnetId) &&
+ this.tenantId.equals(that.tenantId);
+ }
+
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, portId, subnetId, tenantId);
+ }
+
+ /**
+ * An Openstack Router Interface Builder class.
+ */
+ public static final class Builder {
+ private String id;
+ private String tenantId;
+ private String subnetId;
+ private String portId;
+
+ /**
+ * Sets Router Interface ID.
+ *
+ * @param id router interface ID
+ * @return Builder object
+ */
+ public Builder id(String id) {
+ this.id = id;
+ return this;
+ }
+
+ /**
+ * Sets tenant ID.
+ *
+ * @param tenantId tenant ID
+ * @return Builder object
+ */
+ public Builder tenantId(String tenantId) {
+ this.tenantId = tenantId;
+ return this;
+ }
+
+ /**
+ * Sets subnet ID.
+ *
+ * @param subnetId subnet ID
+ * @return Builder object
+ */
+ public Builder subnetId(String subnetId) {
+ this.subnetId = subnetId;
+ return this;
+ }
+
+ /**
+ * Sets port ID.
+ *
+ * @param portId port ID
+ * @return Builder object
+ */
+ public Builder portId(String portId) {
+ this.portId = portId;
+ return this;
+ }
+
+
+ /**
+ * Builds an Openstack Router Interface object.
+ *
+ * @return OpenstackRouterInterface object
+ */
+ public OpenstackRouterInterface build() {
+ return new OpenstackRouterInterface(id, tenantId, subnetId, portId);
+ }
+
+ }
+}
diff --git a/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackRoutingService.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackRoutingService.java
new file mode 100644
index 0000000..101059a
--- /dev/null
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackRoutingService.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2016 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.openstacknetworking;
+
+/**
+ * The Interface of Openstack Routing.
+ */
+public interface OpenstackRoutingService {
+
+ /**
+ * Stores the Floating IP information created by Openstack.
+ *
+ * @param openstackFloatingIP Floating IP information
+ */
+ void createFloatingIP(OpenstackFloatingIP openstackFloatingIP);
+
+ /**
+ * Updates flow rules corresponding to the Floating IP information updated by Openstack.
+ *
+ * @param openstackFloatingIP Floating IP information
+ */
+ void updateFloatingIP(OpenstackFloatingIP openstackFloatingIP);
+
+ /**
+ * Removes flow rules corresponding to Floating IP information removed by Openstack.
+ *
+ * @param id Deleted Floating IP`s ID
+ */
+ void deleteFloatingIP(String id);
+
+ /**
+ * Stores the router information created by Openstack.
+ *
+ * @param openstackRouter Floating IP information
+ */
+ void createRouter(OpenstackRouter openstackRouter);
+
+ /**
+ * Updates flow rules corresponding to the router information updated by Openstack.
+ *
+ * @param openstackRouter Router information
+ */
+ void updateRouter(OpenstackRouter openstackRouter);
+
+ /**
+ * Removes flow rules corresponding to the router information removed by Openstack.
+ *
+ * @param id Deleted router`s ID
+ */
+ void deleteRouter(String id);
+
+ /**
+ * Updates flow rules corresponding to the router information updated by Openstack.
+ *
+ * @param openstackRouterInterface Router information
+ */
+ void updateRouterInterface(OpenstackRouterInterface openstackRouterInterface);
+
+ /**
+ * Removes flow rules corresponding to the router information removed by Openstack.
+ *
+ * @param openstackRouterInterface Router information
+ */
+ void removeRouterInterface(OpenstackRouterInterface openstackRouterInterface);
+
+
+}
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackSecurityGroup.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackSecurityGroup.java
similarity index 98%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackSecurityGroup.java
rename to apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackSecurityGroup.java
index 756989f..358b92b 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackSecurityGroup.java
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackSecurityGroup.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.onosproject.openstackswitching.impl;
+package org.onosproject.openstacknetworking;
import java.util.Collection;
import java.util.Collections;
@@ -112,7 +112,7 @@
this.rules.containsAll(that.rules);
}
- return true;
+ return false;
}
@Override
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackSecurityGroupRule.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackSecurityGroupRule.java
similarity index 78%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackSecurityGroupRule.java
rename to apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackSecurityGroupRule.java
index 8a738e6..8b9da8f 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackSecurityGroupRule.java
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackSecurityGroupRule.java
@@ -13,23 +13,27 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.onosproject.openstackswitching.impl;
+package org.onosproject.openstacknetworking;
+
+import java.util.Objects;
+
+import static com.google.common.base.Preconditions.checkNotNull;
/**
* Represents Openstack Security Group Rules.
*/
public final class OpenstackSecurityGroupRule {
- private String direction;
- private String ethertype;
- private String id;
- private String portRangeMax;
- private String portRangeMin;
- private String protocol;
- private String remoteGroupId;
- private String remoteIpPrefix;
- private String secuityGroupId;
- private String tenantId;
+ private final String direction;
+ private final String ethertype;
+ private final String id;
+ private final String portRangeMax;
+ private final String portRangeMin;
+ private final String protocol;
+ private final String remoteGroupId;
+ private final String remoteIpPrefix;
+ private final String secuityGroupId;
+ private final String tenantId;
private OpenstackSecurityGroupRule(String direction,
String ethertype,
@@ -43,7 +47,7 @@
String tenantId) {
this.direction = direction;
this.ethertype = ethertype;
- this.id = id;
+ this.id = checkNotNull(id);
this.portRangeMax = portRangeMax;
this.portRangeMin = portRangeMin;
this.protocol = protocol;
@@ -53,15 +57,6 @@
this.tenantId = tenantId;
}
- /**
- * Returns the builder object for the OpenstackSecurityGroupRule.
- *
- * @return OpenstackSecurityGroupRule builder object
- */
- public static OpenstackSecurityGroupRule.Builder builder() {
- return new Builder();
- }
-
@Override
public String toString() {
return new StringBuilder(" [")
@@ -78,6 +73,35 @@
.toString();
}
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+
+ if (this instanceof OpenstackSecurityGroupRule) {
+ OpenstackSecurityGroupRule that = (OpenstackSecurityGroupRule) o;
+ return this.direction.equals(that.direction) &&
+ this.ethertype.equals(that.direction) &&
+ this.id.equals(that.id) &&
+ this.portRangeMax.equals(that.portRangeMax) &&
+ this.portRangeMin.equals(that.portRangeMin) &&
+ this.protocol.equals(that.protocol) &&
+ this.remoteGroupId.equals(that.remoteGroupId) &&
+ this.secuityGroupId.equals(that.secuityGroupId) &&
+ this.remoteIpPrefix.equals(that.remoteIpPrefix) &&
+ this.tenantId.equals(that.tenantId);
+ }
+
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(direction, ethertype, id, portRangeMax, portRangeMin, protocol,
+ remoteGroupId, remoteIpPrefix, secuityGroupId, tenantId);
+ }
+
/**
* Represents a security group rule builder object.
*/
diff --git a/apps/openstackswitching/api/src/main/java/org/onosproject/openstackswitching/OpenstackSubnet.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackSubnet.java
similarity index 98%
rename from apps/openstackswitching/api/src/main/java/org/onosproject/openstackswitching/OpenstackSubnet.java
rename to apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackSubnet.java
index f832768..8223711 100644
--- a/apps/openstackswitching/api/src/main/java/org/onosproject/openstackswitching/OpenstackSubnet.java
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackSubnet.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.onosproject.openstackswitching;
+package org.onosproject.openstacknetworking;
import org.onlab.packet.Ip4Address;
diff --git a/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackSwitchingService.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackSwitchingService.java
new file mode 100644
index 0000000..9f70a00
--- /dev/null
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/OpenstackSwitchingService.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2015-2016 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.openstacknetworking;
+
+import java.util.Map;
+
+/**
+ * Handles port management REST API from Openstack for VMs.
+ */
+public interface OpenstackSwitchingService {
+
+ /**
+ * Store the port information created by Openstack.
+ *
+ * @param openstackPort port information
+ */
+ void createPorts(OpenstackPort openstackPort);
+
+ /**
+ * Removes flow rules corresponding to the port removed by Openstack.
+ *
+ * @param uuid UUID
+ */
+ void removePort(String uuid);
+
+ /**
+ * Updates flow rules corresponding to the port information updated by Openstack.
+ *
+ * @param openstackPort OpenStack port
+ */
+ void updatePort(OpenstackPort openstackPort);
+
+ /**
+ * Stores the network information created by openstack.
+ *
+ * @param openstackNetwork network information
+ */
+ void createNetwork(OpenstackNetwork openstackNetwork);
+
+ /**
+ * Stores the subnet information created by openstack.
+ *
+ * @param openstackSubnet subnet information
+ */
+ void createSubnet(OpenstackSubnet openstackSubnet);
+
+ /**
+ * Retruns OpenstackPortInfo map.
+ *
+ * @return OpenstackPortInfo map
+ */
+ Map<String, OpenstackPortInfo> openstackPortInfo();
+
+}
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/package-info.java b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/package-info.java
similarity index 81%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/package-info.java
rename to apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/package-info.java
index 91e19c6..bf6a8cc 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/package-info.java
+++ b/apps/openstacknetworking/api/src/main/java/org/onosproject/openstacknetworking/package-info.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2015 Open Networking Laboratory
+ * Copyright 2016 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.
@@ -15,6 +15,6 @@
*/
/**
- * OpenStack switching REST API.
+ * Application for OpenstackRouting.
*/
-package org.onosproject.openstackswitching.web;
+package org.onosproject.openstacknetworking;
\ No newline at end of file
diff --git a/apps/openstackswitching/app/app.xml b/apps/openstacknetworking/app/app.xml
similarity index 75%
rename from apps/openstackswitching/app/app.xml
rename to apps/openstacknetworking/app/app.xml
index 2043d94..c016e85 100644
--- a/apps/openstackswitching/app/app.xml
+++ b/apps/openstacknetworking/app/app.xml
@@ -14,12 +14,15 @@
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
-<app name="org.onosproject.openstackswitching" origin="ON.Lab" version="${project.version}"
+<app name="org.onosproject.openstacknetworking" origin="ON.Lab" version="${project.version}"
category="default" url="http://onosproject.org"
featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
features="${project.artifactId}">
<description>${project.description}</description>
+ <artifact>mvn:${project.groupId}/onos-app-openstacknetworking-api/${project.version}</artifact>
+ <artifact>mvn:${project.groupId}/onos-app-openstacknetworking-web/${project.version}</artifact>
<artifact>mvn:${project.groupId}/onos-app-openstackswitching/${project.version}</artifact>
+ <artifact>mvn:${project.groupId}/onos-app-openstackrouting/${project.version}</artifact>
<artifact>mvn:${project.groupId}/onos-app-dhcp-api/${project.version}</artifact>
<artifact>mvn:${project.groupId}/onos-app-dhcp/${project.version}</artifact>
</app>
diff --git a/apps/openstackswitching/app/features.xml b/apps/openstacknetworking/app/features.xml
similarity index 87%
rename from apps/openstackswitching/app/features.xml
rename to apps/openstacknetworking/app/features.xml
index a4e2639..7a69ffd 100644
--- a/apps/openstackswitching/app/features.xml
+++ b/apps/openstacknetworking/app/features.xml
@@ -18,7 +18,8 @@
<feature name="${project.artifactId}" version="${project.version}"
description="${project.description}">
<feature>onos-api</feature>
- <bundle>mvn:${project.groupId}/onos-app-openstackswitching-api/${project.version}</bundle>
+ <bundle>mvn:${project.groupId}/onos-app-openstacknetworking-api/${project.version}</bundle>
+ <bundle>mvn:${project.groupId}/onos-app-openstacknetworking-web/${project.version}</bundle>
<bundle>mvn:${project.groupId}/onos-app-openstackswitching/${project.version}</bundle>
<bundle>mvn:${project.groupId}/onos-app-dhcp-api/${project.version}</bundle>
<bundle>mvn:${project.groupId}/onos-app-dhcp/${project.version}</bundle>
diff --git a/apps/openstacknetworking/app/pom.xml b/apps/openstacknetworking/app/pom.xml
new file mode 100644
index 0000000..acf7e22
--- /dev/null
+++ b/apps/openstacknetworking/app/pom.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright 2016 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.
+ -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.onosproject</groupId>
+ <artifactId>onos-app-openstacknetworking</artifactId>
+ <version>1.5.0-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>onos-app-openstacknetworking-app</artifactId>
+ <packaging>pom</packaging>
+
+ <properties>
+ <onos.app.name>org.onosproject.openstacknetworking</onos.app.name>
+ <onos.app.category>default</onos.app.category>
+ <onos.app.url>http://onosproject.org</onos.app.url>
+ <onos.app.readme>Openstack Networking Application.</onos.app.readme>
+ </properties>
+
+ <description>SONA Openstack Networking main Application</description>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.onosproject</groupId>
+ <artifactId>onos-app-openstackswitching</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.onosproject</groupId>
+ <artifactId>onos-app-openstackrouting</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.onosproject</groupId>
+ <artifactId>onos-app-openstacknetworking-api</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.onosproject</groupId>
+ <artifactId>onos-app-openstacknetworking-web</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ </dependencies>
+</project>
diff --git a/apps/openstacknetworking/network-cfg.json b/apps/openstacknetworking/network-cfg.json
new file mode 100644
index 0000000..170d482
--- /dev/null
+++ b/apps/openstacknetworking/network-cfg.json
@@ -0,0 +1,51 @@
+{
+ "apps" : {
+ "org.onosproject.openstackswitching" : {
+ "openstackswitching" : {
+ "do_not_push_flows" : "false",
+ "neutron_server" : "http://192.168.56.103:9696/v2.0/",
+ "keystone_server" : "http://192.168.56.103:5000/v2.0/",
+ "user_name" : "admin",
+ "password" : "nova",
+ "physicalRouterMac" : "00:00:00:00:00:20",
+ "nodes" : [
+ {
+ "hostname" : "compute-01",
+ "ovsdbIp" : "192.168.56.102",
+ "ovsdbPort" : "6640",
+ "bridgeId" : "of:0000000000000001",
+ "openstackNodeType" : "COMPUTENODE"
+ },
+ {
+ "hostname" : "compute-02",
+ "ovsdbIp" : "192.168.56.101",
+ "ovsdbPort" : "6640",
+ "bridgeId" : "of:0000000000000002",
+ "openstackNodeType" : "COMPUTENODE"
+ },
+ {
+ "hostname" : "network",
+ "ovsdbIp" : "192.168.56.106",
+ "ovsdbPort" : "6640",
+ "bridgeId" : "of:0000000000000003",
+ "openstackNodeType" : "GATEWAYNODE",
+ "externalIfName" : "eth3",
+ "externalIfMacAddress" : "00:00:00:00:00:11"
+ }
+ ]
+ }
+ }
+ },
+ "devices" : {
+ "of:0000000000000001" : {
+ "basic" : {
+ "driver" : "sona"
+ }
+ },
+ "of:0000000000000002" : {
+ "basic" : {
+ "driver" : "sona"
+ }
+ }
+ }
+}
diff --git a/apps/openstackswitching/api/pom.xml b/apps/openstacknetworking/openstackrouting/pom.xml
similarity index 73%
copy from apps/openstackswitching/api/pom.xml
copy to apps/openstacknetworking/openstackrouting/pom.xml
index 2fdab70..54a3a5a 100644
--- a/apps/openstackswitching/api/pom.xml
+++ b/apps/openstacknetworking/openstackrouting/pom.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- ~ Copyright 2015 Open Networking Laboratory
+ ~ Copyright 2016 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.
@@ -16,35 +16,39 @@
-->
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.onosproject</groupId>
- <artifactId>onos-openstackswitching</artifactId>
+ <artifactId>onos-app-openstacknetworking</artifactId>
<version>1.5.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
- <artifactId>onos-app-openstackswitching-api</artifactId>
+ <artifactId>onos-app-openstackrouting</artifactId>
<packaging>bundle</packaging>
- <description>SONA Openstack Switching application API</description>
-
<dependencies>
<dependency>
- <groupId>org.onosproject</groupId>
- <artifactId>onos-api</artifactId>
- <version>${project.version}</version>
- </dependency>
- <dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.compendium</artifactId>
</dependency>
<dependency>
- <groupId>org.osgi</groupId>
- <artifactId>org.osgi.core</artifactId>
+ <groupId>org.onosproject</groupId>
+ <artifactId>onos-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.onosproject</groupId>
+ <artifactId>onos-core-serializers</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.onosproject</groupId>
+ <artifactId>onos-app-openstacknetworking-api</artifactId>
+ <version>${project.version}</version>
</dependency>
</dependencies>
</project>
+
diff --git a/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackFloatingIPHandler.java b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackFloatingIPHandler.java
new file mode 100644
index 0000000..3ef1c88
--- /dev/null
+++ b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackFloatingIPHandler.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2016 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.openstacknetworking.routing;
+
+import org.onosproject.event.AbstractEvent;
+
+/**
+ * Handle FloatingIP Event for Managing Flow Rules In Openstack Nodes.
+ */
+public class OpenstackFloatingIPHandler implements Runnable {
+
+ volatile AbstractEvent event;
+ OpenstackFloatingIPHandler(AbstractEvent event) {
+ this.event = event;
+ }
+
+ @Override
+ public void run() {
+
+ }
+}
diff --git a/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackIcmpHandler.java b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackIcmpHandler.java
new file mode 100644
index 0000000..3cc11f0
--- /dev/null
+++ b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackIcmpHandler.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2016 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.openstacknetworking.routing;
+
+import org.onosproject.net.packet.PacketContext;
+
+/**
+ * Handle ICMP packet processing for Managing Flow Rules In Openstack Nodes.
+ */
+public class OpenstackIcmpHandler implements Runnable {
+
+ volatile PacketContext context;
+ private OpenstackRoutingRulePopulator rulePopulator;
+ OpenstackIcmpHandler(OpenstackRoutingRulePopulator rulePopulator, PacketContext context) {
+ this.context = context;
+ this.rulePopulator = rulePopulator;
+ }
+
+ @Override
+ public void run() {
+ }
+}
\ No newline at end of file
diff --git a/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackPnatHandler.java b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackPnatHandler.java
new file mode 100644
index 0000000..40eed7f
--- /dev/null
+++ b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackPnatHandler.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright 2016 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.openstacknetworking.routing;
+
+import org.onlab.packet.Ethernet;
+import org.onlab.packet.IPv4;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.TCP;
+import org.onlab.packet.UDP;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.flow.DefaultTrafficTreatment;
+import org.onosproject.net.flow.TrafficTreatment;
+import org.onosproject.net.packet.DefaultOutboundPacket;
+import org.onosproject.net.packet.InboundPacket;
+import org.onosproject.net.packet.PacketContext;
+import org.onosproject.net.packet.PacketService;
+import org.onosproject.openstacknetworking.OpenstackPort;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.nio.ByteBuffer;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+
+/**
+ * Handle NAT packet processing for Managing Flow Rules In Openstack Nodes.
+ */
+public class OpenstackPnatHandler implements Runnable {
+
+ volatile PacketContext context;
+ private final Logger log = LoggerFactory.getLogger(getClass());
+
+ protected PacketService packetService;
+
+ private final OpenstackRoutingRulePopulator rulePopulator;
+ private final int portNum;
+ private final OpenstackPort openstackPort;
+
+ OpenstackPnatHandler(OpenstackRoutingRulePopulator rulePopulator, PacketContext context,
+ int portNum, OpenstackPort openstackPort) {
+ this.rulePopulator = checkNotNull(rulePopulator);
+ this.context = checkNotNull(context);
+ this.portNum = checkNotNull(portNum);
+ this.openstackPort = checkNotNull(openstackPort);
+ }
+
+ @Override
+ public void run() {
+ InboundPacket inboundPacket = context.inPacket();
+ Ethernet ethernet = checkNotNull(inboundPacket.parsed());
+
+ //TODO: Considers IPV6
+ if (ethernet.getEtherType() != Ethernet.TYPE_IPV4) {
+ log.warn("Now, we just consider IP version 4");
+ return;
+ }
+
+ packetOut(inboundPacket, portNum);
+
+ rulePopulator.populatePnatFlowRules(inboundPacket, openstackPort, portNum,
+ getExternalInterfaceMacAddress(), getExternalRouterMacAddress());
+ }
+
+ private void packetOut(InboundPacket inboundPacket, int portNum) {
+ Ethernet ethernet = checkNotNull(inboundPacket.parsed());
+ IPv4 iPacket = (IPv4) ethernet.getPayload();
+
+ TrafficTreatment.Builder treatment = DefaultTrafficTreatment.builder();
+
+ switch (iPacket.getProtocol()) {
+ case IPv4.PROTOCOL_TCP:
+ TCP tcpPacket = (TCP) iPacket.getPayload();
+ tcpPacket.setSourcePort(portNum);
+ tcpPacket.resetChecksum();
+ tcpPacket.setParent(iPacket);
+ iPacket.setPayload(tcpPacket);
+ break;
+ case IPv4.PROTOCOL_UDP:
+ UDP udpPacket = (UDP) iPacket.getPayload();
+ udpPacket.setSourcePort(portNum);
+ udpPacket.resetChecksum();
+ udpPacket.setParent(iPacket);
+ iPacket.setPayload(udpPacket);
+ break;
+ default:
+ break;
+ }
+
+ iPacket.resetChecksum();
+ iPacket.setPayload(ethernet);
+ ethernet.setSourceMACAddress(getExternalInterfaceMacAddress())
+ .setDestinationMACAddress(getExternalRouterMacAddress());
+ ethernet.resetChecksum();
+
+ treatment.setOutput(getExternalPort(inboundPacket.receivedFrom().deviceId()));
+
+ packetService.emit(new DefaultOutboundPacket(inboundPacket.receivedFrom().deviceId(),
+ treatment.build(), ByteBuffer.wrap(ethernet.serialize())));
+ }
+
+ private PortNumber getExternalPort(DeviceId deviceId) {
+ // TODO
+ return null;
+ }
+ private MacAddress getExternalInterfaceMacAddress() {
+ // TODO
+ return null;
+ }
+ private MacAddress getExternalRouterMacAddress() {
+ // TODO
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackRoutingManager.java b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackRoutingManager.java
new file mode 100644
index 0000000..2ea5935
--- /dev/null
+++ b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackRoutingManager.java
@@ -0,0 +1,244 @@
+/*
+ * Copyright 2016 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.openstacknetworking.routing;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.Service;
+import org.onlab.packet.Ethernet;
+import org.onlab.packet.IPv4;
+import org.onlab.packet.Ip4Address;
+import org.onlab.packet.MacAddress;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.core.CoreService;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.driver.DriverService;
+import org.onosproject.net.flowobjective.FlowObjectiveService;
+import org.onosproject.net.packet.InboundPacket;
+import org.onosproject.net.packet.PacketContext;
+import org.onosproject.net.packet.PacketProcessor;
+import org.onosproject.net.packet.PacketService;
+import org.onosproject.openstacknetworking.OpenstackFloatingIP;
+import org.onosproject.openstacknetworking.OpenstackNetworkingService;
+import org.onosproject.openstacknetworking.OpenstackPort;
+import org.onosproject.openstacknetworking.OpenstackRouter;
+import org.onosproject.openstacknetworking.OpenstackRouterInterface;
+import org.onosproject.openstacknetworking.OpenstackRoutingService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.stream.Collectors;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onlab.util.Tools.groupedThreads;
+
+@Service
+@Component(immediate = true)
+/**
+ * Populates flow rules about L3 functionality for VMs in Openstack.
+ */
+public class OpenstackRoutingManager implements OpenstackRoutingService {
+ private final Logger log = LoggerFactory
+ .getLogger(getClass());
+
+ @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+ protected CoreService coreService;
+
+ @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+ protected PacketService packetService;
+
+ @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+ protected DeviceService deviceService;
+
+ @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+ protected OpenstackNetworkingService openstackService;
+
+ @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+ protected FlowObjectiveService flowObjectiveService;
+
+ @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+ protected DriverService driverService;
+
+ private ApplicationId appId;
+ private Map<String, OpenstackRouterInterface> routerInterfaceMap = Maps.newHashMap();
+ private Map<Integer, String> portNumMap = initPortNumMap();
+ private static final String APP_ID = "org.onosproject.openstackrouting";
+ private Map<Integer, String> initPortNumMap() {
+ Map<Integer, String> map = Maps.newHashMap();
+ for (int i = 1024; i < 65535; i++) {
+ map.put(i, "");
+ }
+ return map;
+ }
+
+ private InternalPacketProcessor internalPacketProcessor = new InternalPacketProcessor();
+ private ExecutorService l3EventExecutorService =
+ Executors.newSingleThreadExecutor(groupedThreads("onos/openstackrouting", "L3-event"));
+ private ExecutorService icmpEventExecutorService =
+ Executors.newSingleThreadExecutor(groupedThreads("onos/openstackrouting", "icmp-event"));
+
+ @Activate
+ protected void activate() {
+ appId = coreService.registerApplication(APP_ID);
+ packetService.addProcessor(internalPacketProcessor, PacketProcessor.director(1));
+
+ log.info("onos-openstackrouting started");
+ }
+
+ @Deactivate
+ protected void deactivate() {
+ packetService.removeProcessor(internalPacketProcessor);
+ log.info("onos-openstackrouting stopped");
+ }
+
+
+ @Override
+ public void createFloatingIP(OpenstackFloatingIP openstackFloatingIP) {
+
+ }
+
+ @Override
+ public void updateFloatingIP(OpenstackFloatingIP openstackFloatingIP) {
+
+ }
+
+ @Override
+ public void deleteFloatingIP(String id) {
+
+ }
+
+ @Override
+ public void createRouter(OpenstackRouter openstackRouter) {
+ checkExternalConnection(openstackRouter, getOpenstackRouterInterface(openstackRouter));
+ }
+
+ @Override
+ public void updateRouter(OpenstackRouter openstackRouter) {
+ checkExternalConnection(openstackRouter, getOpenstackRouterInterface(openstackRouter));
+ }
+
+ @Override
+ public void deleteRouter(String id) {
+ //TODO
+ }
+
+ @Override
+ public void updateRouterInterface(OpenstackRouterInterface routerInterface) {
+ routerInterfaceMap.putIfAbsent(routerInterface.portId(), routerInterface);
+ List<OpenstackRouterInterface> routerInterfaces = Lists.newArrayList();
+ routerInterfaces.add(routerInterface);
+ checkExternalConnection(getOpenstackRouter(routerInterface.tenantId()), routerInterfaces);
+ }
+
+ @Override
+ public void removeRouterInterface(OpenstackRouterInterface routerInterface) {
+ OpenstackRoutingRulePopulator rulePopulator = new OpenstackRoutingRulePopulator(appId,
+ openstackService, flowObjectiveService, deviceService, driverService);
+ rulePopulator.removeExternalRules(routerInterface);
+ routerInterfaceMap.remove(routerInterface.portId());
+ }
+ private class InternalPacketProcessor implements PacketProcessor {
+
+ @Override
+ public void process(PacketContext context) {
+
+ if (context.isHandled()) {
+ return;
+ }
+
+ InboundPacket pkt = context.inPacket();
+ Ethernet ethernet = pkt.parsed();
+
+ if (ethernet != null && ethernet.getEtherType() == Ethernet.TYPE_IPV4) {
+ IPv4 iPacket = (IPv4) ethernet.getPayload();
+ OpenstackRoutingRulePopulator rulePopulator = new OpenstackRoutingRulePopulator(appId,
+ openstackService, flowObjectiveService, deviceService,
+ driverService);
+ switch (iPacket.getProtocol()) {
+ case IPv4.PROTOCOL_ICMP:
+ icmpEventExecutorService.execute(new OpenstackIcmpHandler(rulePopulator, context));
+ break;
+ default:
+ int portNum = getPortNum(ethernet.getSourceMAC(), iPacket.getDestinationAddress());
+ OpenstackPort openstackPort = getOpenstackPort(ethernet.getSourceMAC(),
+ Ip4Address.valueOf(iPacket.getSourceAddress()));
+ l3EventExecutorService.execute(new OpenstackPnatHandler(rulePopulator, context,
+ portNum, openstackPort));
+ break;
+ }
+
+ }
+ }
+
+ private int getPortNum(MacAddress sourceMac, int destinationAddress) {
+ int portNum = portNumMap.keySet().stream()
+ .filter(k -> portNumMap.get(k).equals("")).findFirst().orElse(0);
+ portNumMap.replace(portNum, sourceMac.toString().concat(":").concat(String.valueOf(destinationAddress)));
+ return portNum;
+ }
+ }
+
+ private void checkExternalConnection(OpenstackRouter router,
+ Collection<OpenstackRouterInterface> routerInterfaces) {
+ checkNotNull(router, "Router can not be null");
+ checkNotNull(routerInterfaces, "RouterInterfaces can not be null");
+ Ip4Address externalIp = router.gatewayExternalInfo().externalFixedIps()
+ .values().stream().findFirst().orElse(null);
+ if ((externalIp == null) || (!router.gatewayExternalInfo().isEnablePnat())) {
+ log.debug("Failed to set pnat configuration");
+ return;
+ }
+ routerInterfaces.forEach(routerInterface -> {
+ initiateL3Rule(router, routerInterface);
+ });
+ }
+
+ private void initiateL3Rule(OpenstackRouter router, OpenstackRouterInterface routerInterface) {
+ long vni = Long.parseLong(openstackService.network(openstackService
+ .port(routerInterface.portId()).networkId()).segmentId());
+ OpenstackRoutingRulePopulator rulePopulator = new OpenstackRoutingRulePopulator(appId,
+ openstackService, flowObjectiveService, deviceService, driverService);
+ rulePopulator.populateExternalRules(vni, router, routerInterface);
+ }
+
+ private Collection<OpenstackRouterInterface> getOpenstackRouterInterface(OpenstackRouter router) {
+ return routerInterfaceMap.values().stream().filter(i -> i.id().equals(router.id()))
+ .collect(Collectors.toList());
+ }
+
+ private OpenstackRouter getOpenstackRouter(String tenantId) {
+ return openstackService.routers().stream().filter(r ->
+ r.tenantId().equals(tenantId)).findFirst().orElse(null);
+ }
+
+ private OpenstackPort getOpenstackPort(MacAddress sourceMac, Ip4Address ip4Address) {
+ OpenstackPort openstackPort = openstackService.ports("").stream()
+ .filter(p -> p.macAddress().equals(sourceMac)).findFirst().orElse(null);
+ return openstackPort.fixedIps().values().stream().findFirst().orElse(null)
+ .equals(ip4Address) ? openstackPort : null;
+ }
+
+}
diff --git a/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackRoutingRulePopulator.java b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackRoutingRulePopulator.java
new file mode 100644
index 0000000..dc10216
--- /dev/null
+++ b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/OpenstackRoutingRulePopulator.java
@@ -0,0 +1,371 @@
+/*
+ * Copyright 2016 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.openstacknetworking.routing;
+
+import org.onlab.packet.Ethernet;
+import org.onlab.packet.IPv4;
+import org.onlab.packet.Ip4Address;
+import org.onlab.packet.IpAddress;
+import org.onlab.packet.IpPrefix;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.TCP;
+import org.onlab.packet.TpPort;
+import org.onlab.packet.UDP;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.net.Device;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.Port;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.behaviour.ExtensionTreatmentResolver;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.driver.DefaultDriverData;
+import org.onosproject.net.driver.DefaultDriverHandler;
+import org.onosproject.net.driver.Driver;
+import org.onosproject.net.driver.DriverHandler;
+import org.onosproject.net.driver.DriverService;
+import org.onosproject.net.flow.DefaultTrafficSelector;
+import org.onosproject.net.flow.DefaultTrafficTreatment;
+import org.onosproject.net.flow.TrafficSelector;
+import org.onosproject.net.flow.TrafficTreatment;
+import org.onosproject.net.flow.instructions.ExtensionPropertyException;
+import org.onosproject.net.flow.instructions.ExtensionTreatment;
+import org.onosproject.net.flow.instructions.ExtensionTreatmentType;
+import org.onosproject.net.flowobjective.DefaultForwardingObjective;
+import org.onosproject.net.flowobjective.FlowObjectiveService;
+import org.onosproject.net.flowobjective.ForwardingObjective;
+import org.onosproject.net.packet.InboundPacket;
+import org.onosproject.openstacknetworking.OpenstackNetworkingService;
+import org.onosproject.openstacknetworking.OpenstackPort;
+import org.onosproject.openstacknetworking.OpenstackRouter;
+import org.onosproject.openstacknetworking.OpenstackRouterInterface;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.stream.StreamSupport;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Populates Routing Flow Rules.
+ */
+public class OpenstackRoutingRulePopulator {
+
+ private static Logger log = LoggerFactory
+ .getLogger(OpenstackRoutingRulePopulator.class);
+ private ApplicationId appId;
+ private FlowObjectiveService flowObjectiveService;
+ private OpenstackNetworkingService openstackService;
+ private DeviceService deviceService;
+ private DriverService driverService;
+
+ public static final String PORTNAME_PREFIX_VM = "tap";
+ public static final String PORTNAME_PREFIX_ROUTER = "qr";
+ public static final String PORTNAME_PREFIX_TUNNEL = "vxlan";
+ public static final String PORTNAME = "portName";
+
+ private static final int ROUTING_RULE_PRIORITY = 25000;
+ private static final int PNAT_RULE_PRIORITY = 24000;
+ private static final int PNAT_TIMEOUT = 120;
+ private static final MacAddress GATEWAYMAC = MacAddress.valueOf("1f:1f:1f:1f:1f:1f");
+
+ private InboundPacket inboundPacket;
+ private OpenstackPort openstackPort;
+ private int portNum;
+ private MacAddress externalInterface;
+ private MacAddress externalRouter;
+ private OpenstackRouter router;
+ private OpenstackRouterInterface routerInterface;
+
+ // TODO: This will be replaced to get the information from openstackswitchingservice.
+ private static final String EXTERNAL_INTERFACE_NAME = "eth3";
+
+ public OpenstackRoutingRulePopulator(ApplicationId appId, OpenstackNetworkingService openstackService,
+ FlowObjectiveService flowObjectiveService,
+ DeviceService deviceService, DriverService driverService) {
+ this.appId = appId;
+ this.flowObjectiveService = flowObjectiveService;
+ this.openstackService = openstackService;
+ this.deviceService = deviceService;
+ this.driverService = driverService;
+ }
+
+ public void populatePnatFlowRules(InboundPacket inboundPacket, OpenstackPort openstackPort, int portNum,
+ MacAddress externalInterfaceMacAddress, MacAddress externalRouterMacAddress) {
+ this.inboundPacket = inboundPacket;
+ this.openstackPort = openstackPort;
+ this.portNum = portNum;
+ this.externalInterface = externalInterfaceMacAddress;
+ this.externalRouter = externalRouterMacAddress;
+
+ long vni = getVni(openstackPort);
+
+ populatePnatIncomingFlowRules(vni);
+ populatePnatOutgoingFlowRules(vni);
+ }
+
+ private void populatePnatOutgoingFlowRules(long vni) {
+ IPv4 iPacket = (IPv4) inboundPacket.parsed().getPayload();
+
+ TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder();
+ sBuilder.matchEthType(Ethernet.TYPE_IPV4)
+ .matchIPProtocol(iPacket.getProtocol())
+ .matchTunnelId(vni)
+ .matchIPSrc(IpPrefix.valueOf(iPacket.getSourceAddress(), 32))
+ .matchIPDst(IpPrefix.valueOf(iPacket.getDestinationAddress(), 32));
+
+ TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder();
+ tBuilder.setEthSrc(externalInterface)
+ .setEthDst(externalRouter);
+
+ switch (iPacket.getProtocol()) {
+ case IPv4.PROTOCOL_TCP:
+ TCP tcpPacket = (TCP) iPacket.getPayload();
+ sBuilder.matchTcpSrc(TpPort.tpPort(tcpPacket.getSourcePort()))
+ .matchTcpDst(TpPort.tpPort(tcpPacket.getDestinationPort()));
+ tBuilder.setTcpDst(TpPort.tpPort(portNum));
+ break;
+ case IPv4.PROTOCOL_UDP:
+ UDP udpPacket = (UDP) iPacket.getPayload();
+ sBuilder.matchUdpDst(TpPort.tpPort(udpPacket.getSourcePort()))
+ .matchUdpDst(TpPort.tpPort(udpPacket.getDestinationPort()));
+ tBuilder.setUdpDst(TpPort.tpPort(portNum));
+ break;
+ default:
+ break;
+ }
+
+ Port port = getPortNumOfExternalInterface();
+ checkNotNull(port, "Port can not be null");
+ tBuilder.setOutput(port.number());
+
+ ForwardingObjective fo = DefaultForwardingObjective.builder()
+ .withSelector(sBuilder.build())
+ .withTreatment(tBuilder.build())
+ .withFlag(ForwardingObjective.Flag.VERSATILE)
+ .withPriority(PNAT_RULE_PRIORITY)
+ .makeTemporary(PNAT_TIMEOUT)
+ .fromApp(appId)
+ .add();
+
+ flowObjectiveService.forward(inboundPacket.receivedFrom().deviceId(), fo);
+ }
+
+ private Port getPortNumOfExternalInterface() {
+ return deviceService.getPorts(inboundPacket.receivedFrom().deviceId()).stream()
+ .filter(p -> p.annotations().value("portName").equals(EXTERNAL_INTERFACE_NAME))
+ .findAny().orElse(null);
+ }
+
+
+ private void populatePnatIncomingFlowRules(long vni) {
+ IPv4 iPacket = (IPv4) inboundPacket.parsed().getPayload();
+ DeviceId deviceId = inboundPacket.receivedFrom().deviceId();
+
+ TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder();
+ sBuilder.matchEthType(Ethernet.TYPE_IPV4)
+ .matchIPProtocol(iPacket.getProtocol())
+ .matchIPSrc(IpPrefix.valueOf(iPacket.getDestinationAddress(), 32));
+
+ TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder();
+ tBuilder.setTunnelId(vni)
+ .setIpDst(IpAddress.valueOf(iPacket.getSourceAddress()));
+
+ switch (iPacket.getProtocol()) {
+ case IPv4.PROTOCOL_TCP:
+ TCP tcpPacket = (TCP) iPacket.getPayload();
+ sBuilder.matchTcpSrc(TpPort.tpPort(tcpPacket.getDestinationPort()))
+ .matchTcpDst(TpPort.tpPort(portNum));
+ tBuilder.setTcpDst(TpPort.tpPort(tcpPacket.getSourcePort()));
+ break;
+ case IPv4.PROTOCOL_UDP:
+ UDP udpPacket = (UDP) iPacket.getPayload();
+ sBuilder.matchUdpSrc(TpPort.tpPort(udpPacket.getDestinationPort()))
+ .matchUdpDst(TpPort.tpPort(portNum));
+ tBuilder.setUdpDst(TpPort.tpPort(udpPacket.getSourcePort()));
+ break;
+ default:
+ break;
+ }
+
+ tBuilder.extension(buildNiciraExtenstion(deviceId, Ip4Address.valueOf(iPacket.getSourceAddress())), deviceId)
+ .setOutput(getTunnelPort(deviceId));
+
+ ForwardingObjective fo = DefaultForwardingObjective.builder()
+ .withSelector(sBuilder.build())
+ .withTreatment(tBuilder.build())
+ .withFlag(ForwardingObjective.Flag.VERSATILE)
+ .withPriority(PNAT_RULE_PRIORITY)
+ .makeTemporary(PNAT_TIMEOUT)
+ .fromApp(appId)
+ .add();
+
+ flowObjectiveService.forward(inboundPacket.receivedFrom().deviceId(), fo);
+ }
+
+ private ExtensionTreatment buildNiciraExtenstion(DeviceId id, Ip4Address hostIp) {
+ Driver driver = driverService.getDriver(id);
+ DriverHandler driverHandler = new DefaultDriverHandler(new DefaultDriverData(driver, id));
+ ExtensionTreatmentResolver resolver = driverHandler.behaviour(ExtensionTreatmentResolver.class);
+
+ ExtensionTreatment extensionInstruction =
+ resolver.getExtensionInstruction(
+ ExtensionTreatmentType.ExtensionTreatmentTypes.NICIRA_SET_TUNNEL_DST.type());
+
+ try {
+ extensionInstruction.setPropertyValue("tunnelDst", hostIp);
+ } catch (ExtensionPropertyException e) {
+ log.error("Error setting Nicira extension setting {}", e);
+ }
+
+ return extensionInstruction;
+ }
+
+ private PortNumber getTunnelPort(DeviceId deviceId) {
+ Port port = deviceService.getPorts(deviceId).stream()
+ .filter(p -> p.annotations().value("portName").equals(PORTNAME_PREFIX_TUNNEL))
+ .findAny().orElse(null);
+
+ if (port == null) {
+ log.error("No TunnelPort was created.");
+ return null;
+ }
+ return port.number();
+
+ }
+
+ public void populateExternalRules(long vni, OpenstackRouter router,
+ OpenstackRouterInterface routerInterface) {
+ this.router = router;
+ this.routerInterface = routerInterface;
+
+ // 1. computeNode to gateway
+ populateComputeNodeRules(vni);
+ // 2. gatewayNode to controller
+ populateRuleGatewaytoController(vni);
+ }
+
+ private void populateRuleGatewaytoController(long vni) {
+ Device gatewayDevice = getGatewayNode();
+ TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder();
+ TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder();
+
+ sBuilder.matchEthType(Ethernet.TYPE_IPV4)
+ .matchTunnelId(vni)
+ .matchEthDst(GATEWAYMAC);
+ tBuilder.setOutput(PortNumber.CONTROLLER);
+
+ ForwardingObjective fo = DefaultForwardingObjective.builder()
+ .withSelector(sBuilder.build())
+ .withTreatment(tBuilder.build())
+ .withFlag(ForwardingObjective.Flag.VERSATILE)
+ .withPriority(ROUTING_RULE_PRIORITY)
+ .fromApp(appId)
+ .add();
+
+ flowObjectiveService.forward(gatewayDevice.id(), fo);
+ }
+
+ private void populateComputeNodeRules(long vni) {
+ Device gatewayDevice = getGatewayNode();
+
+ StreamSupport.stream(deviceService.getAvailableDevices().spliterator(), false)
+ .filter(d -> !checkGatewayNode(d.id()))
+ .forEach(d -> populateRuleToGateway(d, gatewayDevice, vni));
+ /*deviceService.getAvailableDevices().forEach(d -> {
+ if (!checkGatewayNode(d.id())) {
+ populateRuleToGateway(d, gatewayDevice, vni);
+ }
+ });*/
+ }
+
+ private void populateRuleToGateway(Device d, Device gatewayDevice, long vni) {
+ TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder();
+ TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder();
+
+ sBuilder.matchEthType(Ethernet.TYPE_IPV4)
+ .matchTunnelId(vni)
+ .matchEthDst(GATEWAYMAC);
+ tBuilder.extension(buildNiciraExtenstion(d.id(), getIPAddressforDevice(gatewayDevice)), d.id())
+ .setOutput(getTunnelPort(d.id()));
+
+ ForwardingObjective fo = DefaultForwardingObjective.builder()
+ .withSelector(sBuilder.build())
+ .withTreatment(tBuilder.build())
+ .withFlag(ForwardingObjective.Flag.SPECIFIC)
+ .withPriority(ROUTING_RULE_PRIORITY)
+ .fromApp(appId)
+ .add();
+
+ flowObjectiveService.forward(d.id(), fo);
+ }
+
+ private Ip4Address getIPAddressforDevice(Device device) {
+ return Ip4Address.valueOf(device.annotations().value("channelId").split(":")[0]);
+ }
+
+ private Device getGatewayNode() {
+ final Device[] device = new Device[1];
+ deviceService.getAvailableDevices().forEach(d -> {
+ if (checkGatewayNode(d.id())) {
+ device[0] = d;
+ }
+ });
+ return device[0];
+ }
+
+ private boolean checkGatewayNode(DeviceId deviceId) {
+ return !deviceService.getPorts(deviceId).stream().anyMatch(port ->
+ port.annotations().value("portName").startsWith(PORTNAME_PREFIX_ROUTER) ||
+ port.annotations().value("portName").startsWith(PORTNAME_PREFIX_VM));
+ }
+
+ private long getVni(OpenstackPort openstackPort) {
+ return Long.parseLong(openstackService.network(openstackPort.networkId()).segmentId());
+ }
+
+ public void removeExternalRules(OpenstackRouterInterface routerInterface) {
+ OpenstackPort openstackPort = openstackService.port(routerInterface.portId());
+ TrafficSelector.Builder sBuilder = DefaultTrafficSelector.builder();
+ sBuilder.matchEthType(Ethernet.TYPE_IPV4)
+ .matchTunnelId(getVni(openstackPort))
+ .matchEthDst(GATEWAYMAC);
+
+ StreamSupport.stream(deviceService.getAvailableDevices().spliterator(), false)
+ .forEach(d -> {
+ if (checkGatewayNode(d.id())) {
+ removeExternalRule(d.id(), sBuilder, ForwardingObjective.Flag.VERSATILE);
+ } else {
+ removeExternalRule(d.id(), sBuilder, ForwardingObjective.Flag.SPECIFIC);
+ }
+ });
+
+ }
+
+ private void removeExternalRule(DeviceId id, TrafficSelector.Builder sBuilder, ForwardingObjective.Flag flag) {
+ TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder();
+
+ ForwardingObjective fo = DefaultForwardingObjective.builder()
+ .withSelector(sBuilder.build())
+ .withTreatment(tBuilder.build())
+ .withFlag(flag)
+ .withPriority(ROUTING_RULE_PRIORITY)
+ .fromApp(appId)
+ .remove();
+
+ flowObjectiveService.forward(id, fo);
+ }
+
+}
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/package-info.java b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/package-info.java
similarity index 80%
copy from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/package-info.java
copy to apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/package-info.java
index 91e19c6..9592065 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/package-info.java
+++ b/apps/openstacknetworking/openstackrouting/src/main/java/org/onosproject/openstacknetworking/routing/package-info.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2015 Open Networking Laboratory
+ * Copyright 2016 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.
@@ -15,6 +15,6 @@
*/
/**
- * OpenStack switching REST API.
+ * Application for OpenstackRouting.
*/
-package org.onosproject.openstackswitching.web;
+package org.onosproject.openstacknetworking.routing;
\ No newline at end of file
diff --git a/apps/openstackswitching/network-cfg.json b/apps/openstacknetworking/openstackswitching/network-cfg.json
similarity index 100%
rename from apps/openstackswitching/network-cfg.json
rename to apps/openstacknetworking/openstackswitching/network-cfg.json
diff --git a/apps/openstacknetworking/openstackswitching/pom.xml b/apps/openstacknetworking/openstackswitching/pom.xml
new file mode 100644
index 0000000..b5b6d65
--- /dev/null
+++ b/apps/openstacknetworking/openstackswitching/pom.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright 2015-2016 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.
+ -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.onosproject</groupId>
+ <artifactId>onos-app-openstacknetworking</artifactId>
+ <version>1.5.0-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>onos-app-openstackswitching</artifactId>
+ <packaging>bundle</packaging>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.onosproject</groupId>
+ <artifactId>onos-app-openstacknetworking-api</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.onosproject</groupId>
+ <artifactId>onos-app-dhcp</artifactId>
+ <version>1.5.0-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.onosproject</groupId>
+ <artifactId>onos-app-dhcp-api</artifactId>
+ <version>1.5.0-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.onosproject</groupId>
+ <artifactId>onos-rest</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.onosproject</groupId>
+ <artifactId>onlab-rest</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.onosproject</groupId>
+ <artifactId>onlab-misc</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ </dependencies>
+
+
+</project>
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackArpHandler.java b/apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackArpHandler.java
similarity index 89%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackArpHandler.java
rename to apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackArpHandler.java
index 7fb489a..415b6d2 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackArpHandler.java
+++ b/apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackArpHandler.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.onosproject.openstackswitching.impl;
+package org.onosproject.openstacknetworking.switching;
import org.onlab.packet.ARP;
import org.onlab.packet.Ethernet;
@@ -27,8 +27,9 @@
import org.onosproject.net.packet.DefaultOutboundPacket;
import org.onosproject.net.packet.InboundPacket;
import org.onosproject.net.packet.PacketService;
-import org.onosproject.openstackswitching.OpenstackPort;
-import org.onosproject.openstackswitching.OpenstackPortInfo;
+import org.onosproject.openstacknetworking.OpenstackNetworkingService;
+import org.onosproject.openstacknetworking.OpenstackPort;
+import org.onosproject.openstacknetworking.OpenstackPortInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.nio.ByteBuffer;
@@ -45,19 +46,19 @@
.getLogger(OpenstackArpHandler.class);
private static final MacAddress GATEWAY_MAC = MacAddress.valueOf("1f:1f:1f:1f:1f:1f");
private PacketService packetService;
- private OpenstackRestHandler restHandler;
+ private OpenstackNetworkingService openstackService;
private HostService hostService;
/**
* Returns OpenstackArpHandler reference.
*
- * @param restHandler rest API handler reference
+ * @param openstackService OpenstackNetworkingService reference
* @param packetService PacketService reference
* @param hostService host service
*/
- public OpenstackArpHandler(OpenstackRestHandler restHandler, PacketService packetService,
+ public OpenstackArpHandler(OpenstackNetworkingService openstackService, PacketService packetService,
HostService hostService) {
- this.restHandler = checkNotNull(restHandler);
+ this.openstackService = openstackService;
this.packetService = packetService;
this.hostService = hostService;
}
@@ -123,7 +124,7 @@
private MacAddress getMacFromOpenstack(IpAddress targetIp) {
checkNotNull(targetIp);
- OpenstackPort openstackPort = restHandler.getPorts()
+ OpenstackPort openstackPort = openstackService.ports()
.stream()
.filter(port -> port.fixedIps().containsValue(targetIp))
.findFirst()
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackSwitchingManager.java b/apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackSwitchingManager.java
similarity index 73%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackSwitchingManager.java
rename to apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackSwitchingManager.java
index 572e204..52b0436 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackSwitchingManager.java
+++ b/apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackSwitchingManager.java
@@ -13,8 +13,9 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.onosproject.openstackswitching.impl;
+package org.onosproject.openstacknetworking.switching;
+import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
@@ -50,29 +51,26 @@
import org.onosproject.net.packet.PacketContext;
import org.onosproject.net.packet.PacketProcessor;
import org.onosproject.net.packet.PacketService;
-import org.onosproject.openstackrouting.OpenstackRouter;
-import org.onosproject.openstackrouting.OpenstackRouterInterface;
-import org.onosproject.openstackrouting.OpenstackRoutingService;
-import org.onosproject.openstackswitching.OpenstackNetwork;
-import org.onosproject.openstackswitching.OpenstackPort;
-import org.onosproject.openstackswitching.OpenstackPortInfo;
-import org.onosproject.openstackswitching.OpenstackSubnet;
-import org.onosproject.openstackswitching.OpenstackSwitchingService;
+import org.onosproject.openstacknetworking.OpenstackNetwork;
+import org.onosproject.openstacknetworking.OpenstackNetworkingConfig;
+import org.onosproject.openstacknetworking.OpenstackNetworkingService;
+import org.onosproject.openstacknetworking.OpenstackPort;
+import org.onosproject.openstacknetworking.OpenstackPortInfo;
+import org.onosproject.openstacknetworking.OpenstackSecurityGroup;
+import org.onosproject.openstacknetworking.OpenstackSubnet;
+import org.onosproject.openstacknetworking.OpenstackSwitchingService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
import java.util.Collection;
import java.util.Map;
-import java.util.NoSuchElementException;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
-import java.util.stream.Collectors;
import static org.onosproject.net.config.basics.SubjectFactories.APP_SUBJECT_FACTORY;
import static org.onlab.util.Tools.groupedThreads;
-@SuppressWarnings("ALL")
@Service
@Component(immediate = true)
/**
@@ -80,8 +78,8 @@
*/
public class OpenstackSwitchingManager implements OpenstackSwitchingService {
- private static Logger log = LoggerFactory
- .getLogger(OpenstackSwitchingManager.class);
+ private final Logger log = LoggerFactory
+ .getLogger(getClass());
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
protected CoreService coreService;
@@ -108,7 +106,7 @@
protected DriverService driverService;
@Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
- protected OpenstackRoutingService openstackRoutingService;
+ protected OpenstackNetworkingService openstackService;
public static final String PORTNAME_PREFIX_VM = "tap";
public static final String PORTNAME_PREFIX_ROUTER = "qr-";
@@ -125,7 +123,6 @@
private String password;
private String physicalRouterMac;
private OpenstackArpHandler arpHandler;
- private OpenstackRestHandler restHandler;
private ExecutorService deviceEventExcutorService =
Executors.newSingleThreadExecutor(groupedThreads("onos/openstackswitching", "device-event"));
@@ -136,17 +133,20 @@
private InternalDeviceListener internalDeviceListener = new InternalDeviceListener();
private InternalConfigListener internalConfigListener = new InternalConfigListener();
private InternalHostListener internalHostListener = new InternalHostListener();
+
+
private final Set<ConfigFactory> factories = ImmutableSet.of(
- new ConfigFactory<ApplicationId, OpenstackSwitchingConfig>(APP_SUBJECT_FACTORY,
- OpenstackSwitchingConfig.class,
+ new ConfigFactory<ApplicationId, OpenstackNetworkingConfig>(APP_SUBJECT_FACTORY,
+ OpenstackNetworkingConfig.class,
"openstackswitching") {
@Override
- public OpenstackSwitchingConfig createConfig() {
- return new OpenstackSwitchingConfig();
+ public OpenstackNetworkingConfig createConfig() {
+ return new OpenstackNetworkingConfig();
}
}
);
+
private Map<String, OpenstackPortInfo> openstackPortInfoMap = Maps.newHashMap();
@Activate
@@ -189,14 +189,14 @@
if (!openstackPort.securityGroups().isEmpty()) {
openstackPort.securityGroups().forEach(sgId -> {
- OpenstackSecurityGroup sg = restHandler.getSecurityGroup(sgId);
+ OpenstackSecurityGroup sg = openstackService.getSecurityGroup(sgId);
log.debug("SecurityGroup : {}", sg.toString());
});
}
}
@Override
- public void deletePort(String uuid) {
+ public void removePort(String uuid) {
// When VMs are remvoed, the flow rules for the VMs are removed using ONOS port update event.
// But, when router is removed, no ONOS port event occurs and we need to use Neutron port event.
// Here we should not touch any rules for VMs.
@@ -212,7 +212,7 @@
if (pName.equals(routerPortName)) {
OpenstackSwitchingRulePopulator rulePopulator =
new OpenstackSwitchingRulePopulator(appId, flowObjectiveService,
- deviceService, restHandler, driverService);
+ deviceService, openstackService, driverService);
rulePopulator.removeSwitchingRules(doNotPushFlows, port, openstackPortInfoMap);
openstackPortInfoMap.remove(routerPortName);
@@ -236,125 +236,8 @@
}
@Override
- public Collection<OpenstackPort> ports(String networkId) {
- Collection<OpenstackPort> ports = restHandler.getPorts();
- List<OpenstackPort> portList = ports.stream()
- .filter(p -> p.networkId().equals(networkId))
- .collect(Collectors.toList());
-
- return portList;
- }
-
- @Override
- public Collection<OpenstackPort> ports() {
- return restHandler.getPorts();
- }
-
- @Override
- public OpenstackPort port(Port port) {
- Collection<OpenstackPort> ports = restHandler.getPorts();
- String uuid = port.annotations().value(PORTNAME).substring(3);
- return ports.stream()
- .filter(p -> p.id().startsWith(uuid))
- .findFirst().orElse(null);
- }
-
- @Override
- public OpenstackPort port(String portId) {
- Collection<OpenstackPort> ports = restHandler.getPorts();
- return ports.stream()
- .filter(p -> p.id().equals(portId))
- .findFirst().orElse(null);
- }
-
- @Override
- public OpenstackNetwork network(String networkId) {
- try {
- Collection<OpenstackSubnet> subnets = restHandler.getSubnets().stream()
- .filter(s -> s.networkId().equals(networkId))
- .collect(Collectors.toList());
-
- Collection<OpenstackNetwork> networks = restHandler.getNetworks();
- OpenstackNetwork openstackNetwork = networks.stream()
- .filter(n -> n.id().equals(networkId))
- .findFirst().get();
-
- return OpenstackNetwork.builder()
- .id(openstackNetwork.id())
- .name(openstackNetwork.name())
- .networkType(openstackNetwork.networkType())
- .segmentId(openstackNetwork.segmentId())
- .tenantId(openstackNetwork.tenantId())
- .subnets(subnets)
- .build();
- } catch (NoSuchElementException e) {
- log.warn("There is no network infor for net ID {}", networkId);
- return null;
- }
- }
-
- @Override
- public OpenstackSubnet subnet(String subnetId) {
- Collection<OpenstackSubnet> subnets = restHandler.getSubnets();
- try {
- return subnets.stream()
- .filter(s -> s.id().equals(subnetId))
- .findFirst().get();
- } catch (NoSuchElementException e) {
- log.warn("There is no subnet info for subnet ID {}", subnetId);
- return null;
- }
- }
-
- @Override
- public void createRouter(OpenstackRouter openstackRouter) {
- openstackRoutingService.createRouter(openstackRouter);
- }
- @Override
- public void updateRouter(String routerId) {
- openstackRoutingService.updateRouter(router(routerId));
- }
-
- @Override
- public void removeRouterInterface(OpenstackRouterInterface openstackRouterInterface) {
- openstackRoutingService.removeRouterInterface(openstackRouterInterface);
- }
- @Override
- public void deleteRouter(String id) {
- openstackRoutingService.deleteRouter(id);
- }
-
- @Override
- public void updateRouterInterface(OpenstackRouterInterface openstackRouterInterface) {
- openstackRoutingService.updateRouterInterface(openstackRouterInterface);
- }
-
- @Override
- public OpenstackRouter router(String routerId) {
- Collection<OpenstackRouter> openstackRouters = restHandler.getRouters();
- try {
- return openstackRouters.stream()
- .filter(r -> r.id().equals(routerId))
- .findAny().get();
- } catch (NoSuchElementException e) {
- log.warn("There is no router info for subnet ID {}", routerId);
- return null;
- }
- }
-
- @Override
- public Collection<OpenstackRouter> routers() {
- return restHandler.getRouters();
- }
-
- @Override
- public Collection<OpenstackPortInfo> portInfos() {
- return openstackPortInfoMap.values();
- }
-
- @Override
- public String physicalRouterMac() {
- return physicalRouterMac;
+ public Map<String, OpenstackPortInfo> openstackPortInfo() {
+ return ImmutableMap.copyOf(this.openstackPortInfoMap);
}
private void processDeviceAdded(Device device) {
@@ -366,10 +249,10 @@
if (port.isEnabled() || port.annotations().value(PORTNAME).startsWith(PORTNAME_PREFIX_ROUTER)) {
OpenstackSwitchingRulePopulator rulePopulator =
new OpenstackSwitchingRulePopulator(appId, flowObjectiveService,
- deviceService, restHandler, driverService);
+ deviceService, openstackService, driverService);
rulePopulator.populateSwitchingRules(doNotPushFlows, device, port);
- updatePortMap(device.id(), port, restHandler.getNetworks(), restHandler.getSubnets(),
+ updatePortMap(device.id(), port, openstackService.networks(), openstackService.subnets(),
rulePopulator.openstackPort(port));
//In case portupdate event is driven by vm shutoff from openstack
@@ -377,7 +260,7 @@
log.debug("Flowrules according to the port {} were removed", port.number().toString());
OpenstackSwitchingRulePopulator rulePopulator =
new OpenstackSwitchingRulePopulator(appId, flowObjectiveService,
- deviceService, restHandler, driverService);
+ deviceService, openstackService, driverService);
rulePopulator.removeSwitchingRules(doNotPushFlows, port, openstackPortInfoMap);
dhcpService.removeStaticMapping(openstackPortInfoMap.get(port.annotations().value(PORTNAME)).mac());
@@ -393,10 +276,10 @@
private void initializeFlowRules() {
OpenstackSwitchingRulePopulator rulePopulator =
new OpenstackSwitchingRulePopulator(appId, flowObjectiveService,
- deviceService, restHandler, driverService);
+ deviceService, openstackService, driverService);
- Collection<OpenstackNetwork> networks = restHandler.getNetworks();
- Collection<OpenstackSubnet> subnets = restHandler.getSubnets();
+ Collection<OpenstackNetwork> networks = openstackService.networks();
+ Collection<OpenstackSubnet> subnets = openstackService.subnets();
deviceService.getDevices().forEach(device -> {
log.debug("device {} num of ports {} ", device.id(),
@@ -458,7 +341,7 @@
ip4Address = (Ip4Address) openstackPort.fixedIps().values().stream().findFirst().orElse(null);
- openstackSubnet = restHandler.getSubnets().stream()
+ openstackSubnet = openstackService.subnets().stream()
.filter(n -> n.networkId().equals(openstackPort.networkId()))
.findFirst().get();
@@ -579,16 +462,18 @@
private class InternalConfigListener implements NetworkConfigListener {
public void configureNetwork() {
- OpenstackSwitchingConfig cfg =
- cfgService.getConfig(appId, OpenstackSwitchingConfig.class);
+ OpenstackNetworkingConfig cfg =
+ cfgService.getConfig(appId, OpenstackNetworkingConfig.class);
if (cfg == null) {
log.error("There is no openstack server information in config.");
return;
}
+
doNotPushFlows = cfg.doNotPushFlows();
physicalRouterMac = cfg.physicalRouterMac();
- restHandler = new OpenstackRestHandler(cfg);
- arpHandler = new OpenstackArpHandler(restHandler, packetService, hostService);
+ openstackService.setConfigurations(cfg.neutronServer(), cfg.keystoneServer(),
+ cfg.userName(), cfg.password());
+ arpHandler = new OpenstackArpHandler(openstackService, packetService, hostService);
initializeFlowRules();
}
@@ -596,8 +481,10 @@
public void event(NetworkConfigEvent event) {
if (((event.type() == NetworkConfigEvent.Type.CONFIG_ADDED ||
event.type() == NetworkConfigEvent.Type.CONFIG_UPDATED)) &&
- event.configClass().equals(OpenstackSwitchingConfig.class)) {
- networkEventExcutorService.execute(this::configureNetwork);
+ event.configClass().equals(OpenstackNetworkingConfig.class)) {
+
+ log.info("Network configuration changed");
+ networkEventExcutorService.execute(this::configureNetwork);
}
}
}
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackSwitchingRulePopulator.java b/apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackSwitchingRulePopulator.java
similarity index 96%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackSwitchingRulePopulator.java
rename to apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackSwitchingRulePopulator.java
index 0ebfe19..258b24c 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackSwitchingRulePopulator.java
+++ b/apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/OpenstackSwitchingRulePopulator.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.onosproject.openstackswitching.impl;
+package org.onosproject.openstacknetworking.switching;
import org.onlab.packet.Ethernet;
import org.onlab.packet.Ip4Address;
@@ -40,9 +40,10 @@
import org.onosproject.net.flowobjective.DefaultForwardingObjective;
import org.onosproject.net.flowobjective.FlowObjectiveService;
import org.onosproject.net.flowobjective.ForwardingObjective;
-import org.onosproject.openstackswitching.OpenstackNetwork;
-import org.onosproject.openstackswitching.OpenstackPort;
-import org.onosproject.openstackswitching.OpenstackPortInfo;
+import org.onosproject.openstacknetworking.OpenstackNetwork;
+import org.onosproject.openstacknetworking.OpenstackNetworkingService;
+import org.onosproject.openstacknetworking.OpenstackPort;
+import org.onosproject.openstacknetworking.OpenstackPortInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -63,7 +64,6 @@
private FlowObjectiveService flowObjectiveService;
private DriverService driverService;
private DeviceService deviceService;
- private OpenstackRestHandler restHandler;
private ApplicationId appId;
private Collection<OpenstackNetwork> openstackNetworkList;
@@ -75,22 +75,20 @@
* @param appId application id
* @param flowObjectiveService FlowObjectiveService reference
* @param deviceService DeviceService reference
- * @param restHandler OpenstackRestHandler reference
* @param driverService DriverService reference
*/
public OpenstackSwitchingRulePopulator(ApplicationId appId,
FlowObjectiveService flowObjectiveService,
DeviceService deviceService,
- OpenstackRestHandler restHandler,
+ OpenstackNetworkingService openstackService,
DriverService driverService) {
this.flowObjectiveService = flowObjectiveService;
this.deviceService = deviceService;
this.driverService = driverService;
- this.restHandler = restHandler;
this.appId = appId;
- openstackNetworkList = restHandler.getNetworks();
- openstackPortList = restHandler.getPorts();
+ openstackNetworkList = openstackService.networks();
+ openstackPortList = openstackService.ports();
}
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/package-info.java b/apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/package-info.java
similarity index 91%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/package-info.java
rename to apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/package-info.java
index 77a322d..6dc1996 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/package-info.java
+++ b/apps/openstacknetworking/openstackswitching/src/main/java/org/onosproject/openstacknetworking/switching/package-info.java
@@ -17,4 +17,4 @@
/**
* OpenStack switch implementation.
*/
-package org.onosproject.openstackswitching.impl;
+package org.onosproject.openstacknetworking.switching;
diff --git a/apps/openstacknetworking/pom.xml b/apps/openstacknetworking/pom.xml
new file mode 100644
index 0000000..cdf3a1c
--- /dev/null
+++ b/apps/openstacknetworking/pom.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright 2016 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.
+ -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.onosproject</groupId>
+ <artifactId>onos-apps</artifactId>
+ <version>1.5.0-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>onos-app-openstacknetworking</artifactId>
+ <packaging>pom</packaging>
+
+ <modules>
+ <module>app</module>
+ <module>web</module>
+ <module>api</module>
+ <module>openstackswitching</module>
+ <module>openstackrouting</module>
+ </modules>
+
+
+ <description>SONA Openstack Networking XXXX Application</description>
+
+ <dependencies>
+ </dependencies>
+</project>
diff --git a/apps/openstackswitching/app/features.xml b/apps/openstacknetworking/web/features.xml
similarity index 69%
copy from apps/openstackswitching/app/features.xml
copy to apps/openstacknetworking/web/features.xml
index a4e2639..5aa4f15 100644
--- a/apps/openstackswitching/app/features.xml
+++ b/apps/openstacknetworking/web/features.xml
@@ -18,11 +18,8 @@
<feature name="${project.artifactId}" version="${project.version}"
description="${project.description}">
<feature>onos-api</feature>
- <bundle>mvn:${project.groupId}/onos-app-openstackswitching-api/${project.version}</bundle>
- <bundle>mvn:${project.groupId}/onos-app-openstackswitching/${project.version}</bundle>
- <bundle>mvn:${project.groupId}/onos-app-dhcp-api/${project.version}</bundle>
- <bundle>mvn:${project.groupId}/onos-app-dhcp/${project.version}</bundle>
- <bundle>mvn:${project.groupId}/onos-app-openstackrouting/${project.version}</bundle>
+ <bundle>mvn:${project.groupId}/onos-app-openstacknetworking-api/${project.version}</bundle>
+ <bundle>mvn:${project.groupId}/onos-app-openstacknetworking-web/${project.version}</bundle>
<bundle>mvn:com.sun.jersey/jersey-client/1.19</bundle>
</feature>
</features>
diff --git a/apps/openstackswitching/app/pom.xml b/apps/openstacknetworking/web/pom.xml
similarity index 90%
rename from apps/openstackswitching/app/pom.xml
rename to apps/openstacknetworking/web/pom.xml
index fadcec4..3db71f6 100644
--- a/apps/openstackswitching/app/pom.xml
+++ b/apps/openstacknetworking/web/pom.xml
@@ -21,31 +21,28 @@
<parent>
<groupId>org.onosproject</groupId>
- <artifactId>onos-openstackswitching</artifactId>
+ <artifactId>onos-app-openstacknetworking</artifactId>
<version>1.5.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath>
</parent>
- <artifactId>onos-app-openstackswitching</artifactId>
+ <artifactId>onos-app-openstacknetworking-web</artifactId>
<packaging>bundle</packaging>
- <description>SONA Openstack Switching applications</description>
<properties>
<web.context>/onos/openstackswitching</web.context>
<api.version>1.0.0</api.version>
- <api.title>ONOS OpenStack Switching REST API</api.title>
+ <api.title>ONOS Openstack Networking REST API</api.title>
<api.description>
- APIs for receiving Neutron information.
+ APIs for interacting with Openstack Neutron Plugin.
</api.description>
- <api.package>org.onosproject.openstackswitching.web</api.package>
- <onos.app.origin>SKT, Inc.</onos.app.origin>
+ <api.package>org.onosproject.openstacknetworking.web</api.package>
</properties>
-
<dependencies>
<dependency>
<groupId>org.onosproject</groupId>
- <artifactId>onos-app-openstackswitching-api</artifactId>
+ <artifactId>onos-app-openstacknetworking-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpensatckRouterWebResource.java b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpensatckRouterWebResource.java
similarity index 77%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpensatckRouterWebResource.java
rename to apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpensatckRouterWebResource.java
index aa9dfe4..d7d6b6d 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpensatckRouterWebResource.java
+++ b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpensatckRouterWebResource.java
@@ -13,13 +13,13 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.onosproject.openstackswitching.web;
+package org.onosproject.openstacknetworking.web;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.onosproject.openstackrouting.OpenstackRouter;
-import org.onosproject.openstackrouting.OpenstackRouterInterface;
-import org.onosproject.openstackswitching.OpenstackSwitchingService;
+import org.onosproject.openstacknetworking.OpenstackRouter;
+import org.onosproject.openstacknetworking.OpenstackRouterInterface;
+import org.onosproject.openstacknetworking.OpenstackRoutingService;
import org.onosproject.rest.AbstractWebResource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -42,8 +42,7 @@
@Path("routers")
public class OpensatckRouterWebResource extends AbstractWebResource {
- protected static final Logger log = LoggerFactory
- .getLogger(OpenstackNetworkWebResource.class);
+ private final Logger log = LoggerFactory.getLogger(getClass());
private static final OpenstackRouterInterfaceCodec ROUTER_INTERFACE_CODEC
= new OpenstackRouterInterfaceCodec();
@@ -62,9 +61,9 @@
OpenstackRouter openstackRouter
= ROUTER_CODEC.decode(routerNode, this);
- OpenstackSwitchingService switchingService
- = getService(OpenstackSwitchingService.class);
- switchingService.createRouter(openstackRouter);
+ OpenstackRoutingService routingService
+ = getService(OpenstackRoutingService.class);
+ routingService.createRouter(openstackRouter);
log.debug("REST API CREATE router is called {}", input.toString());
return Response.status(Response.Status.OK).build();
@@ -80,14 +79,20 @@
@Path("{id}")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
- public Response updateRouter(@PathParam("id") String id) {
- checkNotNull(id);
+ public Response updateRouter(InputStream input) {
+ checkNotNull(input);
try {
- OpenstackSwitchingService switchingService
- = getService(OpenstackSwitchingService.class);
- switchingService.updateRouter(id);
+ ObjectMapper mapper = new ObjectMapper();
+ ObjectNode routerNode = (ObjectNode) mapper.readTree(input);
- log.debug("REST API UPDATE router is called from router {}", id);
+ OpenstackRouter openstackRouter
+ = ROUTER_CODEC.decode(routerNode, this);
+
+ OpenstackRoutingService routingService
+ = getService(OpenstackRoutingService.class);
+ routingService.updateRouter(openstackRouter);
+
+ log.debug("REST API UPDATE router is called from router {}", input.toString());
return Response.status(Response.Status.OK).build();
} catch (Exception e) {
log.error("Updates Router failed because of exception {}",
@@ -110,9 +115,9 @@
OpenstackRouterInterface openstackRouterInterface
= ROUTER_INTERFACE_CODEC.decode(routerIfNode, this);
- OpenstackSwitchingService switchingService
- = getService(OpenstackSwitchingService.class);
- switchingService.updateRouterInterface(openstackRouterInterface);
+ OpenstackRoutingService routingService
+ = getService(OpenstackRoutingService.class);
+ routingService.updateRouterInterface(openstackRouterInterface);
log.debug("REST API AddRouterInterface is called from router {} portId: {}, subnetId: {}, tenantId: {}",
openstackRouterInterface.id(), openstackRouterInterface.portId(),
@@ -129,11 +134,12 @@
@DELETE
@Path("{id}")
+ @Produces(MediaType.APPLICATION_JSON)
public Response deleteRouter(@PathParam("id") String id) {
checkNotNull(id);
- OpenstackSwitchingService switchingService =
- getService(OpenstackSwitchingService.class);
- switchingService.deleteRouter(id);
+ OpenstackRoutingService routingService
+ = getService(OpenstackRoutingService.class);
+ routingService.deleteRouter(id);
log.debug("REST API DELETE routers is called {}", id);
return Response.status(Response.Status.OK).build();
@@ -153,9 +159,9 @@
OpenstackRouterInterface openstackRouterInterface
= ROUTER_INTERFACE_CODEC.decode(routerIfNode, this);
- OpenstackSwitchingService switchingService
- = getService(OpenstackSwitchingService.class);
- switchingService.removeRouterInterface(openstackRouterInterface);
+ OpenstackRoutingService routingService
+ = getService(OpenstackRoutingService.class);
+ routingService.removeRouterInterface(openstackRouterInterface);
log.debug("REST API RemoveRouterInterface is called from router {} portId: {}, subnetId: {}," +
"tenantId: {}", openstackRouterInterface.id(), openstackRouterInterface.portId(),
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackNetworkCodec.java b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackNetworkCodec.java
similarity index 91%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackNetworkCodec.java
rename to apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackNetworkCodec.java
index 9203321..8e5d3af 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackNetworkCodec.java
+++ b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackNetworkCodec.java
@@ -13,13 +13,13 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.onosproject.openstackswitching.web;
+package org.onosproject.openstacknetworking.web;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.onosproject.codec.CodecContext;
import org.onosproject.codec.JsonCodec;
-import org.onosproject.openstackswitching.OpenstackNetwork;
+import org.onosproject.openstacknetworking.OpenstackNetwork;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -29,8 +29,7 @@
*/
public class OpenstackNetworkCodec extends JsonCodec<OpenstackNetwork> {
- protected static final Logger log = LoggerFactory
- .getLogger(OpenstackNetworkCodec.class);
+ private final Logger log = LoggerFactory.getLogger(getClass());
private static final String NETWORK = "network";
private static final String NAME = "name";
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackNetworkWebResource.java b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackNetworkWebResource.java
similarity index 92%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackNetworkWebResource.java
rename to apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackNetworkWebResource.java
index bf04cc4..5555266 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackNetworkWebResource.java
+++ b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackNetworkWebResource.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.onosproject.openstackswitching.web;
+package org.onosproject.openstacknetworking.web;
import org.onosproject.rest.AbstractWebResource;
import org.slf4j.Logger;
@@ -35,8 +35,7 @@
@Path("networks")
public class OpenstackNetworkWebResource extends AbstractWebResource {
- protected static final Logger log = LoggerFactory
- .getLogger(OpenstackNetworkWebResource.class);
+ private final Logger log = LoggerFactory.getLogger(getClass());
@POST
@Consumes(MediaType.APPLICATION_JSON)
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackRestHandler.java b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackNetworkingManager.java
similarity index 67%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackRestHandler.java
rename to apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackNetworkingManager.java
index ad8328e..093d0c1 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/impl/OpenstackRestHandler.java
+++ b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackNetworkingManager.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.onosproject.openstackswitching.impl;
+package org.onosproject.openstacknetworking.web;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
@@ -21,21 +21,32 @@
import com.google.common.collect.Lists;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
-import org.onosproject.openstackrouting.OpenstackRouter;
-import org.onosproject.openstackswitching.OpenstackNetwork;
-import org.onosproject.openstackswitching.OpenstackPort;
-import org.onosproject.openstackswitching.OpenstackSubnet;
-import org.onosproject.openstackswitching.web.OpenstackNetworkCodec;
-import org.onosproject.openstackswitching.web.OpenstackPortCodec;
-import org.onosproject.openstackswitching.web.OpenstackSecurityGroupCodec;
-import org.onosproject.openstackswitching.web.OpenstackRouterCodec;
-import org.onosproject.openstackswitching.web.OpenstackSubnetCodec;
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.Service;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.core.CoreService;
+import org.onosproject.net.Port;
+import org.onosproject.net.driver.DriverService;
+import org.onosproject.openstacknetworking.OpenstackNetwork;
+import org.onosproject.openstacknetworking.OpenstackNetworkingService;
+import org.onosproject.openstacknetworking.OpenstackPort;
+import org.onosproject.openstacknetworking.OpenstackPortInfo;
+import org.onosproject.openstacknetworking.OpenstackRouter;
+import org.onosproject.openstacknetworking.OpenstackSecurityGroup;
+import org.onosproject.openstacknetworking.OpenstackSubnet;
+import org.onosproject.openstacknetworking.OpenstackSwitchingService;
import org.slf4j.Logger;
import javax.ws.rs.core.MediaType;
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.net.MediaType.JSON_UTF_8;
@@ -45,7 +56,9 @@
* Handles REST Calls to Openstack Neutron.
*
*/
-public class OpenstackRestHandler {
+@Service
+@Component(immediate = true)
+public class OpenstackNetworkingManager implements OpenstackNetworkingService {
private static final String URI_NETWORKS = "networks";
private static final String URI_PORTS = "ports";
@@ -70,16 +83,29 @@
private String userName;
private String pass;
- /**
- * Creates OpenstackRestHandler instance.
- *
- * @param cfg OpenstackSwitchingConfig reference
- */
- public OpenstackRestHandler(OpenstackSwitchingConfig cfg) {
- this.neutronUrl = checkNotNull(cfg.neutronServer());
- this.keystoneUrl = checkNotNull(cfg.keystoneServer());
- this.userName = checkNotNull(cfg.userName());
- this.pass = checkNotNull(cfg.password());
+ private static final String PORT_NAME = "portName";
+
+ private ApplicationId appId;
+
+ @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+ protected CoreService coreService;
+
+ @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+ protected DriverService driverService;
+
+ protected OpenstackSwitchingService openstackSwitchingService;
+
+ @Activate
+ protected void activate() {
+ appId = coreService
+ .registerApplication("org.onosproject.openstacknetworking");
+
+ log.info("started");
+ }
+
+ @Deactivate
+ protected void deactivate() {
+ log.info("stopped");
}
/**
@@ -249,4 +275,79 @@
return true;
}
-}
+ @Override
+ public Collection<OpenstackPort> ports(String networkId) {
+ return getPorts().stream()
+ .filter(port -> port.networkId().equals(networkId))
+ .collect(Collectors.toList());
+ }
+
+ @Override
+ public Collection<OpenstackPort> ports() {
+ return getPorts();
+ }
+
+ @Override
+ public OpenstackPort port(Port port) {
+ String uuid = port.annotations().value(PORT_NAME).substring(3);
+ return getPorts().stream()
+ .filter(p -> p.id().startsWith(uuid))
+ .findAny().orElse(null);
+ }
+
+ @Override
+ public OpenstackPort port(String portId) {
+ return getPorts().stream()
+ .filter(p -> p.id().equals(portId))
+ .findAny().orElse(null);
+ }
+
+ @Override
+ public OpenstackNetwork network(String networkId) {
+ return getNetworks().stream()
+ .filter(n -> n.id().equals(networkId))
+ .findAny().orElse(null);
+ }
+
+ @Override
+ public Collection<OpenstackNetwork> networks() {
+ return getNetworks();
+ }
+
+ @Override
+ public OpenstackSubnet subnet(String subnetId) {
+ return getSubnets().stream()
+ .filter(subnet -> subnet.id().equals(subnetId))
+ .findAny().orElse(null);
+ }
+
+ @Override
+ public Collection<OpenstackSubnet> subnets() {
+ return getSubnets();
+ }
+
+ @Override
+ public Collection<OpenstackRouter> routers() {
+ return getRouters();
+ }
+
+ @Override
+ public OpenstackRouter router(String routerId) {
+ return getRouters().stream()
+ .filter(router -> router.id().equals(routerId))
+ .findAny().orElse(null);
+ }
+
+ @Override
+ public Map<String, OpenstackPortInfo> openstackPortInfo() {
+ return openstackSwitchingService.openstackPortInfo();
+ }
+
+ @Override
+ public void setConfigurations(String neutronUrl, String keystoneUrl, String userName, String pass) {
+ this.neutronUrl = checkNotNull(neutronUrl);
+ this.keystoneUrl = checkNotNull(keystoneUrl);
+ this.userName = checkNotNull(userName);
+ this.pass = checkNotNull(pass);
+ }
+}
\ No newline at end of file
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackPortCodec.java b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackPortCodec.java
similarity index 94%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackPortCodec.java
rename to apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackPortCodec.java
index b29b389..1ac3127 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackPortCodec.java
+++ b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackPortCodec.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.onosproject.openstackswitching.web;
+package org.onosproject.openstacknetworking.web;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
@@ -25,7 +25,7 @@
import org.onlab.packet.MacAddress;
import org.onosproject.codec.CodecContext;
import org.onosproject.codec.JsonCodec;
-import org.onosproject.openstackswitching.OpenstackPort;
+import org.onosproject.openstacknetworking.OpenstackPort;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -33,13 +33,14 @@
import java.util.HashMap;
import java.util.Map;
+import static com.google.common.base.Preconditions.checkNotNull;
+
/**
* Encodes and decodes the OpenstackPort.
*/
public class OpenstackPortCodec extends JsonCodec<OpenstackPort> {
- private static Logger log = LoggerFactory
- .getLogger(OpenstackPortCodec.class);
+ private final Logger log = LoggerFactory.getLogger(getClass());
// JSON field names
private static final String PORT = "port";
@@ -62,6 +63,7 @@
@Override
public OpenstackPort decode(ObjectNode json, CodecContext context) {
+ checkNotNull(json);
HashMap<String, Ip4Address> fixedIpMap = new HashMap<>();
JsonNode portInfo = json.get(PORT);
if (portInfo == null) {
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackPortWebResource.java b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackPortWebResource.java
similarity index 89%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackPortWebResource.java
rename to apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackPortWebResource.java
index 206e4b1..a60d81a 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackPortWebResource.java
+++ b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackPortWebResource.java
@@ -13,12 +13,12 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.onosproject.openstackswitching.web;
+package org.onosproject.openstacknetworking.web;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
-import org.onosproject.openstackswitching.OpenstackPort;
-import org.onosproject.openstackswitching.OpenstackSwitchingService;
+import org.onosproject.openstacknetworking.OpenstackPort;
+import org.onosproject.openstacknetworking.OpenstackSwitchingService;
import org.onosproject.rest.AbstractWebResource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -40,8 +40,7 @@
@Path("ports")
public class OpenstackPortWebResource extends AbstractWebResource {
- protected static final Logger log = LoggerFactory
- .getLogger(OpenstackPortWebResource.class);
+ private final Logger log = LoggerFactory.getLogger(getClass());
private static final OpenstackPortCodec PORT_CODEC = new OpenstackPortCodec();
@@ -70,11 +69,12 @@
}
@Path("{portUUID}")
+ @Produces(MediaType.APPLICATION_JSON)
@DELETE
public Response deletePorts(@PathParam("portUUID") String id) {
OpenstackSwitchingService switchingService =
getService(OpenstackSwitchingService.class);
- switchingService.deletePort(id);
+ switchingService.removePort(id);
return Response.status(Response.Status.OK).build();
}
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackRouterCodec.java b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackRouterCodec.java
similarity index 91%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackRouterCodec.java
rename to apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackRouterCodec.java
index afcf560..60600bf 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackRouterCodec.java
+++ b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackRouterCodec.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.onosproject.openstackswitching.web;
+package org.onosproject.openstacknetworking.web;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
@@ -22,8 +22,8 @@
import org.onlab.packet.Ip4Address;
import org.onosproject.codec.CodecContext;
import org.onosproject.codec.JsonCodec;
-import org.onosproject.openstackrouting.OpenstackExternalGateway;
-import org.onosproject.openstackrouting.OpenstackRouter;
+import org.onosproject.openstacknetworking.OpenstackExternalGateway;
+import org.onosproject.openstacknetworking.OpenstackRouter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static com.google.common.base.Preconditions.checkNotNull;
@@ -33,8 +33,7 @@
* Implementation of the OpenstackRouter Codec.
*/
public class OpenstackRouterCodec extends JsonCodec<OpenstackRouter> {
- protected static final Logger log = LoggerFactory
- .getLogger(OpenstackNetworkCodec.class);
+ private final Logger log = LoggerFactory.getLogger(getClass());
private static final String ROUTER = "router";
private static final String TENANT_ID = "tenant_id";
@@ -72,7 +71,7 @@
String status = checkNotNull(routerInfo.path(STATUS).asText());
String adminStateUp = checkNotNull(routerInfo.path(ADMIN_STATE_UP).asText());
- OpenstackExternalGateway.Builder osExtBuiler = OpenstackExternalGateway.builder();
+ OpenstackExternalGateway.Builder osExtBuiler = new OpenstackExternalGateway.Builder();
if (!routerInfo.path(EXTERNAL_GW_INFO).isMissingNode()) {
String externalGatewayNetId = checkNotNull(routerInfo.path(EXTERNAL_GW_INFO).path(NETWORK_ID).asText());
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackRouterInterfaceCodec.java b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackRouterInterfaceCodec.java
similarity index 90%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackRouterInterfaceCodec.java
rename to apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackRouterInterfaceCodec.java
index 88de443..5be664f 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackRouterInterfaceCodec.java
+++ b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackRouterInterfaceCodec.java
@@ -13,13 +13,13 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.onosproject.openstackswitching.web;
+package org.onosproject.openstacknetworking.web;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.onosproject.codec.CodecContext;
import org.onosproject.codec.JsonCodec;
-import org.onosproject.openstackrouting.OpenstackRouterInterface;
+import org.onosproject.openstacknetworking.OpenstackRouterInterface;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static com.google.common.base.Preconditions.checkNotNull;
@@ -27,8 +27,7 @@
* Implementation of the OpenstackRouterInterface Codec.
*/
public class OpenstackRouterInterfaceCodec extends JsonCodec<OpenstackRouterInterface> {
- protected static final Logger log = LoggerFactory
- .getLogger(OpenstackNetworkCodec.class);
+ private final Logger log = LoggerFactory.getLogger(getClass());
private static final String ID = "id";
private static final String TENANT_ID = "tenant_id";
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackSecurityGroupCodec.java b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackSecurityGroupCodec.java
similarity index 91%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackSecurityGroupCodec.java
rename to apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackSecurityGroupCodec.java
index ae9847e..c9519a7 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackSecurityGroupCodec.java
+++ b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackSecurityGroupCodec.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.onosproject.openstackswitching.web;
+package org.onosproject.openstacknetworking.web;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
@@ -21,8 +21,8 @@
import com.google.common.collect.Lists;
import org.onosproject.codec.CodecContext;
import org.onosproject.codec.JsonCodec;
-import org.onosproject.openstackswitching.impl.OpenstackSecurityGroup;
-import org.onosproject.openstackswitching.impl.OpenstackSecurityGroupRule;
+import org.onosproject.openstacknetworking.OpenstackSecurityGroup;
+import org.onosproject.openstacknetworking.OpenstackSecurityGroupRule;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -33,8 +33,7 @@
*/
public class OpenstackSecurityGroupCodec extends JsonCodec<OpenstackSecurityGroup> {
- private static Logger log = LoggerFactory
- .getLogger(OpenstackSecurityGroupCodec.class);
+ private final Logger log = LoggerFactory.getLogger(getClass());
private static final String SECURITY_GROUP = "security_group";
private static final String DESCRIPTION = "description";
@@ -66,7 +65,7 @@
Collection<OpenstackSecurityGroupRule> rules = Lists.newArrayList();
for (JsonNode ruleInfo: ruleInfoList) {
OpenstackSecurityGroupRule openstackSecurityGroupRule =
- OpenstackSecurityGroupRule.builder()
+ new OpenstackSecurityGroupRule.Builder()
.direction(ruleInfo.path(DIRECTION).asText())
.etherType(ruleInfo.path(EHTERTYPE).asText())
.id(ruleInfo.path(ID).asText())
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackSubnetCodec.java b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackSubnetCodec.java
similarity index 91%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackSubnetCodec.java
rename to apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackSubnetCodec.java
index 2a7af82..4bcb494 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackSubnetCodec.java
+++ b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackSubnetCodec.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.onosproject.openstackswitching.web;
+package org.onosproject.openstacknetworking.web;
import com.fasterxml.jackson.databind.JsonNode;
@@ -24,18 +24,19 @@
import org.onlab.packet.Ip4Address;
import org.onosproject.codec.CodecContext;
import org.onosproject.codec.JsonCodec;
-import org.onosproject.openstackswitching.OpenstackSubnet;
+import org.onosproject.openstacknetworking.OpenstackSubnet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
+import static com.google.common.base.Preconditions.checkNotNull;
+
/**
* Encodes and decodes the OpenstackSubnet.
*/
public class OpenstackSubnetCodec extends JsonCodec<OpenstackSubnet> {
- private static Logger log = LoggerFactory
- .getLogger(OpenstackSubnetCodec.class);
+ private final Logger log = LoggerFactory.getLogger(getClass());
// JSON Field names
private static final String SUBNET = "subnet";
@@ -50,6 +51,7 @@
@Override
public OpenstackSubnet decode(ObjectNode json, CodecContext context) {
+ checkNotNull(json);
JsonNode subnetInfo = json.get(SUBNET);
if (subnetInfo == null) {
subnetInfo = json;
diff --git a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackSubnetWebResource.java b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackSubnetWebResource.java
similarity index 84%
rename from apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackSubnetWebResource.java
rename to apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackSubnetWebResource.java
index 43205ea..1b8f47e 100644
--- a/apps/openstackswitching/app/src/main/java/org/onosproject/openstackswitching/web/OpenstackSubnetWebResource.java
+++ b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/OpenstackSubnetWebResource.java
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.onosproject.openstackswitching.web;
+package org.onosproject.openstacknetworking.web;
/**
* Handles Rest API call from Neutron ML2 plugin.
@@ -47,21 +47,18 @@
@PUT
- @Path("{subnetUUID}")
+ @Path("{subnetId}")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
- public Response updateSubnet(@PathParam("id") String id,
+ public Response updateSubnet(@PathParam("subnetId") String id,
final InputStream input) {
return Response.status(Response.Status.OK).build();
-
}
@DELETE
- @Path("{subnetUUID}")
+ @Path("{subnetId}")
@Produces(MediaType.APPLICATION_JSON)
- @Consumes(MediaType.APPLICATION_JSON)
- public Response deleteSubnet(@PathParam("id") String id,
- final InputStream input) {
+ public Response deleteSubnet(@PathParam("subnetId") String id) {
return Response.status(Response.Status.OK).build();
}
diff --git a/apps/openstackswitching/api/src/main/java/org/onosproject/openstackswitching/package-info.java b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/package-info.java
similarity index 87%
rename from apps/openstackswitching/api/src/main/java/org/onosproject/openstackswitching/package-info.java
rename to apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/package-info.java
index ff21937..987a22e 100644
--- a/apps/openstackswitching/api/src/main/java/org/onosproject/openstackswitching/package-info.java
+++ b/apps/openstacknetworking/web/src/main/java/org/onosproject/openstacknetworking/web/package-info.java
@@ -15,6 +15,6 @@
*/
/**
- * OpenStack switch API.
+ * OpenStack networking implementation.
*/
-package org.onosproject.openstackswitching;
+package org.onosproject.openstacknetworking.web;
diff --git a/apps/openstackswitching/app/src/main/webapp/WEB-INF/web.xml b/apps/openstacknetworking/web/src/main/webapp/WEB-INF/web.xml
similarity index 84%
rename from apps/openstackswitching/app/src/main/webapp/WEB-INF/web.xml
rename to apps/openstacknetworking/web/src/main/webapp/WEB-INF/web.xml
index 923eff6..edb555b 100644
--- a/apps/openstackswitching/app/src/main/webapp/WEB-INF/web.xml
+++ b/apps/openstacknetworking/web/src/main/webapp/WEB-INF/web.xml
@@ -30,10 +30,10 @@
<init-param>
<param-name>com.sun.jersey.config.property.classnames</param-name>
<param-value>
- org.onosproject.openstackswitching.web.OpenstackPortWebResource,
- org.onosproject.openstackswitching.web.OpenstackNetworkWebResource,
- org.onosproject.openstackswitching.web.OpenstackSubnetWebResource,
- org.onosproject.openstackswitching.web.OpensatckRouterWebResource
+ org.onosproject.openstacknetworking.web.OpenstackPortWebResource,
+ org.onosproject.openstacknetworking.web.OpenstackNetworkWebResource,
+ org.onosproject.openstacknetworking.web.OpenstackSubnetWebResource,
+ org.onosproject.openstacknetworking.web.OpensatckRouterWebResource
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
diff --git a/apps/openstackswitching/api/src/main/java/org/onosproject/openstackswitching/OpenstackSwitchingService.java b/apps/openstackswitching/api/src/main/java/org/onosproject/openstackswitching/OpenstackSwitchingService.java
deleted file mode 100644
index f81ddae..0000000
--- a/apps/openstackswitching/api/src/main/java/org/onosproject/openstackswitching/OpenstackSwitchingService.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Copyright 2015-2016 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.openstackswitching;
-
-import org.onosproject.net.Port;
-import org.onosproject.openstackrouting.OpenstackRouter;
-import org.onosproject.openstackrouting.OpenstackRouterInterface;
-
-import java.util.Collection;
-
-/**
- * Handles port management REST API from Openstack for VMs.
- */
-public interface OpenstackSwitchingService {
-
- /**
- * Store the port information created by Openstack.
- *
- * @param openstackPort port information
- */
- void createPorts(OpenstackPort openstackPort);
-
- /**
- * Removes flow rules corresponding to the port removed by Openstack.
- *
- * @param uuid UUID
- */
- void deletePort(String uuid);
-
- /**
- * Updates flow rules corresponding to the port information updated by Openstack.
- *
- * @param openstackPort OpenStack port
- */
- void updatePort(OpenstackPort openstackPort);
-
- /**
- * Stores the network information created by openstack.
- *
- * @param openstackNetwork network information
- */
- void createNetwork(OpenstackNetwork openstackNetwork);
-
- /**
- * Stores the subnet information created by openstack.
- *
- * @param openstackSubnet subnet information
- */
- void createSubnet(OpenstackSubnet openstackSubnet);
-
- /**
- * Returns port information list for the network ID given.
- *
- * @param networkId Network ID of the ports
- * @return port information list
- */
- Collection<OpenstackPort> ports(String networkId);
-
- /**
- * Returns port information list.
- *
- * @return port information list
- */
- Collection<OpenstackPort> ports();
- /**
- * Returns port information for the port given.
- *
- * @param port port reference
- * @return port information
- */
- OpenstackPort port(Port port);
-
- /**
- * Returns port information for the port ID given.
- *
- * @param portId Port ID
- * @return port information
- */
- OpenstackPort port(String portId);
-
- /**
- * Returns network information list for the network ID given.
- *
- * @param networkId Network ID
- * @return network information list, or null if not present
- */
- OpenstackNetwork network(String networkId);
-
-
- /**
- * Returns subnet information for the subnet ID give.
- *
- * @param subnetId Subnet ID
- * @return subnet information, or null if not present
- */
- OpenstackSubnet subnet(String subnetId);
-
- /**
- * Sends the created router information to OpenstackRouting service.
- *
- * @param openstackRouter Router Information
- */
- void createRouter(OpenstackRouter openstackRouter);
- /**
- * Sends the updated router information to OpenstackRouting service.
- *
- * @param routerId Router ID
- */
- void updateRouter(String routerId);
- /**
- * Sends the removed router information to OpenstackRouting service.
- *
- * @param routerId Router ID
- */
- void deleteRouter(String routerId);
-
- /**
- * Sends the updated router interface information to OpenstackRouting service.
- *
- * @param openstackRouterInterface Router interface information
- */
- void updateRouterInterface(OpenstackRouterInterface openstackRouterInterface);
-
- /**
- * Sends the removed router interface information to OpenstackRouting service.
- *
- * @param openstackRouterInterface Router interface information
- */
- void removeRouterInterface(OpenstackRouterInterface openstackRouterInterface);
-
- /**
- * Returns the router information list.
- *
- * @return router information list
- */
- Collection<OpenstackRouter> routers();
-
- /**
- * Returns the router information for the router ID given.
- *
- * @param routerId router ID
- * @return router information
- */
- OpenstackRouter router(String routerId);
-
- /**
- * Returns the OpensatckPortInfo list.
- *
- * @return OpensatckPortInfo list
- */
- Collection<OpenstackPortInfo> portInfos();
-
- /**
- * Returns the MacAddress for physical router.
- *
- * @return physical router mac
- */
- String physicalRouterMac();
-
-
-}
diff --git a/apps/pom.xml b/apps/pom.xml
index 3e3aebe..0aa0716 100644
--- a/apps/pom.xml
+++ b/apps/pom.xml
@@ -59,16 +59,15 @@
<module>igmp</module>
<module>pim</module>
<module>mlb</module>
- <module>openstackswitching</module>
<module>pathpainter</module>
<module>drivermatrix</module>
<module>cpman</module>
<module>events</module>
<module>vrouter</module>
- <module>openstackrouting</module>
<module>cordmcast</module>
<module>vpls</module>
<module>openstacknode</module>
+ <module>openstacknetworking</module>
</modules>
<properties>