from flask import Blueprint, request, g from flask_restx import Resource from elasticsearch import exceptions as es_exceptions from leek.api.channels.pipeline import notify from leek.api.conf import settings from leek.api.decorators import get_app_context from leek.api.db.events import merge_events from leek.api.errors import responses from leek.api.schemas.serializer import validate_payload from leek.api.routes.api_v1 import api_v1 from leek.api.db.template import get_app events_bp = Blueprint('events', __name__, url_prefix='/v1/events') events_ns = api_v1.namespace('events', 'Agents events handler') logger = logging.getLogger(__name__) @events_ns.route('/process') class ProcessEvents(Resource): @get_app_context def post(self): """ Process agent events """ # TODO: API Key validation should be moved to API Gateway start_time = time.time() payload = request.get_json() env = g.context["app_env"]
import logging from flask import Blueprint, g, request from flask_restx import Resource from elasticsearch import exceptions as es_exceptions from leek.api.db.store import STATES_TERMINAL from leek.api.decorators import auth from leek.api.db import search from leek.api.routes.api_v1 import api_v1 from leek.api.control import task from leek.api.errors import responses from leek.api.schemas.control import RevocationSchema control_bp = Blueprint('control', __name__, url_prefix='/v1/control') control_ns = api_v1.namespace('control', 'Celery controlLer') logger = logging.getLogger(__name__) @control_ns.route('/tasks/<string:task_uuid>/retry') class TaskRetry(Resource): @auth def post(self, task_uuid): """ Retry a celery task """ try: task_doc = search.get_task_by_uuid(index_alias=g.index_alias, task_uuid=task_uuid) return task.retry_task(g.app_name, task_doc["_source"])
import logging from flask import Blueprint, request, g from flask_restx import Resource from leek.api.decorators import auth from leek.api.schemas.search_params import SearchParamsSchema from leek.api.db.search import search_index from leek.api.routes.api_v1 import api_v1 search_bp = Blueprint('search', __name__, url_prefix='/v1/search') search_ns = api_v1.namespace('search', 'Search index.') logger = logging.getLogger(__name__) @search_ns.route('/') class Search(Resource): @auth def post(self): """ Search index """ org_name = g.org_name app_name = request.headers["x-leek-app-name"] index_alias = f"{org_name}-{app_name}" query = request.get_json() params = SearchParamsSchema.validate(request.args.to_dict()) return search_index(index_alias, query, params)
from xmlrpc.client import ServerProxy import supervisor.xmlrpc from amqp import AccessRefused from flask import Blueprint, request, g from flask_restx import Resource from kombu.connection import Connection from leek.api.schemas.subscription import SubscriptionSchema from leek.api.conf import settings from leek.api.decorators import auth from leek.api.routes.api_v1 import api_v1 from leek.api.errors import responses agent_bp = Blueprint('agent', __name__, url_prefix='/v1/agent') agent_ns = api_v1.namespace('agent', 'Agent manager') logger = logging.getLogger(__name__) SUBSCRIPTIONS_FILE = "/opt/app/conf/subscriptions.json" """ This is only supported for Local Agent. If you don't have access to brokers infrastructure consider using the Standalone Agent """ @agent_ns.route('/control') class AgentControl(Resource): """ Control agent process """
import time from random import choice from string import ascii_uppercase from flask import Blueprint, request, g from flask_restx import Resource from schema import SchemaError from leek.api.decorators import auth from leek.api.utils import generate_app_key, init_trigger from leek.api.schemas.application import ApplicationSchema, TriggerSchema from leek.api.db import template as apps from leek.api.routes.api_v1 import api_v1 applications_bp = Blueprint('applications', __name__, url_prefix='/v1/applications') applications_ns = api_v1.namespace('applications', 'Manage Leek Applications') logger = logging.getLogger(__name__) @applications_ns.route('/') class Applications(Resource): @auth def post(self): """ Create application """ data = request.get_json() app = ApplicationSchema.validate(data) org_name = g.org_name
import logging from flask import Blueprint, current_app, url_for from flask_restx import Resource from leek.api.utils import has_no_empty_params from leek.api.conf import settings from leek.api.db.policy import create_or_update_default_lifecycle_policy from leek.api.routes.api_v1 import api_v1 from leek.api.decorators import auth manage_bp = Blueprint('manage', __name__, url_prefix='/v1/manage') manage_ns = api_v1.namespace('manage', 'Operations related to management.') logger = logging.getLogger(__name__) ############################################### # Health Check | # Can be called from ttt to avoid cold start | ############################################### @manage_ns.route('/hc') class HealthCheck(Resource): def get(self): """ Useful to prevent cold start, should be called periodically by another lambda """ return {"status": "I'm sexy and i know it"}, 200 @manage_ns.route('/site-map')
import logging from flask import Blueprint, g from flask_restx import Resource from leek.api.routes.api_v1 import api_v1 from leek.api.decorators import auth users_bp = Blueprint('users', __name__, url_prefix='/v1/users') users_ns = api_v1.namespace('users', 'Operations related to users.') logger = logging.getLogger(__name__) @users_ns.route('/whoami') class WhoAmI(Resource): @auth def get(self): """ Useful to prevent cold start, should be called periodically by another lambda """ return {"claims": g.claims}, 200