[ONOS-2815] add RouterGateway for Router api

Change-Id: I65843e29173782dc53f82163b3ffe369d6be8223
diff --git a/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/RouterGateway.java b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/RouterGateway.java
new file mode 100644
index 0000000..9a75556
--- /dev/null
+++ b/apps/vtn/vtnrsc/src/main/java/org/onosproject/vtnrsc/RouterGateway.java
@@ -0,0 +1,108 @@
+/*

+ * Copyright 2015 Open Networking Laboratory

+ *

+ * Licensed under the Apache License, Version 2.0 (the "License");

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ *

+ *     http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ */

+package org.onosproject.vtnrsc;

+

+import static com.google.common.base.MoreObjects.toStringHelper;

+import static com.google.common.base.Preconditions.checkNotNull;

+

+import java.util.Collection;

+import java.util.Objects;

+

+/**

+ * Representation of a Router gateway.

+ */

+public final class RouterGateway {

+

+    private final TenantNetworkId networkId;

+    private final boolean enableSnat;

+    private final Collection<FixedIp> externalFixedIps;

+

+    // Public construction is prohibited

+    private RouterGateway(TenantNetworkId networkId, boolean enableSnat,

+                         Collection<FixedIp> externalFixedIps) {

+        this.networkId = checkNotNull(networkId, "networkId cannot be null");

+        this.enableSnat = checkNotNull(enableSnat, "enableSnat cannot be null");

+        this.externalFixedIps = checkNotNull(externalFixedIps, "externalFixedIps cannot be null");

+    }

+

+    /**

+     * Creates router gateway object.

+     *

+     * @param networkId network identifier

+     * @param enableSnat SNAT enable or not

+     * @param externalFixedIps external fixed IP

+     * @return RouterGateway

+     */

+    public static RouterGateway routerGateway(TenantNetworkId networkId, boolean enableSnat,

+                                              Collection<FixedIp> externalFixedIps) {

+        return new RouterGateway(networkId, enableSnat, externalFixedIps);

+    }

+

+    /**

+     * Returns network identifier.

+     *

+     * @return networkId

+     */

+    public TenantNetworkId networkId() {

+        return networkId;

+    }

+

+    /**

+     * Return SNAT enable or not.

+     *

+     * @return enableSnat

+     */

+    public boolean enableSnat() {

+        return enableSnat;

+    }

+

+    /**

+     * Return external fixed Ip.

+     *

+     * @return externalFixedIps

+     */

+    public Collection<FixedIp> externalFixedIps() {

+        return externalFixedIps;

+    }

+

+    @Override

+    public int hashCode() {

+        return Objects.hash(networkId, enableSnat, externalFixedIps);

+    }

+

+    @Override

+    public boolean equals(Object obj) {

+        if (this == obj) {

+            return true;

+        }

+        if (obj instanceof RouterGateway) {

+            final RouterGateway that = (RouterGateway) obj;

+            return Objects.equals(this.networkId, that.networkId)

+                    && Objects.equals(this.enableSnat, that.enableSnat)

+                    && Objects.equals(this.externalFixedIps, that.externalFixedIps);

+        }

+        return false;

+    }

+

+    @Override

+    public String toString() {

+        return toStringHelper(this)

+                .add("networkId", networkId)

+                .add("enableSnat", enableSnat)

+                .add("externalFixedIps", externalFixedIps)

+                .toString();

+    }

+}

diff --git a/apps/vtn/vtnrsc/src/test/java/org/onosproject/vtnrsc/router/RouterGatewayTest.java b/apps/vtn/vtnrsc/src/test/java/org/onosproject/vtnrsc/router/RouterGatewayTest.java
new file mode 100644
index 0000000..ce6b6c0
--- /dev/null
+++ b/apps/vtn/vtnrsc/src/test/java/org/onosproject/vtnrsc/router/RouterGatewayTest.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.vtnrsc.router;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.junit.Test;
+import org.onosproject.vtnrsc.RouterGateway;
+import org.onosproject.vtnrsc.TenantNetworkId;
+import org.onosproject.vtnrsc.FixedIp;
+
+import com.google.common.testing.EqualsTester;
+
+/**
+ * Unit tests for RouterGateway class.
+ */
+public class RouterGatewayTest {
+    final TenantNetworkId networkId1 = TenantNetworkId.networkId("1");
+    final TenantNetworkId networkId2 = TenantNetworkId.networkId("2");
+    final Set<FixedIp> fixedIpSet1 = new HashSet<>();
+    final Set<FixedIp> fixedIpSet2 = new HashSet<>();
+
+    /**
+     * Checks that the RouterGateway class is immutable.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutable(RouterGateway.class);
+    }
+
+    /**
+     * Checks the operation of equals().
+     */
+    @Test
+    public void testEquals() {
+        RouterGateway routerGateway1 = RouterGateway.routerGateway(networkId1,
+                                                                   true,
+                                                                   fixedIpSet1);
+        RouterGateway routerGateway2 = RouterGateway.routerGateway(networkId1,
+                                                                   true,
+                                                                   fixedIpSet1);
+        RouterGateway routerGateway3 = RouterGateway.routerGateway(networkId2,
+                                                                   true,
+                                                                   fixedIpSet2);
+        new EqualsTester().addEqualityGroup(routerGateway1, routerGateway2)
+                .addEqualityGroup(routerGateway3).testEquals();
+    }
+
+    /**
+     * Checks the construction of a RouterGateway object.
+     */
+    @Test
+    public void testConstruction() {
+        RouterGateway routerGateway = RouterGateway.routerGateway(networkId1,
+                                                                  true,
+                                                                  fixedIpSet1);
+        assertThat(fixedIpSet1, is(notNullValue()));
+        assertThat(fixedIpSet1, is(routerGateway.externalFixedIps()));
+        assertThat(networkId1, is(notNullValue()));
+        assertThat(networkId1, is(routerGateway.networkId()));
+        assertThat(routerGateway.enableSnat(), is(true));
+    }
+}