org.apache.brooklyn.demo.GlobalWebFabricExample.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.brooklyn.demo.GlobalWebFabricExample.java

Source

/*
 * 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 org.apache.brooklyn.demo;

import static com.google.common.base.Preconditions.checkNotNull;

import java.util.Arrays;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.brooklyn.api.catalog.Catalog;
import org.apache.brooklyn.api.catalog.CatalogConfig;
import org.apache.brooklyn.api.entity.EntitySpec;
import org.apache.brooklyn.config.ConfigKey;
import org.apache.brooklyn.config.StringConfigMap;
import org.apache.brooklyn.core.config.ConfigKeys;
import org.apache.brooklyn.core.entity.AbstractApplication;
import org.apache.brooklyn.core.entity.Entities;
import org.apache.brooklyn.core.entity.StartableApplication;
import org.apache.brooklyn.core.location.PortRanges;
import org.apache.brooklyn.core.sensor.PortAttributeSensorAndConfigKey;
import org.apache.brooklyn.entity.dns.geoscaling.GeoscalingDnsService;
import org.apache.brooklyn.entity.group.DynamicRegionsFabric;
import org.apache.brooklyn.entity.proxy.AbstractController;
import org.apache.brooklyn.entity.webapp.ElasticJavaWebAppService;
import org.apache.brooklyn.entity.webapp.JavaWebAppService;
import org.apache.brooklyn.launcher.BrooklynLauncher;
import org.apache.brooklyn.util.CommandLineUtil;
import org.apache.brooklyn.util.core.BrooklynMavenArtifacts;
import org.apache.brooklyn.util.core.ResourceUtils;

import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;

@Catalog(name = "Global Web Fabric", description = "Deploys a WAR to multiple clusters, showing how Brooklyn fabrics work", iconUrl = "classpath://brooklyn/demo/glossy-3d-blue-web-icon.png")
public class GlobalWebFabricExample extends AbstractApplication {

    public static final Logger log = LoggerFactory.getLogger(GlobalWebFabricExample.class);

    static final List<String> DEFAULT_LOCATIONS = ImmutableList.of("aws-ec2:eu-west-1", "aws-ec2:ap-southeast-1",
            "aws-ec2:us-west-1");

    public static final String DEFAULT_WAR_PATH = ResourceUtils.create(GlobalWebFabricExample.class)
            // take this war, from the classpath, or via maven if not on the classpath
            .firstAvailableUrl("classpath://hello-world-webapp.war",
                    BrooklynMavenArtifacts.localUrl("example", "brooklyn-example-hello-world-webapp", "war"))
            .or("classpath://hello-world-webapp.war");

    @CatalogConfig(label = "WAR (URL)", priority = 2)
    public static final ConfigKey<String> WAR_PATH = ConfigKeys.newConfigKey("app.war",
            "URL to the application archive which should be deployed", DEFAULT_WAR_PATH);

    // load-balancer instances must run on some port to work with GeoDNS, port 80 to work without special, so make that default
    // (but included here in case it runs on a different port on all machines, or use a range to work with multiple localhosts)
    @CatalogConfig(label = "Proxy server HTTP port")
    public static final PortAttributeSensorAndConfigKey PROXY_HTTP_PORT = new PortAttributeSensorAndConfigKey(
            AbstractController.PROXY_HTTP_PORT, PortRanges.fromInteger(80));

    @Override
    public void initApp() {
        StringConfigMap config = getManagementContext().getConfig();

        GeoscalingDnsService geoDns = addChild(EntitySpec.create(GeoscalingDnsService.class)
                .displayName("GeoScaling DNS")
                .configure("username", checkNotNull(config.getFirst("brooklyn.geoscaling.username"), "username"))
                .configure("password", checkNotNull(config.getFirst("brooklyn.geoscaling.password"), "password"))
                .configure("primaryDomainName",
                        checkNotNull(config.getFirst("brooklyn.geoscaling.primaryDomain"), "primaryDomain"))
                .configure("smartSubdomainName", "brooklyn"));

        DynamicRegionsFabric webFabric = addChild(
                EntitySpec.create(DynamicRegionsFabric.class).displayName("Web Fabric")
                        .configure(DynamicRegionsFabric.FACTORY, new ElasticJavaWebAppService.Factory())

                        //specify the WAR file to use
                        .configure(JavaWebAppService.ROOT_WAR, Entities.getRequiredUrlConfig(this, WAR_PATH)));

        //tell GeoDNS what to monitor
        geoDns.setTargetEntityProvider(webFabric);
    }

    public static void main(String[] argv) {
        List<String> args = Lists.newArrayList(argv);
        String port = CommandLineUtil.getCommandLineOption(args, "--port", "8081+");
        String locations = CommandLineUtil.getCommandLineOption(args, "--locations",
                Joiner.on(",").join(DEFAULT_LOCATIONS));

        BrooklynLauncher launcher = BrooklynLauncher.newInstance()
                .application(EntitySpec.create(StartableApplication.class, GlobalWebFabricExample.class)
                        .displayName("Brooklyn Global Web Fabric Example"))
                .webconsolePort(port).locations(Arrays.asList(locations)).start();

        Entities.dumpInfo(launcher.getApplications());
    }
}