diff --git a/cloudlaunch_cli/api/client.py b/cloudlaunch_cli/api/client.py index fd02726..61ad42a 100644 --- a/cloudlaunch_cli/api/client.py +++ b/cloudlaunch_cli/api/client.py @@ -25,6 +25,8 @@ def __init__(self, url=None, token=None): credentials.azure = endpoints.AzureCredentials(config) credentials.gce = endpoints.GCECredentials(config) self.auth.user.credentials = credentials + self.infrastructure = types.SimpleNamespace() + self.infrastructure.clouds = endpoints.Clouds(config) # For testing purposes only diff --git a/cloudlaunch_cli/api/endpoints.py b/cloudlaunch_cli/api/endpoints.py index a67a8ea..b5402b1 100644 --- a/cloudlaunch_cli/api/endpoints.py +++ b/cloudlaunch_cli/api/endpoints.py @@ -214,3 +214,9 @@ class Applications(CoreAPIBasedAPIEndpoint): path = ['applications'] resource_type = resources.Application id_param_name = 'slug' + + +class Clouds(CoreAPIBasedAPIEndpoint): + path = ['infrastructure', 'clouds'] + resource_type = resources.Cloud + id_param_name = 'slug' diff --git a/cloudlaunch_cli/api/resources.py b/cloudlaunch_cli/api/resources.py index 5e96be9..edd2de4 100644 --- a/cloudlaunch_cli/api/resources.py +++ b/cloudlaunch_cli/api/resources.py @@ -147,7 +147,7 @@ def run_delete(self): class Cloud(APIResource): - pass + id_field_name = 'slug' class Image(APIResource): diff --git a/cloudlaunch_cli/main.py b/cloudlaunch_cli/main.py index d665152..a461039 100644 --- a/cloudlaunch_cli/main.py +++ b/cloudlaunch_cli/main.py @@ -141,8 +141,36 @@ def _print_applications(applications): **app._data)) +@click.group() +def clouds(): + pass + + +@click.command() +def list_clouds(): + clouds = cloudlaunch_client.infrastructure.clouds.list() + _print_clouds(clouds) + + +def _print_clouds(clouds): + slug_width = max([len(cloud.slug) for cloud in clouds]) + 1 + if len(clouds) > 0: + header_format = "{{:{slug_width!s}s}} {{:20s}} {{:12s}} {{:20s}}"\ + .format(slug_width=slug_width) + print(header_format.format( + "Slug", "Name", "Cloud Type", "Region")) + else: + print("No clouds found.") + row_format = "{{slug:{slug_width!s}.{slug_width!s}s}} {{name:20.20s}} "\ + "{{cloud_type:12.12}} {{region_name:20.20s}}"\ + .format(slug_width=slug_width) + for cloud in clouds: + print(row_format.format(**cloud.asdict())) + + client.add_command(deployments) client.add_command(applications) +client.add_command(clouds) client.add_command(config) config.add_command(set_config, name='set') @@ -154,5 +182,7 @@ def _print_applications(applications): applications.add_command(create_application, name='create') applications.add_command(list_applications, name='list') +clouds.add_command(list_clouds, name='list') + if __name__ == '__main__': client()