/*
* Copyright 2011-2012 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.amazonaws.eclipse.rds;
import java.lang.reflect.InvocationTargetException;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.beans.PojoObservables;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import com.amazonaws.services.rds.AmazonRDS;
import com.amazonaws.services.rds.model.DBInstance;
class SelectExistingDatabasePage extends WizardPage {
protected DataBindingContext bindingContext = new DataBindingContext();
private Combo dbCombo;
private final AmazonRDS rds;
private static final String PAGE_NAME = "configureRdsDbWizardPage2";
private final ImportDBInstanceDataModel wizardDataModel;
protected SelectExistingDatabasePage(AmazonRDS rds, ImportDBInstanceDataModel wizardDataModel) {
super(PAGE_NAME);
this.rds = rds;
this.wizardDataModel = wizardDataModel;
}
public void createControl(Composite parent) {
Composite composite = new Composite(parent, SWT.NONE);
composite.setLayout(new GridLayout(2, false));
setControl(composite);
LoadExistingDatabasesRunnable runnable = new LoadExistingDatabasesRunnable(rds);
try {
getContainer().run(true, true, runnable);
} catch (Exception e) {
e.printStackTrace();
}
/*
* TODO: Handle edge cases:
* 1 - not signed up for AWS
* 2 - security credentials not configured
* 3 - not signed up for RDS
* 4 - no databases to import yet
*/
/*
* TODO: Filter out the databases that have already been imported...
*/
new Label(composite, SWT.NONE).setText("RDS DB Instance:");
dbCombo = new Combo(composite, SWT.READ_ONLY);
// TODO: Add support for multiple regions
// TODO: We need to display more information about each DB than just the ID (maybe in a table)
Collection<List<DBInstance>> values = runnable.dbsByRegion.values();
for (DBInstance db : values.iterator().next()) {
dbCombo.add(db.getDBInstanceIdentifier());
dbCombo.setData(db.getDBInstanceIdentifier(), db);
}
// new Label(composite, SWT.NONE).setText("Password:");
// dbPasswordText = new Text(composite, SWT.BORDER);
// Don't edit current security groups...
// Optionally create a new one
// - shared between all connected instances?
// - "Remote Client/Tool Access" group
// - get correct CIDR range from client
bindControls();
}
@SuppressWarnings("static-access")
private void bindControls() {
bindingContext.bindValue(
new ControlDataObservableValue(SWTObservables.observeSelection(dbCombo), true),
PojoObservables.observeValue(wizardDataModel, wizardDataModel.DB_INSTANCE),
null, null);
}
// TODO: do we need progress (could use for regions)
static class LoadExistingDatabasesRunnable implements IRunnableWithProgress {
private final AmazonRDS rds;
public volatile Map<String, List<DBInstance>> dbsByRegion;
public LoadExistingDatabasesRunnable(AmazonRDS rds) {
// TODO: Stop passing in the individual client and just use the client factory to query each region
this.rds = rds;
}
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
// TODO: we really need one RDS client for each region... but we'll fake it for now...
// TODO: host name should be enough to determine if we've imported a db yet?
dbsByRegion = new HashMap<String, List<DBInstance>>();
System.out.println("Identified DBs in US-EAST-1: ");
List<DBInstance> dbInstances = rds.describeDBInstances().getDBInstances();
for (DBInstance db : dbInstances) {
System.out.println(" - " + db.getDBName() + " : " + db.getDBInstanceIdentifier());
}
dbsByRegion.put("us-east-1", dbInstances);
}
}
}