Skip to content

Commit 2b546ae

Browse files
committed
add list connections command
1 parent c74e34a commit 2b546ae

File tree

4 files changed

+53
-14
lines changed

4 files changed

+53
-14
lines changed

octavia-cli/octavia_cli/list/commands.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import click
88

99
from .listings import (
10+
Connections,
1011
DestinationConnectorsDefinitions,
1112
Destinations,
1213
SourceConnectorsDefinitions,
@@ -60,7 +61,16 @@ def destinations(ctx: click.Context):
6061
click.echo(destinations)
6162

6263

63-
AVAILABLE_COMMANDS: List[click.Command] = [connectors, sources, destinations]
64+
@click.command(help="List existing connections.")
65+
@click.pass_context
66+
def connections(ctx: click.Context):
67+
api_client = ctx.obj["API_CLIENT"]
68+
workspace_id = ctx.obj["WORKSPACE_ID"]
69+
connections = Connections(api_client, workspace_id)
70+
click.echo(connections)
71+
72+
73+
AVAILABLE_COMMANDS: List[click.Command] = [connectors, sources, destinations, connections]
6474

6575

6676
def add_commands_to_list():

octavia-cli/octavia_cli/list/listings.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import airbyte_api_client
99
import octavia_cli.list.formatting as formatting
1010
from airbyte_api_client.api import (
11+
connection_api,
1112
destination_api,
1213
destination_definition_api,
1314
source_api,
@@ -85,7 +86,7 @@ class DestinationConnectorsDefinitions(BaseListing):
8586
list_function_name = "list_latest_destination_definitions"
8687

8788

88-
class SourcesAndDestinations(BaseListing, abc.ABC):
89+
class WorkspaceListing(BaseListing, abc.ABC):
8990
def __init__(self, api_client: airbyte_api_client.ApiClient, workspace_id: str):
9091
self.workspace_id = workspace_id
9192
super().__init__(api_client)
@@ -95,15 +96,22 @@ def list_function_kwargs(self) -> dict:
9596
return {"workspace_id_request_body": WorkspaceIdRequestBody(workspace_id=self.workspace_id)}
9697

9798

98-
class Sources(SourcesAndDestinations):
99+
class Sources(WorkspaceListing):
99100
api = source_api.SourceApi
100101
fields_to_display = ["name", "sourceName", "sourceId"]
101102
list_field_in_response = "sources"
102103
list_function_name = "list_sources_for_workspace"
103104

104105

105-
class Destinations(SourcesAndDestinations):
106+
class Destinations(WorkspaceListing):
106107
api = destination_api.DestinationApi
107108
fields_to_display = ["name", "destinationName", "destinationId"]
108109
list_field_in_response = "destinations"
109110
list_function_name = "list_destinations_for_workspace"
111+
112+
113+
class Connections(WorkspaceListing):
114+
api = connection_api.ConnectionApi
115+
fields_to_display = ["name", "connectionId", "status", "sourceId", "destinationId"]
116+
list_field_in_response = "connections"
117+
list_function_name = "list_connections_for_workspace"

octavia-cli/unit_tests/test_list/test_commands.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88

99
def test_available_commands():
10-
assert commands.AVAILABLE_COMMANDS == [commands.connectors, commands.sources, commands.destinations]
10+
assert commands.AVAILABLE_COMMANDS == [commands.connectors, commands.sources, commands.destinations, commands.connections]
1111

1212

1313
def test_commands_in_list_group():
@@ -50,3 +50,12 @@ def test_destinations(mocker):
5050
result = runner.invoke((commands.destinations), obj=context_object)
5151
commands.Destinations.assert_called_with(context_object["API_CLIENT"], context_object["WORKSPACE_ID"])
5252
assert result.output == "DestinationsRepr\n"
53+
54+
55+
def test_connections(mocker):
56+
mocker.patch.object(commands, "Connections", mocker.Mock(return_value="ConnectionsRepr"))
57+
context_object = {"API_CLIENT": mocker.Mock(), "WORKSPACE_ID": "my_workspace_id"}
58+
runner = CliRunner()
59+
result = runner.invoke((commands.connections), obj=context_object)
60+
commands.Connections.assert_called_with(context_object["API_CLIENT"], context_object["WORKSPACE_ID"])
61+
assert result.output == "ConnectionsRepr\n"

octavia-cli/unit_tests/test_list/test_listings.py

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import pytest
66
from airbyte_api_client.api import (
7+
connection_api,
78
destination_api,
89
destination_definition_api,
910
source_api,
@@ -12,11 +13,12 @@
1213
from octavia_cli.list import listings
1314
from octavia_cli.list.listings import (
1415
BaseListing,
16+
Connections,
1517
DestinationConnectorsDefinitions,
1618
Destinations,
1719
SourceConnectorsDefinitions,
1820
Sources,
19-
SourcesAndDestinations,
21+
WorkspaceListing,
2022
)
2123

2224

@@ -110,18 +112,18 @@ def test_init(self, mock_api_client):
110112
assert destination_connectors_definition.list_function_name == "list_latest_destination_definitions"
111113

112114

113-
class TestSourcesAndDestinations:
115+
class TestWorkspaceListing:
114116
@pytest.fixture
115117
def patch_base_class(self, mocker):
116118
# Mock abstract methods to enable instantiating abstract class
117-
mocker.patch.object(SourcesAndDestinations, "__abstractmethods__", set())
118-
mocker.patch.object(SourcesAndDestinations, "api", mocker.Mock())
119+
mocker.patch.object(WorkspaceListing, "__abstractmethods__", set())
120+
mocker.patch.object(WorkspaceListing, "api", mocker.Mock())
119121

120122
def test_init(self, patch_base_class, mocker, mock_api_client):
121123
mocker.patch.object(listings, "WorkspaceIdRequestBody")
122124
mocker.patch.object(BaseListing, "__init__")
123-
assert SourcesAndDestinations.__base__ == BaseListing
124-
sources_and_destinations = SourcesAndDestinations(mock_api_client, "my_workspace_id")
125+
assert WorkspaceListing.__base__ == BaseListing
126+
sources_and_destinations = WorkspaceListing(mock_api_client, "my_workspace_id")
125127

126128
assert sources_and_destinations.workspace_id == "my_workspace_id"
127129
assert sources_and_destinations.list_function_kwargs == {"workspace_id_request_body": listings.WorkspaceIdRequestBody.return_value}
@@ -130,12 +132,12 @@ def test_init(self, patch_base_class, mocker, mock_api_client):
130132

131133
def test_abstract(self, mock_api_client):
132134
with pytest.raises(TypeError):
133-
SourcesAndDestinations(mock_api_client)
135+
WorkspaceListing(mock_api_client)
134136

135137

136138
class TestSources:
137139
def test_init(self, mock_api_client):
138-
assert Sources.__base__ == SourcesAndDestinations
140+
assert Sources.__base__ == WorkspaceListing
139141
sources = Sources(mock_api_client, "my_workspace_id")
140142
assert sources.api == source_api.SourceApi
141143
assert sources.fields_to_display == ["name", "sourceName", "sourceId"]
@@ -145,9 +147,19 @@ def test_init(self, mock_api_client):
145147

146148
class TestDestinations:
147149
def test_init(self, mock_api_client):
148-
assert Destinations.__base__ == SourcesAndDestinations
150+
assert Destinations.__base__ == WorkspaceListing
149151
destinations = Destinations(mock_api_client, "my_workspace_id")
150152
assert destinations.api == destination_api.DestinationApi
151153
assert destinations.fields_to_display == ["name", "destinationName", "destinationId"]
152154
assert destinations.list_field_in_response == "destinations"
153155
assert destinations.list_function_name == "list_destinations_for_workspace"
156+
157+
158+
class TestConnections:
159+
def test_init(self, mock_api_client):
160+
assert Connections.__base__ == WorkspaceListing
161+
connections = Connections(mock_api_client, "my_workspace_id")
162+
assert connections.api == connection_api.ConnectionApi
163+
assert connections.fields_to_display == ["name", "connectionId", "status", "sourceId", "destinationId"]
164+
assert connections.list_field_in_response == "connections"
165+
assert connections.list_function_name == "list_connections_for_workspace"

0 commit comments

Comments
 (0)