135 lines
4.2 KiB
Python
Executable file
135 lines
4.2 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
import argparse
|
|
import json
|
|
import os
|
|
import sys
|
|
import urllib.request
|
|
import urllib.error
|
|
|
|
# Default API Gateway URL (localhost forwarding from node06)
|
|
DEFAULT_API_URL = "http://localhost:8080"
|
|
|
|
def get_url(path):
|
|
return f"{DEFAULT_API_URL}{path}"
|
|
|
|
def headers(token=None):
|
|
h = {"Content-Type": "application/json"}
|
|
if token:
|
|
h["Authorization"] = f"Bearer {token}"
|
|
return h
|
|
|
|
def print_json(data):
|
|
print(json.dumps(data, indent=2))
|
|
|
|
def request(method, url, data=None, token=None):
|
|
parsed_headers = headers(token)
|
|
body = None
|
|
if data:
|
|
body = json.dumps(data).encode('utf-8')
|
|
|
|
req = urllib.request.Request(url, data=body, headers=parsed_headers, method=method)
|
|
|
|
try:
|
|
with urllib.request.urlopen(req) as response:
|
|
if response.status in [200, 201, 204]:
|
|
if response.status == 204:
|
|
print("{}")
|
|
return
|
|
resp_data = json.load(response)
|
|
print_json(resp_data)
|
|
else:
|
|
print(f"Error {response.status}")
|
|
except urllib.error.HTTPError as e:
|
|
print(f"HTTP Error {e.code}: {e.read().decode()}")
|
|
except urllib.error.URLError as e:
|
|
print(f"Connection failed: {e.reason}")
|
|
|
|
def cmd_list_vpcs(args):
|
|
url = get_url("/api/v1/vpcs")
|
|
print(f"GET {url}")
|
|
request("GET", url, token=args.token)
|
|
|
|
def cmd_create_vpc(args):
|
|
url = get_url("/api/v1/vpcs")
|
|
data = {
|
|
"name": args.name,
|
|
"cidr_block": args.cidr,
|
|
"org_id": "org-default",
|
|
"project_id": "proj-default"
|
|
}
|
|
print(f"POST {url} with {data}")
|
|
request("POST", url, data=data, token=args.token)
|
|
|
|
def cmd_list_subnets(args):
|
|
url = get_url("/api/v1/subnets")
|
|
if args.vpc:
|
|
url += f"?vpc_id={args.vpc}"
|
|
print(f"GET {url}")
|
|
request("GET", url, token=args.token)
|
|
|
|
def cmd_create_subnet(args):
|
|
url = get_url("/api/v1/subnets")
|
|
data = {
|
|
"name": args.name,
|
|
"vpc_id": args.vpc,
|
|
"cidr_block": args.cidr,
|
|
"org_id": "org-default",
|
|
"project_id": "proj-default"
|
|
}
|
|
print(f"POST {url} with {data}")
|
|
request("POST", url, data=data, token=args.token)
|
|
|
|
def cmd_list_vms(args):
|
|
url = get_url("/api/v1/vms")
|
|
print(f"GET {url}")
|
|
request("GET", url, token=args.token)
|
|
|
|
def main():
|
|
global DEFAULT_API_URL
|
|
parser = argparse.ArgumentParser(description="PhotonCloud CLI")
|
|
parser.add_argument("--token", help="Auth token", default=os.environ.get("CLOUD_TOKEN"))
|
|
parser.add_argument("--url", help="API URL", default=DEFAULT_API_URL)
|
|
|
|
subparsers = parser.add_subparsers(dest="command", required=True)
|
|
|
|
# VPC Commands
|
|
vpc_parser = subparsers.add_parser("vpc", help="Manage VPCs")
|
|
vpc_sub = vpc_parser.add_subparsers(dest="subcommand", required=True)
|
|
|
|
vpc_list = vpc_sub.add_parser("list", help="List VPCs")
|
|
vpc_list.set_defaults(func=cmd_list_vpcs)
|
|
|
|
vpc_create = vpc_sub.add_parser("create", help="Create VPC")
|
|
vpc_create.add_argument("--name", required=True)
|
|
vpc_create.add_argument("--cidr", required=True)
|
|
vpc_create.set_defaults(func=cmd_create_vpc)
|
|
|
|
# Subnet Commands
|
|
subnet_parser = subparsers.add_parser("subnet", help="Manage Subnets")
|
|
subnet_sub = subnet_parser.add_subparsers(dest="subcommand", required=True)
|
|
|
|
subnet_list = subnet_sub.add_parser("list", help="List Subnets")
|
|
subnet_list.add_argument("--vpc", help="Filter by VPC ID")
|
|
subnet_list.set_defaults(func=cmd_list_subnets)
|
|
|
|
subnet_create = subnet_sub.add_parser("create", help="Create Subnet")
|
|
subnet_create.add_argument("--name", required=True)
|
|
subnet_create.add_argument("--vpc", required=True, help="VPC ID")
|
|
subnet_create.add_argument("--cidr", required=True)
|
|
subnet_create.set_defaults(func=cmd_create_subnet)
|
|
|
|
# VM Commands
|
|
vm_parser = subparsers.add_parser("vm", help="Manage VMs")
|
|
vm_sub = vm_parser.add_subparsers(dest="subcommand", required=True)
|
|
|
|
vm_list = vm_sub.add_parser("list", help="List VMs")
|
|
vm_list.set_defaults(func=cmd_list_vms)
|
|
|
|
args = parser.parse_args()
|
|
if args.url:
|
|
DEFAULT_API_URL = args.url
|
|
|
|
args.func(args)
|
|
|
|
if __name__ == "__main__":
|
|
main()
|