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

#
# Hadoop Cluster on Rackspace Cloudservers
# 

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

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

# Change the number of machines in the cluster here
whirr.instance-templates=1 hadoop-namenode+hadoop-jobtracker,5 hadoop-datanode+hadoop-tasktracker

# Uncomment out these lines to run CDH
#whirr.hadoop-install-function=install_cdh_hadoop
#whirr.hadoop-configure-function=configure_cdh_hadoop

# 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
