Skip to content

Commit

Permalink
Work in progress
Browse files Browse the repository at this point in the history
  • Loading branch information
RaphaelGauthier committed Jan 2, 2017
1 parent 68671e3 commit 5ff35b2
Show file tree
Hide file tree
Showing 9 changed files with 1,031 additions and 2 deletions.
4 changes: 4 additions & 0 deletions rudder-web/src/main/scala/bootstrap/liftweb/Boot.scala
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,10 @@ class Boot extends Loggable {
"secure" / "administration" / "apiManagement"
>> LocGroup("administrationGroup")
>> TestAccess ( () => userIsAllowed("/secure/administration/policyServerManagement",Read("administration")) )
, Menu("dataSourceManagement", <span>Data sources</span>) /
"secure" / "administration" / "dataSourceManagement"
>> LocGroup("administrationGroup")
>> TestAccess ( () => userIsAllowed("/secure/administration/policyServerManagement",Read("administration")) )
)

def utilitiesMenu = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,17 @@ import com.normation.rudder.datasources.OneRequestAllNodes
import com.normation.rudder.datasources.OneRequestByNode
import org.joda.time.Seconds
import scala.concurrent.duration.Duration
import net.liftweb.http.Req
import com.normation.rudder.authorization._
import com.normation.rudder.web.model.CurrentUser

trait DataSourceApi extends RestAPI {
val kind = "datasources"

override protected def checkSecure : PartialFunction[Req, Boolean] = {
case Get(_,_) => CurrentUser.checkRights(Read("administration"))
case Post(_,_) | Put(_,_) | Delete(_,_) => CurrentUser.checkRights(Write("administration")) || CurrentUser.checkRights(Edit("administration"))
case _=> false

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,13 @@ import scala.concurrent.duration.FiniteDuration

class MemoryDataSourceRepository extends DataSourceRepository {

private[this] var sources : Map[DataSourceId,DataSource] = Map()

val baseSourceType = HttpDataSourceType("https://url/api/datasource1", Map(("key1","value1"),("key2","value2")), "GET", false, "json/path/datasource1", OneRequestByNode, DataSource.defaultDuration)
val baseRunParam = DataSourceRunParameters(NoSchedule(DataSource.defaultDuration), false,false)

val datasource1 = DataSource(DataSourceId( "datasource1"), DataSourceName("Data source 1"), baseSourceType, baseRunParam, "simple description", false, DataSource.defaultDuration)

private[this] var sources : Map[DataSourceId,DataSource] = Map((datasource1.id, datasource1))

def getAll() = Full(sources)

Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

181 changes: 181 additions & 0 deletions rudder-web/src/main/webapp/javascript/rudder/angular/dataSource.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,181 @@
var app = angular.module("datasource", []);

app.directive('focusOn', function() {
return function(scope, elem, attr) {
scope.$on('focusOn', function(e, name) {
if(name === attr.focusOn) {
elem[0].focus();
}
});
};
});
app.factory('focus', function ($rootScope, $timeout) {
return function(name) {
$timeout(function (){
$rootScope.$broadcast('focusOn', name);
});
}
});

app.controller("datasourceCtrl", ['$scope', '$timeout', 'orderByFilter','$http', function($scope,$timeout,orderBy,$http,focus) {

$scope.TESTJSON = [{}];
/* Init scope*/
// All datasources
$scope.datasources = [];
// New datasource
$scope.newDatasource;
// Selected datasources
$scope.selectedDatasource;
// "Delete selected datasources" button state
$scope.confirmDeleteAllDatasource = 0;
// List of nodes
$scope.testNodes = {};
// datasource currently tested
$scope.testedDatasource;

/* Get datasources */
$scope.getDataSources = function(){
return $http.get(contextPath + '/secure/api/latest/datasources').then(function(response){
var res = response.data.data.datasources;
$scope.propertyName = 'name';
$scope.reverse = false;
$scope.datasources = orderBy(res, $scope.propertyName, $scope.reverse);
var modifiedTime = {};
for(var i=0 ; i<$scope.datasources.length ; i++){
$scope.datasources[i].newHeader = {"key":"","value":""};
$scope.datasources[i].modifiedTime = timeConvert($scope.datasources[i].updateFrequency);
}
});
}
$scope.getDataSources();

// DETAILS
$scope.saveDetails = function(datasource){
datasource.updateFrequency = minuteConvert(datasource.modifiedTime);
delete datasource.clone;
}
$scope.updateKey = function(header, index, key){
renameKey(header, Object.keys(header)[index], key)
}
$scope.updateValue = function(datasource, key, value){

}
// DATASOURCES
$scope.resetNewDatasource = function(){
$scope.newDatasource.name = "";
$scope.newDatasource.type = "";
}
$scope.createNewDatasource = function(){
console.log($scope.datasources);
}
$scope.saveNewDatasource = function(){
$scope.datasources.push(jQuery.extend(true, {}, $scope.newDatasource));
delete $scope.newDatasource;
}
$scope.cancelNewDetails = function(){
delete $scope.newDatasource;
}
$scope.selectDatasource = function(index){
$scope.selectedDatasource = {};
if(index>=0){
$scope.selectedDatasource = $scope.datasources[index];
}else{
$scope.selectedDatasource = {
"isNew":true
};
}
}
$scope.deleteDatasource = function(index){
$scope.currentDatasourceIndex = index;
$('#deleteModal').bsModal('show');
}
$scope.confirmDeleteDatasource = function(){
$('#deleteModal').bsModal('hide');
}

// TEST DATASOURCE
$scope.testDatasource = function(datasource){
$scope.displayJsonTest = false;
$scope.testedDatasource = datasource;
$scope.testNodes.nodes = $scope.getAllNodes();
$scope.testNodes.selectedNode = $scope.testNodes.nodes[0];
$('#testModal').bsModal('show');
}
$scope.startTestDatasource = function(node){
$scope.displayJsonTest = true;
var formatterLeft = new JSONFormatter($scope.TESTJSON);
var formatterRight = new JSONFormatter($scope.TESTJSON);
$('#json-tab-left' ).text('');
$('#json-tab-right').text('');
$('#json-tab-left' ).append(formatterLeft.render());
$('#json-tab-right').append(formatterRight.render());
}
$scope.refreshDatasource = function(datasource){
datasource.refreshing=true;
$timeout(function(){datasource.refreshing=false}, 2000);
}
// GET NODES
$scope.getAllNodes = function(){
return [
{"nodeId":"random", "name":"random"}
, {"nodeId":"nodeID2", "name":"node-2"}
, {"nodeId":"nodeID3", "name":"node-3"}
, {"nodeId":"nodeID4", "name":"node-4"}
, {"nodeId":"nodeID5", "name":"node-5"}
, {"nodeId":"nodeID6", "name":"node-6"}
, {"nodeId":"nodeID7", "name":"node-7"}
, {"nodeId":"nodeID1", "name":"node-1"}
]
}

// HEADERS
$scope.resetNewHeader = function(datasource){
datasource.newHeader.key = "";
datasource.newHeader.value = "";
}
$scope.toggleHeaders = function(idHeader, event){
$('#'+idHeader).toggle(80);
$(event.currentTarget).find('.fa').toggleClass('fa-rotate-180');
}
$scope.addNewHeader = function(datasource){
console.log(datasource);
if(datasource.type.headers.hasOwnProperty(datasource.newHeader.key)){
console.error("[ERROR] --> key already used");
}else{
datasource.type.headers[datasource.newHeader.key]=datasource.newHeader.value;
$scope.resetNewHeader(datasource);
}
}
$scope.removeHeader = function(datasource,headerKey){
delete datasource.type.headers[headerKey];
}
$scope.hasHeaders = function(datasource){
return Object.keys(datasource.type.headers).length;
}
}]);

function timeConvert(time) {
return {
"day" : Math.floor(time/24/60/60)
, "hour" : Math.floor(time/60/60%24)
, "minute" : time/60%60
}
}
function minuteConvert(time) {
return time.day*1440*60 + time.hour*60*60 + time.minute*60;
}

function renameKey(obj, oldKey, newKey){
if (oldKey !== newKey) {
Object.defineProperty(obj, newKey,
Object.getOwnPropertyDescriptor(obj, oldKey));
delete obj[oldKey];
}
}


$(document).ready(function(){
angular.bootstrap('#datasource', ['datasource']);
});

Loading

0 comments on commit 5ff35b2

Please sign in to comment.