diff --git a/html5/index.html b/html5/index.html index 9040c7f..e29c378 100644 --- a/html5/index.html +++ b/html5/index.html @@ -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 @@
@@ -336,6 +344,7 @@ '); + + } + };; + 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() diff --git a/nginx/KubeInvaders.conf b/nginx/KubeInvaders.conf index adba15f..fcf4659 100644 --- a/nginx/KubeInvaders.conf +++ b/nginx/KubeInvaders.conf @@ -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 }