HONEYCOMB-249 Add Ipv4Range calulator utility
authorMaros Marsalek <[email protected]>
Mon, 10 Oct 2016 13:30:12 +0000 (15:30 +0200)
committerMarek Gradzki <[email protected]>
Fri, 14 Oct 2016 05:44:00 +0000 (05:44 +0000)
Change-Id: If55fdafd6ed0a9c6acb9de74bf64154d3f26b2d5
Signed-off-by: Maros Marsalek <[email protected]>
vpp-common/vpp-translate-utils/src/main/java/io/fd/honeycomb/translate/vpp/util/Ipv4AddressRange.java [new file with mode: 0644]
vpp-common/vpp-translate-utils/src/main/java/io/fd/honeycomb/translate/vpp/util/Ipv4Translator.java
vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/Ipv4AddressRangeTest.java [new file with mode: 0644]

diff --git a/vpp-common/vpp-translate-utils/src/main/java/io/fd/honeycomb/translate/vpp/util/Ipv4AddressRange.java b/vpp-common/vpp-translate-utils/src/main/java/io/fd/honeycomb/translate/vpp/util/Ipv4AddressRange.java
new file mode 100644 (file)
index 0000000..8408e79
--- /dev/null
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * 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 io.fd.honeycomb.translate.vpp.util;
+
+import java.util.Objects;
+import javax.annotation.Nonnull;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4AddressNoZone;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
+
+/**
+ * IPv4 address range representation.
+ */
+public final class Ipv4AddressRange {
+
+    private final Ipv4AddressNoZone start;
+    private final Ipv4AddressNoZone end;
+
+    private Ipv4AddressRange(@Nonnull final Ipv4AddressNoZone start, @Nonnull final Ipv4AddressNoZone end) {
+        this.start = start;
+        this.end = end;
+    }
+
+    public Ipv4AddressNoZone getStart() {
+        return start;
+    }
+
+    public Ipv4AddressNoZone getEnd() {
+        return end;
+    }
+
+    @Override
+    public boolean equals(final Object other) {
+        if (this == other) {
+            return true;
+        }
+        if (other == null || getClass() != other.getClass()) {
+            return false;
+        }
+        final Ipv4AddressRange that = (Ipv4AddressRange) other;
+        return Objects.equals(start, that.start)
+                && Objects.equals(end, that.end);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(start, end);
+    }
+
+    @Override
+    public String toString() {
+        return "Ipv4AddressRange{"
+                + "start=" + start
+                + ", end=" + end
+                + '}';
+    }
+
+    /**
+     * Create address range from prefix.
+     */
+    public static Ipv4AddressRange fromPrefix(final Ipv4Prefix externalIpPool) {
+        final String addressString = externalIpPool.getValue().split("/")[0];
+        byte prefixLength = Ipv4Translator.INSTANCE.extractPrefix(externalIpPool);
+
+        if (prefixLength == 32) {
+            // 32 Prefix can be handled instantly
+            return new Ipv4AddressRange(new Ipv4AddressNoZone(addressString), new Ipv4AddressNoZone(addressString));
+        }
+
+        final byte[] prefixAddrBytes = Ipv4Translator.INSTANCE.ipv4AddressNoZoneToArray(addressString);
+        final byte[] prefixAddrBytes0 = new byte[prefixAddrBytes.length];
+        final byte[] prefixAddrBytesF = new byte[prefixAddrBytes.length];
+
+        byte index = 0;
+        while (prefixLength >= 8) {
+            prefixAddrBytes0[index] = prefixAddrBytes[index];
+            prefixAddrBytesF[index] = prefixAddrBytes[index];
+            index++;
+            prefixLength -= 8;
+        }
+
+        // Take care of the rest
+        if (prefixLength != 0) {
+            final int mask0 = (byte) (Math.pow(2, prefixLength) - 1) << (8 - prefixLength);
+            prefixAddrBytes0[index] = (byte) (prefixAddrBytes[index] & mask0);
+
+            final int maskF = (byte) (Math.pow(2, 8 - prefixLength) - 1);
+            prefixAddrBytesF[index] = (byte) (prefixAddrBytes[index] | maskF);
+
+            index++;
+        }
+
+        for (int i = index; i < 4; i++) {
+            prefixAddrBytes0[i] = 0;
+            prefixAddrBytesF[i] = (byte) 255;
+        }
+
+        return new Ipv4AddressRange(Ipv4Translator.INSTANCE.arrayToIpv4AddressNoZoneReversed(prefixAddrBytes0),
+                Ipv4Translator.INSTANCE.arrayToIpv4AddressNoZoneReversed(prefixAddrBytesF));
+    }
+}
index ff737d4..b5f93df 100644 (file)
@@ -30,6 +30,9 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.
  */
 public interface Ipv4Translator extends ByteDataTranslator {
 
+    /**
+     * Make available also from static context.
+     */
     Ipv4Translator INSTANCE = new Ipv4Translator() {};
 
     /**
diff --git a/vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/Ipv4AddressRangeTest.java b/vpp-common/vpp-translate-utils/src/test/java/io/fd/honeycomb/translate/vpp/util/Ipv4AddressRangeTest.java
new file mode 100644 (file)
index 0000000..aef81fc
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2016 Cisco and/or its affiliates.
+ *
+ * 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 io.fd.honeycomb.translate.vpp.util;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Arrays;
+import java.util.Collection;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
+
+@RunWith(Parameterized.class)
+public class Ipv4AddressRangeTest {
+
+    private final String prefix;
+    private final String start;
+    private final String end;
+
+    public Ipv4AddressRangeTest(String prefix, String start, String end) {
+        this.prefix = prefix;
+        this.start = start;
+        this.end = end;
+    }
+
+    @Parameterized.Parameters
+    public static Collection<Object[]> data() {
+        return Arrays.asList(new Object[][] {
+                { "1.1.1.1/0", "0.0.0.0", "255.255.255.255"},
+                { "1.1.1.1/32", "1.1.1.1", "1.1.1.1"},
+                { "192.168.1.5/8", "192.0.0.0", "192.255.255.255"},
+                { "192.168.1.5/10", "192.128.0.0", "192.191.255.255"}
+        });
+    }
+
+    @Test
+    public void test() throws Exception {
+        final Ipv4AddressRange range = Ipv4AddressRange.fromPrefix(new Ipv4Prefix(prefix));
+        assertEquals(start, range.getStart().getValue());
+        assertEquals(end, range.getEnd().getValue());
+    }
+}
\ No newline at end of file