src/aaz_dev/command/api/specs.py (116 lines of code) (raw):

from flask import Blueprint, jsonify, request from utils import exceptions from utils.plane import PlaneEnum from command.controller.specs_manager import AAZSpecsManager bp = Blueprint('specs', __name__, url_prefix='/AAZ/Specs') # modules @bp.route("/CommandTree/Simple", methods=("GET",)) def simple_command_tree(): manager = AAZSpecsManager() tree = manager.simple_tree if not tree: raise exceptions.ResourceNotFind("Command group not exist") tree = tree.to_primitive() return jsonify(tree) # modules @bp.route("/CommandTree/Nodes/<names_path:node_names>", methods=("GET",)) def command_tree_node(node_names): if node_names[0] != AAZSpecsManager.COMMAND_TREE_ROOT_NAME: raise exceptions.ResourceNotFind("Command group not exist") node_names = node_names[1:] manager = AAZSpecsManager() node = manager.find_command_group(*node_names) if not node: raise exceptions.ResourceNotFind("Command group not exist") result = node.to_primitive() return jsonify(result) @bp.route("/CommandTree/Nodes/<names_path:node_names>/Leaves/<name:leaf_name>", methods=("GET",)) def command_tree_leaf(node_names, leaf_name): if node_names[0] != AAZSpecsManager.COMMAND_TREE_ROOT_NAME: raise exceptions.ResourceNotFind("Command not exist") node_names = node_names[1:] manager = AAZSpecsManager() leaf = manager.find_command(*node_names, leaf_name) if not leaf: raise exceptions.ResourceNotFind("Command not exist") result = leaf.to_primitive() return jsonify(result) @bp.route("/CommandTree/Nodes/Leaves", methods=("POST",)) def command_tree_leaves(): data = request.get_json() result = [] manager = AAZSpecsManager() for command_names in data: if command_names[0] != AAZSpecsManager.COMMAND_TREE_ROOT_NAME: raise exceptions.ResourceNotFind(f"Command not exist: {' '.join(command_names)}") command_names = command_names[1:] leaf = manager.find_command(*command_names) if not leaf: raise exceptions.ResourceNotFind(f"Command not exist: {' '.join(command_names)}") result.append(leaf.to_primitive()) return jsonify(result) @bp.route("/CommandTree/Nodes/<names_path:node_names>/Leaves/<name:leaf_name>/Versions/<base64:version_name>", methods=("GET",)) def aaz_command_in_version(node_names, leaf_name, version_name): if node_names[0] != AAZSpecsManager.COMMAND_TREE_ROOT_NAME: raise exceptions.ResourceNotFind("Command not exist") node_names = node_names[1:] manager = AAZSpecsManager() leaf = manager.find_command(*node_names, leaf_name) if not leaf: raise exceptions.ResourceNotFind("Command not exist") version = None for v in (leaf.versions or []): if v.name == version_name: version = v break if not version: raise exceptions.ResourceNotFind("Command of version not exist") cfg_reader = manager.load_resource_cfg_reader_by_command_with_version( leaf, version=version) cmd_cfg = cfg_reader.find_command(*leaf.names) result = cmd_cfg.to_primitive() del result['name'] result.update({ 'names': leaf.names, 'help': leaf.help.to_primitive(), 'stage': version.stage, }) if version.examples: result['examples'] = version.examples.to_primitive() return jsonify(result) @bp.route("/Resources/<plane>/<base64:resource_id>", methods=("GET", )) def get_resource(plane, resource_id): manager = AAZSpecsManager() versions = manager.get_resource_versions(plane, resource_id) if versions is None: raise exceptions.ResourceNotFind("Resource not exist") result = { "id": resource_id, "versions": versions } return jsonify(result) @bp.route("/Resources/<plane>/Filter", methods=("Post", )) def filter_resources(plane): data = request.get_json() if 'resources' not in data: raise exceptions.InvalidAPIUsage("Invalid request body") manager = AAZSpecsManager() result = { 'resources': [] } for resource_id in data['resources']: versions = manager.get_resource_versions(plane, resource_id) if versions is None: continue result['resources'].append({ "id": resource_id, "versions": versions, }) return jsonify(result) # planes @bp.route("/Planes", methods=("Get", )) def list_planes(): result = [] for name, items in PlaneEnum._config.items(): result.append({ "name": name, **items, }) return jsonify(result)