def attach(self): ec2 = mssapi.connect_ec2() if self.logical_volume_name: # if a logical volume was specified, override the specified volume_id # (if there was one) with the current AWS volume for the logical volume: logical_volume = next(Volume.find(name=self.logical_volume_name)) self.volume_id = logical_volume._volume_id volume = ec2.get_all_volumes([self.volume_id])[0] # wait for the volume to be available. The volume may still be being created # from a snapshot. while volume.update() != 'available': mssapi.log.info('Volume %s not yet available. Current status = %s.' % (volume.id, volume.status)) time.sleep(5) instance = ec2.get_only_instances([self.instance_id])[0] attempt_attach = True while attempt_attach: try: ec2.attach_volume(self.volume_id, self.instance_id, self.device) attempt_attach = False except EC2ResponseError as e: if e.error_code != 'IncorrectState': # if there's an EC2ResonseError with the code set to IncorrectState, delay a bit for ec2 # to realize the instance is running, then try again. Otherwise, raise the error: mssapi.log.info('Attempt to attach the EBS volume %s to this instance (%s) returned %s. Trying again in a bit.' % (self.volume_id, self.instance_id, e.errors)) time.sleep(2) else: raise e mssapi.log.info('Attached volume %s to instance %s as device %s' % (self.volume_id, self.instance_id, self.device)) # now wait for the volume device to appear while not os.path.exists(self.device): mssapi.log.info('%s still does not exist, waiting 2 seconds' % self.device) time.sleep(2)
def main(self): fp = StringIO.StringIO() mssapi.config.dump_safe(fp) self.notify('%s (%s) Starting' % (self.name, self.instance_id), fp.getvalue()) if self.src and self.dst: self.copy_keys() if self.dst: self.copy_log() self.notify('%s (%s) Stopping' % (self.name, self.instance_id), 'Copy Operation Complete') if mssapi.config.getbool(self.name, 'exit_on_completion', True): ec2 = mssapi.connect_ec2() ec2.terminate_instances([self.instance_id])
def attach(self): ec2 = mssapi.connect_ec2() if self.logical_volume_name: # if a logical volume was specified, override the specified volume_id # (if there was one) with the current AWS volume for the logical volume: logical_volume = next(Volume.find(name=self.logical_volume_name)) self.volume_id = logical_volume._volume_id volume = ec2.get_all_volumes([self.volume_id])[0] # wait for the volume to be available. The volume may still be being created # from a snapshot. while volume.update() != 'available': mssapi.log.info( 'Volume %s not yet available. Current status = %s.' % (volume.id, volume.status)) time.sleep(5) instance = ec2.get_only_instances([self.instance_id])[0] attempt_attach = True while attempt_attach: try: ec2.attach_volume(self.volume_id, self.instance_id, self.device) attempt_attach = False except EC2ResponseError as e: if e.error_code != 'IncorrectState': # if there's an EC2ResonseError with the code set to IncorrectState, delay a bit for ec2 # to realize the instance is running, then try again. Otherwise, raise the error: mssapi.log.info( 'Attempt to attach the EBS volume %s to this instance (%s) returned %s. Trying again in a bit.' % (self.volume_id, self.instance_id, e.errors)) time.sleep(2) else: raise e mssapi.log.info('Attached volume %s to instance %s as device %s' % (self.volume_id, self.instance_id, self.device)) # now wait for the volume device to appear while not os.path.exists(self.device): mssapi.log.info('%s still does not exist, waiting 2 seconds' % self.device) time.sleep(2)
def main(): try: opts, args = getopt.getopt(sys.argv[1:], 'a:b:c:g:hi:k:m:n:o:rs:w', [ 'ami', 'bucket', 'class', 'group', 'help', 'inputqueue', 'keypair', 'module', 'numinstances', 'outputqueue', 'reload', 'script_name', 'wait' ]) except: usage() params = { 'module_name': None, 'script_name': None, 'class_name': None, 'script_bucket': None, 'group': 'default', 'keypair': None, 'ami': None, 'num_instances': 1, 'input_queue_name': None, 'output_queue_name': None } reload = None wait = None for o, a in opts: if o in ('-a', '--ami'): params['ami'] = a if o in ('-b', '--bucket'): params['script_bucket'] = a if o in ('-c', '--class'): params['class_name'] = a if o in ('-g', '--group'): params['group'] = a if o in ('-h', '--help'): usage() if o in ('-i', '--inputqueue'): params['input_queue_name'] = a if o in ('-k', '--keypair'): params['keypair'] = a if o in ('-m', '--module'): params['module_name'] = a if o in ('-n', '--num_instances'): params['num_instances'] = int(a) if o in ('-o', '--outputqueue'): params['output_queue_name'] = a if o in ('-r', '--reload'): reload = True if o in ('-s', '--script'): params['script_name'] = a if o in ('-w', '--wait'): wait = True # check required fields required = ['ami'] for pname in required: if not params.get(pname, None): print('%s is required' % pname) usage() if params['script_name']: # first copy the desired module file to S3 bucket if reload: print('Reloading module %s to S3' % params['script_name']) else: print('Copying module %s to S3' % params['script_name']) l = imp.find_module(params['script_name']) c = mssapi.connect_s3() bucket = c.get_bucket(params['script_bucket']) key = bucket.new_key(params['script_name'] + '.py') key.set_contents_from_file(l[0]) params['script_md5'] = key.md5 # we have everything we need, now build userdata string l = [] for k, v in params.items(): if v: l.append('%s=%s' % (k, v)) c = mssapi.connect_ec2() l.append('aws_access_key_id=%s' % c.aws_access_key_id) l.append('aws_secret_access_key=%s' % c.aws_secret_access_key) for kv in args: l.append(kv) s = '|'.join(l) if not reload: rs = c.get_all_images([params['ami']]) img = rs[0] r = img.run(user_data=s, key_name=params['keypair'], security_groups=[params['group']], max_count=params.get('num_instances', 1)) print('AMI: %s - %s (Started)' % (params['ami'], img.location)) print('Reservation %s contains the following instances:' % r.id) for i in r.instances: print('\t%s' % i.id) if wait: running = False while not running: time.sleep(30) [i.update() for i in r.instances] status = [i.state for i in r.instances] print(status) if status.count('running') == len(r.instances): running = True for i in r.instances: print('Instance: %s' % i.ami_launch_index) print('Public DNS Name: %s' % i.public_dns_name) print('Private DNS Name: %s' % i.private_dns_name)
def main(): try: opts, args = getopt.getopt( sys.argv[1:], "a:b:c:g:hi:k:m:n:o:rs:w", [ "ami", "bucket", "class", "group", "help", "inputqueue", "keypair", "module", "numinstances", "outputqueue", "reload", "script_name", "wait", ], ) except: usage() params = { "module_name": None, "script_name": None, "class_name": None, "script_bucket": None, "group": "default", "keypair": None, "ami": None, "num_instances": 1, "input_queue_name": None, "output_queue_name": None, } reload = None wait = None for o, a in opts: if o in ("-a", "--ami"): params["ami"] = a if o in ("-b", "--bucket"): params["script_bucket"] = a if o in ("-c", "--class"): params["class_name"] = a if o in ("-g", "--group"): params["group"] = a if o in ("-h", "--help"): usage() if o in ("-i", "--inputqueue"): params["input_queue_name"] = a if o in ("-k", "--keypair"): params["keypair"] = a if o in ("-m", "--module"): params["module_name"] = a if o in ("-n", "--num_instances"): params["num_instances"] = int(a) if o in ("-o", "--outputqueue"): params["output_queue_name"] = a if o in ("-r", "--reload"): reload = True if o in ("-s", "--script"): params["script_name"] = a if o in ("-w", "--wait"): wait = True # check required fields required = ["ami"] for pname in required: if not params.get(pname, None): print("%s is required" % pname) usage() if params["script_name"]: # first copy the desired module file to S3 bucket if reload: print("Reloading module %s to S3" % params["script_name"]) else: print("Copying module %s to S3" % params["script_name"]) l = imp.find_module(params["script_name"]) c = mssapi.connect_s3() bucket = c.get_bucket(params["script_bucket"]) key = bucket.new_key(params["script_name"] + ".py") key.set_contents_from_file(l[0]) params["script_md5"] = key.md5 # we have everything we need, now build userdata string l = [] for k, v in params.items(): if v: l.append("%s=%s" % (k, v)) c = mssapi.connect_ec2() l.append("aws_access_key_id=%s" % c.aws_access_key_id) l.append("aws_secret_access_key=%s" % c.aws_secret_access_key) for kv in args: l.append(kv) s = "|".join(l) if not reload: rs = c.get_all_images([params["ami"]]) img = rs[0] r = img.run( user_data=s, key_name=params["keypair"], security_groups=[params["group"]], max_count=params.get("num_instances", 1), ) print("AMI: %s - %s (Started)" % (params["ami"], img.location)) print("Reservation %s contains the following instances:" % r.id) for i in r.instances: print("\t%s" % i.id) if wait: running = False while not running: time.sleep(30) [i.update() for i in r.instances] status = [i.state for i in r.instances] print(status) if status.count("running") == len(r.instances): running = True for i in r.instances: print("Instance: %s" % i.ami_launch_index) print("Public DNS Name: %s" % i.public_dns_name) print("Private DNS Name: %s" % i.private_dns_name)