diff --git a/app/api_client/__init__.py b/api_client/__init__.py similarity index 100% rename from app/api_client/__init__.py rename to api_client/__init__.py diff --git a/app/api_client/client.py b/api_client/client.py similarity index 100% rename from app/api_client/client.py rename to api_client/client.py diff --git a/cli.py b/cli.py new file mode 100644 index 0000000..9d98ffc --- /dev/null +++ b/cli.py @@ -0,0 +1,214 @@ +import argparse +import json +from tabulate import tabulate +from api_client.client import IaaSClient # Assuming the IaaSClient class is in a file named iaas_client.py + +def print_table(data, headers): + """Helper function to print data in a table format.""" + if data: + print(tabulate(data, headers=headers, tablefmt="pretty")) + else: + print("No data available.") + +def main(): + parser = argparse.ArgumentParser(description="IaaS CLI Client") + parser.add_argument('--api-key', required=True, help="API key for authentication") + parser.add_argument('--base-url', default="http://localhost:5000/api", help="Base URL for the API") + + subparsers = parser.add_subparsers(dest='command', help='Available commands') + + # Universes + universes_parser = subparsers.add_parser('universes', help='Manage universes') + universes_subparsers = universes_parser.add_subparsers(dest='universes_command', help='Universes commands') + + list_universes_parser = universes_subparsers.add_parser('list', help='List all universes') + + create_universe_parser = universes_subparsers.add_parser('create', help='Create a new universe') + create_universe_parser.add_argument('--name', required=True, help='Name of the universe') + create_universe_parser.add_argument('--description', required=True, help='Description of the universe') + + # Projects + projects_parser = subparsers.add_parser('projects', help='Manage projects') + projects_subparsers = projects_parser.add_subparsers(dest='projects_command', help='Projects commands') + + list_projects_parser = projects_subparsers.add_parser('list', help='List all projects') + + create_project_parser = projects_subparsers.add_parser('create', help='Create a new project') + create_project_parser.add_argument('--name', required=True, help='Name of the project') + create_project_parser.add_argument('--universe-id', required=True, help='Universe ID for the project') + + # VDCs + vdcs_parser = subparsers.add_parser('vdcs', help='Manage VDCs') + vdcs_subparsers = vdcs_parser.add_subparsers(dest='vdcs_command', help='VDCs commands') + + list_vdcs_parser = vdcs_subparsers.add_parser('list', help='List all VDCs') + + create_vdc_parser = vdcs_subparsers.add_parser('create', help='Create a new VDC') + create_vdc_parser.add_argument('--name', required=True, help='Name of the VDC') + create_vdc_parser.add_argument('--project-id', required=True, help='Project ID for the VDC') + + # Networks + networks_parser = subparsers.add_parser('networks', help='Manage networks') + networks_subparsers = networks_parser.add_subparsers(dest='networks_command', help='Networks commands') + + list_networks_parser = networks_subparsers.add_parser('list', help='List all networks') + + create_network_parser = networks_subparsers.add_parser('create', help='Create a new network') + create_network_parser.add_argument('--name', required=True, help='Name of the network') + create_network_parser.add_argument('--vdc-id', required=True, help='VDC ID for the network') + + # Network Ports + network_ports_parser = subparsers.add_parser('network-ports', help='Manage network ports') + network_ports_parser.add_argument('--network-id', required=True, help='Network ID to list ports for') + + # Regions + regions_parser = subparsers.add_parser('regions', help='Manage regions') + regions_subparsers = regions_parser.add_subparsers(dest='regions_command', help='Regions commands') + + list_regions_parser = regions_subparsers.add_parser('list', help='List all regions') + + create_region_parser = regions_subparsers.add_parser('create', help='Create a new region') + create_region_parser.add_argument('--name', required=True, help='Name of the region') + create_region_parser.add_argument('--description', required=True, help='Description of the region') + + # Region Access + region_access_parser = subparsers.add_parser('region-access', help='Get region access') + region_access_parser.add_argument('--region-id', required=True, help='Region ID to get access for') + + # Workload Hosts + workload_hosts_parser = subparsers.add_parser('workload-hosts', help='Manage workload hosts') + workload_hosts_subparsers = workload_hosts_parser.add_subparsers(dest='workload_hosts_command', help='Workload hosts commands') + + list_workload_hosts_parser = workload_hosts_subparsers.add_parser('list', help='List all workload hosts') + + get_workload_host_parser = workload_hosts_subparsers.add_parser('get', help='Get a specific workload host') + get_workload_host_parser.add_argument('--workload-host-id', required=True, help='Workload host ID') + + # Images + images_parser = subparsers.add_parser('images', help='Manage images') + images_subparsers = images_parser.add_subparsers(dest='images_command', help='Images commands') + + list_images_parser = images_subparsers.add_parser('list', help='List all images') + + get_image_parser = images_subparsers.add_parser('get', help='Get a specific image') + get_image_parser.add_argument('--image-id', required=True, help='Image ID') + + edit_image_parser = images_subparsers.add_parser('edit', help='Edit an image') + edit_image_parser.add_argument('--image-id', required=True, help='Image ID') + edit_image_parser.add_argument('--data', required=True, help='JSON data to update the image') + + create_image_parser = images_subparsers.add_parser('create', help='Create a new image') + create_image_parser.add_argument('--data', required=True, help='JSON data to create the image') + + # Containers + containers_parser = subparsers.add_parser('containers', help='Manage containers') + containers_subparsers = containers_parser.add_subparsers(dest='containers_command', help='Containers commands') + + list_containers_parser = containers_subparsers.add_parser('list', help='List all containers') + + get_container_parser = containers_subparsers.add_parser('get', help='Get a specific container') + get_container_parser.add_argument('--container-id', required=True, help='Container ID') + + edit_container_parser = containers_subparsers.add_parser('edit', help='Edit a container') + edit_container_parser.add_argument('--container-id', required=True, help='Container ID') + edit_container_parser.add_argument('--data', required=True, help='JSON data to update the container') + + create_container_parser = containers_subparsers.add_parser('create', help='Create a new container') + create_container_parser.add_argument('--data', required=True, help='JSON data to create the container') + + delete_container_parser = containers_subparsers.add_parser('delete', help='Delete a container') + delete_container_parser.add_argument('--container-id', required=True, help='Container ID') + + args = parser.parse_args() + + client = IaaSClient(api_key=args.api_key, base_url=args.base_url) + + if args.command == 'universes': + if args.universes_command == 'list': + result = client.get_universes() + print_table(result, headers=["ID", "Name", "Description"]) + elif args.universes_command == 'create': + result = client.create_universe(args.name, args.description) + print(json.dumps(result, indent=2)) + + elif args.command == 'projects': + if args.projects_command == 'list': + result = client.get_projects() + print_table(result, headers=["ID", "Name", "Universe ID"]) + elif args.projects_command == 'create': + result = client.create_project(args.name, args.universe_id) + print(json.dumps(result, indent=2)) + + elif args.command == 'vdcs': + if args.vdcs_command == 'list': + result = client.get_vdcs() + print_table(result, headers=["ID", "Name", "Project ID"]) + elif args.vdcs_command == 'create': + result = client.create_vdc(args.name, args.project_id) + print(json.dumps(result, indent=2)) + + elif args.command == 'networks': + if args.networks_command == 'list': + result = client.get_networks() + print_table(result, headers=["ID", "Name", "VDC ID"]) + elif args.networks_command == 'create': + result = client.create_network(args.name, args.vdc_id) + print(json.dumps(result, indent=2)) + + elif args.command == 'network-ports': + result = client.get_network_ports_by_network(args.network_id) + print_table(result, headers=["ID", "Network ID", "Port Details"]) + + elif args.command == 'regions': + if args.regions_command == 'list': + result = client.get_regions() + print_table(result, headers=["ID", "Name", "Description"]) + elif args.regions_command == 'create': + result = client.create_region(args.name, args.description) + print(json.dumps(result, indent=2)) + + elif args.command == 'region-access': + result = client.get_region_access(args.region_id) + print_table(result, headers=["ID", "Region ID", "Access Details"]) + + elif args.command == 'workload-hosts': + if args.workload_hosts_command == 'list': + result = client.get_workload_hosts() + print_table(result, headers=["ID", "Host Name", "Status"]) + elif args.workload_hosts_command == 'get': + result = client.get_workload_host(args.workload_host_id) + print(json.dumps(result, indent=2)) + + elif args.command == 'images': + if args.images_command == 'list': + result = client.get_images() + print_table(result, headers=["ID", "Name", "Size", "Status"]) + elif args.images_command == 'get': + result = client.get_image(args.image_id) + print(json.dumps(result, indent=2)) + elif args.images_command == 'edit': + result = client.edit_image(args.image_id, json.loads(args.data)) + print(json.dumps(result, indent=2)) + elif args.images_command == 'create': + result = client.create_image(json.loads(args.data)) + print(json.dumps(result, indent=2)) + + elif args.command == 'containers': + if args.containers_command == 'list': + result = client.get_containers() + print_table(result, headers=["ID", "Name", "Status", "Image ID"]) + elif args.containers_command == 'get': + result = client.get_container(args.container_id) + print(json.dumps(result, indent=2)) + elif args.containers_command == 'edit': + result = client.edit_container(args.container_id, json.loads(args.data)) + print(json.dumps(result, indent=2)) + elif args.containers_command == 'create': + result = client.create_container(json.loads(args.data)) + print(json.dumps(result, indent=2)) + elif args.containers_command == 'delete': + result = client.delete_container(args.container_id) + print(json.dumps(result, indent=2)) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 172e0db..c71587c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,4 +12,7 @@ websocket-client streamlit aiohttp asyncio -docker \ No newline at end of file +docker +tabulate +psutil +python-dotenv \ No newline at end of file diff --git a/streamlit_server/utils/session.py b/streamlit_server/utils/session.py index 859baf8..4e6d9c9 100644 --- a/streamlit_server/utils/session.py +++ b/streamlit_server/utils/session.py @@ -1,6 +1,6 @@ import streamlit as st # from streamlit_server.api.client import IaaSClient -from app.api_client.client import IaaSClient +from api_client.client import IaaSClient def init_session_state(): # Initialize all required session state keys before use diff --git a/websocket_server.py b/websocket_server.py index 7d6e60f..ee6be09 100755 --- a/websocket_server.py +++ b/websocket_server.py @@ -6,7 +6,6 @@ import time import traceback from flask import Flask, request, jsonify, render_template from flask_socketio import SocketIO, emit -import requests from sqlalchemy import create_engine, Column, String, Text, DateTime, Float, Integer from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker @@ -17,7 +16,6 @@ from sqlalchemy.exc import OperationalError from contextlib import contextmanager from datetime import datetime import pymysql -# from app.models.models import Task api_server_url="http://127.0.0.1:5000/api/"