mirror of
https://github.com/lucky-sideburn/kubeinvaders.git
synced 2026-08-23 21:46:21 +00:00
added saved presets recognition
This commit is contained in:
+11
-2
@@ -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
@@ -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
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user