added saved presets recognition

This commit is contained in:
Eugenio Marzo
2023-01-06 19:32:31 +01:00
parent a69d2e0af8
commit 186a597c46
3 changed files with 179 additions and 25 deletions
+11 -2
View File
@@ -47,6 +47,13 @@
border-color: #000000;
}
.btn-light-saved {
color: #fff;
background-color: #771996;
border-width: 1.5px;
border-color: #000000;
}
.btn-light:hover {
transform: scale(1.05);
}
@@ -194,6 +201,7 @@
<div class="modal-footer">
<button type="button" class="btn btn-light" onclick="savePreset('apply')">Save and apply</button>
<button type="button" class="btn btn-light" onclick="savePreset('save')">Save</button>
<button type="button" class="btn btn-danger" onclick="resetPreset('reset')">Reset to default</button>
<button type="button" class="btn btn-dark" data-dismiss="modal" onclick="closeSetLoadTestModal()">Close</button>
</div>
</form>
@@ -336,6 +344,7 @@
<div id="chaos-program-screen" style="display: none;">
<div class="row" style="margin-top: 1%;">
<div id="alert_placeholder4" style="margin-top: 1%;"></div>
<div id="alert_placeholder_programming_mode" style="margin-top: 1%;"></div>
<div class="col">
<form>
<div class="form-group">
@@ -489,8 +498,8 @@ experiments:
function loadPreset(tool, lang) {
let decodedStringAtoB = "";
console.log("Loaded preset for " + tool);
loadPresetsCodeParsed = JSON.parse(loadPresetsCodeJson);
console.log("[GET-PRESETS] Loaded preset for " + tool);
loadPresetsCodeParsed = JSON.parse(loadPresetsCodeJson);
decodedStringAtoB = atob(loadPresetsCodeParsed[tool]);
loadSavedPreset(tool, lang, decodedStringAtoB);
latest_preset_name = tool;
+55 -2
View File
@@ -114,6 +114,31 @@ function getCodeName() {
oReq.send();
}
function getSavedPresets() {
var oReq = new XMLHttpRequest();
oReq.onreadystatechange = function () {
if (this.readyState === XMLHttpRequest.DONE && this.status === 200) {
if ((this.responseText.trim() != "nil") && (this.responseText.trim() != "")) {
console.log("[GET-PRESETS] Response from backend: <" + this.responseText.trim() + ">");
var savedPresets = this.responseText.split(",");
for (i = 0; i < savedPresets.length; i++) {
var currentPresetName = savedPresets[i].split("_")[1];
currentPresetName = currentPresetName.charAt(0).toUpperCase() + currentPresetName.slice(1);
console.log("[GET-PRESETS] currentPresetName: " + currentPresetName);
var buttonId = "load" + currentPresetName.trim();
console.log("[GET-PRESETS] Change border color of buttonId: " + buttonId);
document.getElementById(buttonId).classList.remove('btn-light');
document.getElementById(buttonId).classList.add('btn-light-saved');
}
} else {
console.log("[GET-PRESETS] There is no saved presets in Redis");
}
}
};;
oReq.open("GET", "https://" + clu_endpoint + "/chaos/loadpreset/savedpresets");
oReq.send();
}
function loadSavedPreset(tool, lang, defaultpreset) {
var oReq = new XMLHttpRequest();
oReq.onreadystatechange = function () {
@@ -127,7 +152,32 @@ function loadSavedPreset(tool, lang, defaultpreset) {
}
};;
oReq.open("GET", "https://" + clu_endpoint + "/chaos/loadpreset?name=" + tool + "&lang=" + lang);
oReq.send();
oReq.send()
var now = new Date().toLocaleString().replace(',','')
$('#alert_placeholder_programming_mode').replaceWith(alert_div + '[' + now + '] Open preset for ' + tool + '</div>');
$('#alert_placeholder').replaceWith(alert_div + '[' + now + '] Open preset for ' + tool + '</div>');
}
function resetPreset() {
var oReq = new XMLHttpRequest();
oReq.onreadystatechange = function () {
if (this.readyState === XMLHttpRequest.DONE && this.status === 200) {
let capitalizedPreset = latest_preset_name.charAt(0).toUpperCase() + latest_preset_name.slice(1);
let buttonId = "load" + capitalizedPreset;
document.getElementById(buttonId).classList.remove('btn-light-saved');
document.getElementById(buttonId).classList.add('btn-light');
closeSetLoadTestModal();
getSavedPresets();
console.log("[RESET-PRESETS] " + latest_preset_name + " restored with default preset");
var now = new Date().toLocaleString().replace(',','')
$('#alert_placeholder_programming_mode').replaceWith(alert_div + '[' + now + '] ' + latest_preset_name + ' preset has been restored with default code</div>');
$('#alert_placeholder').replaceWith(alert_div + '[' + now + '] ' + latest_preset_name + ' preset has been restored with default code</div>');
}
};;
oReq.open("POST", "https://" + clu_endpoint + "/chaos/loadpreset/reset?name="+ latest_preset_name + "&lang="+ latest_preset_lang);
oReq.send({});
}
function savePreset(action) {
@@ -168,6 +218,8 @@ experiments:
oReq.setRequestHeader("Content-Type", "application/json");
oReq.send(presetBody);
closeSetLoadTestModal();
getSavedPresets();
if (action == "apply" && programming_mode_switch == false){
startProgrammingMode();
@@ -420,7 +472,6 @@ function setChaosContainer() {
}
function runChaosProgram() {
chaosProgram = $('#chaosProgramTextArea').val();
chaosProgramWithCodename = chaosProgram.replace(codename_regex, "chaos-codename: " + codename);
$('#chaosProgramTextArea').val(chaosProgramWithCodename);
@@ -954,7 +1005,9 @@ window.setInterval(function backgroundTasks() {
if (programming_mode_switch) {
drawChaosProgramFlow();
}
}, 2000)
getEndpoint();
getNamespaces();
getSavedPresets()
+113 -21
View File
@@ -105,7 +105,7 @@ server {
}
location /metrics {
default_type text/html;
default_type text/html;
content_by_lua_block {
local redis = require "resty.redis"
local red = redis:new()
@@ -208,6 +208,85 @@ server {
}
}
location /chaos/loadpreset/reset {
content_by_lua_block {
local function mysplit (inputstr, sep)
if sep == nil then
sep = "%s"
end
local t={}
for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
table.insert(t, str)
end
return t
end
local redis = require "resty.redis"
local red = redis:new()
local args = ngx.req.get_uri_args()
ngx.header['Access-Control-Allow-Origin'] = '*'
ngx.header['Access-Control-Allow-Methods'] = 'GET, POST, OPTIONS'
ngx.header['Access-Control-Allow-Headers'] = 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'
ngx.header['Access-Control-Expose-Headers'] = 'Content-Length,Content-Range';
ngx.req.read_body()
local okredis, errredis = red:connect("unix:/tmp/redis.sock")
local key_name = args["lang"] .. "_" .. args["name"]
ngx.log(ngx.ERR, "[PRESETS-RESET] The item " .. key_name .. " should be removed from the key presets_list")
local handle = io.popen("redis-cli --scan --pattern " .. key_name .. " | xargs redis-cli del")
local result = handle:read("*a")
local rc = handle:close()
local res = red:get("presets_list")
if res == ngx.null then
ngx.say("There are no presets saved yet")
else
local preset = "";
local new_preset_list = "";
local cnt = 0;
for key, value in ipairs(mysplit(res, ",")) do
ngx.log(ngx.ERR, "[PRESETS-RESET] Split the key presets_list. Current preset is: " .. value)
if value ~= key_name then
preset = value
if cnt > 0 then
new_preset_list = new_preset_list .. "," .. preset
else
new_preset_list = preset
end
end
cnt = cnt + 1
end
ngx.log(ngx.ERR, "[PRESETS-RESET] New key presets_list is: " .. new_preset_list)
red:set("presets_list", new_preset_list)
end
}
}
location /chaos/loadpreset/savedpresets {
default_type text/html;
content_by_lua_block {
local redis = require "resty.redis"
local red = redis:new()
local args = ngx.req.get_uri_args()
ngx.header['Access-Control-Allow-Origin'] = '*'
ngx.header['Access-Control-Allow-Methods'] = 'GET, POST, OPTIONS'
ngx.header['Access-Control-Allow-Headers'] = 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'
ngx.header['Access-Control-Expose-Headers'] = 'Content-Length,Content-Range';
local okredis, errredis = red:connect("unix:/tmp/redis.sock")
local res, err = red:get("presets_list")
if res == ngx.null then
ngx.say(err)
else
ngx.say(res)
ngx.log(ngx.ERR, "[PRESETS_LIST] " .. res)
end
}
}
location /chaos/loadpreset/save {
content_by_lua_block {
local redis = require "resty.redis"
@@ -221,21 +300,34 @@ server {
local data = ngx.req.get_body_data()
local okredis, errredis = red:connect("unix:/tmp/redis.sock")
local key_name = args["lang"] .. "_" .. args["name"]
local all_presets_key = ""
if data ~= nil then
ngx.log(ngx.ERR, "[save loadpreset] lang:" .. args["lang"] .. ", name:" .. args["name"] .. ", payload:" .. data)
red:set(key_name, data)
local res, err = red:get(key_name)
ngx.log(ngx.ERR, "[SAVE-PRESETS] lang:" .. args["lang"] .. ", name:" .. args["name"] .. ", payload:" .. data)
if (red:exists(key_name) == 0) then
red:set(key_name, data)
local res, err = red:get(key_name)
if res == ngx.null then
ngx.say("error: " .. args["name"] .. " has not been saved.")
else
local file = io.open("/var/www/html/" .. key_name, "w")
io.output(file)
io.write(data)
io.close(file)
ngx.say(args["name"] .. " has been saved.")
file = io.open("/var/www/html/" .. key_name, "w")
io.output(file)
io.write(data)
io.close(file)
local redis_presets_list = red:get("presets_list")
if res == ngx.null then
ngx.say("error: " .. args["name"] .. " has not been saved.")
else
ngx.say(args["name"] .. " has been saved.")
if redis_presets_list == ngx.null then
red:set("presets_list", key_name)
else
local presets_list = redis_presets_list .. "," .. key_name
red:set("presets_list", presets_list)
end
end
end
else
ngx.say("Error in payload sent by web interface.")
@@ -275,13 +367,13 @@ server {
ngx.header['Access-Control-Expose-Headers'] = 'Content-Length,Content-Range';
ngx.req.read_body()
local data = ngx.req.get_body_data()
ngx.log(ngx.ERR, "[programming_mode_diagram] data sent from web interface => " .. data)
ngx.log(ngx.ERR, "[PROGRAMMING-MODE-DIAGRAM] data sent from web interface => " .. data)
math.randomseed(os.clock()*100000000000)
local rand = math.random(999, 9999)
local filename = "/tmp/chaosprogram" .. rand
ngx.log(ngx.ERR, "[programming_mode_diagram] write temp file " .. filename)
ngx.log(ngx.ERR, "[PROGRAMMING-MODE-DIAGRAM] write temp file " .. filename)
local yamlfile = io.open(filename, "w")
yamlfile:write(data)
@@ -294,12 +386,12 @@ server {
ngx.log(ngx.ERR, "[programming_mode_diagram] Result of yaml syntax check =>||" .. result .. "||")
if data == nil then
error = "[programming_mode_diagram] No chaos program already loaded."
error = "[PROGRAMMING-MODE-DIAGRAM] No chaos program already loaded."
ngx.log(ngx.ERR, error)
ngx.say(error)
elseif not string.match(result, '{.*}') then
error = "[programming_mode_diagram] Chaos program seems not correct. Please check yaml syntax."
error = "[PROGRAMMING-MODE-DIAGRAM] Chaos program seems not correct. Please check yaml syntax."
ngx.log(ngx.ERR, error)
ngx.say(error)
end
@@ -307,28 +399,28 @@ server {
local yaml_data = lyaml.load(data)
if not key_exists(yaml_data, "jobs") then
error = "[programming_mode_diagram] Chaos program does not contain 'jobs' key. Please fix yaml definition."
error = "[PROGRAMMING-MODE-DIAGRAM] Chaos program does not contain 'jobs' key. Please fix yaml definition."
ngx.log(ngx.ERR, error)
ngx.say(error)
elseif not key_exists(yaml_data, "experiments") then
error = "[programming_mode_diagram] Chaos program does not contain 'experiments' key. Please fix yaml definition"
error = "[PROGRAMMING-MODE-DIAGRAM] Chaos program does not contain 'experiments' key. Please fix yaml definition"
ngx.log(ngx.ERR, error)
ngx.say(error)
elseif is_key_empty(yaml_data, "jobs") then
error = "[programming_mode_diagram] Chaos program does not contain valid 'jobs' key. Please fix yaml definition, add jobs"
error = "[PROGRAMMING-MODE-DIAGRAM] Chaos program does not contain valid 'jobs' key. Please fix yaml definition, add jobs"
ngx.log(ngx.ERR, error)
ngx.say(error)
elseif is_key_empty(yaml_data, "experiments") then
error = "[programming_mode_diagram] Chaos program does not contain valid 'experiments' key. Please fix yaml definition, add experiments"
error = "[PROGRAMMING-MODE-DIAGRAM] Chaos program does not contain valid 'experiments' key. Please fix yaml definition, add experiments"
ngx.log(ngx.ERR, error)
ngx.say(error)
else
os.remove(filename)
response = json.encode(yaml_data)
local response = json.encode(yaml_data)
ngx.say(response)
end
}