/** * 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.core.samples; import org.cloudml.core.builders.*; import static org.cloudml.core.builders.Commons.*; /** * Build the deployment model of SensApp */ public class SensApp { public static final String AMAZON_EC2 = "aws-ec2"; public static final String OPENSTACK = "openstack-nova"; public static final String FLEXIANT = "flexiant"; public static final String SENSAPP = "sensapp"; public static final String JETTY = "JettySC"; public static final String MONGO_DB = "mongoDB"; public static final String SENSAPP_ADMIN = "SensAppAdmin"; public static final String SENSAPP_DB_PORT = "mongoDBRequired"; public static final String DB_PORT = "mongoDB"; public static final String SENSAPP_ADMIN_PORT = "restRequired"; public static final String SENSAPP_USER_PORT = "rest"; public static final String MONGO_DB_1 = "mongoDB1"; public static final String JETTY_2 = "jettySC2"; public static final String JETTY_1 = "jettySC1"; public static final String SENSAPP_1 = "sensApp1"; public static final String SENSAPP_ADMIN_1 = "sensAppAdmin1"; public static final String SENSAPP_ADMIN_TO_SENSAPP = "SensAppAdminSensApp"; public static final String SENSAPP_TO_MONGO_DB = "SensAppMongoDB"; public static final String SENSAPP_ADMIN_VM = "sensapp-sl1"; public static final String SENSAPP_VM = "sensapp-ml1"; public static DeploymentBuilder completeSensApp() { return sensAppTypes() .with(aVMInstance() .named(SENSAPP_VM) .ofType("ML")) .with(aVMInstance() .named(SENSAPP_ADMIN_VM) .ofType("SL")) .with(anInternalComponentInstance() .named(JETTY_1) .ofType(JETTY) .hostedBy(SENSAPP_VM)) .with(anInternalComponentInstance() .named(SENSAPP_1) .ofType(SENSAPP) .hostedBy(JETTY_1)) .with(anInternalComponentInstance() .named(MONGO_DB_1) .ofType(MONGO_DB) .hostedBy(SENSAPP_VM)) .with(anInternalComponentInstance() .named(JETTY_2) .ofType(JETTY) .hostedBy(SENSAPP_ADMIN_VM)) .with(anInternalComponentInstance() .named(SENSAPP_ADMIN_1) .ofType(SENSAPP_ADMIN) .hostedBy(JETTY_2)) .with(aRelationshipInstance() .named("sensAppMongoDB1") .ofType(SENSAPP_TO_MONGO_DB) .from(SENSAPP_1, SENSAPP_DB_PORT) .to(MONGO_DB_1, DB_PORT)) .with(aRelationshipInstance() .named("sensAppAdminSensApp1") .ofType(SENSAPP_ADMIN_TO_SENSAPP) .from(SENSAPP_ADMIN_1, SENSAPP_ADMIN_PORT) .to(SENSAPP_1, SENSAPP_USER_PORT)) ; } private static VMBuilder vmML() { return aVM() .named("ML") .providedBy(FLEXIANT) .with(aProvidedExecutionPlatform() .named("m1Provided") .offering("OS", "Ubuntu")) // FIXME offering of the execution platform .withMinRam(1000) .withMinCores(2) .withMinStorage(50) .withLocation("eu-west-1b") .withOS("ubuntu") .withGroupName("sensapp") .withSshKey("cloudml") //TODO: also add withPrivateKey .withSecurityGroup("SensApp") .with64OS(); } public static VMBuilder vmSL() { return aVM() .named("SL") .providedBy(FLEXIANT) .with(aProvidedExecutionPlatform() .named("s1Provided") .offering("OS", "Ubuntu")) .withMinRam(1000) .withMinCores(1) .withMinStorage(50) .withOS("ubuntu") .withGroupName("SensApp") .withSshKey("cloudml") .withSecurityGroup("SensApp") .withImageId("Ubuntu-SINTEF") .with64OS(); } public static ProviderBuilder ec2() { return aProvider() // FIXME: Setup the credentials .named(AMAZON_EC2); } public static ProviderBuilder flexiant() { return aProvider() .named(FLEXIANT) .withProperty("endPoint", "https://api.sd1.flexiant.net:4442/userapi"); } public static ProviderBuilder minicloud() { return aProvider().named(OPENSTACK).withProperty("endPoint", "http://192.168.1.10:5000/v2.0"); } public static InternalComponentBuilder sensApp() { return anInternalComponent() .named(SENSAPP) .with(aRequiredExecutionPlatform() .named("scRequired") .demanding("Servlet Container", "true")) // FIXME: Should be a War container, right? .with(aRequiredPort() .named(SENSAPP_DB_PORT) .remote()) .with(aProvidedPort() .named(SENSAPP_USER_PORT) .remote() .withPortNumber(8080)) .withResource(aResource() .named("sensAppWar") .retrievedBy("wget -P ~ http://github.com/downloads/SINTEF-9012/sensapp/sensapp.war; wget -P ~ http://cloudml.org/scripts/linux/ubuntu/sensapp/install_start_sensapp.sh") .installedBy("cd ~; sudo bash install_start_sensapp.sh")); } public static InternalComponentBuilder sensAppAdmin() { return anInternalComponent() .named(SENSAPP_ADMIN) .with(aRequiredExecutionPlatform() .named("scRequired") .demanding("Servlet Container", "true")) .with(aRequiredPort() .named(SENSAPP_ADMIN_PORT) .remote() .mandatory() .withPortNumber(8080)) .withResource(aResource() .named("sensAppAdminWar") .retrievedBy("wget -P ~ http://cloudml.org/resources/sensappAdmin/SensAppAdmin.tar; wget -P ~ http://cloudml.org/scripts/linux/ubuntu/sensappAdmin/start_sensappadmin.sh ; wget -P ~ http://cloudml.org/scripts/linux/ubuntu/sensappAdmin/install_sensappadmin.sh ; wget -P ~ http://cloudml.org/resources/sensappAdmin/localTopology.json") .installedBy("cd ~; sudo bash install_sensappadmin.sh") .startedBy("cd ~; sudo bash start_sensappadmin.sh") .stoppedBy("sudo rm -rf /opt/jetty/webapps/SensAppGUI ; sudo service jetty restart")); } public static InternalComponentBuilder jetty() { return anInternalComponent() .named(JETTY) .with(aProvidedExecutionPlatform() .named("sc") .offering("Servlet Container", "true")) .with(aRequiredExecutionPlatform() .named("ml") .demanding("OS", "Ubuntu")) .withResource(aResource() .named("jettyBin") .retrievedBy("wget -P ~ http://cloudml.org/scripts/linux/ubuntu/jetty/install_jetty.sh") .installedBy("cd ~; sudo bash install_jetty.sh") .stoppedBy("sudo service jetty stop")); } public static InternalComponentBuilder mongoDB() { return anInternalComponent() .named(MONGO_DB) .with(aRequiredExecutionPlatform() .named("sl") .demanding("OS", "Ubuntu")) .with(aProvidedPort() .named(DB_PORT) .remote() .withPortNumber(0)) .withResource(aResource() .named("MongoDBBin") .retrievedBy("wget -P ~ http://cloudml.org/scripts/linux/ubuntu/mongoDB/install_mongoDB.sh") .installedBy("cd ~; sudo bash install_mongoDB.sh")); } public static RelationshipBuilder sensappToMongoDB() { return aRelationship() .named(SENSAPP_TO_MONGO_DB) .from(SENSAPP, SENSAPP_DB_PORT) .to(MONGO_DB, DB_PORT); } public static RelationshipBuilder sensappAdminToSensapp() { return aRelationship() .named(SENSAPP_ADMIN_TO_SENSAPP) //add islocal .from(SENSAPP_ADMIN, SENSAPP_ADMIN_PORT) .to(SENSAPP, SENSAPP_USER_PORT) .withClientResource(aResource() .named("client") .retrievedBy("wget -P ~ http://cloudml.org/scripts/linux/ubuntu/sensappAdmin/configure_sensappadmin.sh") .installedBy("cd ~; sudo bash configure_sensappadmin.sh")); } public static DeploymentBuilder sensAppTypes() { return aDeployment() .named("SensApp") .with(ec2()) .with(flexiant()) .with(minicloud()) .with(vmML()) .with(vmSL()) .with(sensApp()) .with(sensAppAdmin()) .with(jetty()) .with(mongoDB()) .with(sensappToMongoDB()) .with(sensappAdminToSensapp()); } }