Skip to content

Commit 953531c

Browse files
committed
Updated AWS stuff. start_worker code updated
1 parent 1e00fdb commit 953531c

File tree

10 files changed

+450
-33
lines changed

10 files changed

+450
-33
lines changed

aws/aws.py

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import configurator
55
import sys
66
import random
7+
import logging
78

89
from libcloud.compute.types import Provider
910
from libcloud.compute.providers import get_driver
@@ -18,6 +19,8 @@
1819
NodeState.PENDING : "PENDING",
1920
NodeState.UNKNOWN : "UNKNOWN" }
2021

22+
logging.basicConfig(filename='aws.log', level=logging.INFO)
23+
2124
def list_resources(driver):
2225

2326
resources = driver.list_nodes()
@@ -48,45 +51,55 @@ def get_public_ip(driver, name):
4851
print "Could not find a resource with the id ", name
4952
return -1
5053

51-
def create_security_group(driver, configs):
54+
def aws_create_security_group(driver, configs):
5255
group_name = configs["SECURITY_GROUP"]
5356
current = driver.ex_list_security_groups()
5457
if group_name in current:
55-
print "INFO: Security group: ", group_name, " is already present"
58+
logging.info("Security group: %s is already present", group_name)
5659
else:
57-
print "INFO: Creating new security group: ", group_name
60+
logging.info("Creating new security group: %s", group_name)
5861
res = driver.ex_create_security_group(name=group_name,description="Open all ports")
5962
if not driver.ex_authorize_security_group(group_name, 0, 65000, '0.0.0.0/0'):
60-
print "INFO: Authorizing ports for security group failed"
63+
logging.info("Authorizing ports for security group failed")
6164
if not driver.ex_authorize_security_group(group_name, 0, 65000, '0.0.0.0/0', protocol='udp'):
62-
print "INFO: Authorizing ports for security group failed"
63-
print res
65+
logging.info("Authorizing ports for security group failed")
66+
logging.debug("Security group: %s", str(res))
6467

6568
def check_keypair(driver, configs):
6669
if "AWS_KEYPAIR_NAME" in configs and "AWS_KEYPAIR_FILE" in configs:
67-
print "AWS_KEYPAIR_NAME : ", configs['AWS_KEYPAIR_NAME']
68-
print "AWS_KEYPAIR_FILE : ", configs['AWS_KEYPAIR_FILE']
70+
logging.debug("AWS_KEYPAIR_NAME : %s", configs['AWS_KEYPAIR_NAME'])
71+
logging.debug("AWS_KEYPAIR_FILE : %s", configs['AWS_KEYPAIR_FILE'])
6972
all_pairs = driver.list_key_pairs()
7073
for pair in all_pairs:
7174
if pair.name == configs['AWS_KEYPAIR_NAME']:
72-
print "INFO: KEYPAIR exists, registered"
75+
logging.info("KEYPAIR exists, registered")
7376
return 0
7477

75-
print "INFO : KEYPAIR does not exist. Creating keypair"
78+
logging.info("KEYPAIR does not exist. Creating keypair")
7679
key_pair = driver.create_key_pair(name=configs['AWS_KEYPAIR_NAME'])
7780
f = open(configs['AWS_KEYPAIR_FILE'], 'w')
7881
f.write(str(key_pair.private_key) + '\n')
7982
f.close()
8083
os.chmod(configs['AWS_KEYPAIR_FILE'], 0600)
84+
logging.info("KEYPAIR created")
8185
else:
82-
print "AWS_KEYPAIR_NAME and/or AWS_KEYPAIR_FILE missing"
83-
print "ERROR: Cannot proceed without AWS_KEYPAIR_NAME and AWS_KEYPAIR_FILE"
86+
logging.error("AWS_KEYPAIR_NAME and/or AWS_KEYPAIR_FILE missing")
87+
logging.error("Cannot proceed without AWS_KEYPAIR_NAME and AWS_KEYPAIR_FILE")
8488
exit(-1)
8589

8690

8791
def start_headnode(driver, configs):
8892
userdata = configurator.getstring("headnode")
8993

94+
# Check if headnode
95+
nodes = driver.list_nodes()
96+
headnode = False
97+
for node in nodes:
98+
if node.name == "headnode" and node.state == NodeState.RUNNING:
99+
headnode = node
100+
print "INFO: Headnode is RUNNING"
101+
return 0
102+
90103
size = NodeSize(id=configs['HEADNODE_MACHINE_TYPE'], name='headnode',
91104
ram=None, disk=None, bandwidth=None, price=None, driver=driver)
92105
image = NodeImage(id=configs['HEADNODE_IMAGE'], name=None, driver=driver)
@@ -96,7 +109,9 @@ def start_headnode(driver, configs):
96109
ex_keyname=configs['AWS_KEYPAIR_NAME'],
97110
ex_securitygroup=configs['SECURITY_GROUP'],
98111
ex_userdata=userdata )
112+
print "INFO: Waiting for headnode bootup ..."
99113
driver._wait_until_running(node, wait_period=5, timeout=240)
114+
print "INFO: Headnode active!"
100115
if node.public_ips:
101116
print '-'*51
102117
print '{0:20} | {1:10} | {2:15}'.format(node.name, NODESTATES[node.state], node.public_ips[0])
@@ -114,10 +129,10 @@ def start_worker(driver, configs, worker_names):
114129
return -1
115130

116131
# Setup userdata
117-
userdata = configurator.getstring("headnode")
132+
userdata = configurator.getstring("worker")
118133
userdata = userdata.replace("SET_HEADNODE_IP", headnode.public_ips[0])
119-
120-
print userdata
134+
logging.info("Headnode connection url : ",headnode.public_ips[0])
135+
logging.debug("Worker userdata : %s", userdata)
121136

122137
list_nodes = []
123138
for worker_name in worker_names:
@@ -131,7 +146,7 @@ def start_worker(driver, configs, worker_names):
131146
ex_securitygroup=configs['SECURITY_GROUP'],
132147
ex_userdata=userdata )
133148
list_nodes.append(node)
134-
print list_nodes
149+
logging.info("Worker node started : %s",str(node))
135150

136151

137152
def terminate_all_nodes():
@@ -156,7 +171,7 @@ def init():
156171
#configurator.pretty_configs(configs)
157172
driver = get_driver(Provider.EC2_US_WEST_OREGON) # was EC2
158173
ec2_driver = driver(configs['AWSAccessKeyId'], configs['AWSSecretKey'])
159-
create_security_group(ec2_driver, configs)
174+
aws_create_security_group(ec2_driver, configs)
160175
check_keypair(ec2_driver, configs)
161176
return configs,ec2_driver
162177

aws/setup.sh

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ check_project ()
88
RESULT=$(gcutil listinstances --project=$GCE_PROJECTID 2>&1)
99
}
1010

11-
1211
start_worker ()
1312
{
14-
echo "Starting worker - TODO"
13+
echo "Starting worker(s) $*"
14+
./aws.py start_worker $*
1515
}
1616

1717
# Is this valid for AWS ?
@@ -22,13 +22,6 @@ check_keys ()
2222
[[ ! -f ~/.ssh/google_compute_engine.pub ]] && echo "Google public key missing" && return
2323
}
2424

25-
26-
stop_workers()
27-
{
28-
echo "Stopping all instances"
29-
}
30-
31-
3225
stop_n_workers()
3326
{
3427
COUNT=1
@@ -43,27 +36,25 @@ stop_n_workers()
4336
# This script ensures that only the specified number of workers are active
4437
start_n_workers ()
4538
{
39+
echo "In start_n_workers"
4640
COUNT=$1
4741
CURRENT=1
48-
out=$(gcutil --project=$GCE_PROJECTID listinstances | grep "swift-worker")
42+
out=$(list_resources | grep "swift-worker")
4943
if [[ "$?" == 0 ]]
5044
then
5145
echo "Current workers"
5246
echo "${out[*]}"
53-
CURRENT=$(gcutil --project=$GCE_PROJECTID listinstances | grep "swift-worker" | wc -l)
47+
CURRENT=$(list_resources | grep "swift-worker" | wc -l)
5448
echo "Count : " $CURRENT
5549
echo "New workers needed : $(($COUNT - $CURRENT))"
5650
fi
5751

5852
for i in $(seq $CURRENT 1 $COUNT)
5953
do
60-
start_worker $i &> $LOG &
54+
start_worker swift-worker-$i &> $LOG &
6155
done
6256
wait
63-
gcutil --project=$GCE_PROJECTID listinstances
64-
echo "Updating WORKER_HOSTS"
65-
EXTERNAL_IPS=$(gcutil --project=$GCE_PROJECTID listinstances | grep worker | awk '{print $10}')
66-
WORKER_NAMES=$(gcutil --project=$GCE_PROJECTID listinstances | grep worker | awk '{print $2}')
57+
list_resources
6758
}
6859

6960
start_n_more ()
@@ -125,6 +116,28 @@ dissolve()
125116
./aws.py dissolve
126117
}
127118

119+
start_headnode()
120+
{
121+
./aws.py start_headnode
122+
}
123+
124+
start_workers()
125+
{
126+
WORKERS_REQUESTED=$AWS_WORKER_COUNT
127+
CURRENT_COUNT=$(list_resources | grep "swift-worker" | wc -l)
128+
echo "Current workers : $CURRENT_COUNT"
129+
echo "Workers requested : $WORKERS_REQUESTED"
130+
WORKERS_REQUIRED=$(($WORKERS_REQUESTED - $CURRENT_COUNT))
131+
if [[ $WORKERS_REQUIRED -gt 0 ]]
132+
then
133+
#printf("swift-worker-%03d", {$CURRENT_COUNT..$(($CURRENT_COUNT+$COUNT_NEEDED))})
134+
END=$(($CURRENT_COUNT+$WORKERS_REQUIRED-1))
135+
start_worker $(printf "swift-worker-%03d " $(seq $CURRENT_COUNT 1 $END))
136+
else
137+
echo "No additional workers needed"
138+
fi
139+
}
140+
128141
connect()
129142
{
130143
source configs
@@ -137,8 +150,12 @@ connect()
137150
ssh -A -o StrictHostKeyChecking=no -l $AWS_USERNAME -i $AWS_KEYPAIR_FILE $IP
138151
}
139152

153+
140154
init()
141155
{
142156
source configs
157+
start_headnode
158+
start_workers
159+
list_resources
143160
}
144161
init

swift-localhost-tutorial/app/simulate

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
simulate.sh
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
#!/usr/bin/env python
2+
import sys
3+
import os
4+
import socket
5+
import time
6+
import math
7+
import random
8+
import getpass
9+
10+
def parse():
11+
from optparse import OptionParser
12+
parser=OptionParser()
13+
parser.add_option("-b", "--bias", type="int", dest="bias", default=0,
14+
help="offset bias: add this integer to all results");
15+
16+
parser.add_option("-B", "--biasfile", type="string", dest="biasfile",
17+
default="none", help="file of integer biases to add to results" );
18+
19+
parser.add_option("-l", "--log", type="string", dest="log", default="yes",
20+
help="generate a log in stderr if not nul");
21+
22+
parser.add_option("-n", "--nvalues", type="int", dest="nvalues",default=1,
23+
help="print this many values per simulation" );
24+
25+
parser.add_option("-s", "--seed", type="int", dest="initseed", default=0,
26+
help="use this integer [0..32767] as a seed");
27+
28+
parser.add_option("-S", "--seedfile", type="string", dest="seedfile",
29+
default="none", help="use this file (containing integer seeds [0..32767]) one per line" );
30+
31+
parser.add_option("-t", "--timesteps", type="int", dest="timesteps",
32+
default=0, help='number of simulated "timesteps" in seconds (determines runtime)' );
33+
34+
parser.add_option("-r", "--range", type="int", dest="range", default=100,
35+
help="range (limit) of generated results" );
36+
37+
parser.add_option("-w", "--width", type="int", dest="width", default=8,
38+
help="Width ?" );
39+
40+
parser.add_option("-x", "--scale", type="int", dest="scale", default=1,
41+
help="scale the results by this integer" );
42+
# Not implemented yet
43+
parser.add_option("-p", "--paramfile", type="string", dest="paramfile", default="none",
44+
help="Not implemented yet" );
45+
return (parser.parse_args());
46+
47+
def log():
48+
import datetime
49+
print >> sys.stderr, "Called as: ", str(sys.argv)
50+
print >> sys.stderr, "Start time: ", datetime.datetime.now()
51+
print >> sys.stderr, "Running on node: ", socket.gethostname()
52+
print >> sys.stderr, "Running as user: ", getpass.getuser()
53+
print >> sys.stderr, "\nEnvironment:\n\n"
54+
print >> sys.stderr, os.environ
55+
56+
def printparams(options):
57+
print 'bias =',options.bias
58+
print 'biasfile = ',options.biasfile
59+
print 'log = ', options.log
60+
print 'nvalues = ',options.nvalues
61+
print 'seed = ', options.initseed
62+
print 'seedfile = ', options.seedfile
63+
print 'timesteps = ', options.timesteps
64+
print 'range = ', options.range
65+
print 'width = ', options.width
66+
print 'scale = ', options.scale
67+
print 'paramfile = ', options.paramfile
68+
69+
def simulate(options):
70+
time.sleep(options.timesteps)
71+
bias=[];
72+
if (options.biasfile != "none"):
73+
try:
74+
with open(options.biasfile) as biasfile:
75+
lines = biasfile.read().splitlines()
76+
for line in lines:
77+
bias.append(int(line))
78+
except IOError:
79+
print "Error accessing content from file: ", options.biasfile
80+
bias_count = len(bias)
81+
82+
for i in range(options.nvalues):
83+
value = (random.random() +
84+
random.random()*math.pow(2,16) +
85+
random.random()*math.pow(2,32) +
86+
random.random()*math.pow(2,48))
87+
value=( (int(value)%options.range) * options.scale + options.bias)
88+
if ( i < bias_count ):
89+
value = value + bias[i]
90+
elif ( bias_count > 0 ):
91+
value = value + bias[bias_count-1]
92+
93+
print '{num:{fill}{width}}'.format(num=value, fill=' ', width=options.width)
94+
95+
96+
def seed(options):
97+
if (options.initseed != 0 ):
98+
random.seed(options.initseed)
99+
if (options.seedfile != "none"):
100+
try:
101+
with open(options.seedfile) as seedfile:
102+
lines=seedfile.read().splitlines()
103+
seed = 0
104+
for line in lines:
105+
seed = seed + int(line)
106+
random.seed(seed)
107+
except IOError:
108+
print "Could not open file: ", options.seedfile
109+
110+
111+
if __name__ == "__main__":
112+
(options, args) = parse()
113+
printparams(options)
114+
seed(options)
115+
simulate(options)
116+
log()
117+
118+
119+
120+
121+
122+
123+
124+
125+

0 commit comments

Comments
 (0)