def detach_volume(): """Create a snapshot of a volume identified by it's mount path""" parser = _get_parser() group = parser.add_mutually_exclusive_group(required=True) group.add_argument("-m", "--mount-path", help="Mount point of the volume to be detached" ).completer = FilesCompleter() group.add_argument( "-i", "--volume-id", help="Volume id to detach").completer = ChoicesCompleter( info().volume_ids()) group.add_argument("-d", "--device", help="Device to detach").completer = ChoicesCompleter( info().volume_ids()) parser.add_argument("-x", "--delete", help="Delete volume after detaching", action="store_true") argcomplete.autocomplete(parser) args = parser.parse_args() if is_ec2(): ebs.detach_volume( mount_path=args.mount_path, volume_id=args.volume_id, device=args.device, delete_volume=args.delete, ) else: parser.error("Only makes sense on an EC2 instance")
def __init__(self, file_name, group=None, stream=None): self._lock = Lock() self._send_lock = Lock() if group: self.group_name = group else: self.group_name = resolve_stack_name() self._messages = deque() if stream: self.stream_name = stream else: self.stream_name = ( resolve_instance_id() + "|" + file_name.replace(":", "_").replace("*", "_") ) try: logs().create_log_group(logGroupName=self.group_name) except BaseException: pass try: logs().create_log_stream( logGroupName=self.group_name, logStreamName=self.stream_name ) except BaseException: pass self.token = None self.send(str(info())) self._do_send() self._stop_flag = Event() self._thread = IntervalThread(self._stop_flag, 2, self._do_send) self._thread.start()
def attach_eni(): """Optionally create and attach an elastic network interface""" parser = _get_parser() group = parser.add_mutually_exclusive_group() group.add_argument( "-s", "--subnet", help="Subnet for the elastic " + "network inferface if one is " + "created. Needs to " + "be on the same availability " + "zone as the instance.", ).completer = ChoicesCompleter(interface.list_compatible_subnet_ids()) group.add_argument( "-i", "--eni-id", help="Id of the eni to attach, if " + "attaching an existing eni.", ).completer = ChoicesCompleter(interface.list_attachable_eni_ids()) argcomplete.autocomplete(parser) args = parser.parse_args() if args.subnet: iface = interface.create_eni(args.subnet) elif args.eni_id: iface = interface.get_eni(args.eni_id) else: iface = interface.create_eni(info().subnet_id()) interface.attach_eni(iface.id) print(iface.id)
def cf_get_parameter(): """Get a parameter value from the stack""" parser = _get_parser() parser.add_argument("parameter", help="The name of the parameter to print") argcomplete.autocomplete(parser) args = parser.parse_args() print(info().stack_data(args.parameter))
def stack_params_and_outputs(): """Show stack parameters and outputs as a single json documents""" parser = _get_parser() parser.add_argument( "-p", "--parameter", help="Name of paremeter if only" + " one parameter required", ) parser.add_argument( "-s", "--stack-name", help="The name of the stack to show", default=info().stack_name(), ).completer = ChoicesCompleter(best_effort_stacks()) argcomplete.autocomplete(parser) args = parser.parse_args() resp, _ = instance_info.stack_params_and_outputs_and_stack( stack_name=args.stack_name) if args.parameter: if args.parameter in resp: print(resp[args.parameter]) else: parser.error("Parameter " + args.parameter + " not found") else: print(json.dumps(resp, indent=2))
def list_attached_enis(): """List all enis in the same availability-zone, i.e. ones that can be attached to this instance. """ parser = _get_parser() group = parser.add_mutually_exclusive_group() group.add_argument( "-i", "--ip-address", help= "Include first private ip addresses for the interfaces in the output", action="store_true", ) group.add_argument( "-f", "--full", help="Print all available data about attached enis as json", action="store_true", ) argcomplete.autocomplete(parser) args = parser.parse_args() if is_ec2(): enis = info().network_interfaces() if args.full: print(json.dumps(enis, indent=2, default=dthandler)) else: for eni in enis: ip_addr = (":" + eni["PrivateIpAddresses"][0]["PrivateIpAddress"] if args.ip_address and "PrivateIpAddresses" in eni and eni["PrivateIpAddresses"] and "PrivateIpAddress" in eni["PrivateIpAddresses"][0] else "") print(eni["NetworkInterfaceId"] + ip_addr) else: parser.error("Only makes sense on an EC2 instance")
def subnet_id(): """Get subnet id for instance""" parser = _get_parser() argcomplete.autocomplete(parser) parser.parse_args() if is_ec2(): print(info().subnet_id()) else: parser.error("Only makes sense on an EC2 instance")
def list_attached_volumes(): """List attached volumes""" parser = _get_parser() argcomplete.autocomplete(parser) _ = parser.parse_args() if is_ec2(): for volume_id in info().volume_ids(): print(volume_id) else: parser.error("Only makes sense on an EC2 instance")
def list_tags(): """List all tags associated with the instance""" parser = _get_parser() argcomplete.autocomplete(parser) parser.parse_args() if is_ec2(): for key, value in info().tags().items(): print(key + "=" + value) else: parser.error("Only makes sense on an EC2 instance")
def cf_stack_id(): """Get id of the stack the creted this instance""" parser = _get_parser() argcomplete.autocomplete(parser) parser.parse_args() if is_ec2(): print(info().stack_id()) else: parser.error( "Only makes sense on an EC2 instance cretated from a CF stack")
def cf_logical_id(): """Get the logical id that is expecting a signal from this instance""" parser = _get_parser() argcomplete.autocomplete(parser) parser.parse_args() if is_ec2(): print(info().logical_id()) else: parser.error( "Only makes sense on an EC2 instance cretated from a CF stack")
def availability_zone(): """Get availability zone for the instance""" parser = _get_parser() argcomplete.autocomplete(parser) parser.parse_args() if is_ec2(): print(info().availability_zone()) else: parser.error( "Only makes sense on an EC2 instance cretated from a CF stack")
def volume_info(): """Get information about an EBS volume via a mountpoint, device or volume-id""" parser = _get_parser() group = parser.add_mutually_exclusive_group(required=True) group.add_argument("-m", "--mount-path", help="Mount point of the volume to be detached" ).completer = FilesCompleter() group.add_argument( "-i", "--volume-id", help="Volume id to detach").completer = ChoicesCompleter( info().volume_ids()) group.add_argument("-d", "--device", help="Device to detach").completer = ChoicesCompleter( info().volume_ids()) parser.add_argument( "-j", "--jmespath", help= "A jemspath expression to get a specific piece of info from volume", ) argcomplete.autocomplete(parser) args = parser.parse_args() if is_ec2(): vol_info = ebs.volume_info(mount_path=args.mount_path, volume_id=args.volume_id, device=args.device) if vol_info: if args.jmespath: vol_info = search(args.jmespath, vol_info) if isinstance(vol_info, dict): print(json.dumps(vol_info, indent=2, default=dthandler)) else: print(str(vol_info)) else: print("No volume info found") exit(1) else: parser.error("Only makes sense on an EC2 instance")
def detach_eni(): """Detach an eni from this instance""" parser = _get_parser() parser.add_argument("-i", "--eni-id", help="Eni id to detach").completer = ChoicesCompleter( info().network_interface_ids()) parser.add_argument("-d", "--delete", help="Delete eni after detach", action="store_true") argcomplete.autocomplete(parser) args = parser.parse_args() interface.detach_eni(args.eni_id, delete=args.delete)
def get_tag(): """Get the value of a tag for an ec2 instance""" parser = _get_parser() parser.add_argument("name", help="The name of the tag to get") argcomplete.autocomplete(parser) args = parser.parse_args() if is_ec2(): value = info().tag(args.name) if value is not None: print(value) else: sys.exit("Tag " + args.name + " not found") else: parser.error("Only makes sense on an EC2 instance")
def create_eni(): """create an elastic network interface""" parser = _get_parser() parser.add_argument( "-s", "--subnet", help="Subnet for the elastic " + "network inferface if one is " + "created. Needs to " + "be on the same availability " + "zone as the instance.", ).completer = ChoicesCompleter(interface.list_compatible_subnet_ids()) argcomplete.autocomplete(parser) args = parser.parse_args() if not args.subnet: args.subnet = info().subnet_id() iface = interface.create_eni(args.subnet) print(iface.id)
def interpolate_file(file_name, destination=None, stack_name=None, use_vault=False, use_environ=False, skip_stack=False, encoding='utf-8'): if not destination: destination = file_name dstfile = tempfile.NamedTemporaryFile( dir=os.path.dirname(file_name), prefix=os.path.basename(file_name), delete=False) else: dstfile = tempfile.NamedTemporaryFile( dir=os.path.dirname(destination), prefix=os.path.basename(destination), delete=False) if use_environ: params = deepcopy(os.environ) else: params = {} if not stack_name and is_ec2() and not skip_stack: params.update(info().stack_data_dict()) elif stack_name and not skip_stack: stack_params, _ = stack_params_and_outputs_and_stack( stack_name=stack_name) params.update(stack_params) vault = None vault_keys = [] if use_vault: vault = Vault() vault_keys = vault.list_all() with io.open(file_name, "r", encoding=encoding) as _infile: with dstfile as _outfile: for line in _infile: line = _process_line(line, params, vault, vault_keys) _outfile.write(line.encode(encoding)) shutil.copy(dstfile.name, destination) os.unlink(dstfile.name)
def resolve_stack_name(): stack_name = info().stack_name() if not stack_name: info().clear_cache() raise Exception("Failed to resolve stack name") return stack_name
def resolve_instance_id(): instance_id = info().instance_id() if not instance_id: info().clear_cache() raise Exception("Failed to resolve instance id") return instance_id