/*
* Copyright [2013] [Cloud4SOA, www.cloud4soa.eu]
*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License 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 beanstalk;
import com.amazonaws.AmazonClientException;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.rds.AmazonRDSClient;
import com.amazonaws.services.rds.model.*;
import java.util.Collection;
import java.util.List;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
public class BeansDatabase {
public DatabaseObject createDatabase(String AWSKeyId, String AWSSecretKey, String dbname, String dbType, String dbIdentifier, String dbClass, int dbSize, String dbUser, String dbPassword) {//throws Exception {
DatabaseObject dbobj = new DatabaseObject();
String endpoint_str = "";
BasicAWSCredentials basic_credentials = new BasicAWSCredentials(AWSKeyId, AWSSecretKey);
AmazonRDSClient rDSClient = new AmazonRDSClient(basic_credentials);
//Minimum size per db type, as described in API Reference
if (dbType != null && dbType.equalsIgnoreCase("MySQL") && dbSize < 5) {
dbSize = 5;
}
if (dbType != null && (dbType.equalsIgnoreCase("oracle-se1") || dbType.equalsIgnoreCase("oracle-se") || dbType.equalsIgnoreCase("oracle-ee")) && dbSize < 10) {
dbSize = 10;
}
CreateDBInstanceRequest create_dbinstance = new CreateDBInstanceRequest();
create_dbinstance.setDBName(dbname);
create_dbinstance.setEngine(dbType);
create_dbinstance.setMasterUsername(dbUser);
create_dbinstance.setMasterUserPassword(dbPassword);
create_dbinstance.setDBInstanceIdentifier(dbIdentifier);
create_dbinstance.setAllocatedStorage(dbSize);//min size =5GB for mysql,10gb for oracle
create_dbinstance.setDBInstanceClass("db.m1.small");//db.m1.small//db.m1.large//db.m1.xlarge//db.m2.xlarge//db.m2.2xlarge//db.m2.4xlarge....
String group = "c4sallowallipgroup";
Vector sec_groups = new Vector();
sec_groups.add(group);
create_dbinstance.setDBSecurityGroups(sec_groups);
DBInstance dbInstance_create = new DBInstance();
System.out.println("will call createDBInstance");
try {
dbInstance_create = rDSClient.createDBInstance(create_dbinstance);
} catch (AmazonClientException amazonClientException) {
System.out.println("Error in Database Creation.");
}
System.out.println("called createDBInstance");
String status = "";
System.out.println("called createDBInstance");
//wait 5 minutes for the first time
int busyWaitingTime = 3000;//3sec
//int busyWaitingTime=300000;
//int busyWaitingTime=40000;
while (!status.equalsIgnoreCase("available")) {
System.out.println("just got inside while");
try {
System.out.println("preparing for sleep");
Thread.sleep(busyWaitingTime);
System.out.println("woke up");
} catch (InterruptedException ex) {
Logger.getLogger(BeansDatabase.class.getName()).log(Level.SEVERE, null, ex);
}
DescribeDBInstancesRequest describeDBInstancesRequest = new DescribeDBInstancesRequest();
describeDBInstancesRequest.setDBInstanceIdentifier(dbname + "cloud4soaid");
//describeDBInstancesRequest.setDBInstanceIdentifier("c4sdb2cloud4soaid");
DBInstance dbInstance = new DBInstance();
System.out.println("will call describeDBInstances");
DescribeDBInstancesResult describeDBInstances = rDSClient.describeDBInstances(describeDBInstancesRequest);
System.out.println("called describeDBInstances");
List<DBInstance> dbInstances = describeDBInstances.getDBInstances();
System.out.println("size--->" + dbInstances.size());
System.out.println("status--->" + dbInstances.get(0).getDBInstanceStatus());
System.out.println("dbname--->" + dbInstances.get(0).getDBName());
dbobj.setDbhost(dbInstances.get(0).getDBInstanceStatus());
if (dbInstances.get(0).getEndpoint() != null) {
System.out.println("endpoint--->" + dbInstances.get(0).getEndpoint().getAddress());
System.out.println("port--->" + dbInstances.get(0).getEndpoint().getPort());
System.out.println("all--->" + dbInstances.get(0).toString());
dbobj.setDbhost(dbInstances.get(0).getEndpoint().getAddress());
dbobj.setDbname(dbInstances.get(0).getDBName());
dbobj.setPort(dbInstances.get(0).getEndpoint().getPort());
status = dbInstances.get(0).getDBInstanceStatus();
//after the first 5 minutes test every minute
busyWaitingTime = 60000;
}
}
System.out.println("just got outside while");
System.out.println("just got outside while and endpoint is :"+dbobj.getDbhost()+ ", name is "+dbobj.getDbname());
/*
*
* DescribeDBInstancesRequest describeDBInstancesRequest = new
* DescribeDBInstancesRequest();
*
* describeDBInstancesRequest.setDBInstanceIdentifier(dbname +
* "cloud4soaid");
* //describeDBInstancesRequest.setDBInstanceIdentifier("c4sdb2cloud4soaid");
* DBInstance dbInstance = new DBInstance();
*
* System.out.println("will call describeDBInstances");
* DescribeDBInstancesResult describeDBInstances =
* rDSClient.describeDBInstances(describeDBInstancesRequest);
* System.out.println("called describeDBInstances");
*
* List<DBInstance> dbInstances = describeDBInstances.getDBInstances();
*
* System.out.println("size--->" + dbInstances.size());
* System.out.println("status--->" +
* dbInstances.get(0).getDBInstanceStatus());
* System.out.println("dbname--->" + dbInstances.get(0).getDBName());
* dbobj.setDbhost(dbInstances.get(0).getDBInstanceStatus());
*
*
* if(dbInstances.get(0).getEndpoint()!=null){
*
*
* System.out.println("endpoint--->" +
* dbInstances.get(0).getEndpoint().getAddress());
* System.out.println("port--->" +
* dbInstances.get(0).getEndpoint().getPort());
* System.out.println("all--->" + dbInstances.get(0).toString());
*
* dbobj.setDbhost(dbInstances.get(0).getEndpoint().getAddress());
* dbobj.setDbname(dbInstances.get(0).getDBName());
* dbobj.setPort(dbInstances.get(0).getEndpoint().getPort()); }
*/
return dbobj;
}
public DatabaseObject getDBInstanceInfo(String AWSKeyId, String AWSSecretKey, String dbname) {//throws Exception {
BasicAWSCredentials basic_credentials = new BasicAWSCredentials(AWSKeyId, AWSSecretKey);
AmazonRDSClient rDSClient = new AmazonRDSClient(basic_credentials);
DescribeDBInstancesRequest describeDBInstancesRequest = new DescribeDBInstancesRequest();
describeDBInstancesRequest.setDBInstanceIdentifier(dbname + "cloud4soaid");
DBInstance dbInstance = new DBInstance();
DescribeDBInstancesResult describeDBInstances = rDSClient.describeDBInstances(describeDBInstancesRequest);
List<DBInstance> dbInstances = describeDBInstances.getDBInstances();
System.out.println("size--->" + dbInstances.size());
System.out.println("dbname--->" + dbInstances.get(0).getDBName());
System.out.println("endpoint--->" + dbInstances.get(0).getEndpoint().getAddress());
System.out.println("port--->" + dbInstances.get(0).getEndpoint().getPort());
System.out.println("all--->" + dbInstances.get(0).toString());
DatabaseObject dbobj = new DatabaseObject();
dbobj.setDbhost(dbInstances.get(0).getEndpoint().getAddress());
dbobj.setDbname(dbInstances.get(0).getDBName());
dbobj.setPort(dbInstances.get(0).getEndpoint().getPort());
return dbobj;
}
public String getDBEndpoint(String AWSKeyId, String AWSSecretKey, String dbname) {//throws Exception {
String endpoint_str = "";
BasicAWSCredentials basic_credentials = new BasicAWSCredentials(AWSKeyId, AWSSecretKey);
AmazonRDSClient rDSClient = new AmazonRDSClient(basic_credentials);
ModifyDBInstanceRequest mod_db = new ModifyDBInstanceRequest(dbname + "cloud4soaid");
DBInstance dbInstance = new DBInstance();
////CHECK THIS. in order to make correct ModifyDBInstanceRequest an attribute must be sent for modification.
///5 (GB) is the minimum
mod_db.setAllocatedStorage(6);
dbInstance = rDSClient.modifyDBInstance(mod_db);
Endpoint endpoint = new Endpoint();
endpoint = dbInstance.getEndpoint();
if (endpoint != null) {
endpoint_str = endpoint.getAddress();
System.out.println("endpoint to string:" + endpoint_str);/////{Address: cloud4soadbid.coaodqyxxykq.us-east-1.rds.amazonaws.com, Port: 3306, }
System.out.println("endpoint get address:" + endpoint.getAddress());/////cloud4soadbid.coaodqyxxykq.us-east-1.rds.amazonaws.com
}
return endpoint_str;
}
public boolean deleteDatabase(String AWSKeyId, String AWSSecretKey, String dbIdentifier) {//throws Exception {
boolean ret = false;
// credentials = new PropertiesCredentials(BeanstalkDeployNoGUI.class.getResourceAsStream("AwsCredentials.properties"))
BasicAWSCredentials basic_credentials = new BasicAWSCredentials(AWSKeyId, AWSSecretKey);
// SimpleDBUtils simpledb= new SimpleDBUtils();
AmazonRDSClient rDSClient = new AmazonRDSClient(basic_credentials);
// RestoreDBInstanceFromDBSnapshotRequest req= new RestoreDBInstanceFromDBSnapshotRequest();
// req.setDBName("dbname");
// req.setPort(3306);
DescribeDBInstancesRequest ddbi = new DescribeDBInstancesRequest();
DBInstance dbins = new DBInstance();
dbins.getEndpoint();
DeleteDBInstanceRequest delRequest = new DeleteDBInstanceRequest(dbIdentifier);
// rDSClient.restoreDBInstanceFromDBSnapshot(req);
delRequest.setSkipFinalSnapshot(true);
rDSClient.deleteDBInstance(delRequest);
return ret;
}
public boolean allowIPConnectionWithDB(String AWSKeyId, String AWSSecretKey, String dbIdentifier) {//throws Exception {
boolean ret = false;
String security_group = "Cloud4SoaSecGroup";
BasicAWSCredentials basic_credentials = new BasicAWSCredentials(AWSKeyId, AWSSecretKey);
AmazonRDSClient rDSClient = new AmazonRDSClient(basic_credentials);
//1st step-->add group cloud4soa if not exist
CreateDBSecurityGroupRequest create_secGroupRequest = new CreateDBSecurityGroupRequest(security_group, "GroupGeneratedByCloud4SoaAdapter");
DBSecurityGroup securityGroup = new DBSecurityGroup();
try {
securityGroup = rDSClient.createDBSecurityGroup(create_secGroupRequest);
} catch (AmazonClientException amazonClientException) {
System.out.print("Error when trying to add Security Group.Security Group might exist already!");
}
//2nd step--> add IP to list of specific Security Group
AuthorizeDBSecurityGroupIngressRequest ip2SecGroup = new AuthorizeDBSecurityGroupIngressRequest(security_group);
//allow specific ip
//ip2SecGroup.setCIDRIP("91.132.244.150/5");
//allow everyone
ip2SecGroup.setCIDRIP("0.0.0.0/0");
try {
rDSClient.authorizeDBSecurityGroupIngress(ip2SecGroup);
} catch (AmazonClientException amazonClientException) {
System.out.print("Error when trying to add the specific IP address to the security group.IP might be already entered!");
}
return ret;
}
}