package org.openstack.atlas.restclients.dns;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource.Builder;
import com.sun.jersey.api.client.WebResource;
import java.io.UnsupportedEncodingException;
import java.util.List;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import java.util.Map.Entry;
import javax.xml.bind.JAXBException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openstack.atlas.restclients.dns.exp.JaxbExp;
import org.openstack.atlas.restclients.dns.pub.objects.Record;
import org.openstack.atlas.restclients.dns.pub.objects.Rdns;
import org.openstack.atlas.restclients.dns.pub.objects.RecordType;
import org.openstack.atlas.restclients.dns.pub.objects.RecordsList;
import org.openstack.atlas.util.b64aes.Base64;
import org.openstack.atlas.util.debug.Debug;
import org.w3._2005.atom.Link;
public class DnsClient1_0 {
private static final Log LOG = LogFactory.getLog(DnsClient1_0.class);
private static final int SB_INIT_SIZE = 1024 * 4;
private int accountId = -1;
private String token = "";
private String endPoint = "";
private String adminEndPoint = "";
private String adminUser = "";
private String adminPasswd = "";
public DnsClient1_0(String endPoint, String adminEndPoint, String adminUser,
String adminPasswd, String token, int accountId) {
this.accountId = accountId;
this.endPoint = endPoint;
this.token = token;
this.adminEndPoint = adminEndPoint;
this.adminUser = adminUser;
this.adminPasswd = adminPasswd;
}
public DnsClient1_0(String endPoint, String token, int accountId) {
this.endPoint = endPoint;
this.accountId = accountId;
this.token = token;
}
public ClientResponse getDomain(Integer domainId, Boolean showRecords,
Boolean showSubDomains,
Integer limit, Integer offset) {
String url = String.format("/%d/domains/%d", accountId, domainId);
Client client = new Client();
WebResource wr = client.resource(endPoint).path(url);
wr = addLimitOffsetParams(wr, limit, offset);
if (showRecords != null) {
wr.queryParam("showRecords", showRecords ? "true" : "false");
}
if (showSubDomains != null) {
wr.queryParam("showSubDomains", showSubDomains ? "true" : "false");
}
Builder rb = wr.accept(MediaType.APPLICATION_XML);
rb = rb.type(MediaType.APPLICATION_XML);
rb.header("x-auth-token", this.token);
ClientResponse resp = rb.get(ClientResponse.class);
return resp;
}
public ClientResponse getDomains(String name, Integer limit, Integer offset) {
Client client = new Client();
String url = String.format("/%d/domains", accountId);
WebResource wr = client.resource(endPoint).path(url);
wr = addLimitOffsetParams(wr, limit, offset);
if (name != null) {
wr = wr.queryParam("name", name);
}
Builder rb = wr.accept(MediaType.APPLICATION_XML);
rb = rb.type(MediaType.APPLICATION_XML);
rb = rb.header("x-auth-token", this.token);
ClientResponse resp = rb.get(ClientResponse.class);
return resp;
}
public ClientResponse getPtrRecords(String deviceUrl, String serviceName, Integer limit, Integer offset) {
Client client = new Client();
String authKey = "x-auth-token";
String url = String.format("/%d/rdns/%s", accountId, serviceName);
WebResource wr = client.resource(endPoint).path(url);
wr = addLimitOffsetParams(wr, limit, offset);
wr = wr.queryParam("href", deviceUrl);
String logMsg = String.format("USEING CRED %s CALLING GET %s",authKey,wr.toString());
LOG.info(logMsg);
System.out.printf("%s\n", logMsg);
Builder rb = wr.accept(MediaType.APPLICATION_XML);
rb = rb.type(MediaType.APPLICATION_XML);
rb = rb.header(authKey, this.token);
ClientResponse resp = rb.get(ClientResponse.class);
return resp;
}
public ClientResponse addPtrRecord(String deviceUrl,
String serviceName, String name, String ip, Integer ttl) {
Rdns rdnsRequest = new Rdns();
String fmt;
String msg;
String authKey = "x-auth-token";
Link link = new Link();
rdnsRequest.setLink(link);
link.setHref(deviceUrl);
link.setRel(serviceName); // Use "cloudLoadBalancers"
RecordsList records = new RecordsList();
rdnsRequest.setRecordsList(records);
Record ptr = new Record();
records.getRecords().add(ptr);
ptr.setName(name);
if (ttl != null) {
ptr.setTtl(ttl);
}
ptr.setData(ip);
ptr.setType(RecordType.PTR);
String url = String.format("/%d/rdns", accountId);
String xml;
try {
xml = JaxbExp.serialize(rdnsRequest);
nop();
} catch (JAXBException ex) {
xml = "ERROR";
}
Client client = new Client();
WebResource wr = client.resource(endPoint).path(url);
Builder rb = wr.accept(MediaType.APPLICATION_XML);
fmt = "USEING CRED %s CALLING POST %s\nbody=%s";
msg = String.format(fmt,authKey,wr.toString(),xml);
LOG.info(msg);
System.out.printf("%s\n", msg);
rb = rb.type(MediaType.APPLICATION_XML);
rb = rb.header(authKey, token);
ClientResponse resp = rb.post(ClientResponse.class, rdnsRequest);
return resp;
}
public ClientResponse delPtrRecordPub(String deviceUrl, String serviceName, String ip) {
return delPtrRecordBaseMethod(deviceUrl, serviceName, ip, "x-auth-token", token, endPoint);
}
public ClientResponse delPtrRecordMan(String deviceUrl, String serviceName, String ip) throws UnsupportedEncodingException {
return delPtrRecordBaseMethod(deviceUrl, serviceName, ip, "authorization", encodeBasicAuth(), adminEndPoint);
}
private ClientResponse delPtrRecordBaseMethod(String deviceUrl, String serviceName, String ip,
String authKey, String authValue, String endPoint) {
String url = String.format("/%d/rdns/%s", accountId, serviceName);
Client client = new Client();
WebResource wr = client.resource(endPoint).path(url);
wr = wr.queryParam("href", deviceUrl);
if (ip != null) {
wr = wr.queryParam("ip", ip);
}
String logMsg = String.format("USEING CRED %s CALLING DELETE %s",authKey,wr.toString());
LOG.info(logMsg);
System.out.printf("%s\n", logMsg);
Builder rb = wr.accept(MediaType.APPLICATION_XML);
rb = rb.type(MediaType.APPLICATION_XML);
rb.header(authKey, authValue);
ClientResponse resp = rb.delete(ClientResponse.class);
return resp;
}
public ClientResponse getDomains() {
return getDomains(null, null, null);
}
private WebResource addLimitOffsetParams(WebResource wr, Integer limit, Integer offset) {
if (limit != null) {
wr = wr.queryParam("limit", limit.toString());
}
if (offset != null) {
wr = wr.queryParam("offset", offset.toString());
}
return wr;
}
public String encodeBasicAuth() throws UnsupportedEncodingException {
return StaticDNSClientUtils.encodeBasicAuth(adminUser,adminPasswd);
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public String getEndPoint() {
return endPoint;
}
public Integer getAccountId() {
return accountId;
}
public void setEndPoint(String endPoint) {
this.endPoint = endPoint;
}
public void setAccountId(Integer accountId) {
this.accountId = accountId;
}
public String getAdminEndPoint() {
return adminEndPoint;
}
public void setAdminEndPoint(String adminEndPoint) {
this.adminEndPoint = adminEndPoint;
}
public String getAdminUser() {
return adminUser;
}
public void setAdminUser(String adminUser) {
this.adminUser = adminUser;
}
public String getAdminPasswd() {
return adminPasswd;
}
public void setAdminPasswd(String adminPasswd) {
this.adminPasswd = adminPasswd;
}
@Override
public String toString() {
String fmt = "{ endPoint=\"%s\",accountId=\"%d\" "
+ "adminEndPoint=\"%s\" adminUser = \"%s\", "
+ "adminPasswd = \"%s\" }";
String msg = String.format(fmt, endPoint, accountId, adminEndPoint,
adminUser, adminPasswd);
return msg;
}
private static String getEST(Throwable th) {
Throwable t;
StringBuilder sb = new StringBuilder(4096);
Exception currEx;
String msg;
t = th;
while (t != null) {
if (t instanceof Exception) {
currEx = (Exception) t;
sb.append(String.format("Exception: %s:%s\n", currEx.getMessage(), currEx.getClass().getName()));
for (StackTraceElement se : currEx.getStackTrace()) {
sb.append(String.format("%s\n", se.toString()));
}
sb.append("\n");
t = t.getCause();
}
}
return sb.toString();
}
private static void nop() {
}
}