1
0
mirror of synced 2026-01-08 21:05:13 -05:00
Files
airbyte/octavia-cli/octavia_cli/get/commands.py
Cole Snodgrass 2e099acc52 update headers from 2022 -> 2023 (#22594)
* It's 2023!

* 2022 -> 2023

---------

Co-authored-by: evantahler <evan@airbyte.io>
2023-02-08 13:01:16 -08:00

109 lines
3.7 KiB
Python

#
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
#
import uuid
from typing import List, Optional, Tuple, Type, Union
import airbyte_api_client
import click
from octavia_cli.base_commands import OctaviaCommand
from .resources import Connection, Destination, Source
COMMON_HELP_MESSAGE_PREFIX = "Get a JSON representation of a remote"
def build_help_message(resource_type: str) -> str:
"""Helper function to build help message consistently for all the commands in this module.
Args:
resource_type (str): source, destination or connection
Returns:
str: The generated help message.
"""
return f"Get a JSON representation of a remote {resource_type}."
def get_resource_id_or_name(resource: str) -> Tuple[Optional[str], Optional[str]]:
"""Helper function to detect if the resource argument passed to the CLI is a resource ID or name.
Args:
resource (str): the resource ID or name passed as an argument to the CLI.
Returns:
Tuple[Optional[str], Optional[str]]: the resource_id and resource_name, the not detected kind is set to None.
"""
resource_id, resource_name = None, None
try:
uuid.UUID(resource)
resource_id = resource
except ValueError:
resource_name = resource
return resource_id, resource_name
def get_json_representation(
api_client: airbyte_api_client.ApiClient,
workspace_id: str,
ResourceClass: Type[Union[Source, Destination, Connection]],
resource_to_get: str,
) -> str:
"""Helper function to retrieve a resource json representation and avoid repeating the same logic for Source/Destination and connection.
Args:
api_client (airbyte_api_client.ApiClient): The Airbyte API client.
workspace_id (str): Current workspace id.
ResourceClass (Type[Union[Source, Destination, Connection]]): Resource class to use
resource_to_get (str): resource name or id to get JSON representation for.
Returns:
str: The resource's JSON representation.
"""
resource_id, resource_name = get_resource_id_or_name(resource_to_get)
resource = ResourceClass(api_client, workspace_id, resource_id=resource_id, resource_name=resource_name)
return resource.to_json()
@click.group(
"get",
help=f'{build_help_message("source, destination or connection")} ID or name can be used as argument. Example: \'octavia get source "My Pokemon source"\' or \'octavia get source cb5413b2-4159-46a2-910a-dc282a439d2d\'',
)
@click.pass_context
def get(ctx: click.Context): # pragma: no cover
pass
@get.command(cls=OctaviaCommand, name="source", help=build_help_message("source"))
@click.argument("resource", type=click.STRING)
@click.pass_context
def source(ctx: click.Context, resource: str):
click.echo(get_json_representation(ctx.obj["API_CLIENT"], ctx.obj["WORKSPACE_ID"], Source, resource))
@get.command(cls=OctaviaCommand, name="destination", help=build_help_message("destination"))
@click.argument("resource", type=click.STRING)
@click.pass_context
def destination(ctx: click.Context, resource: str):
click.echo(get_json_representation(ctx.obj["API_CLIENT"], ctx.obj["WORKSPACE_ID"], Destination, resource))
@get.command(cls=OctaviaCommand, name="connection", help=build_help_message("connection"))
@click.argument("resource", type=click.STRING)
@click.pass_context
def connection(ctx: click.Context, resource: str):
click.echo(get_json_representation(ctx.obj["API_CLIENT"], ctx.obj["WORKSPACE_ID"], Connection, resource))
AVAILABLE_COMMANDS: List[click.Command] = [source, destination, connection]
def add_commands_to_list():
for command in AVAILABLE_COMMANDS:
get.add_command(command)
add_commands_to_list()