Skip to content

Commit

Permalink
Work in progress
Browse files Browse the repository at this point in the history
  • Loading branch information
ElaadF committed Nov 15, 2019
2 parents 0ab90a3 + 06386b1 commit fc09c2e
Show file tree
Hide file tree
Showing 4 changed files with 135 additions and 11 deletions.
Expand Up @@ -42,6 +42,7 @@ import com.normation.rudder.repository.EventLogRepository
import com.normation.rudder.repository.json.DataExtractor.CompleteJson
import com.normation.rudder.rest.RestExtractorService
import com.normation.rudder.rest.RestUtils._
import com.normation.rudder.services.user.PersonIdentService
import com.normation.rudder.web.components.DateFormaterService
import com.normation.rudder.web.services._
import net.liftweb.common._
Expand All @@ -57,6 +58,8 @@ class EventLogAPI (
repos: EventLogRepository
, restExtractor : RestExtractorService
, eventLogDetail : EventLogDetailsGenerator
, personIdentService : PersonIdentService

) extends RestHelper with Loggable {

def serialize(event: EventLog): JValue = {
Expand Down Expand Up @@ -157,8 +160,6 @@ class EventLogAPI (
JsonResponse(errorFormatter(fail.messageChain), 500)
}



case Get(id :: "details" :: Nil, req) =>
implicit val prettify = restExtractor.extractBoolean("prettify")(req)(identity).getOrElse(Some(false)).getOrElse(false)
implicit val action : String = "eventDetails"
Expand All @@ -171,14 +172,46 @@ class EventLogAPI (
})
htmlDetails = eventLogDetail.displayDetails(event, crId)
} yield {
toJsonResponse(None, "content" -> htmlDetails.toString())
val response =
( ("id" -> id)
~ ("content" -> htmlDetails.toString())
~ ("canRollback" -> event.canRollBack)
)
toJsonResponse(None, response)
} ) match {
case Full(resp) => resp
case eb : EmptyBox =>
val fail = eb ?~! s"Error when getting event log with id '${id}' details"
toJsonError(None, fail.messageChain)
}

case Get(id :: "details" :: "rollback" :: Nil, req) =>
implicit val prettify = restExtractor.extractBoolean("prettify")(req)(identity).getOrElse(Some(false)).getOrElse(false)
implicit val action : String = "eventRollback"

( for {
reqParam <- req.params.get("action") match {
case Some(actions) if(actions.size == 1) => Full(actions.head)
case Some(actions) => Failure(s"Only one action is excepted, ${actions.size} found in request : ${actions.mkString(",")}")
case None => Failure("Empty action")
}
rollbackReq <- if(reqParam == "after") Full(eventLogDetail.RollbackTo) else if (reqParam == "before") Full(eventLogDetail.RollbackBefore) else Failure(s"Unknown rollback's action : ${reqParam}")
idLong <- Box.tryo(id.toLong)
event <- repos.getEventLogById(idLong).toBox
committer <- personIdentService.getPersonIdentOrDefault(CurrentUserService.actor.name).toBox
rollbackExec <- rollbackReq.action(event, committer, Seq(event), event)
} yield {
val r =
( ("action" -> reqParam)
~ ("id" -> id)
)
toJsonResponse(None, r)
} ) match {
case Full(resp) => resp
case eb: EmptyBox =>
val fail = eb ?~! s"Error when performing eventlog's rollback with id '${id}'"
toJsonError(None, fail.messageChain)
}
}
serve("secure" / "api" / "eventlog" prefix requestDispatch)
}
Expand Up @@ -1008,7 +1008,7 @@ object RudderConfig extends Loggable {

// Internal APIs
val sharedFileApi = new SharedFilesAPI(restExtractorService,RUDDER_DIR_SHARED_FILES_FOLDER)
val eventLogApi= new EventLogAPI(eventLogRepository, restExtractorService, eventLogDetailsGenerator)
val eventLogApi= new EventLogAPI(eventLogRepository, restExtractorService, eventLogDetailsGenerator, personIdentService)

lazy val asyncWorkflowInfo = new AsyncWorkflowInfo
lazy val configService: ReadConfigService with UpdateConfigService = {
Expand Down
Expand Up @@ -1404,13 +1404,37 @@ function createEventLogTable(gridId, data, contextPath, refresh) {
table.row(row).child().hide();
row.removeClass("opened");
} else {
row.addClass("opened");
// Set data in the open row with the details function from data
$.getJSON(contextPath + '/secure/api/eventlog/' + data.id + "/details", function(data) {
var html = $.parseHTML( data["data"]["content"] );
row.addClass("opened");

// Set data in the open row with the details function from data
$.ajax({
type: "GET",
url: contextPath + "/secure/api/eventlog/" + data.id + "/details" ,
contentType: "application/json; charset=utf-8",
success: function (response, status, jqXHR) {
var id = response["data"]["id"]
var rollback = setupRollbackBlock(id)
var html = $.parseHTML( response["data"]["content"] );
if(response["data"]["canRollback"]){
table.row(row).child($(rollback).append(html)).show();
$("#restoreBtn" + id).click(function(event){
var rollback ='#rollback'+id
$(rollback).hide();
var confirm = "#confirm" + id.toString();
var radios = $('action');
var action = getRadioChecked(radios);
var confirmHtml = "<p><i class='fa fa-exclamation-triangle warnicon' aria-hidden='true'></i><b>Are you sure you want to restore configuration policy" + action + "this</b></p><span><button class='btn btn-default' onClick=cancelRollback(" + id + ")>Cancel</button></span><button class='btn btn-danger' onClick=confirmRollback(" + id + ")>Confirm</button></span>";
$(confirm).append(confirmHtml);
});
} else {
table.row(row).child(html).show();
});
}
}
},
error: function (jqXHR, textStatus, errorThrown) {
createErrorNotification("Error while retrieve eventlog details: " + jqXHR.responseJSON.errorDetails)
}
});
}
// toggle list open / close classes
IdTd.toggleClass('listopen');
IdTd.toggleClass('listclose');
Expand All @@ -1425,6 +1449,46 @@ function createEventLogTable(gridId, data, contextPath, refresh) {
createTable(gridId,data, columns, params, contextPath, refresh, "event_logs", false);
}

function setupRollbackBlock(id) {
var rollbackId = 'rollback' + id;
var confirmId = 'confirm' + id;
var btnId = 'restoreBtn' + id;
var rollbackBlock = document.getElementById("rollbackBlock");
var returnedHTML = rollbackBlock.innerHTML.replace(/{{rollbackId}}/g, rollbackId)
.replace(/{{restoreBtnId}}/g, btnId)
.replace(/{{confirmId}}/g, confirmId);
return returnedHTML
}

function getRadioChecked(radios) {
for (var i = 0, length = radios.length; i < length; i++) {
if (radios[i].checked) {
return radios[i].value;
}
}
}

function confirmRollback(id) {
var radios = $('.radio');
var action = getRadioChecked(radios);
$.ajax({
type: "GET",
url: contextPath + '/secure/api/eventlog/' + id + "/details/rollback?action=" + action ,
contentType: "application/json; charset=utf-8",
success: function (response, status, jqXHR) {
createSuccessNotification("Success : rollback" + action + "eventlog "+ id);
},
error: function (jqXHR, textStatus, errorThrown) {
createErrorNotification("Rollback failed : " + jqXHR.responseJSON.errorDetails)
}
});
}

function cancelRollback(id) {
$('#confirm'+id).empty();
$('#rollback'+id).show();
}

function computeCompliancePercent (complianceArray) {
return computeComplianceOK(complianceArray).percent;
}
Expand Down
Expand Up @@ -39,10 +39,37 @@
<lift:ignore>
This div gets the content of the eventDetailPopup injected within
</lift:ignore>
</div>
</div>html

</div>
</div>
</div>

<script id="rollbackBlock" type="text/template">
<div class='rollbackDisplay'>
<fieldset class='rollbackFieldSet'>
<legend>Rollback</legend>
<div id='{{rollbackId}}'>
<span class='alignRollback'>Restore configuration policy to</span>
<ul style='display: inline-block;padding-left:5px; text-align:left;'>
<input class='radio' type='radio' id='after' name='action' value='after' checked/>
<label for='after'>After</label>
<input class='radio' type='radio' id='before' name='action' value='before'/>
<label for='before'>Before</label>
</ul>
<span class='alignRollback'>this change</span>
<span>
<button id='{{restoreBtnId}}'>Restore</button>
</span>
</div>
<span id='{{confirmId}}'></span>
</fieldset>
</div>
</script>

</lift:surround>





0 comments on commit fc09c2e

Please sign in to comment.