update Agent for Helm
[aaf/authz.git] / cadi / aaf / src / main / java / org / onap / aaf / cadi / register / RegistrationCreator.java
index 7e519c5..fc3c18b 100644 (file)
 
 package org.onap.aaf.cadi.register;
 
-import java.net.Inet4Address;
 import java.net.UnknownHostException;
 import java.util.List;
 
 import org.onap.aaf.cadi.Access;
+import org.onap.aaf.cadi.Access.Level;
 import org.onap.aaf.cadi.CadiException;
 import org.onap.aaf.cadi.aaf.Defaults;
 import org.onap.aaf.cadi.config.Config;
+import org.onap.aaf.cadi.config.RegistrationPropHolder;
 import org.onap.aaf.cadi.util.Split;
 
 import locate.v1_0.MgmtEndpoint;
+import locate.v1_0.MgmtEndpoint.SpecialPorts;
 import locate.v1_0.MgmtEndpoints;
 
 public class RegistrationCreator {
-    private static final String MUST_BE_DEFINED = " must be defined\n";
        private Access access;
     
     public RegistrationCreator(Access access) {
@@ -47,204 +48,201 @@ public class RegistrationCreator {
        MgmtEndpoint defData = null;
        MgmtEndpoint locate = null;
 
-
-       StringBuilder errs = new StringBuilder();
        try {
-               String hostname = access.getProperty(Config.HOSTNAME, null);
-               if (hostname==null) {
-                       hostname = Inet4Address.getLocalHost().getHostName();
-               }
-               if (hostname==null) {
-                       errs.append(Config.HOSTNAME);
-                       errs.append(MUST_BE_DEFINED);
-               }
-
-               Float latitude=null;
-               String slatitude = access.getProperty(Config.CADI_LATITUDE, null);
-               if(slatitude == null) {
-                       errs.append(Config.CADI_LATITUDE);
-                       errs.append(MUST_BE_DEFINED);
-               } else {
-                       latitude = Float.parseFloat(slatitude);
-               }
-
-               Float longitude=null;
-               String slongitude = access.getProperty(Config.CADI_LONGITUDE, null);
-               if(slongitude == null) {
-                       errs.append(Config.CADI_LONGITUDE);
-                       errs.append(MUST_BE_DEFINED);
-               } else {
-                       longitude = Float.parseFloat(slongitude);
-               }
-
-               if(errs.length()>0) {
-                       throw new CadiException(errs.toString());
-               }
-
                String dot_le;
-               String ns;
                String version=null;
-               String lentries = access.getProperty(Config.AAF_LOCATOR_CONTAINER, null);
-               if(lentries==null) {
-                       lentries="";
-               } else {
-                       lentries=',' + lentries; // "" makes a blank default Public Entry
-               }
-
-               String defaultName = null;
-               String str;
-               int public_port = port;
-               // Note: only one of the ports can be public...  Therefore, only the la
-               for(String le : Split.splitTrim(',', lentries)) {
-                       dot_le = le.isEmpty()?"":"."+le;
-                               str = access.getProperty(Config.AAF_LOCATOR_PUBLIC_PORT+dot_le, null);
-                               if(str!=null) { // Get Public Port
-                                       public_port = Integer.decode(str);
-                               }
-               }
+               String defProtocol="https";
                
-               String public_hostname = hostname;
-               for(String le : Split.splitTrim(',', lentries)) {
-                       dot_le = le.isEmpty()?"":"."+le;
-                               String ph = access.getProperty(Config.AAF_LOCATOR_PUBLIC_HOSTNAME+dot_le,null);
-                               if( ph != null) {
-                                       public_hostname=ph;
-                               }
-               }
+               RegistrationPropHolder ph = new RegistrationPropHolder(access, port);
                
-               String default_fqdn = access.getProperty(Config.AAF_LOCATOR_FQDN, public_hostname);
-               
-
+               String firstPrivateHostname = null;
                // Now, loop through by Container
-               for(String le : Split.splitTrim(',', lentries)) {
-                       // Add variable entries
-                       String names;
-                       if(le.length()>0) {
-                               dot_le = '.' + le;
-                               names = access.getProperty(Config.AAF_LOCATOR_NAMES+dot_le,null);
-                               if(names==null) {
-                                       // Go for Default
-                                       names = access.getProperty(Config.AAF_LOCATOR_NAMES,"");
-                               }
+               for(String le : Split.splitTrim(',', ph.lcontainer)) {
+                       if(le.isEmpty()) {
+                               dot_le = le;
                        } else {
-                               dot_le = "";
-                               names=access.getProperty(Config.AAF_LOCATOR_NAMES,dot_le);
+                               dot_le = "."+le;
                        }
-                       
-                       for(String name : Split.splitTrim(',', names)) {
+
+                       for(String entry : Split.splitTrim(',', ph.lentries)) {
                                if(defData==null) {
                                        defData = locate = new MgmtEndpoint();
 
-                                       defaultName = name;
                                        version = access.getProperty(Config.AAF_LOCATOR_VERSION, Defaults.AAF_VERSION);
-                                       locate.setProtocol(access.getProperty(Config.AAF_LOCATOR_PROTOCOL,null));
+                                       locate.setProtocol(defProtocol = access.getProperty(Config.AAF_LOCATOR_PROTOCOL,defProtocol));
                                        List<String> ls = locate.getSubprotocol();
                                        for(String sp : Split.splitTrim(',', access.getProperty(Config.AAF_LOCATOR_SUBPROTOCOL,""))) {
                                                ls.add(sp);     
                                        }
-                                       locate.setLatitude(latitude);
-                                       locate.setLongitude(longitude);
+                                       locate.setLatitude(ph.latitude);
+                                       locate.setLongitude(ph.longitude);
 
                                } else {
                                        locate = copy(defData);
                                }
                                
-                               str = access.getProperty(Config.HOSTNAME+dot_le, null);
-                               if(str==null) {
-                                       str = access.getProperty(Config.HOSTNAME, hostname);
-                               }
-                               locate.setHostname(hostname);
-                               
-                               ns = access.getProperty(Config.AAF_LOCATOR_NS+dot_le,null);
-                               if(ns==null) {
-                                       ns = access.getProperty(Config.AAF_LOCATOR_NS,"");
-                               }
-                               switch(ns) {
-                                       case Defaults.AAF_NS:
-                                               ns = access.getProperty(Config.AAF_ROOT_NS, "");
-                                               // Fallthrough on purpose.
-                               }
-
-                               String ns_dot;
-                               if(ns.isEmpty()) {
-                                       ns_dot = ns;
-                               } else {
-                                       ns_dot = ns + '.';
-                               }
-
-                               String container_id = access.getProperty(Config.AAF_LOCATOR_CONTAINER_ID+dot_le, "");
-                               if(!container_id.isEmpty()) {
-                                       ns_dot = container_id + '.' + ns_dot;
-                               }
-
-                               if(!le.isEmpty()) {
-                                       ns_dot = le + '.' + ns_dot;
-                               }
-
-                               if(name.isEmpty()) {
-                                               locate.setName(ns_dot + defaultName);
-                               } else {
-                                       locate.setName(ns_dot + name);
-                               }
-
-                               if(dot_le.isEmpty()) {
-                                       locate.setHostname(access.getProperty(Config.AAF_LOCATOR_FQDN, default_fqdn));
+                               locate.setName(ph.getEntryName(entry,dot_le));
+                               /* Cover the situation where there is a Container, and multiple locator Entries,
+                                * the first of which is the only real private FQDN
+                                * example: oauth
+                                *      aaf_locator_entries=oauth,token,introspect
+                                *      
+                                *      Entries for token and introspect, but they point to oauth service.
+                                */
+                               String locateHostname;
+                               if(le.isEmpty()) {                      
+                                       locateHostname=ph.getEntryFQDN(entry, dot_le);
+                               } else if(firstPrivateHostname==null) {
+                                       firstPrivateHostname=locateHostname=ph.getEntryFQDN(entry, dot_le);
                                } else {
-                                       str =  access.getProperty(Config.AAF_LOCATOR_FQDN+dot_le, null);
-                                       if(str==null) {
-                                               locate.setHostname(default_fqdn);
-                                       } else {
-                                               String container_ns = access.getProperty(Config.AAF_LOCATOR_CONTAINER_NS+dot_le, "");
-                                               str = str.replace("%CNS", container_ns);
-                                               String container = access.getProperty(Config.AAF_LOCATOR_CONTAINER+dot_le, "");
-                                               str = str.replace("%C", container);
-                                               str = str.replace("%NS", ns);
-                                               str = str.replace("%N", name);
-                                               str = str.replace("%DF", default_fqdn);
-                                               str = str.replace("%PH", public_hostname);
-                                               locate.setHostname(str);
-                                       }
+                                       locateHostname=firstPrivateHostname;
                                }
                                
-                               if(le.isEmpty()) {
-                                       locate.setPort(public_port);
-                               } else {
-                                       locate.setPort(port);
-                               }
-
+                               locate.setHostname(locateHostname);
+                               locate.setPort(ph.getEntryPort(dot_le));
+                               
                                String specificVersion = access.getProperty(Config.AAF_LOCATOR_VERSION + dot_le,null);
                                if(specificVersion == null && locate == defData) {
                                        specificVersion = version;
                                }
                                if(specificVersion!=null) {
                                        String split[] = Split.splitTrim('.', specificVersion);
-                                       locate.setPkg(split.length>3?Integer.parseInt(split[3]):0);
-                                       locate.setPatch(split.length>2?Integer.parseInt(split[2]):0);
-                                       locate.setMinor(split.length>1?Integer.parseInt(split[1]):0);
-                                       locate.setMajor(split.length>0?Integer.parseInt(split[0]):0);
+                                       String deply[]= Split.splitTrim('.', access.getProperty(Config.AAF_DEPLOYED_VERSION, ""));
+                                       locate.setMajor(best(split,deply,0));
+                                       locate.setMinor(best(split,deply,1));
+                                       locate.setPatch(best(split,deply,2));
+                                       locate.setPkg(best(split,deply,3));
                                }
 
-                               String protocol = access.getProperty(Config.AAF_LOCATOR_PROTOCOL + dot_le, null);
+                               String protocol = access.getProperty(Config.AAF_LOCATOR_PROTOCOL + dot_le, defProtocol);
                                if (protocol!=null) {
                                        locate.setProtocol(protocol);
-                                       String subprotocols = access.getProperty(Config.AAF_LOCATOR_SUBPROTOCOL + dot_le, null);
-                                       if(subprotocols!=null) {
-                                               List<String> ls = locate.getSubprotocol();
-                                               for (String s : Split.split(',', subprotocols)) {
-                                                       ls.add(s);
-                                               }
-                                       }
+                                               List<String> ls = locate.getSubprotocol();
+                                               // ls cannot be null, per generated getSubprotocol code
+                                               if(ls.isEmpty()) {
+                                               String subprotocols = access.getProperty(Config.AAF_LOCATOR_SUBPROTOCOL + dot_le, null);
+                                               if(subprotocols==null) {
+                                                       subprotocols = access.getProperty(Config.CADI_PROTOCOLS, null);
+                                               }
+                                               if(subprotocols!=null) {
+                                                       for (String s : Split.split(',', subprotocols)) {
+                                                               ls.add(s);
+                                                       }
+                                               } else {
+                                                       access.printf(Level.ERROR, "%s is required for Locator Registration of %s",
+                                                                       Config.AAF_LOCATOR_SUBPROTOCOL,Config.AAF_LOCATOR_PROTOCOL);
+                                               }
+                                               }
+                                       lme.add(locate);
+                               } else {
+                                       access.printf(Level.ERROR, "%s is required for Locator Registration",Config.AAF_LOCATOR_PROTOCOL);
                                }
-                               lme.add(locate);
                        }
                }
        } catch (NumberFormatException | UnknownHostException e) {
                throw new CadiException("Error extracting Data from Properties for Registrar",e);
        }
-
+       
+       if(access.willLog(Level.INFO)) {
+               access.log(Level.INFO, print(new StringBuilder(),me.getMgmtEndpoint()));
+       }
        return me;
     }
        
+    /*
+     * Find the best version between Actual Interface and Deployed version
+     */
+    private int best(String[] split, String[] deploy, int i) {
+       StringBuilder sb = new StringBuilder();
+       char c;
+               String s;
+       if(split.length>i) {
+               s=split[i];
+                       for(int j=0;j<s.length();++j) {
+                               if(Character.isDigit(c=s.charAt(j))) {
+                                       sb.append(c);
+                               } else {
+                                       break;
+                               }
+                       }
+       }       
+               
+               if(sb.length()==0 && deploy.length>i) {
+                       s=deploy[i];
+                       for(int j=0;j<s.length();++j) {
+                               if(Character.isDigit(c=s.charAt(j))) {
+                                       sb.append(c);
+                               } else {
+                                       break;
+                               }
+                       }
+               }
+               
+               return sb.length()==0?0:Integer.parseInt(sb.toString());
+    }
+
+       private StringBuilder print(StringBuilder sb, List<MgmtEndpoint> lme) {
+       int cnt = 0;
+               for(MgmtEndpoint m : lme) {
+                       print(sb,cnt++,m);
+               }
+               return sb;
+       }
+
+       private void print(StringBuilder out, int cnt, MgmtEndpoint mep) {
+               out.append("\nManagement Endpoint - ");
+               out.append(cnt);
+               out.append("\n\tName:       ");
+               out.append(mep.getName());
+               out.append("\n\tHostname:   ");
+               out.append(mep.getHostname());
+               out.append("\n\tLatitude:   ");
+               out.append(mep.getLatitude());
+               out.append("\n\tLongitude:  ");
+               out.append(mep.getLongitude());
+               out.append("\n\tVersion:    ");
+               out.append(mep.getMajor());
+               out.append('.');
+               out.append(mep.getMinor());
+               out.append('.');
+               out.append(mep.getPatch());
+               out.append('.');
+               out.append(mep.getPkg());
+               out.append("\n\tPort:       ");
+               out.append(mep.getPort());
+               out.append("\n\tProtocol:   ");
+               out.append(mep.getProtocol());
+               out.append("\n\tSpecial Ports:");
+               for( SpecialPorts sp : mep.getSpecialPorts()) {
+                       out.append("\n\t\tName:       ");
+                       out.append(sp.getName());
+                       out.append("\n\t\tPort:       ");
+                       out.append(sp.getPort());
+                       out.append("\n\t\tProtocol:   ");
+                       out.append(sp.getProtocol());
+                       out.append("\n\t\t  Versions: ");
+                       boolean first = true;
+                       for(String s : sp.getProtocolVersions()) {
+                               if(first) {
+                                       first = false;
+                               } else {
+                                       out.append(',');
+                               }
+                               out.append(s);
+                       }
+               }
+               boolean first = true;
+               out.append("\n\tSubProtocol: ");
+               for(String s : mep.getSubprotocol()) {
+                       if(first) {
+                               first = false;
+                       } else {
+                               out.append(',');
+                       }
+                       out.append(s);
+               }
+       }
+    
     private MgmtEndpoint copy(MgmtEndpoint mep) {
                MgmtEndpoint out = new MgmtEndpoint();
                out.setName(mep.getName());
@@ -253,8 +251,8 @@ public class RegistrationCreator {
                out.setLongitude(mep.getLongitude());
                out.setMajor(mep.getMajor());
                out.setMinor(mep.getMinor());
-               out.setPkg(mep.getPkg());
                out.setPatch(mep.getPatch());
+               out.setPkg(mep.getPkg());
                out.setPort(mep.getPort());
                out.setProtocol(mep.getProtocol());
                out.getSpecialPorts().addAll(mep.getSpecialPorts());