import argparse import requests import json from decouple import config from pyotp import TOTP def add_otp(parser): parser.add_argument("--name", required=True) parser.add_argument("--realm", required=True) parser.add_argument("--seed", required=True) return parser def add_vmid(parser): parser.add_argument("--vmid", required=True) return parser argparser = argparse.ArgumentParser() subparser = argparser.add_subparsers(dest="command") create_image_parser = subparser.add_parser("create-image-from-file") create_image_parser.add_argument("--uuid", required=True) create_image_parser.add_argument("--name", required=True) create_image_parser.add_argument("--image-store", dest="image_store_name", required=True) images_parser = subparser.add_parser("images") images_parser.add_argument("--list", choices=["public", "private"], required=True) user_parser = subparser.add_parser("user") user_subparser = user_parser.add_subparsers(dest="usercommand") user_list_vms_parser = user_subparser.add_parser("list") user_list_vms_parser.add_argument("--files", action='store_true') user_list_vms_parser.add_argument("--vms", action='store_true') add_otp(user_list_vms_parser) vm_parser = subparser.add_parser("vm") vm_subparser = vm_parser.add_subparsers(dest="vmcommand") vm_create_parser = vm_subparser.add_parser("create") add_otp(vm_create_parser) vm_create_parser.add_argument("--specs_file", required=True) vm_create_parser.add_argument("--image_uuid", required=True) vm_start_parser = vm_subparser.add_parser("start") vm_suspend_parser = vm_subparser.add_parser("suspend") vm_resume_parser = vm_subparser.add_parser("resume") vm_shutdown_parser = vm_subparser.add_parser("shutdown") vm_status_parser = vm_subparser.add_parser("status") add_vmid(add_otp(vm_start_parser)) add_vmid(add_otp(vm_suspend_parser)) add_vmid(add_otp(vm_resume_parser)) add_vmid(add_otp(vm_shutdown_parser)) add_vmid(add_otp(vm_status_parser)) args = argparser.parse_args() if args.command == "create-image-from-file": name = args.name uuid = args.uuid image_store_name = args.image_store_name data = { "name": args.name, "uuid": uuid, "image_store": image_store_name } r = requests.post(f"{config('UCLOUD_API_SERVER')}/image/create", data) print(r.content.decode("utf-8")) elif args.command == "images": if args.list == "public": r = requests.get(f"{config('UCLOUD_API_SERVER')}/image/list-public") print(json.loads(r.content)) elif args.command == "vm": if args.vmcommand == "create": with open(args.specs_file, "r") as specs_f: specs = json.loads(specs_f.read()) data = { "name": args.name, "realm": args.realm, "token": TOTP(args.seed).now(), "specs": specs, "image_uuid": args.image_uuid } r = requests.post(f"{config('UCLOUD_API_SERVER')}/vm/create", json=data) print(json.loads(r.content)) elif args.vmcommand in ["start", "suspend", "resume", "status", "shutdown"]: data = { "name": args.name, "realm": args.realm, "token": TOTP(args.seed).now(), "vmid": args.vmid, } if args.vmcommand == "status": r = requests.get(f"{config('UCLOUD_API_SERVER')}/vm/{args.vmcommand}", json=data) else: r = requests.post(f"{config('UCLOUD_API_SERVER')}/vm/{args.vmcommand}", json=data) print(json.loads(r.content)) elif args.command == "user": if args.usercommand == "list" and args.vms: data = { "name": args.name, "realm": args.realm, "token": TOTP(args.seed).now() } r = requests.get(f"{config('UCLOUD_API_SERVER')}/user/vms", json=data) print(json.loads(r.content)) elif args.usercommand == "list" and args.files: data = { "name": args.name, "realm": args.realm, "token": TOTP(args.seed).now() } r = requests.get(f"{config('UCLOUD_API_SERVER')}/user/files", json=data) print(json.loads(r.content))