Skip to content
This repository was archived by the owner on Sep 12, 2024. It is now read-only.

Added DEEPDRILLS_ENABLED in global config API endpoint #972

Merged
merged 2 commits into from
Jun 1, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
193 changes: 109 additions & 84 deletions chaos_genius/views/config_setting_view.py
Original file line number Diff line number Diff line change
@@ -1,23 +1,25 @@
# -*- coding: utf-8 -*-
"""Base views for config settings and onboarding."""
from flask import Blueprint, current_app, request, jsonify
from copy import deepcopy

from flask import Blueprint, current_app, jsonify, request

from chaos_genius.databases.models.data_source_model import DataSource
from chaos_genius.databases.models.kpi_model import Kpi
from chaos_genius.alerts.slack import trigger_overall_kpi_stats
from chaos_genius.utils.datetime_helper import get_server_timezone
from chaos_genius.utils.modules_utils import is_enterprise_edition
from chaos_genius.core.rca.rca_utils.api_utils import kpi_aggregation
from chaos_genius.databases.models.config_setting_model import ConfigSetting
from chaos_genius.controllers.config_controller import (
get_modified_config_file,
get_config_object,
create_config_object,
get_all_configurations,
get_config_object,
get_modified_config_file,
get_multidim_status_for_kpi,
)
from chaos_genius.core.rca.rca_utils.api_utils import kpi_aggregation
from chaos_genius.databases.db_utils import chech_editable_field
from copy import deepcopy
from chaos_genius.databases.models.config_setting_model import ConfigSetting
from chaos_genius.databases.models.data_source_model import DataSource
from chaos_genius.databases.models.kpi_model import Kpi
from chaos_genius.settings import DEEPDRILLS_ENABLED
from chaos_genius.utils.datetime_helper import get_server_timezone
from chaos_genius.utils.modules_utils import is_enterprise_edition

blueprint = Blueprint("config_settings", __name__)

Expand All @@ -30,7 +32,8 @@ def get_onboarding_status():
try:
data_sources = (
True
if DataSource.query.filter(DataSource.active == True).first() is not None
if DataSource.query.filter(DataSource.active == True).first()
is not None
else False
)
kpis = (
Expand All @@ -46,16 +49,27 @@ def get_onboarding_status():
analytics = True if len(kpi_list) > 0 else False

organisation_settings_value = ConfigSetting.query.filter(
ConfigSetting.name == "organisation_settings", ConfigSetting.active == True
ConfigSetting.name == "organisation_settings",
ConfigSetting.active == True,
).all()
organisation_settings = True if len(organisation_settings_value) > 0 else False
organisation_settings = (
True if len(organisation_settings_value) > 0 else False
)
except Exception as err_msg:
print(err_msg)

steps = [
{"step_no": 1, "step_name": "Add Data Source", "step_done": data_sources},
{
"step_no": 1,
"step_name": "Add Data Source",
"step_done": data_sources,
},
{"step_no": 2, "step_name": "Add KPI", "step_done": kpis},
{"step_no": 3, "step_name": "Activate Analytics", "step_done": analytics},
{
"step_no": 3,
"step_name": "Activate Analytics",
"step_done": analytics,
},
]
completion_precentage = int(
len([step for step in steps if step["step_done"]]) / len(steps) * 100
Expand All @@ -79,7 +93,9 @@ def get_config():
name = data.get("config_name")
config_obj = get_config_object(name)
if not config_obj:
return jsonify({"status": "not_found", "message": "Config doesn't exist"})
return jsonify(
{"status": "not_found", "message": "Config doesn't exist"}
)

config_state = get_modified_config_file(config_obj.safe_dict, name)
return jsonify({"data": config_state, "status": "success"})
Expand All @@ -95,48 +111,51 @@ def get_config():
@blueprint.route("/set-config", methods=["POST"])
def set_config():
"""Configuring the settings."""
if request.is_json:
data = request.get_json()
config_name = data.get("config_name")
if config_name not in [
"email",
"slack",
"organisation_settings",
"alert_digest_settings",
]:
return jsonify({"status": "not_found", "message": "Config doesn't exist"})
config_obj = get_config_object(config_name)
config_settings = data.get("config_settings", {})
updated_config_settings = {}
if config_obj:
updated_config_settings = config_obj.config_setting
config_obj.active = False
config_obj.save(commit=True)
if config_name == "organisation_settings":
for module in config_settings.keys():
updated_config_settings[module].update(config_settings[module])
else:
updated_config_settings.update(
data.get("config_settings", {})
) # this will work for all email, slack and alert_digest_settings

if not updated_config_settings:
updated_config_settings = config_settings
new_config = create_config_object(config_name, updated_config_settings)
new_config.save(commit=True)
return jsonify(
{
"message": f"{config_name.capitalize()} configuration has been saved successfully.",
"status": "success",
}
)
else:
if not request.is_json:
return jsonify(
{
"message": "The request payload is not in JSON format",
"status": "failure",
}
)
data = request.get_json()
config_name = data.get("config_name")
if config_name not in [
"email",
"slack",
"organisation_settings",
"alert_digest_settings",
]:
return jsonify(
{"status": "not_found", "message": "Config doesn't exist"}
)
config_obj = get_config_object(config_name)
config_settings = data.get("config_settings", {})
updated_config_settings = {}
if config_obj:
updated_config_settings = config_obj.config_setting
config_obj.active = False
config_obj.save(commit=True)
if config_name == "organisation_settings":
for module in config_settings.keys():
updated_config_settings[module].update(
config_settings[module]
)
else:
updated_config_settings.update(
data.get("config_settings", {})
) # this will work for all email, slack and alert_digest_settings

if not updated_config_settings:
updated_config_settings = config_settings
new_config = create_config_object(config_name, updated_config_settings)
new_config.save(commit=True)
return jsonify(
{
"message": f"{config_name.capitalize()} configuration has been saved successfully.",
"status": "success",
}
)


@blueprint.route("/get-all-config", methods=["GET"])
Expand All @@ -155,30 +174,32 @@ def get_all_config():
@blueprint.route("/test-alert", methods=["POST"])
def test_alert():
"""Test Alert."""
if request.is_json:
data = request.get_json()
kpi_info = Kpi.get_by_id(data["kpiId"]).as_dict
connection_info = DataSource.get_by_id(kpi_info["data_source"]).as_dict
_, _, kpi_aggregation_stats = kpi_aggregation(
kpi_info, connection_info, "last_7_days"
)
overall_stats = {
"current": kpi_aggregation_stats["panel_metrics"]["grp2_metrics"],
"past": kpi_aggregation_stats["panel_metrics"]["grp1_metrics"],
"impact": kpi_aggregation_stats["panel_metrics"]["impact"],
}
status = trigger_overall_kpi_stats(
data["name"],
kpi_info["name"],
connection_info["name"],
data["alertMessage"],
overall_stats,
)
return jsonify(
{"message": "Alert has been tested successfully.", "status": status}
)
else:
if not request.is_json:
return jsonify({"error": "The request payload is not in JSON format"})
data = request.get_json()
kpi_info = Kpi.get_by_id(data["kpiId"]).as_dict
connection_info = DataSource.get_by_id(kpi_info["data_source"]).as_dict
_, _, kpi_aggregation_stats = kpi_aggregation(
kpi_info, connection_info, "last_7_days"
)
overall_stats = {
"current": kpi_aggregation_stats["panel_metrics"]["grp2_metrics"],
"past": kpi_aggregation_stats["panel_metrics"]["grp1_metrics"],
"impact": kpi_aggregation_stats["panel_metrics"]["impact"],
}
status = trigger_overall_kpi_stats(
data["name"],
kpi_info["name"],
connection_info["name"],
data["alertMessage"],
overall_stats,
)
return jsonify(
{
"message": "Alert has been tested successfully.",
"status": status,
}
)


@blueprint.route("/get-meta-info/<string:config>", methods=["GET"])
Expand All @@ -187,7 +208,7 @@ def get_config_meta_data(config):
try:
meta_info = ConfigSetting.get_meta_info(config)
if not meta_info:
raise Exception("Config Type doesn't exist")
raise ValueError("Config Type doesn't exist")
results = {"name": config}
fields = []
for config_key, info in meta_info.items():
Expand All @@ -196,7 +217,9 @@ def get_config_meta_data(config):
results["fields"] = fields
return jsonify({"data": results, "status": "success"})
except Exception as err:
current_app.logger.info(f"Error in getting meta info for Config Setting: {err}")
current_app.logger.info(
f"Error in getting meta info for Config Setting: {err}"
)
return jsonify({"message": str(err), "status": "failure"})


Expand All @@ -212,7 +235,9 @@ def multidim_status():
status = "success"
except Exception as err:
status = "failure"
current_app.logger.info(f"Error in fetching Dashboad Config Data: {err}")
current_app.logger.info(
f"Error in fetching Dashboad Config Data: {err}"
)
message = str(err)
return jsonify({"data": data, "msg": message, "status": status})

Expand All @@ -238,16 +263,15 @@ def edit_config_setting():
]
== True
):
new_config_settings[module][key] = updated_settings[module][
new_config_settings[module][
key
]
] = updated_settings[module][key]

config_obj.config_setting = new_config_settings
config_obj.save(commit=True)
else:
if chech_editable_field(meta_info, "config_setting"):
config_obj.config_setting = data.get("config_setting")
config_obj.save(commit=True)
elif chech_editable_field(meta_info, "config_setting"):
config_obj.config_setting = data.get("config_setting")
config_obj.save(commit=True)
status = "success"
else:
message = "Config setting not found or disabled"
Expand Down Expand Up @@ -280,6 +304,7 @@ def global_config():
try:
data["timezone"] = get_server_timezone()
data["is_ee"] = is_enterprise_edition()
data["deepdrills_enabled"] = DEEPDRILLS_ENABLED
status = "success"
except Exception as err:
status = "failure"
Expand Down