Example #1
0
def run_instances(options):

    global CONFIG_PATH
    global IDENTITY_FILE
    global TABLE_PATH
    global INFO_PATH

    # default values
    isDetailed = False
    userName = "******"

    if len(options) < 2:
        elog("Invalid Options", "Insufficient values")

    imageId = options.pop(len(options) - 1)
    alias = options.pop(len(options) - 1)

    while len(options) > 0:
        op = options.pop(0)
        if op == "-d" or op == "-detail":
            isDetailed = True
        elif op == "-u" or op == "-user":
            if len(options) == 0:
                elog("Invalid Options", "insufficient values")
            op = options.pop(0)
            userName = op
        else:
            elog("Invalid Option", "Unkown option: " + op)

    # load ~/.ssh/config into memory, context is the object containing the parsed ~/.ssh/config file
    context = ConfigParser.loads(CONFIG_PATH)

    # check if the alias is occupied
    dupHost = context.isAliasDup(alias)
    if dupHost:
        elog("duplicated alias name found: {0}".format(dupHost))

    # default values
    sgroup = "sg-a64e57c1"
    count = "1"  # does not support multiple instances yet
    ins_type = "t2.micro"
    key_name = "yangKey"

    if isDetailed:
        temp = raw_input("> Enter security-group-ids (" + sgroup + "):\n> ")
        if temp:
            sgroup = temp
        # temp = raw_input("> Enter number of instances (" + count + "):\n> ")
        # if temp:
        #     count = temp
        temp = raw_input("> Enter instance type (" + ins_type + "):\n> ")
        if temp:
            ins_type = temp
        temp = raw_input("> Enter key name (" + key_name + "):\n> ")
        if temp:
            key_name = temp

    log("command :\naws ec2 run-instances --image-id {0} --security-group-ids {1} --count {2} --instance-type {3} --key-name {4} --query 'Instances[0].InstanceId' --output json"
        .format(imageId, sgroup, count, ins_type, key_name))
    instance_id, err = execute(
        "aws ec2 run-instances --image-id {0} --security-group-ids {1} --count {2} --instance-type {3} --key-name {4} --query 'Instances[0].InstanceId' --output json"
        .format(imageId, sgroup, count, ins_type, key_name))

    if err:
        elog(err, "Failed to run new instances")

    log("aws ec2 describe-instances --instance-id {0} --output json".format(
        instance_id))
    out, err = execute(
        "aws ec2 describe-instances --instance-id {0} --output json".format(
            instance_id))

    if err:
        elog(err, "Failed to retrive instances' description")

    raw_instance = json.loads(out)["Reservations"][0]["Instances"][0]
    baked_instance = {}
    baked_instance["InstanceId"] = raw_instance["InstanceId"]
    baked_instance["ImageId"] = raw_instance["ImageId"]
    baked_instance["PublicDnsName"] = raw_instance["PublicDnsName"]
    baked_instance["PublicIpAddress"] = raw_instance["PublicIpAddress"]
    baked_instance["KeyName"] = raw_instance["KeyName"]
    baked_instance["InstanceType"] = raw_instance["InstanceType"]
    baked_instance["SecurityGroups"] = raw_instance["SecurityGroups"]
    baked_instance["AvailabilityZone"] = raw_instance["Placement"][
        "AvailabilityZone"]
    baked_instance["UserName"] = userName

    newHost = ConfigParser.Host(alias)
    newHost.put("User", userName)
    newHost.put("HostName", baked_instance["PublicDnsName"])
    newHost.put("IdentityFile", IDENTITY_FILE)
    context.add(newHost)
    context.save()

    try:
        f_info = open(INFO_PATH + alias + ".json", 'w')
        f_info.write(json.dumps(baked_instance, indent=4))
        f_info.close()

        table = TableParser.loads(TABLE_PATH)
        table.add(alias, baked_instance["InstanceId"])
        table.save()

    except IOError, err:
        elog(err,
             "Failed to store instance infomation or update instance table")