/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var tiers = [];
var defaultDatasource = "_default";
var ruleTypes = [
"loadByInterval",
"loadByPeriod",
"dropByInterval",
"dropByPeriod",
"dropBeforeByPeriod",
"loadForever",
"dropForever",
"JSON"
];
function makeRuleDiv(rule) {
var retVal = "
";
if (rule === null || typeof rule === "undefined") {
retVal += makeRuleComponents("") + makeRuleBody();
} else {
retVal += makeRuleComponents(rule.type) + makeRuleBody(rule);
}
retVal += "
";
return retVal;
}
function makeRuleComponents(type) {
var components = "X ";
components +=
"" +
"type " +
"" +
" ";
$.each(ruleTypes, function(index, ruleType) {
if (ruleType === type) {
components += "" + ruleType + " ";
} else {
components += "" + ruleType + " ";
}
});
components +=
" " +
" ";
return components;
}
function makeRuleBody(rule) {
var retVal = "";
if (rule !== null && typeof rule !== "undefined") {
switch (rule.type) {
case "loadByInterval":
retVal += makeLoadByInterval(rule);
break;
case "loadByPeriod":
retVal += makeLoadByPeriod(rule);
break;
case "loadForever":
retVal += makeLoadForever(rule);
break;
case "dropByInterval":
retVal += makeDropByInterval(rule);
break;
case "dropByPeriod":
retVal += makeDropByPeriod(rule);
break;
case "dropBeforeByPeriod":
retVal += makeDropBeforeByPeriod(rule);
break;
case "dropForever":
retVal += "";
break;
case "JSON":
retVal += makeJSON();
break;
default:
break;
}
}
retVal += " ";
return retVal;
}
function makeLoadByInterval(rule) {
var retVal = "";
retVal += "interval ";
retVal += "Add Another Tier ";
if (rule.tieredReplicants === undefined) {
retVal += makeTierLoad(null, 0);
}
for (var tier in rule.tieredReplicants) {
retVal += makeTierLoad(tier, rule.tieredReplicants[tier]);
}
return retVal;
}
function makeLoadByPeriod(rule) {
var retVal = "";
retVal += "period ";
retVal += "includeFuture ";
retVal += "Add Another Tier ";
if (rule.tieredReplicants === undefined) {
retVal += makeTierLoad(null, 0);
}
for (var tier in rule.tieredReplicants) {
retVal += makeTierLoad(tier, rule.tieredReplicants[tier]);
}
return retVal;
}
function makeLoadForever(rule) {
var retVal = "";
retVal += "Add Another Tier ";
if (rule.tieredReplicants === undefined) {
retVal += makeTierLoad(null, 0);
}
for (var tier in rule.tieredReplicants) {
retVal += makeTierLoad(tier, rule.tieredReplicants[tier]);
}
return retVal;
}
function makeTierLoad(tier, val) {
return "" +
"replicants " +
makeTiersDropdown(tier) +
"
";
}
function makeDropByInterval(rule) {
return "interval ";
}
function makeDropByPeriod(rule) {
var retVal = "";
retVal += "period ";
retVal += "includeFuture ";
return retVal;
}
function makeDropBeforeByPeriod(rule) {
return "period ";
}
function makeJSON() {
return "JSON ";
}
function makeTiersDropdown(selTier) {
var retVal = "tier "
if ($.inArray(selTier, tiers) == -1) {
tiers.push(selTier);
}
$.each(tiers, function(index, tier) {
if (selTier === tier) {
retVal += "" + tier + " ";
} else {
retVal += "" + tier + " ";
}
});
retVal += " ";
return retVal;
}
function getRules() {
var selected = $('#datasources option:selected').text();
if (selected !== "") {
$.getJSON("/druid/coordinator/v1/rules/" + selected, function(data) {
$('#rules_list').empty();
if (!$.isEmptyObject(data)) {
$.each(data, function(index, rule) {
$('#rules_list').append(makeRuleDiv(rule));
});
}
});
}
}
function domToRule(domRule) {
var ruleType = $($(domRule).find(".rule_dropdown_types:first")).val();
var inputs = $($(domRule).find(".rule_body:first")).children("input");
// Special case for free form JSON
if (ruleType === "JSON") {
return $.parseJSON($(inputs.children("input:first")).val());
}
var rule = {};
rule.type = ruleType;
$.each(inputs, function(index, input) {
var name = $(input).attr("name");
rule[name] = $(input).val();
});
var theTiers = $($(domRule).find(".rule_body:first")).children(".rule_tier");
var tieredReplicants = {};
$.each(theTiers, function(index, theTier) {
var tierName = $(theTier).find("select").val();
var replicants = $(theTier).find("[name=replicants]").val();
tieredReplicants[tierName] = replicants;
});
rule.tieredReplicants = tieredReplicants;
return rule;
}
$(document).ready(function() {
$("button").button();
$("#rules_list").sortable();
$("#error_dialog").dialog({
autoOpen: false,
modal:true,
resizeable: false,
buttons: {
Ok : function() {
$(this).dialog("close");
}
}
});
$("#cancel_dialog").dialog({
autoOpen: false,
modal:true,
resizeable: false,
buttons: {
Yes : function() {
getRules();
$(this).dialog("close");
},
No: function() {
$(this).dialog("close");
}
}
});
$("#update_dialog").dialog({
autoOpen: false,
modal:true,
resizeable: false,
buttons: {
Yes : function() {
var rules = [];
$.each($("#rules_list").children(), function(index, domRule) {
rules.push(domToRule(domRule));
});
var selected = $('#datasources option:selected').text();
$.ajax({
type: 'POST',
url:'/druid/coordinator/v1/rules/' + selected,
data: JSON.stringify(rules),
contentType:"application/json; charset=utf-8",
dataType:"text",
error: function(xhr, status, error) {
$("#update_dialog").dialog("close");
$("#error_dialog").html(xhr.responseText);
$("#error_dialog").dialog("open");
},
success: function(data, status, xhr) {
$("#update_dialog").dialog("close");
}
});
},
Cancel: function() {
$(this).dialog("close");
}
}
});
$.getJSON("/druid/coordinator/v1/tiers", function(theTiers) {
tiers = theTiers;
});
$.getJSON("/druid/coordinator/v1/metadata/datasources", function(data) {
$.each(data, function(index, datasource) {
$('#datasources').append($(' ').val(datasource).text(datasource));
});
$('#datasources').append($(' ').val(defaultDatasource).text(defaultDatasource));
});
$("#datasources").change(function(event) {
getRules();
$("#rules").show();
});
$(document).on("change", '.rule_dropdown_types', null, function(event) {
var newRule = {
"type" : $(event.target).val()
};
var ruleBody = $(event.target).parent('.rule_dropdown').next('.rule_body');
ruleBody.replaceWith(makeRuleBody(newRule));
});
$(document).on("click", '.delete_rule', null, function(event) {
$(event.target).parent(".rule").remove();
});
$(document).on("click", '.add_tier', null, function(event) {
$(event.target).parent().append(makeTierLoad(null, 0));
});
$("#create_new_rule").click(function (event) {
$('#rules_list').prepend(makeRuleDiv());
});
$("#cancel").click(function() {
$("#cancel_dialog").dialog("open");
});
$('#update').click(function (){
$("#update_dialog").dialog("open")
});
});