package denominator.ultradns; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.TreeMap; import feign.Body; import feign.Headers; import feign.Param; import feign.RequestLine; @Headers("Content-Type: application/xml") interface UltraDNS { @RequestLine("POST") @Body("<v01:getNeustarNetworkStatus/>") NetworkStatus getNeustarNetworkStatus(); @RequestLine("POST") @Body("<v01:getAccountsListOfUser/>") String getAccountsListOfUser(); @RequestLine("POST") @Body("<v01:getZonesOfAccount><accountId>{accountId}</accountId><zoneType>all</zoneType></v01:getZonesOfAccount>") List<String> getZonesOfAccount(@Param("accountId") String accountId); @RequestLine("POST") @Body("<v01:createPrimaryZone><transactionID/><accountId>{accountId}</accountId><zoneName>{zoneName}</zoneName><forceImport>false</forceImport></v01:createPrimaryZone>") void createPrimaryZone(@Param("accountId") String accountId, @Param("zoneName") String zoneName); /** * @throws UltraDNSException with code {@link UltraDNSException#ZONE_NOT_FOUND}. */ @RequestLine("POST") @Body("<v01:deleteZone><transactionID /><zoneName>{zoneName}</zoneName></v01:deleteZone>") void deleteZone(@Param("zoneName") String zoneName); @RequestLine("POST") @Body("<v01:getResourceRecordsOfZone><zoneName>{zoneName}</zoneName><rrType>0</rrType></v01:getResourceRecordsOfZone>") List<Record> getResourceRecordsOfZone(@Param("zoneName") String zoneName); @RequestLine("POST") @Body("<v01:getResourceRecordsOfDNameByType><zoneName>{zoneName}</zoneName><hostName>{hostName}</hostName><rrType>{rrType}</rrType></v01:getResourceRecordsOfDNameByType>") List<Record> getResourceRecordsOfDNameByType(@Param("zoneName") String zoneName, @Param("hostName") String hostName, @Param("rrType") int rrType); @RequestLine("POST") void createResourceRecord(@Param("resourceRecord") Record create, @Param("zoneName") String zoneName); @RequestLine("POST") void updateResourceRecord(@Param("resourceRecord") Record update, @Param("zoneName") String zoneName); /** * @throws UltraDNSException with code {@link UltraDNSException#RESOURCE_RECORD_NOT_FOUND} . */ @RequestLine("POST") @Body("<v01:deleteResourceRecord><transactionID /><guid>{guid}</guid></v01:deleteResourceRecord>") void deleteResourceRecord(@Param("guid") String guid); @RequestLine("POST") @Body("<v01:getLoadBalancingPoolsByZone><zoneName>{zoneName}</zoneName><lbPoolType>RR</lbPoolType></v01:getLoadBalancingPoolsByZone>") Map<NameAndType, String> getLoadBalancingPoolsByZone(@Param("zoneName") String zoneName); @RequestLine("POST") @Body("<v01:getRRPoolRecords><lbPoolId>{poolId}</lbPoolId></v01:getRRPoolRecords>") List<Record> getRRPoolRecords(@Param("poolId") String poolId); @RequestLine("POST") @Body("<v01:addRRLBPool><transactionID /><zoneName>{zoneName}</zoneName><hostName>{hostName}</hostName><description>{poolRecordType}</description><poolRecordType>{poolRecordType}</poolRecordType><rrGUID /></v01:addRRLBPool>") String addRRLBPool(@Param("zoneName") String zoneName, @Param("hostName") String name, @Param("poolRecordType") int typeCode); @RequestLine("POST") @Body("<v01:addRecordToRRPool><transactionID /><roundRobinRecord lbPoolID=\"{lbPoolID}\" info1Value=\"{address}\" ZoneName=\"{zoneName}\" Type=\"{type}\" TTL=\"{ttl}\"/></v01:addRecordToRRPool>") void addRecordToRRPool(@Param("type") int type, @Param("ttl") int ttl, @Param("address") String rdata, @Param("lbPoolID") String lbPoolID, @Param("zoneName") String zoneName); @RequestLine("POST") @Body("<v01:updateRecordOfRRPool><transactionID /><resourceRecord rrGuid=\"{rrGuid}\" lbPoolID=\"{lbPoolID}\" info1Value=\"{info1Value}\" TTL=\"{ttl}\"/></v01:updateRecordOfRRPool>") void updateRecordOfRRPool(@Param("rrGuid") String rrGuid, @Param("lbPoolID") String lbPoolID, @Param("info1Value") String info1Value, @Param("ttl") int ttl); /** * @throws UltraDNSException with code {@link UltraDNSException#POOL_NOT_FOUND} and {@link * UltraDNSException#RESOURCE_RECORD_NOT_FOUND}. */ @RequestLine("POST") @Body("<v01:deleteLBPool><transactionID /><lbPoolID>{lbPoolID}</lbPoolID><DeleteAll>Yes</DeleteAll><retainRecordId /></v01:deleteLBPool>") void deleteLBPool(@Param("lbPoolID") String id); @RequestLine("POST") @Body("<v01:getAvailableRegions />") Map<String, Collection<String>> getAvailableRegions(); @RequestLine("POST") @Body("<v01:getDirectionalDNSGroupDetails><GroupId>{GroupId}</GroupId></v01:getDirectionalDNSGroupDetails>") DirectionalGroup getDirectionalDNSGroupDetails(@Param("GroupId") String groupId); @RequestLine("POST") @Body("<v01:getDirectionalDNSRecordsForGroup><groupName>{groupName}</groupName><hostName>{hostName}</hostName><zoneName>{zoneName}</zoneName><poolRecordType>{poolRecordType}</poolRecordType></v01:getDirectionalDNSRecordsForGroup>") List<DirectionalRecord> getDirectionalDNSRecordsForGroup(@Param("zoneName") String zoneName, @Param("groupName") String groupName, @Param("hostName") String name, @Param("poolRecordType") int type); /** * @throws UltraDNSException with code {@link UltraDNSException#POOL_RECORD_ALREADY_EXISTS}. */ @RequestLine("POST") String addDirectionalPoolRecord(@Param("record") DirectionalRecord toCreate, @Param("group") DirectionalGroup group, @Param("poolId") String poolId); /** * @throws UltraDNSException with code {@link UltraDNSException#RESOURCE_RECORD_ALREADY_EXISTS}. */ @RequestLine("POST") void updateDirectionalPoolRecord(@Param("record") DirectionalRecord update, @Param("group") DirectionalGroup group); @RequestLine("POST") @Body("<v01:getDirectionalPoolsOfZone><zoneName>{zoneName}</zoneName></v01:getDirectionalPoolsOfZone>") Map<String, String> getDirectionalPoolsOfZone(@Param("zoneName") String zoneName); @RequestLine("POST") @Body("<v01:getDirectionalDNSRecordsForHost><zoneName>{zoneName}</zoneName><hostName>{hostName}</hostName><poolRecordType>{poolRecordType}</poolRecordType></v01:getDirectionalDNSRecordsForHost>") List<DirectionalRecord> getDirectionalDNSRecordsForHost(@Param("zoneName") String zoneName, @Param("hostName") String name, @Param("poolRecordType") int rrType); @RequestLine("POST") @Body("<v01:addDirectionalPool><transactionID /><AddDirectionalPoolData dirPoolType=\"GEOLOCATION\" poolRecordType=\"{poolRecordType}\" zoneName=\"{zoneName}\" hostName=\"{hostName}\" description=\"{poolRecordType}\"/></v01:addDirectionalPool>") String addDirectionalPool(@Param("zoneName") String zoneName, @Param("hostName") String name, @Param("poolRecordType") String type); @RequestLine("POST") @Body("<v01:deleteDirectionalPoolRecord><transactionID /><dirPoolRecordId>{dirPoolRecordId}</dirPoolRecordId></v01:deleteDirectionalPoolRecord>") void deleteDirectionalPoolRecord(@Param("dirPoolRecordId") String id); @RequestLine("POST") @Body("<v01:deleteDirectionalPool><transactionID /><dirPoolID>{dirPoolID}</dirPoolID><retainRecordID /></v01:deleteDirectionalPool>") void deleteDirectionalPool(@Param("dirPoolID") String dirPoolID); enum NetworkStatus { GOOD, FAILED; } class Record { String id; Long created; String name; int typeCode; int ttl; List<String> rdata = new ArrayList<String>(); } class NameAndType { String name; String type; @Override public int hashCode() { return 37 * name.hashCode() + type.hashCode(); } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null || !(obj instanceof NameAndType)) { return false; } NameAndType that = NameAndType.class.cast(obj); return this.name.equals(that.name) && this.type.equals(that.type); } @Override public String toString() { return "NameAndType(" + name + "," + type + ")"; } } class DirectionalGroup { String name; Map<String, Collection<String>> regionToTerritories = new TreeMap<String, Collection<String>>(); } class DirectionalRecord extends Record { String geoGroupId; String geoGroupName; boolean noResponseRecord; String type; } }