diff --git a/site/app.py b/site/app.py index 6af159f..6d30957 100644 --- a/site/app.py +++ b/site/app.py @@ -6,7 +6,7 @@ from routes.main import bp as main_bp from routes.api import bp as api_bp from routes.api_test import bp as api_test_bp -VERSION = "1.0.35" +VERSION = "1.0.36" app = Flask(__name__, template_folder="templates", static_folder="static") app.config["NUBES_API_ENDPOINT"] = os.getenv("NUBES_API_ENDPOINT", "https://lk-api-gateway-dev.ngcloud.ru/api/v1/svc") diff --git a/site/operations/tracker.py b/site/operations/tracker.py new file mode 100644 index 0000000..0dce8e1 --- /dev/null +++ b/site/operations/tracker.py @@ -0,0 +1,43 @@ +"""Трекер созданных инстансов — только те что породило приложение.""" +import json +import os +import threading + +_LOCK = threading.Lock() +_PATH = os.path.join(os.path.dirname(__file__), "..", "instances.json") + + +def _load(): + try: + with open(_PATH) as f: + return json.load(f) + except (FileNotFoundError, json.JSONDecodeError): + return {} + + +def _save(data): + with open(_PATH, "w") as f: + json.dump(data, f, indent=2) + + +def add(instance_uid, svc_id, display_name): + with _LOCK: + data = _load() + data[instance_uid] = { + "svcId": svc_id, + "displayName": display_name, + "instanceUid": instance_uid, + } + _save(data) + + +def remove(instance_uid): + with _LOCK: + data = _load() + data.pop(instance_uid, None) + _save(data) + + +def list_all(): + with _LOCK: + return list(_load().values()) diff --git a/site/routes/api_test.py b/site/routes/api_test.py index fe08158..9abbd4f 100644 --- a/site/routes/api_test.py +++ b/site/routes/api_test.py @@ -3,6 +3,8 @@ from flask import Blueprint, current_app, jsonify, request from api.http_client import HttpClient from operations.get_services import get_services, get_service_detail from operations.get_instances import get_instances +from operations.tracker import add as tracker_add, list_all as tracker_list +from operations.tracker import remove as tracker_remove bp = Blueprint("api_test", __name__) @@ -38,8 +40,13 @@ def api_operations(svc_id): try: detail = get_service_detail(_client(), svc_id) ops = detail.get("operations", []) + # только отслеживаемые инстансы этого сервиса + tracked = tracker_list() + tracked_uids = {t["instanceUid"] for t in tracked if t["svcId"] == svc_id} instances = get_instances(_client()) - svc_instances = [i for i in instances if i.get("serviceId") == svc_id and i.get("explainedStatus") not in ("deleted", "not created")] + svc_instances = [i for i in instances + if i.get("instanceUid") in tracked_uids + and i.get("explainedStatus") not in ("deleted", "not created")] return jsonify({ "svc": detail.get("svc", ""), "operations": [{"svcOperationId": o["svcOperationId"], "operation": o["operation"]} for o in ops], @@ -115,6 +122,7 @@ def api_test(): result["status"] = "OK" result["instanceUid"] = instance_uid result["duration"] = round(time.time() - t0, 1) + tracker_add(instance_uid, svc_id, display_name) return jsonify(result) time.sleep(5) result["status"] = "TIMEOUT" @@ -136,6 +144,8 @@ def api_test(): result["status"] = "OK" result["instanceUid"] = instance_uid result["duration"] = round(time.time() - t0, 1) + if op_name == "delete": + tracker_remove(instance_uid) return jsonify(result) time.sleep(5) result["status"] = "TIMEOUT"