/*
* Copyright 2014 Amazon Technologies, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://aws.amazon.com/apache2.0
*
* This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
* OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and
* limitations under the License.
*/
package com.amediamanager.dao;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.amazonaws.services.rds.AmazonRDS;
import com.amazonaws.services.rds.model.DBInstance;
import com.amazonaws.services.rds.model.DescribeDBInstancesRequest;
import com.amazonaws.services.rds.model.DescribeDBInstancesResult;
import com.amazonaws.services.rds.model.Endpoint;
import com.amediamanager.config.ConfigurationSettings;
public class RdsDbEndpointRetriever implements DbEndpointRetriever {
@Autowired
protected ConfigurationSettings config;
@Autowired
protected AmazonRDS rds;
/* (non-Javadoc)
* @see com.aMediaManager.DataAccess.DbEndpointRetriever#getMasterDbEndpoint(java.lang.String)
*/
@Override
public Endpoint getMasterDbEndpoint(String dbInstanceId) {
Endpoint endpoint = null;
DescribeDBInstancesResult result = rds.describeDBInstances(new DescribeDBInstancesRequest().withDBInstanceIdentifier(dbInstanceId));
if(result.getDBInstances().size() == 1) {
endpoint = result.getDBInstances().get(0).getEndpoint();
}
return endpoint;
}
/* (non-Javadoc)
* @see com.aMediaManager.DataAccess.DbEndpointRetriever#getReadReplicaEndpoints(java.lang.String)
*/
@Override
public List<Endpoint> getReadReplicaEndpoints(String dbInstanceId) {
List<Endpoint> endpoints = null;
DescribeDBInstancesResult result = rds.describeDBInstances(new DescribeDBInstancesRequest().withDBInstanceIdentifier(dbInstanceId));
// If the master exist and has any read replicas
if(result.getDBInstances().size() == 1 && result.getDBInstances().get(0).getReadReplicaDBInstanceIdentifiers().size() > 0) {
endpoints = new ArrayList<Endpoint>();
for(String readReplicaId : result.getDBInstances().get(0).getReadReplicaDBInstanceIdentifiers()) {
DBInstance rrInstance = rds.describeDBInstances(new DescribeDBInstancesRequest().withDBInstanceIdentifier(readReplicaId)).getDBInstances().get(0);
if (rrInstance.getDBInstanceStatus().equals("available")) {
endpoints.add(rrInstance.getEndpoint());
}
}
if(endpoints.size() == 0) {
endpoints = null;
}
}
return endpoints;
}
/*
# If the master DB identifier were available in the constructor, this would be a more efficient way to retrieve
# the master and read replica endpoints as it limits the number of API requests.
String marker = null;
do {
DescribeDBInstancesResult result = rds.describeDBInstances(new DescribeDBInstancesRequest().withMarker(marker));
for (DBInstance instance : result.getDBInstances()) {
if (masterId.equals(instance.getDBInstanceIdentifier())) {
master = instance.getEndpoint();
} else if (masterId.equals(instance.getReadReplicaSourceDBInstanceIdentifier())) {
if (instance.getDBInstanceStatus().equals("available")) {
replicas.add(instance.getEndpoint());
}
}
}
marker = result.getMarker();
} while (marker != null);
*/
}