/** * This file is part of CloudML [ http://cloudml.org ] * * Copyright (C) 2012 - SINTEF ICT * Contact: Franck Chauvel <franck.chauvel@sintef.no> * * Module: root * * CloudML is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. * * CloudML is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with CloudML. If not, see * <http://www.gnu.org/licenses/>. */ package org.cloudml.connectors; import cloudadapter.Adapter; import cloudadapter.DatabaseObject; import com.cloudbees.api.ApplicationDeployArchiveResponse; import com.cloudbees.api.BeesClient; import com.cloudbees.api.ServiceResourceBindResponse; import com.google.common.collect.ImmutableMap; import java.io.File; import org.cloudml.core.Provider; import eu.cloud4soa.api.datamodel.governance.ApplicationInstance; import eu.cloud4soa.api.datamodel.governance.Credentials; import eu.cloud4soa.api.datamodel.governance.DatabaseInfo; import eu.cloud4soa.api.datamodel.governance.DeployApplicationParameters; import eu.cloud4soa.api.datamodel.governance.PaasInstance; import eu.cloud4soa.api.util.exception.adapter.Cloud4SoaException; import eu.cloud4soa.governance.ems.IExecutionManagementService; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; public class Cloud4soaConnector implements PaaSConnector { public final static String CLOUDBEES = "CloudBees"; public final static String RDS = "BeansTalk"; private ApplicationInstance ai; private PaasInstance pi; private Provider provider; private Credentials credentials; private IExecutionManagementService ems; private String platform; private static final Logger journal = Logger.getLogger(Cloud4soaConnector.class.getName()); private static Map<String, Map<String,String>> defaultValues = ImmutableMap.of( CLOUDBEES, (Map<String,String>) ImmutableMap.of( "DB-Engine", "MySQL", "DB-Version", "1.5.7", "App-Version", "default" ) ); public Cloud4soaConnector(Provider provider){ this.provider=provider; this.credentials=new Credentials( provider.getCredentials().getLogin(), provider.getCredentials().getPassword(), provider.getProperties().get("account").getValue() ); if(provider.getName().toLowerCase().equals(CLOUDBEES.toLowerCase())) this.platform = CLOUDBEES; if(provider.getName().toLowerCase().equals(RDS.toLowerCase())) this.platform = RDS; } public Cloud4soaConnector(String apiKey, String securityKey, String account, String platform) { credentials = new Credentials(apiKey, securityKey, account); this.platform = platform; } public String createEnvironmentWithWar(String applicationName, String domainName, String envName, String stackName, int minRam, String warFile, String versionLabel) { String tmp2=""; if(stackName == null || stackName.length()==0){ try { tmp2 = Adapter.uploadAndDeployToEnv(platform, warFile, credentials.getPublicKey(), credentials.getPrivateKey(), credentials.getAccountName(), applicationName, versionLabel, "", "", "", "", "", "deployed by cloudml" ); journal.log(Level.INFO, ">> Created application:" + tmp2); } catch (Cloud4SoaException ex) { Logger.getLogger(Cloud4soaConnector.class.getName()).log(Level.SEVERE, null, ex); } catch (java.lang.NoSuchFieldError ex){ Logger.getLogger(Cloud4soaConnector.class.getName()).log(Level.SEVERE, "The war is deployed, but due to the version conflict of cloudbees, no response is printed"); } } else{ BeesClient client = new BeesClient("https://api.cloudbees.com/api", provider.getCredentials().getLogin(), provider.getCredentials().getPassword(), "xml", "1.0"); Map<String,String> params = new HashMap<String, String>(); params.put("containerType", stackName); try { ApplicationDeployArchiveResponse deployArchiveResponse = client.applicationDeployArchive(this.credentials.getAccountName() + "/" + applicationName, envName, "deployed by cloudml", warFile, warFile, "war", false, params, null); tmp2=deployArchiveResponse.getUrl(); } catch (Exception ex) { Logger.getLogger(Cloud4soaConnector.class.getName()).log(Level.SEVERE, null, ex); } } return tmp2; } // private Application[] listApplications() throws Cloud4SoaException { // String adapterUrl=provider.findProperty("enPoint"); // return ems.listApplications("adapterUrl", credentials, pi); // } private void deploy(String name, File warFile) throws Cloud4SoaException { DeployApplicationParameters parameters = new DeployApplicationParameters(); String adapterUrl = provider.getProperties().valueOf("enPoint"); ai = new ApplicationInstance(); ai.setAppName(name); ai.setAdapterUrl("adapterURL"); parameters.setApplicationArchive(warFile); ems.deployApplication(adapterUrl, credentials, pi, ai, parameters); } private void undeploy(String name) throws Cloud4SoaException { String adapterUrl = provider.getProperties().valueOf("enPoint"); ai = new ApplicationInstance(); ai.setAppName(name); ai.setAdapterUrl("adapterURL"); ems.undeployApplication(adapterUrl, credentials, pi, ai); } public void uploadWar(String warFile, String versionLabel, String applicationName, String envName, int timeout) { System.out.print("uploadWar:"); while (timeout-- > 0) { System.out.print("-"); try { Thread.sleep(1000); } catch (InterruptedException ex) { Logger.getLogger(BeanstalkConnector.class.getName()).log(Level.SEVERE, null, ex); } try { String tmp2 = Adapter.uploadAndDeployToEnv( platform, warFile, credentials.getPublicKey(), credentials.getPrivateKey(), credentials.getAccountName(), applicationName, versionLabel, envName, "", "", "", "", "deployed by cloudml after db injection"); journal.log(Level.INFO, ">> Created application:" + tmp2); break; } catch (Exception ex) { Logger.getLogger(Cloud4soaConnector.class.getName()).log(Level.SEVERE, null, ex); } } } @Override public String createQueue(String name) { throw new IllegalStateException("not supported"); } @Override public void deleteQueue(String name) { throw new IllegalStateException("not supported"); } @Override public List<String> listQueues() { throw new IllegalStateException("not supported"); } @Override public void createDBInstance(String engine, String version, String dbInstanceIdentifier, String dbName, String username, String password, Integer allocatedSize, String dbInstanceClass, String securityGroup) { try { if(engine==null || engine.equals("")) engine = defaultValues.get(platform).get("DB-Engine"); if(version == null || version.equals("")) version = defaultValues.get(platform).get("DB-Version"); if(dbName==null || dbName.equals("")) dbName = dbInstanceIdentifier; DatabaseInfo dbinfo = Adapter.createDB(platform, credentials.getPublicKey(), credentials.getPrivateKey(),credentials.getAccountName(), dbInstanceIdentifier, engine, version, "created by cloudml", dbName, username, password ); journal.log(Level.INFO, ">>DB created: "+dbinfo.toString()+": "+dbinfo.getDatabaseUrl()+dbinfo.getHost()); } catch (Cloud4SoaException ex) { Logger.getLogger(Cloud4soaConnector.class.getName()).log(Level.SEVERE, null, ex); } } public void restoreDB(String host, String port, String dbUser,String dbPass, String dbName, String local_file){ journal.log(Level.INFO, ">> Not yet implemented"); } /** * Cloud4Soa does not work for Cloudbees * * @param dbInstanceId * @param timeout * @return */ public String getDBEndPoint(String dbInstanceId, int timeout) { System.out.print("Retriving DB endpoint:"); while (timeout-- > 0) { try { Thread.sleep(1000); } catch (InterruptedException ex) { Logger.getLogger(Cloud4soaConnector.class.getName()).log(Level.SEVERE, null, ex); } try { DatabaseObject dbobject = Adapter.getDBInfo( platform, credentials.getPublicKey(), credentials.getPrivateKey(), credentials.getAccountName(), "mysql", "", "1.5.7", null, dbInstanceId, null, null); if (dbobject.getDbhost() != null && dbobject.getDbhost().length() > 0) { System.out.println(dbobject.getDbhost() + ":" + dbobject.getPort()); return dbobject.getDbhost()+":"+dbobject.getPort()+"/"+dbobject.getDbname(); } } catch (Cloud4SoaException ex) { Logger.getLogger(Cloud4soaConnector.class.getName()).log(Level.SEVERE, null, ex); } } return ""; } @Override public void configAppParameters(String applicationName, Map<String,String> params) { if("cloudbees".equals(provider.getName().toLowerCase())){ try{ BeesClient client = new BeesClient("https://api.cloudbees.com/api", provider.getCredentials().getLogin(), provider.getCredentials().getPassword(), "xml", "1.0"); client.applicationConfigUpdate(this.credentials.getAccountName()+"/"+applicationName, params); } catch(Exception ex){ Logger.getLogger(Cloud4soaConnector.class.getName()).log(Level.SEVERE, "failed to set up scale", ex); } } } public void restartApp(String appId){ try { BeesClient client = new BeesClient("https://api.cloudbees.com/api", provider.getCredentials().getLogin(), provider.getCredentials().getPassword(), "xml", "1.0"); client.applicationRestart("mod4cloud/" + appId); } catch (Exception e) { journal.log(Level.SEVERE, e.getMessage()); } } public void bindDbToApp(String appId, String dbId, String alias){ try { //Thread.sleep(60000); BeesClient client = new BeesClient("https://api.cloudbees.com/api", provider.getCredentials().getLogin(), provider.getCredentials().getPassword(), "xml", "1.0"); ServiceResourceBindResponse srbr=client.resourceBind("cb-app", "mod4cloud/"+appId, "cb-db", "mod4cloud/"+dbId, alias, Collections.EMPTY_MAP); Logger.getLogger(Cloud4soaConnector.class.getName()).log(Level.INFO, srbr.getMessage()); restartApp(appId); } catch (Exception ex) { Logger.getLogger(Cloud4soaConnector.class.getName()).log(Level.SEVERE, null, ex); } } @Override public void setEnvVar(String appName, String nameVar, String val) { return; } @Override public void deleteApp(String appName) { try { undeploy(appName); } catch (Cloud4SoaException e) { e.printStackTrace(); } } }