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")