#
# 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.
#

#
# ElasticSearch Cluster on Rackspace Cloud
# 

# Read the Configuration Guide for more info:
# http://whirr.apache.org/docs/latest/configuration-guide.html 

# Change the cluster name here
whirr.cluster-name=elasticsearch

# Change the number of machines in the cluster here
whirr.instance-templates=2 elasticsearch

# For Rackspace set RACKSPACE_USERNAME and RACKSPACE_API_KEY environment variables.
whirr.provider=cloudservers-us
whirr.identity=${env:RACKSPACE_USERNAME}
whirr.credential=${env:RACKSPACE_API_KEY}

# The size of the instance to use. See http://www.rackspacecloud.com/cloud_hosting_products/servers/faq/
# id 3: 1GB, 1 virtual core
# id 4: 2GB, 2 virtual cores
# id 5: 4GB, 2 virtual cores
# id 6: 8GB, 4 virtual cores
# id 7: 15.5GB, 4 virtual cores
whirr.hardware-id=6
# Ubuntu 10.04 LTS Lucid
whirr.image-id=49

# By default use the user system SSH keys. Override them here.
# whirr.private-key-file=${sys:user.home}/.ssh/id_rsa
# whirr.public-key-file=${whirr.private-key-file}.pub

# You can specify the version by setting the tarball url
# whirr.elasticsearch.tarball.url=http://github.com/downloads/elasticsearch/elasticsearch/elasticsearch-0.15.2.tar.gz

#
# elasticsearch specific settings (Expert)
#

# 1. Gateway Persistence settings
# See: http://www.elasticsearch.org/guide/reference/modules/gateway/
# Defaults: the index is only stored in memory and all data is lost on shutdown

# 1.1 Enable persistence on the local filesystem
# See: http://www.elasticsearch.org/guide/reference/modules/gateway/local.html

# es.gateway.type=fs
# es.gateway.recovery_after_nodes=1
# es.gateway.recovery_after_time=5m
# es.expected_nodes=2

# 1.2 Enable persistence on HDFS
# See: http://www.elasticsearch.org/guide/reference/modules/gateway/hadoop.html

# es.gateway.type=hdfs
# es.gateway.hdfs.uri=hdfs://myhost:8022
# es.gateway.hdfs.path=/some/path

# 2. Scripting Support
# See: http://www.elasticsearch.org/guide/reference/modules/scripting.html
# The scripting module uses by default mvel

# Just add them to the list of installed plugins
# es.plugins=lang-javascript, lang-groovy, lang-python,

# 3. Memcached protocol support
# See: http://www.elasticsearch.org/guide/reference/modules/memcached.html

# es.plugins=transport-memcached

# 4. Thrift protocol support
# See: http://www.elasticsearch.org/guide/reference/modules/thrift.html

# es.plugins=transport-thrift
