http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d5cf5285/software/nosql/src/main/java/brooklyn/entity/nosql/couchbase/CouchbaseSyncGatewayImpl.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/couchbase/CouchbaseSyncGatewayImpl.java b/software/nosql/src/main/java/brooklyn/entity/nosql/couchbase/CouchbaseSyncGatewayImpl.java deleted file mode 100644 index ae82af4..0000000 --- a/software/nosql/src/main/java/brooklyn/entity/nosql/couchbase/CouchbaseSyncGatewayImpl.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * 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 brooklyn.entity.nosql.couchbase; - -import brooklyn.config.render.RendererHints; -import brooklyn.entity.basic.SoftwareProcessImpl; -import brooklyn.event.feed.http.HttpFeed; -import brooklyn.event.feed.http.HttpPollConfig; -import brooklyn.event.feed.http.HttpValueFunctions; -import brooklyn.location.access.BrooklynAccessUtils; - -import com.google.common.base.Functions; -import com.google.common.net.HostAndPort; - -public class CouchbaseSyncGatewayImpl extends SoftwareProcessImpl implements CouchbaseSyncGateway { - - private HttpFeed httpFeed; - - @Override - public Class<CouchbaseSyncGatewayDriver> getDriverInterface() { - return CouchbaseSyncGatewayDriver.class; - } - - @Override - protected void connectSensors() { - super.connectSensors(); - connectServiceUpIsRunning(); - } - - @Override - protected void connectServiceUpIsRunning() { - HostAndPort hp = BrooklynAccessUtils.getBrooklynAccessibleAddress(this, - getAttribute(CouchbaseSyncGateway.ADMIN_REST_API_PORT)); - - String managementUri = String.format("http://%s:%s", - hp.getHostText(), hp.getPort()); - - setAttribute(MANAGEMENT_URL, managementUri); - - httpFeed = HttpFeed.builder() - .entity(this) - .period(200) - .baseUri(managementUri) - .poll(new HttpPollConfig<Boolean>(SERVICE_UP) - .onSuccess(HttpValueFunctions.responseCodeEquals(200)) - .onFailureOrException(Functions.constant(false))) - .build(); - } - - @Override - protected void disconnectSensors() { - super.disconnectSensors(); - disconnectServiceUpIsRunning(); - } - - @Override - protected void disconnectServiceUpIsRunning() { - if (httpFeed != null) { - httpFeed.stop(); - } - } - - static { - RendererHints.register(MANAGEMENT_URL, RendererHints.namedActionWithUrl()); - } -} \ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d5cf5285/software/nosql/src/main/java/brooklyn/entity/nosql/couchbase/CouchbaseSyncGatewaySshDriver.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/couchbase/CouchbaseSyncGatewaySshDriver.java b/software/nosql/src/main/java/brooklyn/entity/nosql/couchbase/CouchbaseSyncGatewaySshDriver.java deleted file mode 100644 index d21f9b5..0000000 --- a/software/nosql/src/main/java/brooklyn/entity/nosql/couchbase/CouchbaseSyncGatewaySshDriver.java +++ /dev/null @@ -1,167 +0,0 @@ -/* - * 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 brooklyn.entity.nosql.couchbase; - -import static brooklyn.util.ssh.BashCommands.INSTALL_CURL; -import static brooklyn.util.ssh.BashCommands.alternatives; -import static brooklyn.util.ssh.BashCommands.chainGroup; -import static brooklyn.util.ssh.BashCommands.sudo; -import static java.lang.String.format; - -import java.util.List; - -import brooklyn.entity.Entity; -import brooklyn.entity.basic.AbstractSoftwareProcessSshDriver; -import brooklyn.entity.basic.Entities; -import brooklyn.entity.basic.EntityLocal; -import brooklyn.entity.basic.EntityPredicates; -import brooklyn.entity.drivers.downloads.DownloadResolver; -import brooklyn.event.basic.DependentConfiguration; -import brooklyn.location.OsDetails; -import brooklyn.location.basic.SshMachineLocation; -import brooklyn.util.collections.MutableMap; -import brooklyn.util.ssh.BashCommands; -import brooklyn.util.time.Duration; -import brooklyn.util.time.Time; - -import com.google.common.base.Optional; -import com.google.common.base.Predicates; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Iterables; - -public class CouchbaseSyncGatewaySshDriver extends AbstractSoftwareProcessSshDriver implements CouchbaseSyncGatewayDriver { - public CouchbaseSyncGatewaySshDriver(EntityLocal entity, SshMachineLocation machine) { - super(entity, machine); - } - - @Override - public void stop() { - - } - - @Override - public void install() { - //reference http://docs.couchbase.com/sync-gateway/#getting-started-with-sync-gateway - DownloadResolver resolver = Entities.newDownloader(this); - List<String> urls = resolver.getTargets(); - String saveAs = resolver.getFilename(); - - OsDetails osDetails = getMachine().getMachineDetails().getOsDetails(); - - log.info("Installing couchbase-sync-gateway version: {}", getVersion()); - if (osDetails.isLinux()) { - List<String> commands = installLinux(urls, saveAs); - newScript(INSTALLING) - .body.append(commands).execute(); - } - } - - @Override - public void customize() { - - } - - @Override - public void launch() { - Entity cbNode = entity.getConfig(CouchbaseSyncGateway.COUCHBASE_SERVER); - Entities.waitForServiceUp(cbNode, Duration.ONE_HOUR); - DependentConfiguration.waitInTaskForAttributeReady(cbNode, CouchbaseCluster.IS_CLUSTER_INITIALIZED, Predicates.equalTo(true)); - // Even once the bucket has published its API URL, it can still take a couple of seconds for it to become available - Time.sleep(10 * 1000); - if (cbNode instanceof CouchbaseCluster) { - // in_cluster now applies even to a node in a cluster of size 1 - Optional<Entity> cbClusterNode = Iterables.tryFind(cbNode.getAttribute(CouchbaseCluster.GROUP_MEMBERS), - Predicates.and(Predicates.instanceOf(CouchbaseNode.class), EntityPredicates.attributeEqualTo(CouchbaseNode.IS_IN_CLUSTER, Boolean.TRUE))); - - if (!cbClusterNode.isPresent()) { - throw new IllegalArgumentException(format("The cluster %s does not contain any suitable Couchbase nodes to connect to..", cbNode.getId())); - } - - cbNode = cbClusterNode.get(); - } - String hostname = cbNode.getAttribute(CouchbaseNode.HOSTNAME); - String webPort = cbNode.getAttribute(CouchbaseNode.COUCHBASE_WEB_ADMIN_PORT).toString(); - - - String username = cbNode.getConfig(CouchbaseNode.COUCHBASE_ADMIN_USERNAME); - String password = cbNode.getConfig(CouchbaseNode.COUCHBASE_ADMIN_PASSWORD); - - String bucketName = entity.getConfig(CouchbaseSyncGateway.COUCHBASE_SERVER_BUCKET); - String pool = entity.getConfig(CouchbaseSyncGateway.COUCHBASE_SERVER_POOL); - String pretty = entity.getConfig(CouchbaseSyncGateway.PRETTY) ? "-pretty" : ""; - String verbose = entity.getConfig(CouchbaseSyncGateway.VERBOSE) ? "-verbose" : ""; - - String adminRestApiPort = entity.getConfig(CouchbaseSyncGateway.ADMIN_REST_API_PORT).iterator().next().toString(); - String syncRestApiPort = entity.getConfig(CouchbaseSyncGateway.SYNC_REST_API_PORT).iterator().next().toString(); - - String serverWebAdminUrl = format("http://%s:%s@%s:%s", username, password, hostname, webPort); - String options = format("-url %s -bucket %s -adminInterface 0.0.0.0:%s -interface 0.0.0.0:%s -pool %s %s %s", - serverWebAdminUrl, bucketName, adminRestApiPort, syncRestApiPort, pool, pretty, verbose); - - newScript(ImmutableMap.of("usePidFile", true), LAUNCHING) - .body.append(format("/opt/couchbase-sync-gateway/bin/sync_gateway %s ", options) + "> out.log 2> err.log < /dev/null &") - .failOnNonZeroResultCode() - .execute(); - } - - @Override - public boolean isRunning() { - return newScript(MutableMap.of("usePidFile", true), CHECK_RUNNING).execute() == 0; - } - - @Override - public void kill() { - newScript(MutableMap.of("usePidFile", true), KILLING).execute(); - } - - private List<String> installLinux(List<String> urls, String saveAs) { - - String apt = chainGroup( - "which apt-get", - sudo("apt-get update"), - sudo(format("dpkg -i %s", saveAs))); - - String yum = chainGroup( - "which yum", - sudo(format("rpm --install %s", saveAs))); - - return ImmutableList.<String>builder() - .add(INSTALL_CURL) - .addAll(BashCommands.commandsToDownloadUrlsAs(urls, saveAs)) - .add(alternatives(apt, yum)) - .build(); - } - - @Override - public String getOsTag() { - OsDetails os = getLocation().getOsDetails(); - if (os == null) { - // Default to generic linux - return "x86_64.rpm"; - } else { - //FIXME should be a better way to check for OS name and version - String osName = os.getName().toLowerCase(); - String fileExtension = osName.contains("deb") || osName.contains("ubuntu") ? ".deb" : ".rpm"; - String arch = os.is64bit() ? "x86_64" : "x86"; - return arch + fileExtension; - } - } - -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d5cf5285/software/nosql/src/main/java/brooklyn/entity/nosql/couchdb/CouchDBCluster.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/couchdb/CouchDBCluster.java b/software/nosql/src/main/java/brooklyn/entity/nosql/couchdb/CouchDBCluster.java deleted file mode 100644 index 7e65a78..0000000 --- a/software/nosql/src/main/java/brooklyn/entity/nosql/couchdb/CouchDBCluster.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * 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 brooklyn.entity.nosql.couchdb; - -import brooklyn.entity.group.DynamicCluster; -import brooklyn.entity.proxying.ImplementedBy; -import brooklyn.event.AttributeSensor; -import brooklyn.event.basic.BasicAttributeSensorAndConfigKey; -import brooklyn.event.basic.Sensors; -import brooklyn.util.flags.SetFromFlag; - -/** - * A cluster of {@link CouchDBNode}s based on {@link DynamicCluster} which can be resized by a policy if required. - * - * TODO add sensors with aggregated CouchDB statistics from cluster - */ -@ImplementedBy(CouchDBClusterImpl.class) -public interface CouchDBCluster extends DynamicCluster { - - @SetFromFlag("clusterName") - BasicAttributeSensorAndConfigKey<String> CLUSTER_NAME = new BasicAttributeSensorAndConfigKey<String>(String.class, "couchdb.cluster.name", "Name of the CouchDB cluster", "BrooklynCluster"); - - AttributeSensor<String> HOSTNAME = Sensors.newStringSensor("couchdb.cluster.hostname", "Hostname to connect to cluster with"); - - AttributeSensor<Integer> HTTP_PORT = Sensors.newIntegerSensor("couchdb.cluster.http.port", "CouchDB HTTP port to connect to cluster with"); - - /** - * The name of the cluster. - */ - String getClusterName(); - -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d5cf5285/software/nosql/src/main/java/brooklyn/entity/nosql/couchdb/CouchDBClusterImpl.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/couchdb/CouchDBClusterImpl.java b/software/nosql/src/main/java/brooklyn/entity/nosql/couchdb/CouchDBClusterImpl.java deleted file mode 100644 index 4835f72..0000000 --- a/software/nosql/src/main/java/brooklyn/entity/nosql/couchdb/CouchDBClusterImpl.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * 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 brooklyn.entity.nosql.couchdb; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import brooklyn.entity.group.DynamicClusterImpl; -import brooklyn.entity.proxying.EntitySpec; - -/** - * Implementation of {@link CouchDBCluster}. - */ -public class CouchDBClusterImpl extends DynamicClusterImpl implements CouchDBCluster { - - @SuppressWarnings("unused") - private static final Logger log = LoggerFactory.getLogger(CouchDBClusterImpl.class); - - public CouchDBClusterImpl() { - } - - /** - * Sets the default {@link #MEMBER_SPEC} to describe the CouchDB nodes. - */ - @Override - protected EntitySpec<?> getMemberSpec() { - return getConfig(MEMBER_SPEC, EntitySpec.create(CouchDBNode.class)); - } - - @Override - public String getClusterName() { - return getAttribute(CLUSTER_NAME); - } - -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d5cf5285/software/nosql/src/main/java/brooklyn/entity/nosql/couchdb/CouchDBNode.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/couchdb/CouchDBNode.java b/software/nosql/src/main/java/brooklyn/entity/nosql/couchdb/CouchDBNode.java deleted file mode 100644 index 88d0694..0000000 --- a/software/nosql/src/main/java/brooklyn/entity/nosql/couchdb/CouchDBNode.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * 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 brooklyn.entity.nosql.couchdb; - -import org.apache.brooklyn.catalog.Catalog; -import brooklyn.config.ConfigKey; -import brooklyn.entity.basic.ConfigKeys; -import brooklyn.entity.basic.SoftwareProcess; -import brooklyn.entity.proxying.ImplementedBy; -import brooklyn.entity.webapp.WebAppService; -import brooklyn.event.basic.BasicAttributeSensorAndConfigKey; -import brooklyn.util.flags.SetFromFlag; - -/** - * An {@link brooklyn.entity.Entity} that represents a CouchDB node in a {@link CouchDBCluster}. - */ -@Catalog(name="CouchDB Node", - description="Apache CouchDB is a database that uses JSON for documents, JavaScript for MapReduce queries, " + - "and regular HTTP for an API", - iconUrl="classpath:///couchdb-logo.png") -@ImplementedBy(CouchDBNodeImpl.class) -public interface CouchDBNode extends SoftwareProcess, WebAppService { - - @SetFromFlag("version") - ConfigKey<String> SUGGESTED_VERSION = ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.SUGGESTED_VERSION, "1.2.1"); - - @SetFromFlag("erlangVersion") - ConfigKey<String> ERLANG_VERSION = ConfigKeys.newStringConfigKey("erlang.version", "Erlang runtime version", "R15B"); - - @SetFromFlag("clusterName") - BasicAttributeSensorAndConfigKey<String> CLUSTER_NAME = CouchDBCluster.CLUSTER_NAME; - - @SetFromFlag("couchdbConfigTemplateUrl") - BasicAttributeSensorAndConfigKey<String> COUCHDB_CONFIG_TEMPLATE_URL = new BasicAttributeSensorAndConfigKey<String>( - String.class, "couchdb.config.templateUrl", "Template file (in freemarker format) for the couchdb config file", - "classpath://brooklyn/entity/nosql/couchdb/couch.ini"); - - @SetFromFlag("couchdbUriTemplateUrl") - BasicAttributeSensorAndConfigKey<String> COUCHDB_URI_TEMPLATE_URL = new BasicAttributeSensorAndConfigKey<String>( - String.class, "couchdb.uri.templateUrl", "Template file (in freemarker format) for the couchdb URI file", - "classpath://brooklyn/entity/nosql/couchdb/couch.uri"); - - @SetFromFlag("couchdbConfigFileName") - BasicAttributeSensorAndConfigKey<String> COUCHDB_CONFIG_FILE_NAME = new BasicAttributeSensorAndConfigKey<String>( - String.class, "couchdb.config.fileName", "Name for the copied config file", "local.ini"); - - Integer getHttpPort(); - - Integer getHttpsPort(); -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d5cf5285/software/nosql/src/main/java/brooklyn/entity/nosql/couchdb/CouchDBNodeDriver.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/couchdb/CouchDBNodeDriver.java b/software/nosql/src/main/java/brooklyn/entity/nosql/couchdb/CouchDBNodeDriver.java deleted file mode 100644 index 6e98c33..0000000 --- a/software/nosql/src/main/java/brooklyn/entity/nosql/couchdb/CouchDBNodeDriver.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * 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 brooklyn.entity.nosql.couchdb; - -import brooklyn.entity.basic.SoftwareProcessDriver; - -public interface CouchDBNodeDriver extends SoftwareProcessDriver { - - Integer getHttpPort(); - - Integer getHttpsPort(); - - String getClusterName(); - - String getCouchDBConfigTemplateUrl(); - - String getCouchDBUriTemplateUrl(); - - String getCouchDBConfigFileName(); - -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d5cf5285/software/nosql/src/main/java/brooklyn/entity/nosql/couchdb/CouchDBNodeImpl.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/couchdb/CouchDBNodeImpl.java b/software/nosql/src/main/java/brooklyn/entity/nosql/couchdb/CouchDBNodeImpl.java deleted file mode 100644 index 89573ec..0000000 --- a/software/nosql/src/main/java/brooklyn/entity/nosql/couchdb/CouchDBNodeImpl.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * 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 brooklyn.entity.nosql.couchdb; - -import java.util.concurrent.TimeUnit; - -import javax.annotation.Nullable; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import brooklyn.entity.basic.SoftwareProcessImpl; -import brooklyn.entity.webapp.JavaWebAppSoftwareProcessImpl; -import brooklyn.entity.webapp.WebAppServiceMethods; -import brooklyn.event.feed.http.HttpFeed; -import brooklyn.event.feed.http.HttpPollConfig; -import brooklyn.event.feed.http.HttpValueFunctions; - -import com.google.common.base.Function; -import com.google.common.base.Functions; - -/** - * Implementation of {@link CouchDBNode}. - */ -public class CouchDBNodeImpl extends SoftwareProcessImpl implements CouchDBNode { - - private static final Logger log = LoggerFactory.getLogger(CouchDBNodeImpl.class); - - public CouchDBNodeImpl() { - } - - public Integer getHttpPort() { return getAttribute(CouchDBNode.HTTP_PORT); } - public Integer getHttpsPort() { return getAttribute(CouchDBNode.HTTPS_PORT); } - public String getClusterName() { return getAttribute(CouchDBNode.CLUSTER_NAME); } - - @Override - public Class<CouchDBNodeDriver> getDriverInterface() { - return CouchDBNodeDriver.class; - } - - private volatile HttpFeed httpFeed; - - @Override - protected void connectSensors() { - super.connectSensors(); - - connectServiceUpIsRunning(); - - httpFeed = HttpFeed.builder() - .entity(this) - .period(500, TimeUnit.MILLISECONDS) - .baseUri(String.format("http://%s:%d/_stats", getAttribute(HOSTNAME), getHttpPort())) - .poll(new HttpPollConfig<Integer>(REQUEST_COUNT) - .onSuccess(HttpValueFunctions.jsonContents(new String[] { "httpd", "requests", "count" }, Integer.class)) - .onFailureOrException(Functions.constant(-1))) - .poll(new HttpPollConfig<Integer>(ERROR_COUNT) - .onSuccess(HttpValueFunctions.jsonContents(new String[] { "httpd_status_codes", "404", "count" }, Integer.class)) - .onFailureOrException(Functions.constant(-1))) - .poll(new HttpPollConfig<Integer>(TOTAL_PROCESSING_TIME) - .onSuccess(HttpValueFunctions.jsonContents(new String[] { "couchdb", "request_time", "count" }, Integer.class)) - .onFailureOrException(Functions.constant(-1))) - .poll(new HttpPollConfig<Integer>(MAX_PROCESSING_TIME) - .onSuccess(HttpValueFunctions.chain(HttpValueFunctions.jsonContents(new String[] { "couchdb", "request_time", "max" }, Double.class), new Function<Double, Integer>() { - @Override - public Integer apply(@Nullable Double input) { - return Integer.valueOf(input.intValue()); - } - })) - .onFailureOrException(Functions.constant(-1))) - .build(); - - WebAppServiceMethods.connectWebAppServerPolicies(this); - } - - @Override - public void disconnectSensors() { - super.disconnectSensors(); - if (httpFeed != null) httpFeed.stop(); - disconnectServiceUpIsRunning(); - } - - /** @see JavaWebAppSoftwareProcessImpl#postStop() */ - @Override - protected void postStop() { - super.postStop(); - // zero our workrate derived workrates. - setAttribute(REQUESTS_PER_SECOND_LAST, 0D); - setAttribute(REQUESTS_PER_SECOND_IN_WINDOW, 0D); - } -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d5cf5285/software/nosql/src/main/java/brooklyn/entity/nosql/couchdb/CouchDBNodeSshDriver.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/couchdb/CouchDBNodeSshDriver.java b/software/nosql/src/main/java/brooklyn/entity/nosql/couchdb/CouchDBNodeSshDriver.java deleted file mode 100644 index 74a8092..0000000 --- a/software/nosql/src/main/java/brooklyn/entity/nosql/couchdb/CouchDBNodeSshDriver.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * 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 brooklyn.entity.nosql.couchdb; - -import static brooklyn.util.ssh.BashCommands.*; - -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import brooklyn.entity.basic.AbstractSoftwareProcessSshDriver; -import brooklyn.entity.basic.Attributes; -import brooklyn.location.Location; -import brooklyn.location.basic.SshMachineLocation; -import brooklyn.util.collections.MutableMap; -import brooklyn.util.net.Networking; -import brooklyn.util.os.Os; - -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Sets; - -/** - * Start a {@link CouchDBNode} in a {@link Location} accessible over ssh. - */ -public class CouchDBNodeSshDriver extends AbstractSoftwareProcessSshDriver implements CouchDBNodeDriver { - - private static final Logger log = LoggerFactory.getLogger(CouchDBNodeSshDriver.class); - - public CouchDBNodeSshDriver(CouchDBNodeImpl entity, SshMachineLocation machine) { - super(entity, machine); - - entity.setAttribute(Attributes.LOG_FILE_LOCATION, getLogFileLocation()); - } - - public String getLogFileLocation() { return Os.mergePathsUnix(getRunDir(), "couchdb.log"); } - - @Override - public Integer getHttpPort() { return entity.getAttribute(CouchDBNode.HTTP_PORT); } - - @Override - public Integer getHttpsPort() { return entity.getAttribute(CouchDBNode.HTTPS_PORT); } - - @Override - public String getClusterName() { return entity.getAttribute(CouchDBNode.CLUSTER_NAME); } - - @Override - public String getCouchDBConfigTemplateUrl() { return entity.getAttribute(CouchDBNode.COUCHDB_CONFIG_TEMPLATE_URL); } - - @Override - public String getCouchDBUriTemplateUrl() { return entity.getAttribute(CouchDBNode.COUCHDB_URI_TEMPLATE_URL); } - - @Override - public String getCouchDBConfigFileName() { return entity.getAttribute(CouchDBNode.COUCHDB_CONFIG_FILE_NAME); } - - public String getErlangVersion() { return entity.getConfig(CouchDBNode.ERLANG_VERSION); } - - @Override - public void install() { - log.info("Installing {}", entity); - List<String> commands = ImmutableList.<String>builder() - .add(ifExecutableElse0("zypper", chainGroup( // SLES 11 not supported, would require building from source - ok(sudo("zypper --non-interactive addrepo http://download.opensuse.org/repositories/devel:/languages:/erlang/openSUSE_11.4 erlang_suse_11")), - ok(sudo("zypper --non-interactive addrepo http://download.opensuse.org/repositories/devel:/languages:/erlang/openSUSE_12.3 erlang_suse_12")), - ok(sudo("zypper --non-interactive addrepo http://download.opensuse.org/repositories/devel:/languages:/erlang/openSUSE_13.1 erlang_suse_13")), - ok(sudo("zypper --non-interactive addrepo http://download.opensuse.org/repositories/server:/database/openSUSE_11.4 db_suse_11")), - ok(sudo("zypper --non-interactive addrepo http://download.opensuse.org/repositories/server:/database/openSUSE_12.3 db_suse_12")), - ok(sudo("zypper --non-interactive addrepo http://download.opensuse.org/repositories/server:/database/openSUSE_13.1 db_suse_13"))))) - .add(installPackage( // NOTE only 'port' states the version of Erlang used, maybe remove this constraint? - ImmutableMap.of( - "apt", "erlang-nox erlang-dev", - "port", "erlang@"+getErlangVersion()+"+ssl"), - "erlang")) - .add(installPackage("couchdb")) - .add(ifExecutableElse0("service", sudo("service couchdb stop"))) - .build(); - - newScript(INSTALLING) - .body.append(commands) - .execute(); - } - - @Override - public Set<Integer> getPortsUsed() { - Set<Integer> result = Sets.newLinkedHashSet(super.getPortsUsed()); - result.addAll(getPortMap().values()); - return result; - } - - private Map<String, Integer> getPortMap() { - return ImmutableMap.<String, Integer>builder() - .put("httpPort", getHttpPort()) - .build(); - } - - @Override - public void customize() { - log.info("Customizing {} (Cluster {})", entity, getClusterName()); - Networking.checkPortsValid(getPortMap()); - - newScript(CUSTOMIZING).execute(); - - // Copy the configuration files across - String destinationConfigFile = Os.mergePathsUnix(getRunDir(), getCouchDBConfigFileName()); - copyTemplate(getCouchDBConfigTemplateUrl(), destinationConfigFile); - String destinationUriFile = Os.mergePathsUnix(getRunDir(), "couch.uri"); - copyTemplate(getCouchDBUriTemplateUrl(), destinationUriFile); - } - - @Override - public void launch() { - log.info("Launching {}", entity); - newScript(MutableMap.of(USE_PID_FILE, false), LAUNCHING) - .body.append(sudo(String.format("nohup couchdb -p %s -a %s -o couchdb-console.log -e couchdb-error.log -b &", getPidFile(), Os.mergePathsUnix(getRunDir(), getCouchDBConfigFileName())))) - .execute(); - } - - public String getPidFile() { return Os.mergePathsUnix(getRunDir(), "couchdb.pid"); } - - @Override - public boolean isRunning() { - return newScript(MutableMap.of(USE_PID_FILE, false), CHECK_RUNNING) - .body.append(sudo(String.format("couchdb -p %s -s", getPidFile()))) - .execute() == 0; - } - - @Override - public void stop() { - newScript(MutableMap.of(USE_PID_FILE, false), STOPPING) - .body.append(sudo(String.format("couchdb -p %s -k", getPidFile()))) - .failOnNonZeroResultCode() - .execute(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d5cf5285/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchCluster.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchCluster.java b/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchCluster.java deleted file mode 100644 index ac5e1a8..0000000 --- a/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchCluster.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * 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 brooklyn.entity.nosql.elasticsearch; - -import org.apache.brooklyn.catalog.Catalog; -import brooklyn.entity.group.DynamicCluster; -import brooklyn.entity.proxying.ImplementedBy; -import brooklyn.event.basic.BasicAttributeSensorAndConfigKey; -import brooklyn.util.flags.SetFromFlag; - -/** - * A cluster of {@link ElasticSearchNode}s based on {@link DynamicCluster} which can be resized by a policy if required. - */ -@Catalog(name="Elastic Search Cluster", description="Elasticsearch is an open-source search server based on Lucene. " - + "It provides a distributed, multitenant-capable full-text search engine with a RESTful web interface and " - + "schema-free JSON documents.") -@ImplementedBy(ElasticSearchClusterImpl.class) -public interface ElasticSearchCluster extends DynamicCluster { - @SetFromFlag("clusterName") - BasicAttributeSensorAndConfigKey<String> CLUSTER_NAME = new BasicAttributeSensorAndConfigKey<String>(String.class, - "elasticsearch.cluster.name", "Name of the ElasticSearch cluster", "BrooklynCluster"); - - String getClusterName(); -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d5cf5285/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchClusterImpl.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchClusterImpl.java b/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchClusterImpl.java deleted file mode 100644 index a773006..0000000 --- a/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchClusterImpl.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * 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 brooklyn.entity.nosql.elasticsearch; - -import java.util.concurrent.atomic.AtomicInteger; - -import brooklyn.entity.group.DynamicClusterImpl; -import brooklyn.entity.proxying.EntitySpec; - -public class ElasticSearchClusterImpl extends DynamicClusterImpl implements ElasticSearchCluster { - - private AtomicInteger nextMemberId = new AtomicInteger(0); - - @Override - protected EntitySpec<?> getMemberSpec() { - EntitySpec<?> spec = EntitySpec.create(getConfig(MEMBER_SPEC, EntitySpec.create(ElasticSearchNode.class))); - - spec.configure(ElasticSearchNode.CLUSTER_NAME, getConfig(ElasticSearchClusterImpl.CLUSTER_NAME)) - .configure(ElasticSearchNode.NODE_NAME, "elasticsearch-" + nextMemberId.incrementAndGet()); - - return spec; - } - - @Override - public String getClusterName() { - return getConfig(CLUSTER_NAME); - } - -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d5cf5285/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchNode.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchNode.java b/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchNode.java deleted file mode 100644 index 814955e..0000000 --- a/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchNode.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * 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 brooklyn.entity.nosql.elasticsearch; - -import org.apache.brooklyn.catalog.Catalog; -import brooklyn.config.ConfigKey; -import brooklyn.entity.basic.ConfigKeys; -import brooklyn.entity.basic.SoftwareProcess; -import brooklyn.entity.database.DatastoreMixins; -import brooklyn.entity.proxying.ImplementedBy; -import brooklyn.entity.webapp.WebAppServiceConstants; -import brooklyn.event.AttributeSensor; -import brooklyn.event.basic.BasicAttributeSensorAndConfigKey; -import brooklyn.event.basic.BasicAttributeSensorAndConfigKey.StringAttributeSensorAndConfigKey; -import brooklyn.event.basic.PortAttributeSensorAndConfigKey; -import brooklyn.event.basic.Sensors; -import brooklyn.location.basic.PortRanges; -import brooklyn.util.flags.SetFromFlag; - -/** - * An {@link brooklyn.entity.Entity} that represents an ElasticSearch node - */ -@Catalog(name="Elastic Search Node", description="Elasticsearch is an open-source search server based on Lucene. " - + "It provides a distributed, multitenant-capable full-text search engine with a RESTful web interface and " - + "schema-free JSON documents.") -@ImplementedBy(ElasticSearchNodeImpl.class) -public interface ElasticSearchNode extends SoftwareProcess, DatastoreMixins.HasDatastoreUrl { - @SetFromFlag("version") - ConfigKey<String> SUGGESTED_VERSION = ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.SUGGESTED_VERSION, "1.2.1"); - - @SetFromFlag("downloadUrl") - BasicAttributeSensorAndConfigKey<String> DOWNLOAD_URL = new BasicAttributeSensorAndConfigKey<String>( - SoftwareProcess.DOWNLOAD_URL, "https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-${version}.tar.gz"); - - @SetFromFlag("dataDir") - ConfigKey<String> DATA_DIR = ConfigKeys.newStringConfigKey("elasticsearch.node.data.dir", "Directory for writing data files", null); - - @SetFromFlag("logDir") - ConfigKey<String> LOG_DIR = ConfigKeys.newStringConfigKey("elasticsearch.node.log.dir", "Directory for writing log files", null); - - @SetFromFlag("configFileUrl") - ConfigKey<String> TEMPLATE_CONFIGURATION_URL = ConfigKeys.newStringConfigKey( - "elasticsearch.node.template.configuration.url", "URL where the elasticsearch configuration file (in freemarker format) can be found", null); - - @SetFromFlag("multicastEnabled") - ConfigKey<Boolean> MULTICAST_ENABLED = ConfigKeys.newBooleanConfigKey("elasticsearch.node.multicast.enabled", - "Indicates whether zen discovery multicast should be enabled for a node", null); - - @SetFromFlag("multicastEnabled") - ConfigKey<Boolean> UNICAST_ENABLED = ConfigKeys.newBooleanConfigKey("elasticsearch.node.UNicast.enabled", - "Indicates whether zen discovery unicast should be enabled for a node", null); - - @SetFromFlag("httpPort") - PortAttributeSensorAndConfigKey HTTP_PORT = new PortAttributeSensorAndConfigKey(WebAppServiceConstants.HTTP_PORT, PortRanges.fromString("9200+")); - - @SetFromFlag("nodeName") - StringAttributeSensorAndConfigKey NODE_NAME = new StringAttributeSensorAndConfigKey("elasticsearch.node.name", - "Node name (or randomly selected if not set", null); - - @SetFromFlag("clusterName") - StringAttributeSensorAndConfigKey CLUSTER_NAME = new StringAttributeSensorAndConfigKey("elasticsearch.node.cluster.name", - "Cluster name (or elasticsearch selected if not set", null); - - AttributeSensor<String> NODE_ID = Sensors.newStringSensor("elasticsearch.node.id"); - AttributeSensor<Integer> DOCUMENT_COUNT = Sensors.newIntegerSensor("elasticsearch.node.docs.count"); - AttributeSensor<Integer> STORE_BYTES = Sensors.newIntegerSensor("elasticsearch.node.store.bytes"); - AttributeSensor<Integer> GET_TOTAL = Sensors.newIntegerSensor("elasticsearch.node.get.total"); - AttributeSensor<Integer> GET_TIME_IN_MILLIS = Sensors.newIntegerSensor("elasticsearch.node.get.time.in.millis"); - AttributeSensor<Integer> SEARCH_QUERY_TOTAL = Sensors.newIntegerSensor("elasticsearch.node.search.query.total"); - AttributeSensor<Integer> SEARCH_QUERY_TIME_IN_MILLIS = Sensors.newIntegerSensor("elasticsearch.node.search.query.time.in.millis"); - -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d5cf5285/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchNodeDriver.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchNodeDriver.java b/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchNodeDriver.java deleted file mode 100644 index 976b05c..0000000 --- a/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchNodeDriver.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * 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 brooklyn.entity.nosql.elasticsearch; - -import brooklyn.entity.basic.SoftwareProcessDriver; - -public interface ElasticSearchNodeDriver extends SoftwareProcessDriver { - -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d5cf5285/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchNodeImpl.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchNodeImpl.java b/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchNodeImpl.java deleted file mode 100644 index b6b244d..0000000 --- a/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchNodeImpl.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * 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 brooklyn.entity.nosql.elasticsearch; - -import static com.google.common.base.Preconditions.checkNotNull; -import brooklyn.entity.basic.SoftwareProcessImpl; -import brooklyn.event.AttributeSensor; -import brooklyn.event.feed.http.HttpFeed; -import brooklyn.event.feed.http.HttpPollConfig; -import brooklyn.event.feed.http.HttpValueFunctions; -import brooklyn.event.feed.http.JsonFunctions; -import brooklyn.location.access.BrooklynAccessUtils; -import brooklyn.util.guava.Functionals; -import brooklyn.util.guava.Maybe; -import brooklyn.util.guava.MaybeFunctions; -import brooklyn.util.guava.TypeTokens; -import brooklyn.util.http.HttpToolResponse; - -import com.google.common.base.Function; -import com.google.common.base.Functions; -import com.google.common.net.HostAndPort; -import com.google.gson.JsonElement; - -public class ElasticSearchNodeImpl extends SoftwareProcessImpl implements ElasticSearchNode { - - protected static final Function<Maybe<JsonElement>, Maybe<JsonElement>> GET_FIRST_NODE_FROM_NODES = new Function<Maybe<JsonElement>, Maybe<JsonElement>>() { - @Override public Maybe<JsonElement> apply(Maybe<JsonElement> input) { - if (input.isAbsent()) { - return input; - } - return Maybe.fromNullable(input.get().getAsJsonObject().entrySet().iterator().next().getValue()); - } - }; - - protected static final Function<HttpToolResponse, Maybe<JsonElement>> GET_FIRST_NODE = Functionals.chain(HttpValueFunctions.jsonContents(), - MaybeFunctions.<JsonElement>wrap(), JsonFunctions.walkM("nodes"), GET_FIRST_NODE_FROM_NODES); - - - HttpFeed httpFeed; - - @Override - public Class<ElasticSearchNodeDriver> getDriverInterface() { - return ElasticSearchNodeDriver.class; - } - - protected static final <T> HttpPollConfig<T> getSensorFromNodeStat(AttributeSensor<T> sensor, String... jsonPath) { - return new HttpPollConfig<T>(sensor) - .onSuccess(Functionals.chain(GET_FIRST_NODE, JsonFunctions.walkM(jsonPath), JsonFunctions.castM(TypeTokens.getRawRawType(sensor.getTypeToken()), null))) - .onFailureOrException(Functions.<T>constant(null)); - } - - @Override - protected void connectSensors() { - super.connectSensors(); - Integer rawPort = getAttribute(HTTP_PORT); - checkNotNull(rawPort, "HTTP_PORT sensors not set for %s; is an acceptable port available?", this); - HostAndPort hp = BrooklynAccessUtils.getBrooklynAccessibleAddress(this, rawPort); - Function<Maybe<JsonElement>, String> getNodeId = new Function<Maybe<JsonElement>, String>() { - @Override public String apply(Maybe<JsonElement> input) { - if (input.isAbsent()) { - return null; - } - return input.get().getAsJsonObject().entrySet().iterator().next().getKey(); - } - }; - httpFeed = HttpFeed.builder() - .entity(this) - .period(1000) - .baseUri(String.format("http://%s:%s/_nodes/_local/stats", hp.getHostText(), hp.getPort())) - .poll(new HttpPollConfig<Boolean>(SERVICE_UP) - .onSuccess(HttpValueFunctions.responseCodeEquals(200)) - .onFailureOrException(Functions.constant(false))) - .poll(new HttpPollConfig<String>(NODE_ID) - .onSuccess(Functionals.chain(HttpValueFunctions.jsonContents(), MaybeFunctions.<JsonElement>wrap(), JsonFunctions.walkM("nodes"), getNodeId)) - .onFailureOrException(Functions.constant(""))) - .poll(getSensorFromNodeStat(NODE_NAME, "name")) - .poll(getSensorFromNodeStat(DOCUMENT_COUNT, "indices", "docs", "count")) - .poll(getSensorFromNodeStat(STORE_BYTES, "indices", "store", "size_in_bytes")) - .poll(getSensorFromNodeStat(GET_TOTAL, "indices", "get", "total")) - .poll(getSensorFromNodeStat(GET_TIME_IN_MILLIS, "indices", "get", "time_in_millis")) - .poll(getSensorFromNodeStat(SEARCH_QUERY_TOTAL, "indices", "search", "query_total")) - .poll(getSensorFromNodeStat(SEARCH_QUERY_TIME_IN_MILLIS, "indices", "search", "query_time_in_millis")) - .poll(new HttpPollConfig<String>(CLUSTER_NAME) - .onSuccess(HttpValueFunctions.jsonContents("cluster_name", String.class))) - .build(); - } - - @Override - protected void disconnectSensors() { - if (httpFeed != null) { - httpFeed.stop(); - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d5cf5285/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchNodeSshDriver.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchNodeSshDriver.java b/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchNodeSshDriver.java deleted file mode 100644 index 1fdb672..0000000 --- a/software/nosql/src/main/java/brooklyn/entity/nosql/elasticsearch/ElasticSearchNodeSshDriver.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * 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 brooklyn.entity.nosql.elasticsearch; - -import static java.lang.String.format; - -import java.io.Reader; -import java.io.StringReader; -import java.util.List; - -import brooklyn.config.ConfigKey; -import brooklyn.entity.basic.AbstractSoftwareProcessSshDriver; -import brooklyn.entity.basic.Entities; -import brooklyn.entity.basic.EntityLocal; -import brooklyn.location.basic.SshMachineLocation; -import brooklyn.util.collections.MutableMap; -import brooklyn.util.net.Urls; -import brooklyn.util.os.Os; -import brooklyn.util.ssh.BashCommands; - -import com.google.common.collect.ImmutableList; - -public class ElasticSearchNodeSshDriver extends AbstractSoftwareProcessSshDriver implements ElasticSearchNodeDriver { - - public ElasticSearchNodeSshDriver(EntityLocal entity, SshMachineLocation machine) { - super(entity, machine); - } - - @Override - public void preInstall() { - resolver = Entities.newDownloader(this); - setExpandedInstallDir(Os.mergePaths(getInstallDir(), resolver.getUnpackedDirectoryName(format("elasticsearch-%s", getVersion())))); - } - - @Override - public void install() { - List<String> urls = resolver.getTargets(); - String saveAs = resolver.getFilename(); - - List<String> commands = ImmutableList.<String>builder() - .add(BashCommands.installJavaLatestOrWarn()) - .addAll(BashCommands.commandsToDownloadUrlsAs(urls, saveAs)) - .add(String.format("tar zxvf %s", saveAs)) - .build(); - - newScript(INSTALLING).body.append(commands).execute(); - } - - @Override - public void customize() { - newScript(CUSTOMIZING).execute(); //create the directory - - String configFileUrl = entity.getConfig(ElasticSearchNode.TEMPLATE_CONFIGURATION_URL); - - if (configFileUrl == null) { - return; - } - - String configScriptContents = processTemplate(configFileUrl); - Reader configContents = new StringReader(configScriptContents); - - getMachine().copyTo(configContents, Urls.mergePaths(getRunDir(), getConfigFile())); - } - - @Override - public void launch() { - String pidFile = getRunDir() + "/" + AbstractSoftwareProcessSshDriver.PID_FILENAME; - entity.setAttribute(ElasticSearchNode.PID_FILE, pidFile); - StringBuilder commandBuilder = new StringBuilder() - .append(String.format("%s/bin/elasticsearch -d -p %s", getExpandedInstallDir(), pidFile)); - if (entity.getConfig(ElasticSearchNode.TEMPLATE_CONFIGURATION_URL) != null) { - commandBuilder.append(" -Des.config=" + Os.mergePaths(getRunDir(), getConfigFile())); - } - appendConfigIfPresent(commandBuilder, "es.path.data", ElasticSearchNode.DATA_DIR, Os.mergePaths(getRunDir(), "data")); - appendConfigIfPresent(commandBuilder, "es.path.logs", ElasticSearchNode.LOG_DIR, Os.mergePaths(getRunDir(), "logs")); - appendConfigIfPresent(commandBuilder, "es.node.name", ElasticSearchNode.NODE_NAME.getConfigKey()); - appendConfigIfPresent(commandBuilder, "es.cluster.name", ElasticSearchNode.CLUSTER_NAME.getConfigKey()); - appendConfigIfPresent(commandBuilder, "es.discovery.zen.ping.multicast.enabled", ElasticSearchNode.MULTICAST_ENABLED); - appendConfigIfPresent(commandBuilder, "es.discovery.zen.ping.unicast.enabled", ElasticSearchNode.UNICAST_ENABLED); - commandBuilder.append(" > out.log 2> err.log < /dev/null"); - newScript(MutableMap.of("usePidFile", false), LAUNCHING) - .updateTaskAndFailOnNonZeroResultCode() - .body.append(commandBuilder.toString()) - .execute(); - } - - private void appendConfigIfPresent(StringBuilder builder, String parameter, ConfigKey<?> configKey) { - appendConfigIfPresent(builder, parameter, configKey, null); - } - - private void appendConfigIfPresent(StringBuilder builder, String parameter, ConfigKey<?> configKey, String defaultValue) { - String config = null; - if (entity.getConfig(configKey) != null) { - config = String.valueOf(entity.getConfig(configKey)); - } - if (config == null && defaultValue != null) { - config = defaultValue; - } - if (config != null) { - builder.append(String.format(" -D%s=%s", parameter, config)); - } - } - - public String getConfigFile() { - return "elasticsearch.yaml"; - } - - @Override - public boolean isRunning() { - return newScript(MutableMap.of("usePidFile", true), CHECK_RUNNING).execute() == 0; - } - - @Override - public void stop() { - newScript(MutableMap.of("usePidFile", true), STOPPING).execute(); - } - - @Override - public void kill() { - newScript(MutableMap.of("usePidFile", true), KILLING).execute(); - } - -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d5cf5285/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/AbstractMongoDBServer.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/AbstractMongoDBServer.java b/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/AbstractMongoDBServer.java deleted file mode 100644 index 152bb20..0000000 --- a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/AbstractMongoDBServer.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * 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 brooklyn.entity.nosql.mongodb; - -import brooklyn.config.ConfigKey; -import brooklyn.entity.Entity; -import brooklyn.entity.basic.ConfigKeys; -import brooklyn.entity.basic.SoftwareProcess; -import brooklyn.event.basic.AttributeSensorAndConfigKey; -import brooklyn.event.basic.BasicAttributeSensorAndConfigKey; -import brooklyn.event.basic.PortAttributeSensorAndConfigKey; -import brooklyn.util.flags.SetFromFlag; - -public interface AbstractMongoDBServer extends SoftwareProcess, Entity { - - // TODO Need to properly test v2.4.x and v2.5.x support. - // I think the v2.5.x were dev releases. - // Should update mongo.config to yaml format, but no rush for that. - - @SetFromFlag("dataDirectory") - ConfigKey<String> DATA_DIRECTORY = ConfigKeys.newStringConfigKey( - "mongodb.data.directory", "Data directory to store MongoDB journals"); - - @SetFromFlag("mongodbConfTemplateUrl") - ConfigKey<String> MONGODB_CONF_TEMPLATE_URL = ConfigKeys.newStringConfigKey( - "mongodb.config.url", "Template file (in freemarker format) for a MongoDB configuration file", - "classpath://brooklyn/entity/nosql/mongodb/default.conf"); - - @SetFromFlag("version") - ConfigKey<String> SUGGESTED_VERSION = - ConfigKeys.newConfigKeyWithDefault(SoftwareProcess.SUGGESTED_VERSION, "2.6.5"); - - // TODO: Windows support - // e.g. http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.2.2.tgz, - // http://fastdl.mongodb.org/osx/mongodb-osx-x86_64-2.2.2.tgz - // http://downloads.mongodb.org/win32/mongodb-win32-x86_64-1.8.5.zip - // Note Windows download is a zip. - @SetFromFlag("downloadUrl") - AttributeSensorAndConfigKey<String, String> DOWNLOAD_URL = new BasicAttributeSensorAndConfigKey<String>( - SoftwareProcess.DOWNLOAD_URL, "http://fastdl.mongodb.org/${driver.osDir}/${driver.osTag}-${version}.tgz"); - - @SetFromFlag("port") - PortAttributeSensorAndConfigKey PORT = - new PortAttributeSensorAndConfigKey("mongodb.server.port", "Server port", "27017+"); -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d5cf5285/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/AbstractMongoDBSshDriver.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/AbstractMongoDBSshDriver.java b/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/AbstractMongoDBSshDriver.java deleted file mode 100644 index 8210c77..0000000 --- a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/AbstractMongoDBSshDriver.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * 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 brooklyn.entity.nosql.mongodb; - -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import brooklyn.entity.basic.AbstractSoftwareProcessSshDriver; -import brooklyn.entity.basic.Entities; -import brooklyn.entity.basic.EntityLocal; -import brooklyn.entity.basic.lifecycle.ScriptHelper; -import brooklyn.location.OsDetails; -import brooklyn.location.basic.SshMachineLocation; -import brooklyn.util.exceptions.Exceptions; -import brooklyn.util.net.Networking; -import brooklyn.util.os.Os; -import brooklyn.util.ssh.BashCommands; - -import com.google.common.base.Joiner; -import com.google.common.base.Strings; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; - -public abstract class AbstractMongoDBSshDriver extends AbstractSoftwareProcessSshDriver { - - private static final Logger LOG = LoggerFactory.getLogger(AbstractMongoDBSshDriver.class); - - public AbstractMongoDBSshDriver(EntityLocal entity, SshMachineLocation machine) { - super(entity, machine); - } - - @Override - public void preInstall() { - resolver = Entities.newDownloader(this); - setExpandedInstallDir(Os.mergePaths(getInstallDir(), resolver.getUnpackedDirectoryName(getBaseName()))); - } - - @Override - public void install() { - List<String> urls = resolver.getTargets(); - String saveAs = resolver.getFilename(); - - List<String> commands = new LinkedList<String>(); - commands.addAll(BashCommands.commandsToDownloadUrlsAs(urls, saveAs)); - commands.add(BashCommands.INSTALL_TAR); - commands.add("tar xzfv " + saveAs); - - newScript(INSTALLING) - .failOnNonZeroResultCode() - .body.append(commands).execute(); - } - - @Override - public void customize() { - Map<?,?> ports = ImmutableMap.of("port", getServerPort()); - Networking.checkPortsValid(ports); - String command = String.format("mkdir -p %s", getDataDirectory()); - newScript(CUSTOMIZING) - .updateTaskAndFailOnNonZeroResultCode() - .body.append(command).execute(); - String templateUrl = entity.getConfig(MongoDBServer.MONGODB_CONF_TEMPLATE_URL); - if (!Strings.isNullOrEmpty(templateUrl)) copyTemplate(templateUrl, getConfFile()); - } - - @Override - public boolean isRunning() { - try { - return MongoDBClientSupport.forServer((AbstractMongoDBServer) entity).ping(); - } catch (Exception e) { - Exceptions.propagateIfFatal(e); - return false; - } - } - - /** - * Kills the server with SIGINT. Sending SIGKILL is likely to result in data corruption. - * @see <a href="http://docs.mongodb.org/manual/tutorial/manage-mongodb-processes/#sending-a-unix-int-or-term-signal">http://docs.mongodb.org/manual/tutorial/manage-mongodb-processes/#sending-a-unix-int-or-term-signal</a> - */ - @Override - public void stop() { - // TODO: Wait for process to terminate. Currently, this will send the signal and then immediately continue with next steps, - // which could involve stopping VM etc. - - // We could also use SIGTERM (15) - new ScriptHelper(this, "Send SIGINT to MongoDB server") - .body.append("kill -2 $(cat " + getPidFile() + ")") - .execute(); - } - - protected String getBaseName() { - return getOsTag() + "-" + entity.getConfig(AbstractMongoDBServer.SUGGESTED_VERSION); - } - - // IDE note: This is used by MongoDBServer.DOWNLOAD_URL - public String getOsDir() { - return (getLocation().getOsDetails().isMac()) ? "osx" : "linux"; - } - - public String getOsTag() { - OsDetails os = getLocation().getOsDetails(); - if (os == null) { - // Default to generic linux - return "mongodb-linux-x86_64"; - } else if (os.isMac()) { - // Mac is 64bit only - return "mongodb-osx-x86_64"; - } else { - String arch = os.is64bit() ? "x86_64" : "i686"; - return "mongodb-linux-" + arch; - } - } - - public String getDataDirectory() { - String result = entity.getConfig(MongoDBServer.DATA_DIRECTORY); - if (result!=null) return result; - return getRunDir() + "/data"; - } - - protected String getLogFile() { - return getRunDir() + "/log.txt"; - } - - protected String getPidFile() { - return getRunDir() + "/pid"; - } - - protected Integer getServerPort() { - return entity.getAttribute(MongoDBServer.PORT); - } - - protected String getConfFile() { - return getRunDir() + "/mongo.conf"; - } - - protected ImmutableList.Builder<String> getArgsBuilderWithDefaults(AbstractMongoDBServer server) { - Integer port = server.getAttribute(MongoDBServer.PORT); - - return ImmutableList.<String>builder() - .add("--config", getConfFile()) - .add("--pidfilepath", getPidFile()) - .add("--logpath", getLogFile()) - .add("--port", port.toString()) - .add("--fork"); - } - - protected void launch(ImmutableList.Builder<String> argsBuilder) { - String args = Joiner.on(" ").join(argsBuilder.build()); - String command = String.format("%s/bin/mongod %s > out.log 2> err.log < /dev/null", getExpandedInstallDir(), args); - LOG.info(command); - newScript(LAUNCHING) - .updateTaskAndFailOnNonZeroResultCode() - .body.append(command).execute(); - } - -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d5cf5285/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBClient.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBClient.java b/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBClient.java deleted file mode 100644 index 6485101..0000000 --- a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBClient.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * 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 brooklyn.entity.nosql.mongodb; - -import java.util.List; -import java.util.Map; - -import brooklyn.config.ConfigKey; -import brooklyn.entity.annotation.Effector; -import brooklyn.entity.annotation.EffectorParam; -import brooklyn.entity.basic.ConfigKeys; -import brooklyn.entity.basic.MethodEffector; -import brooklyn.entity.nosql.mongodb.sharding.MongoDBShardedDeployment; -import brooklyn.entity.proxying.ImplementedBy; -import brooklyn.util.flags.SetFromFlag; - -import com.google.common.reflect.TypeToken; - -@ImplementedBy(MongoDBClientImpl.class) -public interface MongoDBClient extends AbstractMongoDBServer { - - MethodEffector<Void> RUN_SCRIPT = new MethodEffector<Void>(MongoDBClient.class, "runScript"); - - @SuppressWarnings("serial") - @SetFromFlag("startupJsScripts") - ConfigKey<List<String>> STARTUP_JS_SCRIPTS = ConfigKeys.newConfigKey( - new TypeToken<List<String>>(){}, "mongodb.client.startupJsScripts", - "List of scripts defined in mongodb.client.scripts to be run on startup"); - - @SuppressWarnings("serial") - @SetFromFlag("scripts") - ConfigKey<Map<String, String>> JS_SCRIPTS = ConfigKeys.newConfigKey( - new TypeToken<Map<String, String>>(){}, "mongodb.client.scripts", "List of javascript scripts to be copied " - + "to the server. These scripts can be run using the runScript effector"); - - @SetFromFlag("shardedDeployment") - ConfigKey<MongoDBShardedDeployment> SHARDED_DEPLOYMENT = ConfigKeys.newConfigKey(MongoDBShardedDeployment.class, - "mongodb.client.shardeddeployment", "Sharded deployment that the client will use to run scripts. " - + "If both SERVER and SHARDED_DEPLOYMENT are specified, SERVER will be used"); - - @SetFromFlag("server") - ConfigKey<AbstractMongoDBServer> SERVER = ConfigKeys.newConfigKey(AbstractMongoDBServer.class, - "mongodb.client.server", "MongoDBServer that the client will use to run scripts. " - + "If both SERVER and SHARDED_DEPLOYMENT are specified, SERVER will be used"); - - @Effector(description="Runs one of the scripts defined in mongodb.client.scripts") - void runScript(@EffectorParam(name="preStart", description="use this to create parameters that can be used by the script, e.g.:<p><code>var loopCount = 10</code>") String preStart, - @EffectorParam(name="scriptName", description="Name of the script as defined in mongodb.client.scripts") String scriptName); -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d5cf5285/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBClientDriver.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBClientDriver.java b/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBClientDriver.java deleted file mode 100644 index cb78240..0000000 --- a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBClientDriver.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * 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 brooklyn.entity.nosql.mongodb; - -import brooklyn.entity.basic.SoftwareProcessDriver; - -public interface MongoDBClientDriver extends SoftwareProcessDriver { - void runScript(String preStart, String scriptName); -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d5cf5285/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBClientImpl.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBClientImpl.java b/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBClientImpl.java deleted file mode 100644 index 034a928..0000000 --- a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBClientImpl.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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 brooklyn.entity.nosql.mongodb; - -import brooklyn.entity.basic.SoftwareProcessImpl; -import brooklyn.entity.trait.Startable; - -public class MongoDBClientImpl extends SoftwareProcessImpl implements MongoDBClient { - - @Override - protected void connectSensors() { - super.connectSensors(); - setAttribute(Startable.SERVICE_UP, true); - } - - @SuppressWarnings("rawtypes") - @Override - public Class getDriverInterface() { - return MongoDBClientDriver.class; - } - - @Override - public void runScript(String preStart, String scriptName) { - ((MongoDBClientDriver)getDriver()).runScript(preStart, scriptName); - } - -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/d5cf5285/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBClientSshDriver.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBClientSshDriver.java b/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBClientSshDriver.java deleted file mode 100644 index 3579ff2..0000000 --- a/software/nosql/src/main/java/brooklyn/entity/nosql/mongodb/MongoDBClientSshDriver.java +++ /dev/null @@ -1,147 +0,0 @@ -/* - * 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 brooklyn.entity.nosql.mongodb; - -import java.util.List; -import java.util.Map; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import brooklyn.entity.basic.EntityLocal; -import brooklyn.entity.nosql.mongodb.sharding.MongoDBRouter; -import brooklyn.entity.nosql.mongodb.sharding.MongoDBRouterCluster; -import brooklyn.entity.nosql.mongodb.sharding.MongoDBShardedDeployment; -import brooklyn.entity.trait.Startable; -import brooklyn.event.basic.DependentConfiguration; -import brooklyn.location.basic.SshMachineLocation; -import brooklyn.util.exceptions.Exceptions; -import brooklyn.util.math.MathPredicates; - -import com.google.common.base.Preconditions; -import com.google.common.base.Predicates; - -public class MongoDBClientSshDriver extends AbstractMongoDBSshDriver implements MongoDBClientDriver { - - private static final Logger LOG = LoggerFactory.getLogger(MongoDBClientSshDriver.class); - - private boolean isRunning = false; - - public MongoDBClientSshDriver(EntityLocal entity, SshMachineLocation machine) { - super(entity, machine); - } - - @Override - public void customize() { - String command = String.format("mkdir -p %s", getUserScriptDir()); - newScript(CUSTOMIZING) - .updateTaskAndFailOnNonZeroResultCode() - .body.append(command).execute(); - Map<String, String> scripts = entity.getConfig(MongoDBClient.JS_SCRIPTS); - for (String scriptName : scripts.keySet()) { - copyResource(scripts.get(scriptName), getUserScriptDir() + scriptName + ".js"); - } - } - - @Override - public void launch() { - AbstractMongoDBServer server = getServer(); - // The scripts are going to be run on the machine via SSH so it shouldn't matter - // that the accessible host and port might be different. - String host = server.getAttribute(AbstractMongoDBServer.HOSTNAME); - Integer port = server.getAttribute(AbstractMongoDBServer.PORT); - - List<String> scripts = entity.getConfig(MongoDBClient.STARTUP_JS_SCRIPTS); - if (scripts!=null) { - for (String scriptName : scripts) { - try { - LOG.debug("Running MongoDB script "+scriptName+" at "+getEntity()); - runScript("", scriptName, host, port); - } catch (Exception e) { - LOG.warn("Error running MongoDB script "+scriptName+" at "+getEntity()+", throwing: "+e); - isRunning = false; - Exceptions.propagateIfFatal(e); - throw new IllegalStateException("Error running MongoDB script "+scriptName+" at "+entity+": "+e, e); - } - } - } - isRunning = true; - } - - @Override - public boolean isRunning() { - // TODO better would be to get some confirmation - return isRunning; - } - - @Override - public void stop() { - try { - super.stop(); - } finally { - isRunning = false; - } - } - - private String getUserScriptDir() { - return getRunDir() + "/userScripts/" ; - } - - public void runScript(String preStart, String scriptName) { - AbstractMongoDBServer server = getServer(); - String host = server.getAttribute(AbstractMongoDBServer.HOSTNAME); - Integer port = server.getAttribute(AbstractMongoDBServer.PORT); - runScript(preStart, scriptName, host, port); - } - - private void runScript(String preStart, String scriptName, String host, Integer port) { - // TODO: escape preStart to prevent injection attack - String command = String.format("%s/bin/mongo %s:%s --eval \"%s\" %s/%s > out.log 2> err.log < /dev/null", getExpandedInstallDir(), - host, port, preStart, getUserScriptDir(), scriptName + ".js"); - newScript(LAUNCHING) - .updateTaskAndFailOnNonZeroResultCode() - .body.append(command).execute(); - } - - private AbstractMongoDBServer getServer() { - AbstractMongoDBServer server = entity.getConfig(MongoDBClient.SERVER); - MongoDBShardedDeployment deployment = entity.getConfig(MongoDBClient.SHARDED_DEPLOYMENT); - if (server == null) { - Preconditions.checkNotNull(deployment, "Either server or shardedDeployment must be specified for %s", this); - server = DependentConfiguration.builder() - .attributeWhenReady(deployment.getRouterCluster(), MongoDBRouterCluster.ANY_ROUTER) - .blockingDetails("any available router") - .runNow(); - DependentConfiguration.builder() - .attributeWhenReady(server, MongoDBRouter.SHARD_COUNT) - .readiness(MathPredicates.<Integer>greaterThan(0)) - .runNow(); - } else { - if (deployment != null) { - log.warn("Server and ShardedDeployment defined for {}; using server ({} instead of {})", - new Object[] {this, server, deployment}); - } - DependentConfiguration.builder() - .attributeWhenReady(server, Startable.SERVICE_UP) - .readiness(Predicates.equalTo(true)) - .runNow(); - } - return server; - } -}
