Exemple #1
0
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")
Exemple #2
0
 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()
Exemple #3
0
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)
Exemple #4
0
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))
Exemple #5
0
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))
Exemple #6
0
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")
Exemple #7
0
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")
Exemple #8
0
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")
Exemple #9
0
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")
Exemple #10
0
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")
Exemple #11
0
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")
Exemple #12
0
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")
Exemple #13
0
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")
Exemple #14
0
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)
Exemple #15
0
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")
Exemple #16
0
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)
Exemple #17
0
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)
Exemple #18
0
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
Exemple #19
0
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