Revised how wait-for-running was done in AWS deployment

This commit is contained in:
troymc 2016-03-24 19:39:33 +01:00
parent f46fb86ec4
commit c0a7be618c
3 changed files with 51 additions and 107 deletions

View File

@ -1,99 +0,0 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import json
import os
import boto.ec2
import time
import argparse
AWS_ACCESS_KEY_ID = os.environ["AWS_ACCESS_KEY_ID"]
AWS_SECRET_ACCESS_KEY = os.environ["AWS_SECRET_ACCESS_KEY"]
parser = argparse.ArgumentParser()
parser.add_argument("--tag", help="tag instances in aws")
args = parser.parse_args()
if args.tag:
tag = args.tag
else:
# reading credentials from config for remote connection
print('usage: python3 get_instance_status.py --tag <tag>')
print('reason: tag missing!!!')
exit(1)
conn = boto.ec2.connect_to_region("eu-central-1",
aws_access_key_id=AWS_ACCESS_KEY_ID,
aws_secret_access_key=AWS_SECRET_ACCESS_KEY)
PASSING = []
RUNNING = []
# get list of instance ids from amazon
def list_of_ids(tag):
# TODO: CHANGE TO PROPER DOCSTRING
# Returns a list of ids of all instances with the given tag
reservations = conn.get_all_instances(filters={"tag:Name": tag})
# There are several reservations
# and each reservation can have several instances
id_list = []
for reservation in reservations:
for instance in reservation.instances:
if instance.id is not None:
id_list.append(instance.id)
return id_list
# Andreas' old code:
"""
INSTANCE_IDS = []
def prepare_list(tag):
reservations = conn.get_all_instances(filters={"tag:Name" : tag})
instances = [i for r in reservations for i in r.instances]
for i in instances:
inst = i.__dict__
inst_id = inst.get('id')
INSTANCE_IDS.append(inst_id)
return INSTANCE_IDS
"""
# get statuses from amazon
def create_run_pass_list(tag):
# instlist_old = prepare_list(tag)
# print("instlist_old = {}".format(instlist_old))
instlist_new = list_of_ids(tag)
print("instlist_new = {}".format(instlist_new))
instlist = instlist_new
for entry in range(0, len(instlist)): # 0, 1, ..., [len(instlist) - 1]
instances = conn.get_only_instances(instance_ids=instlist[entry])
status = conn.get_all_instance_status(instance_ids=instlist[entry])
for instance in instances:
reachability = status[0].system_status.details["reachability"]
PASSING.append(reachability)
return instlist, PASSING, RUNNING
if __name__ == "__main__":
# get lists from amazon
try:
instlist, passlist, runlist = create_run_pass_list(tag)
print("instlist = {}".format(instlist))
print("passlist = {}".format(passlist))
print("runlist = {}".format(runlist))
except IndexError:
print("Searching for matching cluster-tag...")
exit(1)
for entry in range(0,len(instlist)):
if "passed" in passlist and len(set(passlist)) == 1:
print("up and running")
exit(0)
# exit with error code for continous check if nothing found
exit(1)

View File

@ -1,5 +1,8 @@
#! /bin/bash #! /bin/bash
# The set -e option instructs bash to immediately exit if any command has a non-zero exit status
set -e
function printErr() function printErr()
{ {
echo "usage: ./startup.sh <tag> <number_of_nodes_in_cluster>" echo "usage: ./startup.sh <tag> <number_of_nodes_in_cluster>"
@ -51,18 +54,13 @@ fi
# 0400 for pem/bigchaindb.pem # 0400 for pem/bigchaindb.pem
chmod 0400 pem/bigchaindb.pem chmod 0400 pem/bigchaindb.pem
# starting and tagging instances echo "Starting and tagging instances on EC2"
python run_and_tag.py --tag $TAG --nodes $NODES python run_and_tag.py --tag $TAG --nodes $NODES
# let's wait a minute to get the nodes ready and in status initializing # let's wait a minute to get the nodes ready and in status initializing
#sleep 60 #sleep 60
# checking if instances are up and running (every 5 secs.) # Wait until all those instances are running
RET=1 python wait_until_all_running.py --tag $TAG
until [ ${RET} -eq 0 ]; do
python3 get_instance_status.py --tag $TAG
RET=$?
sleep 5
done
# in case of elastic ips... # in case of elastic ips...
python3 get_elastic_ips.py --tag $TAG python3 get_elastic_ips.py --tag $TAG

View File

@ -0,0 +1,45 @@
# -*- coding: utf-8 -*-
import os
import boto3
import argparse
AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID']
AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
AWS_REGION = os.environ['AWS_REGION']
parser = argparse.ArgumentParser()
parser.add_argument("--tag", help="tag instances in aws")
args = parser.parse_args()
if args.tag:
tag = args.tag
else:
# reading credentials from config for remote connection
print('usage: python get_instance_status.py --tag <tag>')
print('reason: tag missing!!!')
exit(1)
# Connect to Amazon EC2
ec2 = boto3.resource(service_name='ec2',
region_name=AWS_REGION,
aws_access_key_id=AWS_ACCESS_KEY_ID,
aws_secret_access_key=AWS_SECRET_ACCESS_KEY)
# Get a list of all instances with the specified tag.
# (Technically, instances_with_tag is an ec2.instancesCollection.)
instances_with_tag = ec2.instances.filter(
Filters=[{'Name': 'tag:Name', 'Values': [tag]}]
)
print('The instances with tag {} have these ids:'.format(tag))
for instance in instances_with_tag:
print(instance.id)
print('Waiting until all those instances exist...')
for instance in instances_with_tag:
instance.wait_until_exists()
print('Waiting until all those instances are running...')
for instance in instances_with_tag:
instance.wait_until_running()