Skip to content
This repository was archived by the owner on May 5, 2020. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 10 additions & 6 deletions cloudscale/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import os
import configparser
from .client import RestAPI
from .log import logger
from .lib.server import Server
from .lib.server_group import ServerGroup
from .lib.volume import Volume
Expand All @@ -23,7 +24,7 @@

class Cloudscale:

def __init__(self, api_token=None, profile=None, verbose=False):
def __init__(self, api_token=None, profile=None):

if api_token and profile:
raise CloudscaleException("API token and profile are mutually exclusive")
Expand All @@ -36,13 +37,15 @@ def __init__(self, api_token=None, profile=None, verbose=False):
else:
self.api_token = self.config.get('api_token')

if not self.api_token:
raise CloudscaleException("Missing API key")

logger.debug("API token: {}...".format(self.api_token[:4]))

# Configre requests timeout
self.timeout = self.config.get('timeout', 60)
logger.debug("Timeout: {}".format(self.timeout))

if not self.api_token:
raise CloudscaleException("Missing API key: see -h for help")

self.verbose = verbose
self.service_classes = {
'server': Server,
'server_group': ServerGroup,
Expand Down Expand Up @@ -75,6 +78,8 @@ def _read_from_configfile(self, profile=None):
else:
profile = os.getenv('CLOUDSCALE_PROFILE', 'default')

logger.info("Profile: {}".format(profile))

if not conf._sections.get(profile):
return dict()

Expand All @@ -91,7 +96,6 @@ def __getattr__(self, name):
)
obj = self.service_classes[name]()
obj._client = client
obj.verbose = self.verbose
return obj
except NameError as e:
raise CloudscaleException(e)
4 changes: 4 additions & 0 deletions cloudscale/cli.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import click
import click_log
from .log import logger
from click_repl import register_repl
from .util import OrderedGroup
from .commands.version import cmd_version
Expand All @@ -13,10 +15,12 @@
from .commands.volume import volume
from .commands.objects_user import objects_user

click_log.basic_config(logger)

@click.group(cls=OrderedGroup, context_settings={
'help_option_names': ['-h', '--help'],
})
@click_log.simple_verbosity_option(logger)
def cli():
pass

Expand Down
8 changes: 6 additions & 2 deletions cloudscale/client.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import requests
from urllib.parse import urlencode
from .log import logger

class RestAPI:

Expand Down Expand Up @@ -51,29 +52,32 @@ def get_resources(self, resource, payload=None, resource_id=None):

query_url = query_url + '?' + data

logger.debug("HTTP GET: {}".format(query_url))
r = requests.get(query_url, headers=self.headers, timeout=self.timeout)
return self._return_result(r)

def post_patch_resource(self, resource, payload=None, resource_id=None, action=None):
data = self._handle_payload(payload)
query_url = self.endpoint + '/' + resource


if not resource_id:
logger.debug("HTTP POST URL {}, data {}".format(query_url, data))
r = requests.post(query_url, json=data, headers=self.headers, timeout=self.timeout)
return self._return_result(r)


query_url += '/' + resource_id
if action:
query_url += '/' + action
logger.debug("HTTP POSTst URL {}, data {}".format(query_url, data))
r = requests.post(query_url, json=data, headers=self.headers, timeout=self.timeout)
return self._return_result(r)
else:
logger.debug("HTTP POST URL {}, data {}".format(query_url, data))
r = requests.patch(query_url, json=data, headers=self.headers, timeout=self.timeout)
return self._return_result(r)

def delete_resource(self, resource, resource_id):
query_url = self.endpoint + '/' + resource + '/' + resource_id
logger.debug("HTTP DELETE: {}".format(query_url))
r = requests.delete(query_url, headers=self.headers, timeout=self.timeout)
return self._return_result(r)
10 changes: 5 additions & 5 deletions cloudscale/commands/flavor.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
import sys
import click
from ..log import logger
from ..util import to_table
from .. import Cloudscale, CloudscaleException, CloudscaleApiException

@click.group()
@click.option('--api-token', '-a', envvar='CLOUDSCALE_API_TOKEN', help="API token.")
@click.option('--profile', '-p', help="Profile used in config file.")
@click.option('--verbose', '-v', is_flag=True, help='Enables verbose mode.')
@click.pass_context
def flavor(ctx, profile, api_token, verbose):
def flavor(ctx, profile, api_token):
try:
ctx.obj = Cloudscale(api_token, profile, verbose)
ctx.obj = Cloudscale(api_token, profile)
except CloudscaleException as e:
click.echo(e, err=True)
logger.error(e)
sys.exit(1)

@flavor.command("list")
Expand All @@ -25,5 +25,5 @@ def cmd_list(cloudscale):
table = to_table(response, headers)
click.echo(table)
except CloudscaleApiException as e:
click.echo(e, err=True)
logger.error(e)
sys.exit(1)
18 changes: 9 additions & 9 deletions cloudscale/commands/floating_ip.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
import sys
import click
from ..log import logger
from ..util import to_table, to_pretty_json, to_dict
from .. import Cloudscale, CloudscaleApiException, CloudscaleException
from . import abort_if_false

@click.group()
@click.option('--api-token', '-a', envvar='CLOUDSCALE_API_TOKEN', help="API token.")
@click.option('--profile', '-p', help="Profile used in config file.")
@click.option('--verbose', '-v', is_flag=True, help='Enables verbose mode.')
@click.pass_context
def floating_ip(ctx, profile, api_token, verbose):
def floating_ip(ctx, profile, api_token):
try:
ctx.obj = Cloudscale(api_token, profile, verbose)
ctx.obj = Cloudscale(api_token, profile)
except CloudscaleException as e:
click.echo(e, err=True)
logger.error(e)
sys.exit(1)

@floating_ip.command("list")
Expand All @@ -26,7 +26,7 @@ def cmd_list(cloudscale):
table = to_table(response, headers)
click.echo(table)
except CloudscaleApiException as e:
click.echo(e, err=True)
logger.error(e)
sys.exit(1)

@click.option('--network-id', 'uuid', required=True)
Expand All @@ -37,7 +37,7 @@ def cmd_show(cloudscale, uuid):
response = cloudscale.floating_ip.get_by_uuid(uuid)
click.echo(to_pretty_json(response))
except CloudscaleApiException as e:
click.echo(e, err=True)
logger.error(e)
sys.exit(1)

@click.option('--ip-version', type=int, default=4, show_default=True)
Expand All @@ -62,7 +62,7 @@ def cmd_create(cloudscale, ip_version, server_uuid, prefix_length, reverse_ptr,
)
click.echo(to_pretty_json(response))
except CloudscaleApiException as e:
click.echo(e, err=True)
logger.error(e)
sys.exit(1)

@click.option('--network-id', 'uuid', required=True)
Expand All @@ -82,7 +82,7 @@ def cmd_update(cloudscale, uuid, server_uuid, reverse_ptr, tags):
response = cloudscale.floating_ip.get_by_uuid(uuid)
click.echo(to_pretty_json(response))
except CloudscaleApiException as e:
click.echo(e, err=True)
logger.error(e)
sys.exit(1)

@click.option('--network-id', 'uuid', required=True)
Expand All @@ -96,5 +96,5 @@ def cmd_delete(cloudscale, uuid):
cloudscale.floating_ip.delete(uuid)
click.echo("Deleted!")
except CloudscaleApiException as e:
click.echo(e, err=True)
logger.error(e)
sys.exit(1)
10 changes: 5 additions & 5 deletions cloudscale/commands/image.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
import sys
import click
from ..log import logger
from ..util import to_table
from .. import Cloudscale, CloudscaleApiException, CloudscaleException

@click.group()
@click.option('--api-token', '-a', envvar='CLOUDSCALE_API_TOKEN', help="API token.")
@click.option('--profile', '-p', help="Profile used in config file.")
@click.option('--verbose', '-v', is_flag=True, help='Enables verbose mode.')
@click.pass_context
def image(ctx, profile, api_token, verbose):
def image(ctx, profile, api_token):
try:
ctx.obj = Cloudscale(api_token, profile, verbose)
ctx.obj = Cloudscale(api_token, profile)
except CloudscaleException as e:
click.echo(e, err=True)
logger.error(e)
sys.exit(1)

@image.command("list")
Expand All @@ -25,5 +25,5 @@ def cmd_list(cloudscale):
table = to_table(response, headers)
click.echo(table)
except CloudscaleApiException as e:
click.echo(e, err=True)
logger.error(e)
sys.exit(1)
18 changes: 9 additions & 9 deletions cloudscale/commands/network.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
import sys
import click
from ..log import logger
from ..util import to_table, to_pretty_json, to_dict
from .. import Cloudscale, CloudscaleApiException, CloudscaleException
from . import abort_if_false

@click.group()
@click.option('--api-token', '-a', envvar='CLOUDSCALE_API_TOKEN', help="API token.")
@click.option('--profile', '-p', help="Profile used in config file.")
@click.option('--verbose', '-v', is_flag=True, help='Enables verbose mode.')
@click.pass_context
def network(ctx, profile, api_token, verbose):
def network(ctx, profile, api_token):
try:
ctx.obj = Cloudscale(api_token, profile, verbose)
ctx.obj = Cloudscale(api_token, profile)
except CloudscaleException as e:
click.echo(e, err=True)
logger.error(e)
sys.exit(1)

@network.command("list")
Expand All @@ -26,7 +26,7 @@ def cmd_list(cloudscale):
table = to_table(response, headers)
click.echo(table)
except CloudscaleApiException as e:
click.echo(e, err=True)
logger.error(e)
sys.exit(1)

@click.option('--uuid', required=True)
Expand All @@ -37,7 +37,7 @@ def cmd_show(cloudscale, uuid):
response = cloudscale.network.get_by_uuid(uuid)
click.echo(to_pretty_json(response))
except CloudscaleApiException as e:
click.echo(e, err=True)
logger.error(e)
sys.exit(1)

@click.option('--name', required=True)
Expand All @@ -58,7 +58,7 @@ def cmd_create(cloudscale, name, zone, mtu, auto_create_ipv4_subnet, tags):
)
click.echo(to_pretty_json(response))
except CloudscaleApiException as e:
click.echo(e, err=True)
logger.error(e)
sys.exit(1)

@click.option('--uuid', required=True)
Expand All @@ -78,7 +78,7 @@ def cmd_update(cloudscale, uuid, name, mtu, tags):
response = cloudscale.network.get_by_uuid(uuid)
click.echo(to_pretty_json(response))
except CloudscaleApiException as e:
click.echo(e, err=True)
logger.error(e)
sys.exit(1)

@click.option('--uuid', required=True)
Expand All @@ -92,5 +92,5 @@ def cmd_delete(cloudscale, uuid):
cloudscale.network.delete(uuid)
click.echo("Deleted!")
except CloudscaleApiException as e:
click.echo(e, err=True)
logger.error(e)
sys.exit(1)
18 changes: 9 additions & 9 deletions cloudscale/commands/objects_user.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
import sys
import click
from ..log import logger
from ..util import to_table, to_pretty_json, to_dict
from .. import Cloudscale, CloudscaleApiException, CloudscaleException
from . import abort_if_false

@click.group()
@click.option('--api-token', '-a', envvar='CLOUDSCALE_API_TOKEN', help="API token.")
@click.option('--profile', '-p', help="Profile used in config file.")
@click.option('--verbose', '-v', is_flag=True, help='Enables verbose mode.')
@click.pass_context
def objects_user(ctx, profile, api_token, verbose):
def objects_user(ctx, profile, api_token):
try:
ctx.obj = Cloudscale(api_token, profile, verbose)
ctx.obj = Cloudscale(api_token, profile)
except CloudscaleException as e:
click.echo(e, err=True)
logger.error(e)
sys.exit(1)

@click.option('--filter-tag')
Expand All @@ -27,7 +27,7 @@ def cmd_list(cloudscale, filter_tag):
table = to_table(response, headers)
click.echo(table)
except CloudscaleApiException as e:
click.echo(e, err=True)
logger.error(e)
sys.exit(1)

@click.option('--id', '--uuid', 'uuid', required=True)
Expand All @@ -38,7 +38,7 @@ def cmd_show(cloudscale, uuid):
response = cloudscale.objects_user.get_by_uuid(uuid)
click.echo(to_pretty_json(response))
except CloudscaleApiException as e:
click.echo(e, err=True)
logger.error(e)
sys.exit(1)

@click.option('--display-name', required=True)
Expand All @@ -50,7 +50,7 @@ def cmd_create(cloudscale, display_name, tags):
response = cloudscale.objects_user.create(display_name, to_dict(tags))
click.echo(to_pretty_json(response))
except CloudscaleApiException as e:
click.echo(e, err=True)
logger.error(e)
sys.exit(1)

@click.option('--id', '--uuid', 'uuid', required=True)
Expand All @@ -64,7 +64,7 @@ def cmd_update(cloudscale, uuid, display_name, tags):
response = cloudscale.objects_user.get_by_uuid(uuid)
click.echo(to_pretty_json(response))
except CloudscaleApiException as e:
click.echo(e, err=True)
logger.error(e)
sys.exit(1)

@click.option('--id', '--uuid', 'uuid', required=True)
Expand All @@ -78,5 +78,5 @@ def cmd_delete(cloudscale, uuid):
cloudscale.objects_user.delete(uuid)
click.echo("Deleted!")
except CloudscaleApiException as e:
click.echo(e, err=True)
logger.error(e)
sys.exit(1)
Loading