K8s doesn't necessarily support DNS
[aaf/authz.git] / cadi / client / src / main / java / org / onap / aaf / cadi / locator / DNSLocator.java
index 1fc4b83..8053dab 100644 (file)
@@ -27,11 +27,10 @@ import java.net.URI;
 import java.net.URISyntaxException;
 
 import org.onap.aaf.cadi.Access;
-import org.onap.aaf.cadi.Locator;
-import org.onap.aaf.cadi.LocatorException;
 import org.onap.aaf.cadi.Access.Level;
+import org.onap.aaf.cadi.LocatorException;
 
-public class DNSLocator implements Locator<URI> {
+public class DNSLocator implements SizedLocator<URI> {
     private static enum Status {UNTRIED, OK, INVALID, SLOW};
     private static final int CHECK_TIME = 3000;
     
@@ -40,13 +39,15 @@ public class DNSLocator implements Locator<URI> {
     private Host[] hosts;
     private int startPort, endPort;
     private String suffix;
+
+    private int size = 1; // initial, until refreshed.
     
     public DNSLocator(Access access, String protocol, String host, String range) {
         this.host = host;
         this.protocol = protocol;
         this.access = access;
         int dash = range.indexOf('-');
-        if(dash<0) {
+        if (dash<0) {
             startPort = endPort = Integer.parseInt(range);
         } else {
             startPort = Integer.parseInt(range.substring(0,dash));
@@ -57,23 +58,27 @@ public class DNSLocator implements Locator<URI> {
 
     public DNSLocator(Access access, String aaf_locate) throws LocatorException {
         this.access = access;
-        if(aaf_locate==null) {
+        if (aaf_locate==null) {
             throw new LocatorException("Null passed into DNSLocator constructor");
         }
-        int start, port;
-        if(aaf_locate.startsWith("https:")) {
-            protocol = "https:";
-            start = 9; // https://
-            port = 443;
-        } else if(aaf_locate.startsWith("http:")) {
-            protocol = "http:";
-            start = 8; // http://
-            port = 80;
+        int start, defPort;
+        if (aaf_locate.startsWith("https://")) {
+            protocol = "https";
+            start = 8; // https://
+            defPort = 443;
+        } else if (aaf_locate.startsWith("http://")) {
+            protocol = "http";
+            start = 7; // http://
+            defPort = 80;
         } else {
             throw new LocatorException("DNSLocator accepts only https or http protocols.  (requested URL " + aaf_locate + ')');
         }
-        
-        parsePorts(aaf_locate.substring(start), port);
+        host = parseHostAndPorts(aaf_locate, start, defPort);
+        refresh();
+    }
+
+    public static DNSLocator create(Access access, String url) throws LocatorException {
+        return new DNSLocator(access, url);
     }
 
     @Override
@@ -83,8 +88,8 @@ public class DNSLocator implements Locator<URI> {
 
     @Override
     public boolean hasItems() {
-        for(Host h : hosts) {
-            if(h.status==Status.OK) {
+        for (Host h : hosts) {
+            if (h.status==Status.OK) {
                 return true;
             }
         }
@@ -100,7 +105,7 @@ public class DNSLocator implements Locator<URI> {
     @Override
     public Item best() throws LocatorException {
         // not a good "best"
-        for(int i=0;i<hosts.length;++i) {
+        for (int i=0;i<hosts.length;++i) {
             switch(hosts[i].status) {
                 case OK:
                     return new DLItem(i);
@@ -110,7 +115,7 @@ public class DNSLocator implements Locator<URI> {
                     break;
                 case UNTRIED:
                     try {
-                        if(hosts[i].ia.isReachable(CHECK_TIME)) {
+                        if (hosts[i].ia.isReachable(CHECK_TIME)) {
                             hosts[i].status = Status.OK;
                             return new DLItem(i);
                         }
@@ -133,7 +138,7 @@ public class DNSLocator implements Locator<URI> {
     @Override
     public Item next(Item item) throws LocatorException {
         DLItem di = (DLItem)item;
-        if(++di.cnt<hosts.length) {
+        if (++di.cnt<hosts.length) {
             return di;
         } else {
             return null;
@@ -146,12 +151,13 @@ public class DNSLocator implements Locator<URI> {
             InetAddress[] ias = InetAddress.getAllByName(host);
             Host[] temp = new Host[ias.length * (1 + endPort - startPort)];
             int cnt = -1;
-            for(int j=startPort; j<=endPort; ++j) {
-                for(int i=0;i<ias.length;++i) {
+            for (int j=startPort; j<=endPort; ++j) {
+                for (int i=0;i<ias.length;++i) {
                     temp[++cnt] = new Host(ias[i], j, suffix);
                 }
             }
             hosts = temp;
+            size = temp.length * (endPort-startPort+1);
             return true;
         } catch (Exception e) {
             access.log(Level.ERROR, e);
@@ -159,13 +165,14 @@ public class DNSLocator implements Locator<URI> {
         return false;
     }
     
-    private void parsePorts(String aaf_locate, int defaultPort) throws LocatorException {
+    private String parseHostAndPorts(String aaf_locate, int _start, int defaultPort) throws LocatorException {
         int slash, start;
-        int colon = aaf_locate.indexOf(':');
-        if(colon > 0) {
+        int colon = aaf_locate.indexOf(':',_start);
+        if (colon > 0) {
+            host = aaf_locate.substring(_start,colon);
             start = colon + 1;
             int left = aaf_locate.indexOf('[', start);
-            if(left > 0) {
+            if (left > 0) {
                 int right = aaf_locate.indexOf(']', left + 1);
                 if (right < 0) {
                     throw new LocatorException("Missing closing bracket in DNSLocator constructor.  (requested URL " + aaf_locate + ')');
@@ -176,27 +183,36 @@ public class DNSLocator implements Locator<URI> {
                 if (dash == (right - 1) || dash == (left + 1)) {
                     throw new LocatorException("Missing ports in brackets in DNSLocator constructor.  (requested URL " + aaf_locate + ')');
                 }
-                if(dash < 0) {
+                if (dash < 0) {
                     startPort = endPort = Integer.parseInt(aaf_locate.substring(left + 1, right));
                 } else {
                     startPort = Integer.parseInt(aaf_locate.substring(left + 1, dash));
                     endPort = Integer.parseInt(aaf_locate.substring(dash + 1, right));
                 }
+                slash = aaf_locate.indexOf('/', start);
+                if(slash>=0) {
+                    suffix = aaf_locate.substring(slash);
+                }
                 
             } else {
                 slash = aaf_locate.indexOf('/', start);
                 if (slash == start) {
                     throw new LocatorException("Missing port before '/' in DNSLocator constructor.  (requested URL " + aaf_locate + ')');
                 }
-                if(slash < 0) {
+                if (slash < 0) {
                     startPort = endPort = Integer.parseInt(aaf_locate.substring(start));
                 } else {
                     startPort = endPort = Integer.parseInt(aaf_locate.substring(start, slash));
+                    suffix = aaf_locate.substring(slash);
                 }
             }
         } else {
+            slash = aaf_locate.indexOf('/', _start);
+            host = slash<_start?aaf_locate.substring(_start):aaf_locate.substring(_start,slash);
             startPort = endPort = defaultPort;
-        }        
+        }
+        
+        return host;
     }
 
     private class Host {
@@ -206,9 +222,13 @@ public class DNSLocator implements Locator<URI> {
         
         public Host(InetAddress inetAddress, int port, String suffix) throws URISyntaxException {
             ia = inetAddress;
-            uri = new URI(protocol,null,inetAddress.getHostAddress(),port,suffix,null,null);
+            uri = new URI(protocol,null,inetAddress.getCanonicalHostName(),port,suffix,null,null);
             status = Status.UNTRIED;
         }
+        
+        public String toString() {
+            return uri.toString() + " - " + status.name();
+        }
     }
     
     private class DLItem implements Item {
@@ -220,4 +240,8 @@ public class DNSLocator implements Locator<URI> {
     }
     
     public void destroy() {}
+
+    public int size() {
+        return size;
+    }
 }