diff --git a/commands/helper.py b/commands/helper.py index eea8b0e..d29df90 100755 --- a/commands/helper.py +++ b/commands/helper.py @@ -1,4 +1,5 @@ import click +import json from dataclasses import dataclass from pyotp import TOTP @@ -11,6 +12,10 @@ class OTPCredentials: seed: str def get_json(self): - print(self.name, self.realm, self.seed) r = {"name": self.name, "realm": self.realm, "token": TOTP(self.seed).now()} return r + + +def load_dump_pretty(content): + parsed = json.loads(content) + return json.dumps(parsed, indent=4, sort_keys=True) \ No newline at end of file diff --git a/commands/host.py b/commands/host.py index ea6f9d0..24cf3da 100755 --- a/commands/host.py +++ b/commands/host.py @@ -3,7 +3,7 @@ import json import requests from decouple import config -from .helper import OTPCredentials +from .helper import OTPCredentials, load_dump_pretty @click.group() @@ -12,9 +12,9 @@ def host(): @host.command("add") -@click.option("--name", required=True) -@click.option("--realm", required=True) -@click.option("--seed", required=True) +@click.option("--name", envvar="OTP_NAME", required=True) +@click.option("--realm", envvar="OTP_REALM", required=True) +@click.option("--seed", envvar="OTP_SEED", required=True) @click.option("--specs", required=True) @click.option("--hostname", required=True) def add_host(name, realm, seed, specs, hostname): @@ -26,5 +26,10 @@ def add_host(name, realm, seed, specs, hostname): "hostname": hostname, } r = requests.post(f"{config('UCLOUD_API_SERVER')}/host/create", json=data) + print(load_dump_pretty(r.content)) - print(json.loads(r.content)) + +@host.command("list") +def list_host(): + r = requests.get(f"{config('UCLOUD_API_SERVER')}/host/list") + print(load_dump_pretty(r.content)) \ No newline at end of file diff --git a/commands/image.py b/commands/image.py index 138bea2..9fcf860 100755 --- a/commands/image.py +++ b/commands/image.py @@ -3,7 +3,7 @@ import json import requests from decouple import config -from .helper import OTPCredentials +from .helper import OTPCredentials, load_dump_pretty @click.group() @@ -17,7 +17,7 @@ def image(): def list(public, private): if public: r = requests.get(f"{config('UCLOUD_API_SERVER')}/image/list-public") - print(json.loads(r.content)) + print(load_dump_pretty(r.content)) @image.command("create-from-file") @@ -27,4 +27,4 @@ def list(public, private): def create_from_file(name, uuid, image_store_name): data = {"name": name, "uuid": uuid, "image_store": image_store_name} r = requests.post(f"{config('UCLOUD_API_SERVER')}/image/create", json=data) - print(r.content.decode("utf-8")) + print(load_dump_pretty(r.content)) diff --git a/commands/user.py b/commands/user.py index 0fa79ab..cd23d31 100755 --- a/commands/user.py +++ b/commands/user.py @@ -3,7 +3,7 @@ import json import requests from decouple import config -from .helper import OTPCredentials +from .helper import OTPCredentials, load_dump_pretty @click.group() @@ -11,21 +11,21 @@ def user(): pass -@user.command("list-files") -@click.option("--name", required=True) -@click.option("--realm", required=True) -@click.option("--seed", required=True) +@user.command("files") +@click.option("--name", envvar="OTP_NAME", required=True) +@click.option("--realm", envvar="OTP_REALM", required=True) +@click.option("--seed", envvar="OTP_SEED", required=True) def list_files(name, realm, seed): data = OTPCredentials(name, realm, seed).get_json() r = requests.get(f"{config('UCLOUD_API_SERVER')}/user/files", json=data) - print(json.loads(r.content)) + print(load_dump_pretty(r.content)) -@user.command("list-vms") -@click.option("--name", required=True) -@click.option("--realm", required=True) -@click.option("--seed", required=True) +@user.command("vms") +@click.option("--name", envvar="OTP_NAME", required=True) +@click.option("--realm", envvar="OTP_REALM", required=True) +@click.option("--seed", envvar="OTP_SEED", required=True) def list_vms(name, realm, seed): data = OTPCredentials(name, realm, seed).get_json() r = requests.get(f"{config('UCLOUD_API_SERVER')}/user/vms", json=data) - print(json.loads(r.content)) + print(load_dump_pretty(r.content)) diff --git a/commands/vm.py b/commands/vm.py index a873396..0a3b055 100755 --- a/commands/vm.py +++ b/commands/vm.py @@ -3,7 +3,7 @@ import json import requests from decouple import config -from .helper import OTPCredentials +from .helper import OTPCredentials, load_dump_pretty def vm_command(command, otp, uuid): @@ -18,9 +18,9 @@ def vm(): @vm.command("create") -@click.option("--name", required=True) -@click.option("--realm", required=True) -@click.option("--seed", required=True) +@click.option("--name", envvar="OTP_NAME", required=True) +@click.option("--realm", envvar="OTP_REALM", required=True) +@click.option("--seed", envvar="OTP_SEED", required=True) @click.option("--specs", required=True) @click.option("--image_uuid", required=True) def create(name, realm, seed, specs, image_uuid): @@ -32,26 +32,42 @@ def create(name, realm, seed, specs, image_uuid): "image_uuid": image_uuid, } r = requests.post(f"{config('UCLOUD_API_SERVER')}/vm/create", json=data) - print(json.loads(r.content)) + print(load_dump_pretty(r.content)) @vm.command("action") -@click.option("--name", required=True) -@click.option("--realm", required=True) -@click.option("--seed", required=True) +@click.option("--name", envvar="OTP_NAME", required=True) +@click.option("--realm", envvar="OTP_REALM", required=True) +@click.option("--seed", envvar="OTP_SEED", required=True) @click.option("--uuid", required=True) @click.option("--command", required=True) def vm_action(name, realm, seed, uuid, command): r = vm_command(command, OTPCredentials(name, realm, seed), uuid) - print(json.loads(r.content)) + print(load_dump_pretty(r.content)) @vm.command("status") -@click.option("--name", required=True) -@click.option("--realm", required=True) -@click.option("--seed", required=True) +@click.option("--name", envvar="OTP_NAME", required=True) +@click.option("--realm", envvar="OTP_REALM", required=True) +@click.option("--seed", envvar="OTP_SEED", required=True) @click.option("--uuid", required=True) def status(name, realm, seed, uuid): data = {"name": name, "realm": realm, "seed": seed, "uuid": uuid} r = requests.get(f"{config('UCLOUD_API_SERVER')}/vm/status", json=data) - print(json.loads(r.content)) + print(load_dump_pretty(r.content)) + +@vm.command("migrate") +@click.option("--name", envvar="OTP_NAME", required=True) +@click.option("--realm", envvar="OTP_REALM", required=True) +@click.option("--seed", envvar="OTP_SEED", required=True) +@click.option("--uuid", required=True) +@click.option("--destination", required=True) +def vm_migration(name, realm, seed, uuid, destination): + otp = OTPCredentials(name, realm, seed) + data = { + **otp.get_json(), + "uuid": uuid, + "destination": destination + } + r = requests.post(f"{config('UCLOUD_API_SERVER')}/vm/migrate", json=data) + print(load_dump_pretty(r.content)) \ No newline at end of file