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) {
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());
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());