diff options
Diffstat (limited to 'sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui')
68 files changed, 3758 insertions, 0 deletions
diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/abstractField/abstractField.css b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/abstractField/abstractField.css new file mode 100644 index 000000000..3042e7b37 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/abstractField/abstractField.css @@ -0,0 +1 @@ +.require { color: #a00; } diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/abstractField/abstractField.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/abstractField/abstractField.js new file mode 100644 index 000000000..3d629b78d --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/abstractField/abstractField.js @@ -0,0 +1,49 @@ +(function( $, app, joey ) { + + var ui = app.ns("ui"); + + ui.AbstractField = ui.AbstractWidget.extend({ + + defaults: { + name : "", // (required) - name of the field + require: false, // validation requirements (false, true, regexp, function) + value: "", // default value + label: "" // human readable label of this field + }, + + init: function(parent) { + this._super(); + this.el = $.joey(this._main_template()); + this.field = this.el.find("[name="+this.config.name+"]"); + this.label = this.config.label; + this.require = this.config.require; + this.name = this.config.name; + this.val( this.config.value ); + this.attach( parent ); + }, + + val: function( val ) { + if(val === undefined) { + return this.field.val(); + } else { + this.field.val( val ); + return this; + } + }, + + validate: function() { + var val = this.val(), req = this.require; + if( req === false ) { + return true; + } else if( req === true ) { + return val.length > 0; + } else if( req.test && $.isFunction(req.test) ) { + return req.test( val ); + } else if( $.isFunction(req) ) { + return req( val, this ); + } + } + + }); + +})( this.jQuery, this.app, this.joey ); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/abstractPanel/abstractPanel.css b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/abstractPanel/abstractPanel.css new file mode 100644 index 000000000..6cce209bc --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/abstractPanel/abstractPanel.css @@ -0,0 +1,43 @@ +#uiModal { + background: black; +} + +.uiPanel { + box-shadow: -1px 2.5px 4px -3px black, -1px -2.5px 4px -3px black, 3px 2.5px 4px -3px black, 3px -2.5px 4px -3px black; + position: absolute; + background: #eee; + border: 1px solid #666; +} + +.uiPanel-titleBar { + text-align: center; + font-weight: bold; + padding: 2px 0; + background: rgba(223, 223, 223, 0.75); + background: -moz-linear-gradient(top, rgba(223, 223, 223, 0.75), rgba(193, 193, 193, 0.75), rgba(223, 223, 223, 0.75)); + background: -webkit-linear-gradient(top, rgba(223, 223, 223, 0.75), rgba(193, 193, 193, 0.75), rgba(223, 223, 223, 0.75)); + border-bottom: 1px solid #bbb; +} + +.uiPanel-close { + cursor: pointer; + border: 1px solid #aaa; + background: #fff; + color: #fff; + float: left; + height: 10px; + left: 3px; + line-height: 9px; + padding: 1px 0; + position: relative; + text-shadow: 0 0 1px #000; + top: 0px; + width: 12px; +} +.uiPanel-close:hover { + background: #eee; +} + +.uiPanel-body { + overflow: auto; +} diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/abstractPanel/abstractPanel.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/abstractPanel/abstractPanel.js new file mode 100644 index 000000000..17f62a798 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/abstractPanel/abstractPanel.js @@ -0,0 +1,83 @@ +(function( $, app ) { + + var ui = app.ns("ui"); + + ui.AbstractPanel = ui.AbstractWidget.extend({ + defaults: { + body: null, // initial content of the body + modal: true, // create a modal panel - creates a div that blocks interaction with page + height: 'auto', // panel height + width: 400, // panel width (in pixels) + open: false, // show the panel when it is created + parent: 'BODY', // node that panel is attached to + autoRemove: false // remove the panel from the dom and destroy it when the widget is closed + }, + shared: { // shared data for all instances of ui.Panel and decendants + stack: [], // array of all open panels + modal: $( { tag: "DIV", id: "uiModal", css: { opacity: 0.2, position: "absolute", top: "0px", left: "0px" } } ) + }, + init: function() { + this._super(); + }, + open: function( ev ) { + this.el + .css( { visibility: "hidden" } ) + .appendTo( this.config.parent ) + .css( this._getPosition( ev ) ) + .css( { zIndex: (this.shared.stack.length ? (+this.shared.stack[this.shared.stack.length - 1].el.css("zIndex") + 10) : 100) } ) + .css( { visibility: "visible", display: "block" } ); + this.shared.stack.remove(this); + this.shared.stack.push(this); + this._setModal(); + $(document).bind("keyup", this._close_handler ); + this.fire("open", { source: this, event: ev } ); + return this; + }, + close: function() { + var index = this.shared.stack.indexOf(this); + if(index !== -1) { + this.shared.stack.splice(index, 1); + this.el.css( { left: "-2999px" } ); // move the dialog to the left rather than hiding to prevent ie6 rendering artifacts + this._setModal(); + this.fire("close", this ); + if(this.config.autoRemove) { + this.remove(); + } + } + return this; + }, + // close the panel and remove it from the dom, destroying it (you can not reuse the panel after calling remove) + remove: function() { + this.close(); + $(document).unbind("keyup", this._close_handler ); + this._super(); + }, + // starting at the top of the stack, find the first panel that wants a modal and put it just underneath, otherwise remove the modal + _setModal: function() { + for(var stackPtr = this.shared.stack.length - 1; stackPtr >= 0; stackPtr--) { + if(this.shared.stack[stackPtr].config.modal) { + this.shared.modal + .appendTo( document.body ) + .css( { zIndex: this.shared.stack[stackPtr].el.css("zIndex") - 5 } ) + .css( $(document).vSize().asSize() ); + return; + } + } + this.shared.modal.remove(); // no panels that want a modal were found + }, + _getPosition: function() { + return $(window).vSize() // get the current viewport size + .sub(this.el.vSize()) // subtract the size of the panel + .mod(function(s) { return s / 2; }) // divide by 2 (to center it) + .add($(document).vScroll()) // add the current scroll offset + .mod(function(s) { return Math.max(5, s); }) // make sure the panel is not off the edge of the window + .asOffset(); // and return it as a {top, left} object + }, + _close_handler: function( ev ) { + if( ev.type === "keyup" && ev.keyCode !== 27) { return; } // press esc key to close + $(document).unbind("keyup", this._close_handler); + this.close( ev ); + } + }); + +})( this.jQuery, this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/abstractWidget/abstractWidget.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/abstractWidget/abstractWidget.js new file mode 100644 index 000000000..bf3b4c8b6 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/abstractWidget/abstractWidget.js @@ -0,0 +1,49 @@ +(function( $, joey, app ) { + + var ui = app.ns("ui"); + var ux = app.ns("ux"); + + ui.AbstractWidget = ux.Observable.extend({ + defaults : { + id: null // the id of the widget + }, + + el: null, // this is the jquery wrapped dom element(s) that is the root of the widget + + init: function() { + this._super(); + for(var prop in this) { // automatically bind all the event handlers + if(prop.contains("_handler")) { + this[prop] = this[prop].bind(this); + } + } + }, + + id: function(suffix) { + return this.config.id ? (this.config.id + (suffix ? "-" + suffix : "")) : undefined; + }, + + attach: function( parent, method ) { + if( parent ) { + this.el[ method || "appendTo"]( parent ); + } + this.fire("attached", this ); + return this; + }, + + remove: function() { + this.el.remove(); + this.fire("removed", this ); + this.removeAllObservers(); + this.el = null; + return this; + } + }); + + joey.plugins.push( function( obj ) { + if( obj instanceof ui.AbstractWidget ) { + return obj.el[0]; + } + }); + +})( this.jQuery, this.joey, this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/anyRequest/anyRequest.css b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/anyRequest/anyRequest.css new file mode 100644 index 000000000..f00412cf1 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/anyRequest/anyRequest.css @@ -0,0 +1,38 @@ +.uiAnyRequest-request { + float: left; + width: 350px; + padding: 5px; + background: #d8e7ff; + background: -moz-linear-gradient(left, #d8e7ff, #e8f1ff); + background: -webkit-linear-gradient(left, #d8e7ff, #e8f1ff); +} + +.uiAnyRequest-request INPUT[type=text], +.uiAnyRequest-request TEXTAREA { + width: 340px; +} + +.anyRequest INPUT[name=path] { + width: 259px; +} + +.uiAnyRequest-out { + margin-left: 365px; +} + +.uiAnyRequest-out P { + margin-top: 0; +} + +.uiAnyRequest-jsonErr { + color: red; +} + +.uiAnyRequest-history { + margin: 0; + padding: 0; + list-style: none; + max-height: 100px; + overflow-x: hidden; + overflow-y: auto; +} diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/anyRequest/anyRequest.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/anyRequest/anyRequest.js new file mode 100644 index 000000000..926bbcced --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/anyRequest/anyRequest.js @@ -0,0 +1,235 @@ +(function( $, app, i18n, raphael ) { + + var ui = app.ns("ui"); + var ut = app.ns("ut"); + var services = app.ns("services"); + + ui.AnyRequest = ui.Page.extend({ + defaults: { + cluster: null, // (required) instanceof app.services.Cluster + path: "_search", // default uri to send a request to + query: { query: { match_all: { }}}, + transform: " return root;" // default transformer function (does nothing) + }, + init: function(parent) { + this._super(); + this.prefs = services.Preferences.instance(); + this.history = this.prefs.get("anyRequest-history") || [ { type: "POST", path: this.config.path, query : JSON.stringify(this.config.query), transform: this.config.transform } ]; + this.el = $.joey(this._main_template()); + this.base_uriEl = this.el.find("INPUT[name=base_uri]"); + this.pathEl = this.el.find("INPUT[name=path]"); + this.typeEl = this.el.find("SELECT[name=method]"); + this.dataEl = this.el.find("TEXTAREA[name=body]"); + this.prettyEl = this.el.find("INPUT[name=pretty]"); + this.transformEl = this.el.find("TEXTAREA[name=transform]"); + this.asGraphEl = this.el.find("INPUT[name=asGraph]"); + this.asTableEl = this.el.find("INPUT[name=asTable]"); + this.asJsonEl = this.el.find("INPUT[name=asJson]"); + this.cronEl = this.el.find("SELECT[name=cron]"); + this.outEl = this.el.find("DIV.uiAnyRequest-out"); + this.errEl = this.el.find("DIV.uiAnyRequest-jsonErr"); + this.typeEl.val("GET"); + this.attach(parent); + this.setHistoryItem(this.history[this.history.length - 1]); + }, + setHistoryItem: function(item) { + this.pathEl.val(item.path); + this.typeEl.val(item.type); + this.dataEl.val(item.query); + this.transformEl.val(item.transform); + }, + _request_handler: function( ev ) { + if(! this._validateJson_handler()) { + return; + } + var path = this.pathEl.val(), + type = this.typeEl.val(), + query = JSON.stringify(JSON.parse(this.dataEl.val())), + transform = this.transformEl.val(), + base_uri = this.base_uriEl.val(); + if( ev ) { // if the user click request + if(this.timer) { + window.clearTimeout(this.timer); // stop any cron jobs + } + delete this.prevData; // remove data from previous cron runs + this.outEl.text(i18n.text("AnyRequest.Requesting")); + if( ! /\/$/.test( base_uri )) { + base_uri += "/"; + this.base_uriEl.val( base_uri ); + } + for(var i = 0; i < this.history.length; i++) { + if(this.history[i].path === path && + this.history[i].type === type && + this.history[i].query === query && + this.history[i].transform === transform) { + this.history.splice(i, 1); + } + } + this.history.push({ + path: path, + type: type, + query: query, + transform: transform + }); + this.history.slice(250); // make sure history does not get too large + this.prefs.set( "anyRequest-history", this.history ); + this.el.find("UL.uiAnyRequest-history") + .empty() + .append($( { tag: "UL", children: this.history.map(this._historyItem_template, this) }).children()) + .children().find(":last-child").each(function(i, j) { j.scrollIntoView(false); }).end() + .scrollLeft(0); + } + this.config.cluster.request({ + url: base_uri + path, + type: type, + data: query, + success: this._responseWriter_handler, + error: this._responseError_handler + }); + }, + _responseError_handler: function (response) { + var obj; + try { + obj = JSON.parse(response.responseText); + if (obj) { + this._responseWriter_handler(obj); + } + } catch (err) { + } + }, + _responseWriter_handler: function(data) { + this.outEl.empty(); + try { + data = (new Function("root", "prev", this.transformEl.val()))(data, this.prevData) + } catch(e) { + this.errEl.text(e.message); + return; + } + if(this.asGraphEl.attr("checked")) { + var w = this.outEl.width(); + raphael(this.outEl[0], w - 10, 300) + .g.barchart(10, 10, w - 20, 280, [data]); + } + if(this.asTableEl.attr("checked")) { + try { + var store = new app.data.ResultDataSourceInterface(); + this.outEl.append(new app.ui.ResultTable({ + width: this.outEl.width() - 23, + store: store + } ) ); + store.results(data); + } catch(e) { + this.errEl.text("Results Table Failed: " + e.message); + } + } + if(this.asJsonEl.attr("checked")) { + this.outEl.append(new ui.JsonPretty({ obj: data })); + } + if(this.cronEl.val() > 0) { + this.timer = window.setTimeout(function(){ + this._request_handler(); + }.bind(this), this.cronEl.val()); + } + this.prevData = data; + }, + _validateJson_handler: function( ev ) { + /* if the textarea is empty, we replace its value by an empty JSON object : "{}" and the request goes on as usual */ + var jsonData = this.dataEl.val().trim(); + var j; + if(jsonData === "") { + jsonData = "{}"; + this.dataEl.val( jsonData ); + } + try { + j = JSON.parse(jsonData); + } catch(e) { + this.errEl.text(e.message); + return false; + } + this.errEl.text(""); + if(this.prettyEl.attr("checked")) { + this.dataEl.val(JSON.stringify(j, null, " ")); + } + return true; + }, + _historyClick_handler: function( ev ) { + var item = $( ev.target ).closest( "LI" ).data( "item" ); + this.setHistoryItem( item ); + }, + _main_template: function() { + return { tag: "DIV", cls: "anyRequest", children: [ + { tag: "DIV", cls: "uiAnyRequest-request", children: [ + new app.ui.SidebarSection({ + open: false, + title: i18n.text("AnyRequest.History"), + body: { tag: "UL", onclick: this._historyClick_handler, cls: "uiAnyRequest-history", children: this.history.map(this._historyItem_template, this) } + }), + new app.ui.SidebarSection({ + open: true, + title: i18n.text("AnyRequest.Query"), + body: { tag: "DIV", children: [ + { tag: "INPUT", type: "text", name: "base_uri", value: this.config.cluster.config.base_uri }, + { tag: "BR" }, + { tag: "INPUT", type: "text", name: "path", value: this.config.path }, + { tag: "SELECT", name: "method", children: ["POST", "GET", "PUT", "HEAD", "DELETE"].map(ut.option_template) }, + { tag: "TEXTAREA", name: "body", rows: 20, text: JSON.stringify(this.config.query) }, + { tag: "BUTTON", css: { cssFloat: "right" }, type: "button", children: [ { tag: "B", text: i18n.text("AnyRequest.Request") } ], onclick: this._request_handler }, + { tag: "BUTTON", type: "button", text: i18n.text("AnyRequest.ValidateJSON"), onclick: this._validateJson_handler }, + { tag: "LABEL", children: [ { tag: "INPUT", type: "checkbox", name: "pretty" }, i18n.text("AnyRequest.Pretty") ] }, + { tag: "DIV", cls: "uiAnyRequest-jsonErr" } + ]} + }), + new app.ui.SidebarSection({ + title: i18n.text("AnyRequest.Transformer"), + help: "AnyRequest.TransformerHelp", + body: { tag: "DIV", children: [ + { tag: "CODE", text: "function(root, prev) {" }, + { tag: "BR" }, + { tag: "TEXTAREA", name: "transform", rows: 5, text: this.config.transform }, + { tag: "BR" }, + { tag: "CODE", text: "}" } + ] } + }), + new app.ui.SidebarSection({ + title: i18n.text("AnyRequest.RepeatRequest"), + body: { tag: "DIV", children: [ + i18n.text("AnyRequest.RepeatRequestSelect"), " ", + { tag: "SELECT", name: "cron", children: [ + { value: 0, text: "do not repeat" }, + { value: 1000, text: "second" }, + { value: 1000 * 2, text: "2 seconds" }, + { value: 1000 * 5, text: "5 seconds" }, + { value: 1000 * 20, text: "20 seconds" }, + { value: 1000 * 60, text: "minute" }, + { value: 1000 * 60 * 10, text: "10 minutes" }, + { value: 1000 * 60 * 60, text: "hour" } + ].map(function(op) { return $.extend({ tag: "OPTION"}, op); }) } + ] } + }), + new app.ui.SidebarSection({ + title: i18n.text("AnyRequest.DisplayOptions"), + help: "AnyRequest.DisplayOptionsHelp", + body: { tag: "DIV", children: [ + { tag: "LABEL", children: [ { tag: "INPUT", type: "checkbox", checked: true, name: "asJson" }, i18n.text("AnyRequest.AsJson") ] }, + { tag: "BR" }, + { tag: "LABEL", children: [ { tag: "INPUT", type: "checkbox", name: "asGraph" }, i18n.text("AnyRequest.AsGraph") ] }, + { tag: "BR" }, + { tag: "LABEL", children: [ { tag: "INPUT", type: "checkbox", name: "asTable" }, i18n.text("AnyRequest.AsTable") ] } + ] } + }) + ] }, + { tag: "DIV", cls: "uiAnyRequest-out" } + ] }; + }, + _historyItem_template: function(item) { + return { tag: "LI", cls: "booble", data: { item: item }, children: [ + { tag: "SPAN", text: item.path }, + " ", + { tag: "EM", text: item.query }, + " ", + { tag: "SPAN", text: item.transform } + ] }; + } + }); + +})( this.jQuery, this.app, this.i18n, this.Raphael ); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/browser/browser.css b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/browser/browser.css new file mode 100644 index 000000000..66e2110a7 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/browser/browser.css @@ -0,0 +1,7 @@ +.uiBrowser-filter { + float: left; +} + +.uiBrowser-table { + margin-left: 365px; +} diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/browser/browser.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/browser/browser.js new file mode 100644 index 000000000..329aa4d6c --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/browser/browser.js @@ -0,0 +1,58 @@ +(function( $, app, i18n ){ + + var ui = app.ns("ui"); + var data = app.ns("data"); + + ui.Browser = ui.Page.extend({ + defaults: { + cluster: null // (required) instanceof app.services.Cluster + }, + init: function() { + this._super(); + this.cluster = this.config.cluster; + this.query = new app.data.Query( { cluster: this.cluster } ); + this._refreshButton = new ui.Button({ + label: i18n.text("General.RefreshResults"), + onclick: function( btn ) { + this.query.query(); + }.bind(this) + }); + this.el = $(this._main_template()); + new data.MetaDataFactory({ + cluster: this.cluster, + onReady: function(metadata) { + this.metadata = metadata; + this.store = new data.QueryDataSourceInterface( { metadata: metadata, query: this.query } ); + this.queryFilter = new ui.QueryFilter({ metadata: metadata, query: this.query }); + this.queryFilter.attach(this.el.find("> .uiBrowser-filter") ); + this.resultTable = new ui.ResultTable( { + onHeaderClick: this._changeSort_handler, + store: this.store + } ); + this.resultTable.attach( this.el.find("> .uiBrowser-table") ); + this.updateResults(); + }.bind(this) + }); + }, + updateResults: function() { + this.query.query(); + }, + _changeSort_handler: function(table, wEv) { + this.query.setSort(wEv.column, wEv.dir === "desc"); + this.query.setPage(1); + this.query.query(); + }, + _main_template: function() { + return { tag: "DIV", cls: "uiBrowser", children: [ + new ui.Toolbar({ + label: i18n.text("Browser.Title"), + left: [ ], + right: [ this._refreshButton ] + }), + { tag: "DIV", cls: "uiBrowser-filter" }, + { tag: "DIV", cls: "uiBrowser-table" } + ] }; + } + }); + +})( this.jQuery, this.app, this.i18n ); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/button/button.css b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/button/button.css new file mode 100644 index 000000000..17123dcd7 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/button/button.css @@ -0,0 +1,50 @@ +.uiButton { + padding: 0; + border: 0; + margin: 3px; + width: auto; + overflow: visible; + cursor: pointer; + background: transparent; +} + +.uiButton-content { + height: 20px; + border: 1px solid #668dc6; + border-radius: 2px; + background: #96c6eb; + background: -moz-linear-gradient(top, #96c6eb, #5296c7); + background: -webkit-linear-gradient(top, #96c6eb, #5296c7); + color: white; + font-weight: bold; +} + +.moz .uiButton-content { margin: 0 -2px; } + +.uiButton-label { + padding: 2px 6px; + white-space: nowrap; +} +.uiButton:hover .uiButton-content { + background: #2777ba; + background: -moz-linear-gradient(top, #6aaadf, #2777ba); + background: -webkit-linear-gradient(top, #6aaadf, #2777ba); +} +.uiButton.active .uiButton-content, +.uiButton:active .uiButton-content { + background: #2575b7; + background: -moz-linear-gradient(top, #2576b8, #2575b7); + background: -webkit-linear-gradient(top, #2576b8, #2575b7); +} +.uiButton.disabled .uiButton-content, +.uiButton.disabled:active .uiButton-content { + border-color: #c6c6c6; + color: #999999; + background: #ddd; + background: -moz-linear-gradient(top, #ddd, #ddd); + background: -webkit-linear-gradient(top, #ddd, #ddd); +} + +.uiButton.disabled { + cursor: default; +} diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/button/button.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/button/button.js new file mode 100644 index 000000000..57f83a083 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/button/button.js @@ -0,0 +1,53 @@ +(function( $, joey, app ) { + + var ui = app.ns("ui"); + + ui.Button = ui.AbstractWidget.extend({ + defaults : { + label: "", // the label text + disabled: false, // create a disabled button + autoDisable: false // automatically disable the button when clicked + }, + + _baseCls: "uiButton", + + init: function(parent) { + this._super(); + this.el = $.joey(this.button_template()) + .bind("click", this.click_handler); + this.config.disabled && this.disable(); + this.attach( parent ); + }, + + click_handler: function(jEv) { + if(! this.disabled) { + this.fire("click", jEv, this); + this.config.autoDisable && this.disable(); + } + }, + + enable: function() { + this.el.removeClass("disabled"); + this.disabled = false; + return this; + }, + + disable: function(disable) { + if(disable === false) { + return this.enable(); + } + this.el.addClass("disabled"); + this.disabled = true; + return this; + }, + + button_template: function() { return ( + { tag: 'BUTTON', type: 'button', id: this.id(), cls: this._baseCls, children: [ + { tag: 'DIV', cls: 'uiButton-content', children: [ + { tag: 'DIV', cls: 'uiButton-label', text: this.config.label } + ] } + ] } + ); } + }); + +})( this.jQuery, this.joey, this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/button/buttonDemo.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/button/buttonDemo.js new file mode 100644 index 000000000..060e8f650 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/button/buttonDemo.js @@ -0,0 +1,9 @@ +$( function() { + + var ui = window.app.ns("ui"); + + window.builder = function() { + return new ui.Button({ label: "Default" }); + } ; + +});
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/checkField/checkField.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/checkField/checkField.js new file mode 100644 index 000000000..d5f50127e --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/checkField/checkField.js @@ -0,0 +1,25 @@ +(function( app ) { + + var ui = app.ns("ui"); + + ui.CheckField = ui.AbstractField.extend({ + _main_template: function() { return ( + { tag: "DIV", id: this.id(), cls: "uiCheckField", children: [ + { tag: "INPUT", type: "checkbox", name: this.config.name, checked: !!this.config.value } + ] } + ); }, + validate: function() { + return this.val() || ( ! this.require ); + }, + val: function( val ) { + if( val === undefined ) { + return !!this.field.attr( "checked" ); + } else { + this.field.attr( "checked", !!val ); + } + } + }); + +})( this.app ); + + diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/checkField/checkFieldDemo.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/checkField/checkFieldDemo.js new file mode 100644 index 000000000..9a3b3caee --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/checkField/checkFieldDemo.js @@ -0,0 +1,45 @@ +$( function() { + + var ui = window.app.ns("ui"); + var ux = window.app.ns("ux"); + var ut = window.app.ns("ut"); + + window.builder = function() { + var form = new ux.FieldCollection({ + fields: [ + new ui.CheckField({ + label: "default", + name: "check_default" + }), + new ui.CheckField({ + label: "checked", + name: "check_true", + value: true + }), + new ui.CheckField({ + label: "unchecked", + name: "check_false", + value: false + }), + new ui.CheckField({ + label: "required", + name: "check_required", + require: true + }) + ] + }); + + return ( + { tag: "DIV", children: form.fields.map( function( field ) { + return { tag: "LABEL", cls: "uiPanelForm-field", children: [ + { tag: "DIV", cls: "uiPanelForm-label", children: [ field.label, ut.require_template(field) ] }, + field + ]}; + }).concat( new ui.Button({ + label: "Evaluate Form", + onclick: function() { console.log( "valid=" + form.validate(), form.getData() ); } + })) } + ); + }; + +});
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/checkField/checkFieldSpec.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/checkField/checkFieldSpec.js new file mode 100644 index 000000000..26ddc6f63 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/checkField/checkFieldSpec.js @@ -0,0 +1,34 @@ +describe("app.ui.CheckField", function() { + + var CheckField = window.app.ui.CheckField; + + it("should have a label", function() { + expect( ( new CheckField({ label: "foo" }) ).label ).toBe( "foo" ); + }); + + it("should have a name", function() { + expect( ( new CheckField({ name: "foo" }) ).name ).toBe( "foo" ); + }); + + it("should have a val that is false when then field is not checked", function() { + expect( ( new CheckField({ name: "foo", value: false }) ).val() ).toBe( false ); + }); + + it("should have a val that is true when the field is checked", function() { + expect( ( new CheckField({ name: "foo", value: true }) ).val() ).toBe( true ); + }); + + it("should be valid if the field value is true", function() { + expect( ( new CheckField({ name: "foo", value: true }) ).validate() ).toBe( true ); + }); + + it("should be valid if require is false", function() { + expect( ( new CheckField({ name: "foo", require: false, value: true }) ).validate() ).toBe( true ); + expect( ( new CheckField({ name: "foo", require: false, value: false }) ).validate() ).toBe( true ); + }); + + it("should be invalid if require is true and value is false", function() { + expect( ( new CheckField({ name: "foo", require: true, value: false }) ).validate() ).toBe( false ); + }); + +});
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/clusterConnect/clusterConnect.css b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/clusterConnect/clusterConnect.css new file mode 100644 index 000000000..e5b8fb457 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/clusterConnect/clusterConnect.css @@ -0,0 +1,3 @@ +.uiClusterConnect-uri { + width: 280px; +} diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/clusterConnect/clusterConnect.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/clusterConnect/clusterConnect.js new file mode 100644 index 000000000..63d097723 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/clusterConnect/clusterConnect.js @@ -0,0 +1,43 @@ +(function( $, app, i18n ) { + + var ui = app.ns("ui"); + var services = app.ns("services"); + + ui.ClusterConnect = ui.AbstractWidget.extend({ + defaults: { + cluster: null + }, + init: function() { + this._super(); + this.prefs = services.Preferences.instance(); + this.cluster = this.config.cluster; + this.el = $.joey(this._main_template()); + this.cluster.get( "", this._node_handler ); + }, + + _node_handler: function(data) { + if(data) { + this.prefs.set("app-base_uri", this.cluster.base_uri); + } + }, + + _reconnect_handler: function() { + var base_uri = this.el.find(".uiClusterConnect-uri").val(); + $("body").empty().append(new app.App("body", { id: "es", base_uri: base_uri })); + }, + + _main_template: function() { + return { tag: "SPAN", cls: "uiClusterConnect", children: [ + { tag: "INPUT", type: "text", cls: "uiClusterConnect-uri", onkeyup: function( ev ) { + if(ev.which === 13) { + ev.preventDefault(); + this._reconnect_handler(); + } + }.bind(this), id: this.id("baseUri"), value: this.cluster.base_uri }, + { tag: "BUTTON", type: "button", text: i18n.text("Header.Connect"), onclick: this._reconnect_handler } + ]}; + } + }); + +})( this.jQuery, this.app, this.i18n ); + diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/clusterConnect/clusterConnectSpec.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/clusterConnect/clusterConnectSpec.js new file mode 100644 index 000000000..8b8be82d7 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/clusterConnect/clusterConnectSpec.js @@ -0,0 +1,38 @@ +describe("clusterConnect", function() { + + var ClusterConnect = window.app.ui.ClusterConnect; + + describe("when created", function() { + + var prefs, success_callback, cluster, clusterConnect; + + beforeEach( function() { + prefs = { + set: jasmine.createSpy("set") + }; + spyOn( window.app.services.Preferences, "instance" ).and.callFake( function() { + return prefs; + }); + cluster = { + get: jasmine.createSpy("get").and.callFake( function(uri, success) { + success_callback = success; + }) + }; + clusterConnect = new ClusterConnect({ + base_uri: "http://localhost:9200", + cluster: cluster + }); + }); + + it("should test the connection to the cluster", function() { + expect( cluster.get ).toHaveBeenCalled(); + }); + + it("should store successful connection in preferences", function() { + success_callback("fakePayload"); + expect( prefs.set ).toHaveBeenCalled(); + }); + + }); + +}); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/clusterOverview/clusterOverview.css b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/clusterOverview/clusterOverview.css new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/clusterOverview/clusterOverview.css diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/clusterOverview/clusterOverview.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/clusterOverview/clusterOverview.js new file mode 100644 index 000000000..745ab42e3 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/clusterOverview/clusterOverview.js @@ -0,0 +1,302 @@ +(function( $, app, i18n ) { + + var ui = app.ns("ui"); + var services = app.ns("services"); + + // ( master ) master = true, data = true + // ( coordinator ) master = true, data = false + // ( worker ) master = false, data = true; + // ( client ) master = false, data = false; + // http enabled ? + + function nodeSort_name(a, b) { + if (!(a.cluster && b.cluster)) { + return 0; + } + return a.cluster.name.toString().localeCompare( b.cluster.name.toString() ); + } + + function nodeSort_addr( a, b ) { + if (!(a.cluster && b.cluster)) { + return 0; + } + return a.cluster.transport_address.toString().localeCompare( b.cluster.transport_address.toString() ); + } + + function nodeSort_type( a, b ) { + if (!(a.cluster && b.cluster)) { + return 0; + } + if( a.master_node ) { + return -1; + } else if( b.master_node ) { + return 1; + } else if( a.data_node && !b.data_node ) { + return -1; + } else if( b.data_node && !a.data_node ) { + return 1; + } else { + return a.cluster.name.toString().localeCompare( b.cluster.name.toString() ); + } + } + + var NODE_SORT_TYPES = { + "Sort.ByName": nodeSort_name, + "Sort.ByAddress": nodeSort_addr, + "Sort.ByType": nodeSort_type + }; + + function nodeFilter_none( a ) { + return true; + } + + function nodeFilter_clients( a ) { + return (a.master_node || a.data_node ); + } + + + ui.ClusterOverview = ui.Page.extend({ + defaults: { + cluster: null // (reqired) an instanceof app.services.Cluster + }, + init: function() { + this._super(); + this.cluster = this.config.cluster; + this.prefs = services.Preferences.instance(); + this._clusterState = this.config.clusterState; + this._clusterState.on("data", this.draw_handler ); + this._refreshButton = new ui.RefreshButton({ + onRefresh: this.refresh.bind(this), + onChange: function( btn ) { + if( btn.value === -1 ) { + this.draw_handler(); + } + }.bind( this ) + }); + var nodeSortPref = this.prefs.get("clusterOverview-nodeSort") || Object.keys(NODE_SORT_TYPES)[0]; + this._nodeSort = NODE_SORT_TYPES[ nodeSortPref ]; + this._nodeSortMenu = new ui.MenuButton({ + label: i18n.text( "Preference.SortCluster" ), + menu: new ui.SelectMenuPanel({ + value: nodeSortPref, + items: Object.keys( NODE_SORT_TYPES ).map( function( k ) { + return { text: i18n.text( k ), value: k }; + }), + onSelect: function( panel, event ) { + this._nodeSort = NODE_SORT_TYPES[ event.value ]; + this.prefs.set("clusterOverview-nodeSort", event.value ); + this.draw_handler(); + }.bind(this) + }) + }); + this._indicesSort = this.prefs.get( "clusterOverview-indicesSort") || "desc"; + this._indicesSortMenu = new ui.MenuButton({ + label: i18n.text( "Preference.SortIndices" ), + menu: new ui.SelectMenuPanel({ + value: this._indicesSort, + items: [ + { value: "desc", text: i18n.text( "SortIndices.Descending" ) }, + { value: "asc", text: i18n.text( "SortIndices.Ascending" ) } ], + onSelect: function( panel, event ) { + this._indicesSort = event.value; + this.prefs.set( "clusterOverview-indicesSort", this._indicesSort ); + this.draw_handler(); + }.bind(this) + }) + }); + this._aliasRenderer = this.prefs.get( "clusterOverview-aliasRender" ) || "full"; + this._aliasMenu = new ui.MenuButton({ + label: i18n.text( "Preference.ViewAliases" ), + menu: new ui.SelectMenuPanel({ + value: this._aliasRenderer, + items: [ + { value: "full", text: i18n.text( "ViewAliases.Grouped" ) }, + { value: "list", text: i18n.text( "ViewAliases.List" ) }, + { value: "none", text: i18n.text( "ViewAliases.None" ) } ], + onSelect: function( panel, event ) { + this._aliasRenderer = event.value; + this.prefs.set( "clusterOverview-aliasRender", this._aliasRenderer ); + this.draw_handler(); + }.bind(this) + }) + }); + this._indexFilter = new ui.TextField({ + value: this.prefs.get("clusterOverview-indexFilter"), + placeholder: i18n.text( "Overview.IndexFilter" ), + onchange: function( indexFilter ) { + this.prefs.set("clusterOverview-indexFilter", indexFilter.val() ); + this.draw_handler(); + }.bind(this) + }); + this.el = $(this._main_template()); + this.tablEl = this.el.find(".uiClusterOverview-table"); + this.refresh(); + }, + remove: function() { + this._clusterState.removeObserver( "data", this.draw_handler ); + }, + refresh: function() { + this._refreshButton.disable(); + this._clusterState.refresh(); + }, + draw_handler: function() { + var data = this._clusterState; + var indexFilter; + try { + var indexFilterRe = new RegExp( this._indexFilter.val() ); + indexFilter = function(s) { return indexFilterRe.test(s); }; + } catch(e) { + indexFilter = function() { return true; }; + } + var clusterState = data.clusterState; + var status = data.status; + var nodeStats = data.nodeStats; + var clusterNodes = data.clusterNodes; + var nodes = []; + var indices = []; + var cluster = {}; + var nodeIndices = {}; + var indexIndices = {}, indexIndicesIndex = 0; + function newNode(n) { + return { + name: n, + routings: [], + master_node: clusterState.master_node === n + }; + } + function newIndex(i) { + return { + name: i, + replicas: [] + }; + } + function getIndexForNode(n) { + return nodeIndices[n] = (n in nodeIndices) ? nodeIndices[n] : nodes.push(newNode(n)) - 1; + } + function getIndexForIndex(routings, i) { + var index = indexIndices[i] = (i in indexIndices) ? + (routings[indexIndices[i]] = routings[indexIndices[i]] || newIndex(i)) && indexIndices[i] + : ( ( routings[indexIndicesIndex] = newIndex(i) ) && indexIndicesIndex++ ); + indices[index] = i; + return index; + } + $.each(clusterNodes.nodes, function(name, node) { + getIndexForNode(name); + }); + + var indexNames = []; + $.each(clusterState.routing_table.indices, function(name, index){ + indexNames.push(name); + }); + indexNames.sort(); + if (this._indicesSort === "desc") indexNames.reverse(); + indexNames.filter( indexFilter ).forEach(function(name) { + var indexObject = clusterState.routing_table.indices[name]; + $.each(indexObject.shards, function(name, shard) { + shard.forEach(function(replica){ + var node = replica.node; + if(node === null) { node = "Unassigned"; } + var index = replica.index; + var shard = replica.shard; + var routings = nodes[getIndexForNode(node)].routings; + var indexIndex = getIndexForIndex(routings, index); + var replicas = routings[indexIndex].replicas; + if(node === "Unassigned" || !indexObject.shards[shard]) { + replicas.push({ replica: replica }); + } else { + replicas[shard] = { + replica: replica, + status: indexObject.shards[shard].filter(function(replica) { + return replica.node === node; + })[0] + }; + } + }); + }); + }); + indices = indices.map(function(index){ + return { + name: index, + state: "open", + metadata: clusterState.metadata.indices[index], + status: status.indices[index] + }; + }, this); + $.each(clusterState.metadata.indices, function(name, index) { + if(index.state === "close" && indexFilter( name )) { + indices.push({ + name: name, + state: "close", + metadata: index, + status: null + }); + } + }); + nodes.forEach(function(node) { + node.stats = nodeStats.nodes[node.name]; + var cluster = clusterNodes.nodes[node.name]; + node.cluster = cluster || { name: "<unknown>" }; + node.data_node = !( cluster && cluster.attributes && cluster.attributes.data === "false" ); + for(var i = 0; i < indices.length; i++) { + node.routings[i] = node.routings[i] || { name: indices[i].name, replicas: [] }; + node.routings[i].max_number_of_shards = indices[i].metadata.settings["index.number_of_shards"]; + node.routings[i].open = indices[i].state === "open"; + } + }); + var aliasesIndex = {}; + var aliases = []; + var indexClone = indices.map(function() { return false; }); + $.each(clusterState.metadata.indices, function(name, index) { + index.aliases.forEach(function(alias) { + var aliasIndex = aliasesIndex[alias] = (alias in aliasesIndex) ? aliasesIndex[alias] : aliases.push( { name: alias, max: -1, min: 999, indices: [].concat(indexClone) }) - 1; + var indexIndex = indexIndices[name]; + var aliasRow = aliases[aliasIndex]; + aliasRow.min = Math.min(aliasRow.min, indexIndex); + aliasRow.max = Math.max(aliasRow.max, indexIndex); + aliasRow.indices[indexIndex] = indices[indexIndex]; + }); + }); + cluster.aliases = aliases; + cluster.nodes = nodes + .filter( nodeFilter_none ) + .sort( this._nodeSort ); + indices.unshift({ name: null }); + this._drawNodesView( cluster, indices ); + this._refreshButton.enable(); + }, + _drawNodesView: function( cluster, indices ) { + this._nodesView && this._nodesView.remove(); + this._nodesView = new ui.NodesView({ + onRedraw: function() { + this.refresh(); + }.bind(this), + interactive: ( this._refreshButton.value === -1 ), + aliasRenderer: this._aliasRenderer, + cluster: this.cluster, + data: { + cluster: cluster, + indices: indices + } + }); + this._nodesView.attach( this.tablEl ); + }, + _main_template: function() { + return { tag: "DIV", id: this.id(), cls: "uiClusterOverview", children: [ + new ui.Toolbar({ + label: i18n.text("Overview.PageTitle"), + left: [ + this._nodeSortMenu, + this._indicesSortMenu, + this._aliasMenu, + this._indexFilter + ], + right: [ + this._refreshButton + ] + }), + { tag: "DIV", cls: "uiClusterOverview-table" } + ] }; + } + }); + +})( this.jQuery, this.app, this.i18n ); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/csvTable/csvTable.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/csvTable/csvTable.js new file mode 100644 index 000000000..2daaf5cc6 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/csvTable/csvTable.js @@ -0,0 +1,84 @@ +( function( $, app, joey ) { + + var ui = app.ns("ui"); + + var CELL_SEPARATOR = ","; + var CELL_QUOTE = '"'; + var LINE_SEPARATOR = "\r\n"; + + ui.CSVTable = ui.AbstractWidget.extend({ + defaults: { + results: null + }, + _baseCls: "uiCSVTable", + init: function( parent ) { + this._super(); + var results = this.config.results.hits.hits; + var columns = this._parseResults( results ); + this._downloadButton = new ui.Button({ + label: "Generate Download Link", + onclick: this._downloadLinkGenerator_handler + }); + this._downloadLink = $.joey( { tag: "A", text: "download", }); + this._downloadLink.hide(); + this._csvText = this._csv_template( columns, results ); + this.el = $.joey( this._main_template() ); + this.attach( parent ); + }, + _downloadLinkGenerator_handler: function() { + var csvData = new Blob( [ this._csvText ], { type: 'text/csv' }); + var csvURL = URL.createObjectURL( csvData ); + this._downloadLink.attr( "href", csvURL ); + this._downloadLink.show(); + }, + _parseResults: function( results ) { + var columnPaths = {}; + (function parse( path, obj ) { + if( obj instanceof Array ) { + for( var i = 0; i < obj.length; i++ ) { + parse( path, obj[i] ); + } + } else if( typeof obj === "object" ) { + for( var prop in obj ) { + parse( path + "." + prop, obj[ prop ] ); + } + } else { + columnPaths[ path ] = true; + } + })( "root", results ); + var columns = []; + for( var column in columnPaths ) { + columns.push( column.split(".").slice(1) ); + } + return columns; + }, + _main_template: function() { return ( + { tag: "DIV", cls: this._baseCls, id: this.id(), children: [ + this._downloadButton, + this._downloadLink, + { tag: "PRE", text: this._csvText } + ] } + ); }, + _csv_template: function( columns, results ) { + return this._header_template( columns ) + LINE_SEPARATOR + this._results_template( columns, results ); + }, + _header_template: function( columns ) { + return columns.map( function( column ) { + return column.join("."); + }).join( CELL_SEPARATOR ); + }, + _results_template: function( columns, results ) { + return results.map( function( result ) { + return columns.map( function( column ) { + var l = 0, + ptr = result; + while( l !== column.length && ptr != null ) { + ptr = ptr[ column[ l++ ] ]; + } + return ( ptr == null ) ? "" : ( CELL_QUOTE + ptr.toString().replace(/"/g, '""') + CELL_QUOTE ); + }).join( CELL_SEPARATOR ); + }).join( LINE_SEPARATOR ); + } + }); + +})( this.jQuery, this.app, this.joey ); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/dateHistogram/dateHistogram.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/dateHistogram/dateHistogram.js new file mode 100644 index 000000000..7c750b604 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/dateHistogram/dateHistogram.js @@ -0,0 +1,104 @@ +(function( app, i18n, raphael ) { + + var ui = app.ns("ui"); + + ui.DateHistogram = ui.AbstractWidget.extend({ + defaults: { + printEl: null, // (optional) if supplied, clicking on elements in the histogram changes the query + cluster: null, // (required) + query: null, // (required) the current query + spec: null // (required) // date field spec + }, + init: function() { + this._super(); + this.el = $(this._main_template()); + this.query = this.config.query.clone(); + // check if the index/types have changed and rebuild the histogram + this.config.query.on("results", function(query) { + if(this.queryChanged) { + this.buildHistogram(query); + this.queryChanged = false; + } + }.bind(this)); + this.config.query.on("setIndex", function(query, params) { + this.query.setIndex(params.index, params.add); + this.queryChanged = true; + }.bind(this)); + this.config.query.on("setType", function(query, params) { + this.query.setType(params.type, params.add); + this.queryChanged = true; + }.bind(this)); + this.query.search.size = 0; + this.query.on("results", this._stat_handler); + this.query.on("results", this._aggs_handler); + this.buildHistogram(); + }, + buildHistogram: function(query) { + this.statAggs = this.query.addAggs({ + stats: { field: this.config.spec.field_name } + }); + this.query.query(); + this.query.removeAggs(this.statAggs); + }, + _stat_handler: function(query, results) { + if(! results.aggregations[this.statAggs]) { return; } + this.stats = results.aggregations[this.statAggs]; + // here we are calculating the approximate range that will give us less than 121 columns + var rangeNames = [ "year", "year", "month", "day", "hour", "minute" ]; + var rangeFactors = [100000, 12, 30, 24, 60, 60000 ]; + this.intervalRange = 1; + var range = this.stats.max - this.stats.min; + do { + this.intervalName = rangeNames.pop(); + var factor = rangeFactors.pop(); + this.intervalRange *= factor; + range = range / factor; + } while(range > 70); + this.dateAggs = this.query.addAggs({ + date_histogram : { + field: this.config.spec.field_name, + interval: this.intervalName + } + }); + this.query.query(); + this.query.removeAggs(this.dateAggs); + }, + _aggs_handler: function(query, results) { + if(! results.aggregations[this.dateAggs]) { return; } + var buckets = [], range = this.intervalRange; + var min = Math.floor(this.stats.min / range) * range; + var prec = [ "year", "month", "day", "hour", "minute", "second" ].indexOf(this.intervalName); + results.aggregations[this.dateAggs].buckets.forEach(function(entry) { + buckets[parseInt((entry.key - min) / range , 10)] = entry.doc_count; + }, this); + for(var i = 0; i < buckets.length; i++) { + buckets[i] = buckets[i] || 0; + } + this.el.removeClass("loading"); + var el = this.el.empty(); + var w = el.width(), h = el.height(); + var r = raphael(el[0], w, h ); + var printEl = this.config.printEl; + query = this.config.query; + r.g.barchart(0, 0, w, h, [buckets], { gutter: "0", vgutter: 0 }).hover( + function() { + this.flag = r.g.popup(this.bar.x, h - 5, this.value || "0").insertBefore(this); + }, function() { + this.flag.animate({opacity: 0}, 200, ">", function () {this.remove();}); + } + ).click(function() { + if(printEl) { + printEl.val(window.dateRangeParser.print(min + this.bar.index * range, prec)); + printEl.trigger("keyup"); + query.query(); + } + }); + }, + _main_template: function() { return ( + { tag: "DIV", cls: "uiDateHistogram loading", css: { height: "50px" }, children: [ + i18n.text("General.LoadingAggs") + ] } + ); } + }); + +})( this.app, this.i18n, this.Raphael );
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/dialogPanel/dialogPanel.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/dialogPanel/dialogPanel.js new file mode 100644 index 000000000..80176fda8 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/dialogPanel/dialogPanel.js @@ -0,0 +1,22 @@ +(function( app ) { + + var ui = app.ns("ui"); + + ui.DialogPanel = ui.DraggablePanel.extend({ + _commit_handler: function(jEv) { + this.fire("commit", this, { jEv: jEv }); + }, + _main_template: function() { + var t = this._super(); + t.children.push(this._actionsBar_template()); + return t; + }, + _actionsBar_template: function() { + return { tag: "DIV", cls: "pull-right", children: [ + new app.ui.Button({ label: "Cancel", onclick: this._close_handler }), + new app.ui.Button({ label: "OK", onclick: this._commit_handler }) + ]}; + } + }); + +})( this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/draggablePanel/draggablePanel.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/draggablePanel/draggablePanel.js new file mode 100644 index 000000000..ee0a98a14 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/draggablePanel/draggablePanel.js @@ -0,0 +1,42 @@ +(function( $, app ) { + + var ui = app.ns("ui"); + + ui.DraggablePanel = ui.AbstractPanel.extend({ + defaults: { + // title: "" // (required) text for the panel title + }, + + _baseCls: "uiPanel", + + init: function() { + this._super(); + this.body = $(this._body_template()); + this.title = $(this._title_template()); + this.el = $.joey( this._main_template() ); + this.el.css( { width: this.config.width } ); + this.dd = new app.ux.DragDrop({ + pickupSelector: this.el.find(".uiPanel-titleBar"), + dragObj: this.el + }); + // open the panel if set in configuration + this.config.open && this.open(); + }, + + setBody: function(body) { + this.body.empty().append(body); + }, + _body_template: function() { return { tag: "DIV", cls: "uiPanel-body", css: { height: this.config.height + (this.config.height === 'auto' ? "" : "px" ) }, children: [ this.config.body ] }; }, + _title_template: function() { return { tag: "SPAN", cls: "uiPanel-title", text: this.config.title }; }, + _main_template: function() { return ( + { tag: "DIV", id: this.id(), cls: this._baseCls, children: [ + { tag: "DIV", cls: "uiPanel-titleBar", children: [ + { tag: "DIV", cls: "uiPanel-close", onclick: this._close_handler, text: "x" }, + this.title + ]}, + this.body + ] } + ); } + }); + +})( this.jQuery, this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/filterBrowser/filterBrowser.css b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/filterBrowser/filterBrowser.css new file mode 100644 index 000000000..d9acccf3b --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/filterBrowser/filterBrowser.css @@ -0,0 +1,9 @@ +.uiFilterBrowser-row * { + margin-right: 0.4em; +} + +.uiFilterBrowser-row BUTTON { + height: 22px; + position: relative; + top: 1px; +} diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/filterBrowser/filterBrowser.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/filterBrowser/filterBrowser.js new file mode 100644 index 000000000..ca03154d3 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/filterBrowser/filterBrowser.js @@ -0,0 +1,205 @@ +(function( $, app, i18n ) { + + var ui = app.ns("ui"); + var data = app.ns("data"); + var ut = app.ns("ut"); + + ui.FilterBrowser = ui.AbstractWidget.extend({ + defaults: { + cluster: null, // (required) instanceof app.services.Cluster + index: "" // (required) name of the index to query + }, + + init: function(parent) { + this._super(); + this._cluster = this.config.cluster; + this.el = $(this._main_template()); + this.filtersEl = this.el.find(".uiFilterBrowser-filters"); + this.attach( parent ); + new data.MetaDataFactory({ cluster: this._cluster, onReady: function(metadata, eventData) { + this.metadata = metadata; + this._createFilters_handler(eventData.originalData.metadata.indices); + }.bind(this) }); + }, + + _createFilters_handler: function(data) { + var filters = []; + function scan_properties(path, obj) { + if (obj.properties) { + for (var prop in obj.properties) { + scan_properties(path.concat(prop), obj.properties[prop]); + } + } else { + // handle multi_field + if (obj.fields) { + for (var subField in obj.fields) { + filters.push({ path: (path[path.length - 1] !== subField) ? path.concat(subField) : path, type: obj.fields[subField].type, meta: obj.fields[subField] }); + } + } else { + filters.push({ path: path, type: obj.type, meta: obj }); + } + } + } + for(var type in data[this.config.index].mappings) { + scan_properties([type], data[this.config.index].mappings[type]); + } + + filters.sort( function(a, b) { + var x = a.path.join("."); + var y = b.path.join("."); + return (x < y) ? -1 : (x > y) ? 1 : 0; + }); + + this.filters = [ + { path: ["match_all"], type: "match_all", meta: {} }, + { path: ["_all"], type: "_all", meta: {}} + ].concat(filters); + + this._addFilterRow_handler(); + }, + + _addFilterRow_handler: function() { + this.filtersEl.append(this._filter_template()); + }, + + _removeFilterRow_handler: function(jEv) { + $(jEv.target).closest("DIV.uiFilterBrowser-row").remove(); + if(this.filtersEl.children().length === 0) { + this._addFilterRow_handler(); + } + }, + + _search_handler: function() { + var search = new data.BoolQuery(); + search.setSize( this.el.find(".uiFilterBrowser-outputSize").val() ) + this.fire("startingSearch"); + this.filtersEl.find(".uiFilterBrowser-row").each(function(i, row) { + row = $(row); + var bool = row.find(".bool").val(); + var field = row.find(".field").val(); + var op = row.find(".op").val(); + var value = {}; + if(field === "match_all") { + op = "match_all"; + } else if(op === "range") { + var lowqual = row.find(".lowqual").val(), + highqual = row.find(".highqual").val(); + if(lowqual.length) { + value[row.find(".lowop").val()] = lowqual; + } + if(highqual.length) { + value[row.find(".highop").val()] = highqual; + } + } else if(op === "fuzzy") { + var qual = row.find(".qual").val(), + fuzzyqual = row.find(".fuzzyqual").val(); + if(qual.length) { + value["value"] = qual; + } + if(fuzzyqual.length) { + value[row.find(".fuzzyop").val()] = fuzzyqual; + } + } else { + value = row.find(".qual").val(); + } + search.addClause(value, field, op, bool); + }); + if(this.el.find(".uiFilterBrowser-showSrc").attr("checked")) { + this.fire("searchSource", search.search); + } + this._cluster.post( this.config.index + "/_search", search.getData(), this._results_handler ); + }, + + _results_handler: function( data ) { + var type = this.el.find(".uiFilterBrowser-outputFormat").val(); + this.fire("results", this, { type: type, data: data, metadata: this.metadata }); + }, + + _changeQueryField_handler: function(jEv) { + var select = $(jEv.target); + var spec = select.children(":selected").data("spec"); + select.siblings().remove(".op,.qual,.range,.fuzzy"); + var ops = []; + if(spec.type === 'match_all') { + } else if(spec.type === '_all') { + ops = ["query_string"]; + } else if(spec.type === 'string' || spec.type === 'text' || spec.type === 'keyword') { + ops = ["term", "wildcard", "prefix", "fuzzy", "range", "query_string", "text", "missing"]; + } else if(spec.type === 'long' || spec.type === 'integer' || spec.type === 'float' || + spec.type === 'byte' || spec.type === 'short' || spec.type === 'double') { + ops = ["term", "range", "fuzzy", "query_string", "missing"]; + } else if(spec.type === 'date') { + ops = ["term", "range", "fuzzy", "query_string", "missing"]; + } else if(spec.type === 'geo_point') { + ops = ["missing"]; + } else if(spec.type === 'ip') { + ops = ["term", "range", "fuzzy", "query_string", "missing"]; + } else if(spec.type === 'boolean') { + ops = ["term"] + } + select.after({ tag: "SELECT", cls: "op", onchange: this._changeQueryOp_handler, children: ops.map(ut.option_template) }); + select.next().change(); + }, + + _changeQueryOp_handler: function(jEv) { + var op = $(jEv.target), opv = op.val(); + op.siblings().remove(".qual,.range,.fuzzy"); + if(opv === 'term' || opv === 'wildcard' || opv === 'prefix' || opv === "query_string" || opv === 'text') { + op.after({ tag: "INPUT", cls: "qual", type: "text" }); + } else if(opv === 'range') { + op.after(this._range_template()); + } else if(opv === 'fuzzy') { + op.after(this._fuzzy_template()); + } + }, + + _main_template: function() { + return { tag: "DIV", children: [ + { tag: "DIV", cls: "uiFilterBrowser-filters" }, + { tag: "BUTTON", type: "button", text: i18n.text("General.Search"), onclick: this._search_handler }, + { tag: "LABEL", children: + i18n.complex("FilterBrowser.OutputType", { tag: "SELECT", cls: "uiFilterBrowser-outputFormat", children: [ + { text: i18n.text("Output.Table"), value: "table" }, + { text: i18n.text("Output.JSON"), value: "json" }, + { text: i18n.text("Output.CSV"), value: "csv" } + ].map(function( o ) { return $.extend({ tag: "OPTION" }, o ); } ) } ) + }, + { tag: "LABEL", children: + i18n.complex("FilterBrowser.OutputSize", { tag: "SELECT", cls: "uiFilterBrowser-outputSize", + children: [ "10", "50", "250", "1000", "5000", "25000" ].map( ut.option_template ) + } ) + }, + { tag: "LABEL", children: [ { tag: "INPUT", type: "checkbox", cls: "uiFilterBrowser-showSrc" }, i18n.text("Output.ShowSource") ] } + ]}; + }, + + _filter_template: function() { + return { tag: "DIV", cls: "uiFilterBrowser-row", children: [ + { tag: "SELECT", cls: "bool", children: ["must", "must_not", "should"].map(ut.option_template) }, + { tag: "SELECT", cls: "field", onchange: this._changeQueryField_handler, children: this.filters.map(function(f) { + return { tag: "OPTION", data: { spec: f }, value: f.path.join("."), text: f.path.join(".") }; + })}, + { tag: "BUTTON", type: "button", text: "+", onclick: this._addFilterRow_handler }, + { tag: "BUTTON", type: "button", text: "-", onclick: this._removeFilterRow_handler } + ]}; + }, + + _range_template: function() { + return { tag: "SPAN", cls: "range", children: [ + { tag: "SELECT", cls: "lowop", children: ["gt", "gte"].map(ut.option_template) }, + { tag: "INPUT", type: "text", cls: "lowqual" }, + { tag: "SELECT", cls: "highop", children: ["lt", "lte"].map(ut.option_template) }, + { tag: "INPUT", type: "text", cls: "highqual" } + ]}; + }, + + _fuzzy_template: function() { + return { tag: "SPAN", cls: "fuzzy", children: [ + { tag: "INPUT", cls: "qual", type: "text" }, + { tag: "SELECT", cls: "fuzzyop", children: ["max_expansions", "min_similarity"].map(ut.option_template) }, + { tag: "INPUT", cls: "fuzzyqual", type: "text" } + ]}; + } + }); + +})( this.jQuery, this.app, this.i18n ); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/header/header.css b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/header/header.css new file mode 100644 index 000000000..b61badf12 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/header/header.css @@ -0,0 +1,10 @@ +.uiHeader { + padding: 3px 10px; +} + +.uiHeader-name, .uiHeader-status { + font-size: 1.2em; + font-weight: bold; + padding: 0 10px; +} + diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/header/header.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/header/header.js new file mode 100644 index 000000000..a6e1155ec --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/header/header.js @@ -0,0 +1,73 @@ +(function( $, app, i18n ) { + + var ui = app.ns("ui"); + + ui.Header = ui.AbstractWidget.extend({ + defaults: { + cluster: null, + clusterState: null + }, + _baseCls: "uiHeader", + init: function() { + this._clusterConnect = new ui.ClusterConnect({ + cluster: this.config.cluster + }); + var quicks = [ + { text: i18n.text("Nav.Info"), path: "" }, + { text: i18n.text("Nav.Status"), path: "_stats" }, + { text: i18n.text("Nav.NodeStats"), path: "_nodes/stats" }, + { text: i18n.text("Nav.ClusterNodes"), path: "_nodes" }, + { text: i18n.text("Nav.Plugins"), path: "_nodes/plugins" }, + { text: i18n.text("Nav.ClusterState"), path: "_cluster/state" }, + { text: i18n.text("Nav.ClusterHealth"), path: "_cluster/health" }, + { text: i18n.text("Nav.Templates"), path: "_template" } + ]; + var cluster = this.config.cluster; + var quickPanels = {}; + var menuItems = quicks.map( function( item ) { + return { text: item.text, onclick: function() { + cluster.get( item.path, function( data ) { + quickPanels[ item.path ] && quickPanels[ item.path ].el && quickPanels[ item.path ].remove(); + quickPanels[ item.path ] = new ui.JsonPanel({ + title: item.text, + json: data + }); + } ); + } }; + }, this ); + this._quickMenu = new ui.MenuButton({ + label: i18n.text("NodeInfoMenu.Title"), + menu: new ui.MenuPanel({ + items: menuItems + }) + }); + this.el = $.joey( this._main_template() ); + this.nameEl = this.el.find(".uiHeader-name"); + this.statEl = this.el.find(".uiHeader-status"); + this._clusterState = this.config.clusterState; + this._clusterState.on("data", function( state ) { + var shards = state.status._shards; + var colour = state.clusterHealth.status; + var name = state.clusterState.cluster_name; + this.nameEl.text( name ); + this.statEl + .text( i18n.text("Header.ClusterHealth", colour, shards.successful, shards.total ) ) + .css( "background", colour ); + }.bind(this)); + this.statEl.text( i18n.text("Header.ClusterNotConnected") ).css("background", "grey"); + this._clusterState.refresh(); + }, + _main_template: function() { return ( + { tag: "DIV", cls: this._baseCls, children: [ + this._clusterConnect, + { tag: "SPAN", cls: "uiHeader-name" }, + { tag: "SPAN", cls: "uiHeader-status" }, + { tag: "H1", text: i18n.text("General.Elasticsearch") }, + { tag: "SPAN", cls: "pull-right", children: [ + this._quickMenu + ] } + ] } + ); } + } ); + +})( this.jQuery, this.app, this.i18n ); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/helpPanel/helpPanel.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/helpPanel/helpPanel.js new file mode 100644 index 000000000..a76be2dbb --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/helpPanel/helpPanel.js @@ -0,0 +1,21 @@ +(function( app ){ + + var ui = app.ns("ui"); + + ui.HelpPanel = ui.InfoPanel.extend({ + defaults: { + ref: "", + open: true, + autoRemove: true, + modal: false, + width: 500, + height: 450, + title: i18n.text("General.Help") + }, + init: function() { + this._super(); + this.body.append(i18n.text(this.config.ref)); + } + }); + +})( this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/indexOverview/indexOverview.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/indexOverview/indexOverview.js new file mode 100644 index 000000000..3eab4f5b4 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/indexOverview/indexOverview.js @@ -0,0 +1,115 @@ +(function( $, app, i18n ) { + + var ui = app.ns("ui"); + var ut = app.ns("ut"); + + ui.IndexOverview = ui.Page.extend({ + defaults: { + cluster: null + }, + init: function() { + this._super(); + this.cluster = this.config.cluster; + this._clusterState = this.config.clusterState; + this._clusterState.on("data", this._refresh_handler ); + this.el = $(this._main_template()); + this._refresh_handler(); + }, + remove: function() { + this._clusterState.removeObserver( "data", this._refresh_handler ); + }, + _refresh_handler: function() { + var state = this._clusterState; + var view = { + indices: acx.eachMap( state.status.indices, function( name, index ) { + return { + name: name, + state: index + }; + }).sort( function( a, b ) { + return a.name < b.name ? -1 : 1; + }) + }; + this._indexViewEl && this._indexViewEl.remove(); + this._indexViewEl = $( this._indexTable_template( view ) ); + this.el.find(".uiIndexOverview-table").append( this._indexViewEl ); + }, + _newIndex_handler: function() { + var fields = new app.ux.FieldCollection({ + fields: [ + new ui.TextField({ label: i18n.text("ClusterOverView.IndexName"), name: "_name", require: true }), + new ui.TextField({ + label: i18n.text("ClusterOverview.NumShards"), + name: "number_of_shards", + value: "5", + require: function( val ) { return parseInt( val, 10 ) >= 1; } + }), + new ui.TextField({ + label: i18n.text("ClusterOverview.NumReplicas"), + name: "number_of_replicas", + value: "1", + require: function( val ) { return parseInt( val, 10 ) >= 0; } + }) + ] + }); + var dialog = new ui.DialogPanel({ + title: i18n.text("ClusterOverview.NewIndex"), + body: new ui.PanelForm({ fields: fields }), + onCommit: function(panel, args) { + if(fields.validate()) { + var data = fields.getData(); + var name = data["_name"]; + delete data["_name"]; + this.config.cluster.put( encodeURIComponent( name ), JSON.stringify({ settings: { index: data } }), function(d) { + dialog.close(); + alert(JSON.stringify(d)); + this._clusterState.refresh(); + }.bind(this) ); + } + }.bind(this) + }).open(); + }, + _indexTable_template: function( view ) { return ( + { tag: "TABLE", cls: "table", children: [ + { tag: "THEAD", children: [ + { tag: "TR", children: [ + { tag: "TH" }, + { tag: "TH", children: [ + { tag: "H3", text: "Size" } + ] }, + { tag: "TH", children: [ + { tag: "H3", text: "Docs" } + ] } + ] } + ] }, + { tag: "TBODY", cls: "striped", children: view.indices.map( this._index_template, this ) } + ] } + ); }, + + _index_template: function( index ) { return ( + { tag: "TR", children: [ + { tag: "TD", children: [ + { tag: "H3", text: index.name } + ] }, + { tag: "TD", text: ut.byteSize_template( index.state.primaries.store.size_in_bytes ) + "/" + ut.byteSize_template( index.state.total.store.size_in_bytes ) }, + { tag: "TD", text: ut.count_template( index.state.primaries.docs.count ) } + ] } + ); }, + _main_template: function() { + return { tag: "DIV", id: this.id(), cls: "uiIndexOverview", children: [ + new ui.Toolbar({ + label: i18n.text("IndexOverview.PageTitle"), + left: [ + new ui.Button({ + label: i18n.text("ClusterOverview.NewIndex"), + onclick: this._newIndex_handler + }), + ] + }), + { tag: "DIV", cls: "uiIndexOverview-table", children: this._indexViewEl } + ] }; + } + + }); + +})( this.jQuery, this.app, this.i18n ); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/indexSelector/indexSelector.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/indexSelector/indexSelector.js new file mode 100644 index 000000000..7f51d5f74 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/indexSelector/indexSelector.js @@ -0,0 +1,45 @@ +(function( $, app, i18n ) { + + var ui = app.ns("ui"); + + ui.IndexSelector = ui.AbstractWidget.extend({ + init: function(parent) { + this._super(); + this.el = $(this._main_template()); + this.attach( parent ); + this.cluster = this.config.cluster; + this.update(); + }, + update: function() { + this.cluster.get( "_stats", this._update_handler ); + }, + + _update_handler: function(data) { + var options = []; + var index_names = Object.keys(data.indices).sort(); + for(var i=0; i < index_names.length; i++) { + name = index_names[i]; + options.push(this._option_template(name, data.indices[name])); + } + this.el.find(".uiIndexSelector-select").empty().append(this._select_template(options)); + this._indexChanged_handler(); + }, + + _main_template: function() { + return { tag: "DIV", cls: "uiIndexSelector", children: i18n.complex( "IndexSelector.SearchIndexForDocs", { tag: "SPAN", cls: "uiIndexSelector-select" } ) }; + }, + + _indexChanged_handler: function() { + this.fire("indexChanged", this.el.find("SELECT").val()); + }, + + _select_template: function(options) { + return { tag: "SELECT", children: options, onChange: this._indexChanged_handler }; + }, + + _option_template: function(name, index) { + return { tag: "OPTION", value: name, text: i18n.text("IndexSelector.NameWithDocs", name, index.primaries.docs.count ) }; + } + }); + +})( this.jQuery, this.app, this.i18n ); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/infoPanel/infoPanel.css b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/infoPanel/infoPanel.css new file mode 100644 index 000000000..7d4a86c79 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/infoPanel/infoPanel.css @@ -0,0 +1,38 @@ + +.uiInfoPanel { + background: rgba(0, 0, 0, 0.75); + color: white; + border-radius: 8px; + padding: 1px; +} +.uiInfoPanel .uiPanel-titleBar { + background: rgba(74, 74, 74, 0.75); + background: -moz-linear-gradient(top, rgba(84, 84, 84, 0.75), rgba(54, 54, 54, 0.75), rgba(64, 64, 64, 0.75)); + background: -webkit-linear-gradient(top, rgba(84, 84, 84, 0.75), rgba(54, 54, 54, 0.75), rgba(64, 64, 64, 0.75)); + border-radius: 8px 8px 0 0; + padding: 1px 0 2px 0; + border-bottom: 0; +} +.uiInfoPanel .uiPanel-close { + border-radius: 6px; + height: 13px; + width: 13px; + background: #ccc; + left: 3px; + top: 1px; + color: #333; + text-shadow: #222 0 0 1px; + line-height: 11px; + border: 0; + padding: 0; +} +.uiInfoPanel .uiPanel-close:hover { + background: #eee; +} + +.uiInfoPanel .uiPanel-body { + background: transparent; + padding: 20px; + border-radius: 0 0 8px 8px; + border: 1px solid #222; +} diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/infoPanel/infoPanel.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/infoPanel/infoPanel.js new file mode 100644 index 000000000..db2440074 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/infoPanel/infoPanel.js @@ -0,0 +1,9 @@ +(function( app ) { + + var ui = app.ns("ui"); + + ui.InfoPanel = ui.DraggablePanel.extend({ + _baseCls: "uiPanel uiInfoPanel" + }); + +})( this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/jsonPanel/jsonPanel.css b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/jsonPanel/jsonPanel.css new file mode 100644 index 000000000..20aff8817 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/jsonPanel/jsonPanel.css @@ -0,0 +1,4 @@ +.uiJsonPanel SPAN.uiJsonPretty-string { color: #6F6; } +.uiJsonPanel SPAN.uiJsonPretty-number { color: #66F; } +.uiJsonPanel SPAN.uiJsonPretty-null { color: #F66; } +.uiJsonPanel SPAN.uiJsonPretty-boolean { color: #F6F; } diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/jsonPanel/jsonPanel.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/jsonPanel/jsonPanel.js new file mode 100644 index 000000000..4e83baade --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/jsonPanel/jsonPanel.js @@ -0,0 +1,24 @@ +(function( app ) { + + var ui = app.ns("ui"); + + ui.JsonPanel = ui.InfoPanel.extend({ + defaults: { + json: null, // (required) + modal: false, + open: true, + autoRemove: true, + height: 500, + width: 600 + }, + + _baseCls: "uiPanel uiInfoPanel uiJsonPanel", + + _body_template: function() { + var body = this._super(); + body.children = [ new ui.JsonPretty({ obj: this.config.json }) ]; + return body; + } + }); + +})( this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/jsonPretty/jsonPretty.css b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/jsonPretty/jsonPretty.css new file mode 100644 index 000000000..7a1a0ba62 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/jsonPretty/jsonPretty.css @@ -0,0 +1,22 @@ +DIV.uiJsonPretty-object { font-size: 1.26em; font-family: monospace; } +UL.uiJsonPretty-object, +UL.uiJsonPretty-array { margin: 0; padding: 0 0 0 2em; list-style: none; } +UL.uiJsonPretty-object LI, +UL.uiJsonPretty-array LI { padding: 0; margin: 0; } +.expando > SPAN.uiJsonPretty-name:before { content: "\25bc\a0"; color: #555; position: relative; top: 2px; } +.expando.uiJsonPretty-minimised > SPAN.uiJsonPretty-name:before { content: "\25ba\a0"; top: 0; } +.uiJsonPretty-minimised > UL SPAN.uiJsonPretty-name:before, +.expando .uiJsonPretty-minimised > UL SPAN.uiJsonPretty-name:before { content: ""; } +SPAN.uiJsonPretty-string, +SPAN.uiJsonPretty-string A { color: green; } +SPAN.uiJsonPretty-string A { text-decoration: underline;} +SPAN.uiJsonPretty-number { color: blue; } +SPAN.uiJsonPretty-null { color: red; } +SPAN.uiJsonPretty-boolean { color: purple; } +.expando > .uiJsonPretty-name { cursor: pointer; } +.expando > .uiJsonPretty-name:hover { text-decoration: underline; } +.uiJsonPretty-minimised { white-space: nowrap; overflow: hidden; } +.uiJsonPretty-minimised > UL { opacity: 0.6; } +.uiJsonPretty-minimised .uiJsonPretty-minimised > UL { opacity: 1; } +.uiJsonPretty-minimised UL, .uiJsonPretty-minimised LI { display: inline; padding: 0; } + diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/jsonPretty/jsonPretty.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/jsonPretty/jsonPretty.js new file mode 100644 index 000000000..76820bb39 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/jsonPretty/jsonPretty.js @@ -0,0 +1,89 @@ +(function( $, app ) { + + var ui = app.ns("ui"); + + ui.JsonPretty = ui.AbstractWidget.extend({ + defaults: { + obj: null + }, + init: function(parent) { + this._super(); + this.el = $(this._main_template()); + this.attach(parent); + this.el.click(this._click_handler); + }, + + _click_handler: function(jEv) { + var t = $(jEv.target).closest(".uiJsonPretty-name").closest("LI"); + if(t.length === 0 || t.parents(".uiJsonPretty-minimised").length > 0) { return; } + t.toggleClass("uiJsonPretty-minimised"); + jEv.stopPropagation(); + }, + + _main_template: function() { + try { + return { tag: "DIV", cls: "uiJsonPretty", children: this.pretty.parse(this.config.obj) }; + } catch (error) { + throw "JsonPretty error: " + error.message; + } + }, + + pretty: { // from https://github.com/RyanAmos/Pretty-JSON/blob/master/pretty_json.js + "expando" : function(value) { + return (value && (/array|object/i).test(value.constructor.name)) ? "expando" : ""; + }, + "parse": function (member) { + return this[(member == null) ? 'null' : member.constructor.name.toLowerCase()](member); + }, + "null": function (value) { + return this['value']('null', 'null'); + }, + "array": function (value) { + var results = []; + var lastItem = value.length - 1; + value.forEach(function( v, i ) { + results.push({ tag: "LI", cls: this.expando(v), children: [ this['parse'](v) ] }); + if( i !== lastItem ) { + results.push(","); + } + }, this); + return [ "[ ", ((results.length > 0) ? { tag: "UL", cls: "uiJsonPretty-array", children: results } : null), "]" ]; + }, + "object": function (value) { + var results = []; + var keys = Object.keys( value ); + var lastItem = keys.length - 1; + keys.forEach( function( key, i ) { + var children = [ this['value']( 'name', '"' + key + '"' ), ": ", this['parse']( value[ key ]) ]; + if( i !== lastItem ) { + children.push(","); + } + results.push( { tag: "LI", cls: this.expando( value[ key ] ), children: children } ); + }, this); + return [ "{ ", ((results.length > 0) ? { tag: "UL", cls: "uiJsonPretty-object", children: results } : null ), "}" ]; + }, + "number": function (value) { + return this['value']('number', value.toString()); + }, + "string": function (value) { + if (/^(http|https|file):\/\/[^\s]+$/.test(value)) { + return this['link']( value ); + } else { + return this['value']('string', '"' + value.toString() + '"'); + } + }, + "boolean": function (value) { + return this['value']('boolean', value.toString()); + }, + "link": function( value ) { + return this['value']("string", { tag: "A", href: value, target: "_blank", text: '"' + value + '"' } ); + }, + "value": function (type, value) { + if (/^(http|https|file):\/\/[^\s]+$/.test(value)) { + } + return { tag: "SPAN", cls: "uiJsonPretty-" + type, text: value }; + } + } + }); + +})( this.jQuery, this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/menuButton/menuButton.css b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/menuButton/menuButton.css new file mode 100644 index 000000000..21c36bc59 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/menuButton/menuButton.css @@ -0,0 +1,11 @@ +.uiMenuButton { + display: inline-block; +} + +.uiMenuButton .uiButton-label { + background-image: url('data:image/gif;base64,R0lGODlhDwAPAIABAP///////yH5BAEAAAEALAAAAAAPAA8AAAITjI+py+0P4wG0gmavq1HLD4ZiAQA7'); + background-position: right 50%; + background-repeat: no-repeat; + padding-right: 17px; + text-align: left; +} diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/menuButton/menuButton.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/menuButton/menuButton.js new file mode 100644 index 000000000..aa7fc8a84 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/menuButton/menuButton.js @@ -0,0 +1,22 @@ +(function( $, app ) { + + var ui = app.ns("ui"); + + ui.MenuButton = app.ui.Button.extend({ + defaults: { + menu: null + }, + _baseCls: "uiButton uiMenuButton", + init: function(parent) { + this._super(parent); + this.menu = this.config.menu; + this.on("click", this.openMenu_handler); + this.menu.on("open", function() { this.el.addClass("active"); }.bind(this)); + this.menu.on("close", function() { this.el.removeClass("active"); }.bind(this)); + }, + openMenu_handler: function(jEv) { + this.menu && this.menu.open(jEv); + } + }); + +})( this.jQuery, this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/menuPanel/menuPanel.css b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/menuPanel/menuPanel.css new file mode 100644 index 000000000..8236a856f --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/menuPanel/menuPanel.css @@ -0,0 +1,30 @@ +.uiMenuPanel { + border: 1px solid #668dc6; + position: absolute; + background: #96c6eb; + color: white; +} + +.uiMenuPanel LI { + list-style: none; + border-bottom: 1px solid #668dc6; +} + +.uiMenuPanel LI:hover { + background: #2575b7; +} + +.uiMenuPanel LI:last-child { + border-bottom: 0; +} + +.uiMenuPanel-label { + white-space: nowrap; + padding: 2px 10px 2px 10px; + cursor: pointer; +} + +.disabled .uiMenuPanel-label { + cursor: auto; + color: #888; +} diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/menuPanel/menuPanel.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/menuPanel/menuPanel.js new file mode 100644 index 000000000..631ea5b4c --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/menuPanel/menuPanel.js @@ -0,0 +1,43 @@ +(function( app ) { + + var ui = app.ns("ui"); + + ui.MenuPanel = ui.AbstractPanel.extend({ + defaults: { + items: [], // (required) an array of menu items + modal: false + }, + _baseCls: "uiMenuPanel", + init: function() { + this._super(); + this.el = $(this._main_template()); + }, + open: function(jEv) { + this._super(jEv); + var cx = this; setTimeout(function() { $(document).bind("click", cx._close_handler); }, 50); + }, + _getItems: function() { + return this.config.items; + }, + _close_handler: function(jEv) { + this._super(jEv); + $(document).unbind("click", this._close_handler); + }, + _main_template: function() { + return { tag: "DIV", cls: this._baseCls, children: this._getItems().map(this._menuItem_template, this) }; + }, + _menuItem_template: function(item) { + var dx = item.disabled ? { onclick: function() {} } : {}; + return { tag: "LI", cls: "uiMenuPanel-item" + (item.disabled ? " disabled" : "") + (item.selected ? " selected" : ""), children: [ $.extend({ tag: "DIV", cls: "uiMenuPanel-label" }, item, dx ) ] }; + }, + _getPosition: function(jEv) { + var right = !! $(jEv.target).parents(".pull-right").length; + var parent = $(jEv.target).closest("BUTTON"); + return parent.vOffset() + .addY(parent.vSize().y) + .addX( right ? parent.vSize().x - this.el.vOuterSize().x : 0 ) + .asOffset(); + } + }); + +})( this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/nodesView/nodesView.css b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/nodesView/nodesView.css new file mode 100644 index 000000000..e7a7778f3 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/nodesView/nodesView.css @@ -0,0 +1,88 @@ +.uiNodesView TH, +.uiNodesView TD { + vertical-align: top; + padding: 2px 20px; +} + +.uiNodesView TH.close, +.uiNodesView TD.close { + color: #888; + background: #f2f2f2; +} + +.uiNodesView .uiMenuButton .uiButton-content { + padding-right: 3px; + border-radius: 8px; + height: 14px; +} + +.uiNodesView .uiMenuButton.active .uiButton-content, +.uiNodesView .uiMenuButton:active .uiButton-content { + border-bottom-right-radius: 0px; + border-bottom-left-radius: 0px; +} + +.uiNodesView .uiMenuButton .uiButton-label { + padding: 0px 17px 0px 7px; +} + +.uiNodesView-hasAlias { + text-align: center; +} +.uiNodesView-hasAlias.max { + border-top-right-radius: 8px; + border-bottom-right-radius: 8px; +} +.uiNodesView-hasAlias.min { + border-top-left-radius: 8px; + border-bottom-left-radius: 8px; +} +.uiNodesView-hasAlias-remove { + float: right; + font-weight: bold; + cursor: pointer; +} + +.uiNodesView TD.uiNodesView-icon { + padding: 20px 0px 15px 20px; +} + +.uiNodesView-node:nth-child(odd) { + background: #eee; +} + +.uiNodesView-routing { + position: relative; + min-width: 90px; +} + +.uiNodesView-nullReplica, +.uiNodesView-replica { + box-sizing: border-box; + cursor: pointer; + float: left; + height: 40px; + width: 35px; + margin: 4px; + border: 2px solid #444; + padding: 2px; + font-size: 32px; + line-height: 32px; + text-align: center; + letter-spacing: -5px; + text-indent: -7px; +} + +.uiNodesView-replica.primary { + border-width: 4px; + line-height: 29px; +} + +.uiNodesView-nullReplica { + border-color: transparent; +} + +.uiNodesView-replica.state-UNASSIGNED { background: #eeeeee; color: #999; border-color: #666; float: none; display: inline-block; } +.uiNodesView-replica.state-INITIALIZING { background: #dddc88; } +.uiNodesView-replica.state-STARTED { background: #99dd88; } +.uiNodesView-replica.state-RELOCATING { background: #dc88dd; } diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/nodesView/nodesView.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/nodesView/nodesView.js new file mode 100644 index 000000000..08ce1d301 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/nodesView/nodesView.js @@ -0,0 +1,277 @@ +(function( app, i18n, joey ) { + + var ui = app.ns("ui"); + var ut = app.ns("ut"); + + ui.NodesView = ui.AbstractWidget.extend({ + defaults: { + interactive: true, + aliasRenderer: "list", + scaleReplicas: 1, + cluster: null, + data: null + }, + init: function() { + this._super(); + this.interactive = this.config.interactive; + this.cluster = this.config.cluster; + this._aliasRenderFunction = { + "none": this._aliasRender_template_none, + "list": this._aliasRender_template_list, + "full": this._aliasRender_template_full + }[ this.config.aliasRenderer ]; + this._styleSheetEl = joey({ tag: "STYLE", text: ".uiNodesView-nullReplica, .uiNodesView-replica { zoom: " + this.config.scaleReplicas + " }" }); + this.el = $( this._main_template( this.config.data.cluster, this.config.data.indices ) ); + }, + + _newAliasAction_handler: function( index ) { + var fields = new app.ux.FieldCollection({ + fields: [ + new ui.TextField({ label: i18n.text("AliasForm.AliasName"), name: "alias", require: true }) + ] + }); + var dialog = new ui.DialogPanel({ + title: i18n.text("AliasForm.NewAliasForIndexName", index.name), + body: new ui.PanelForm({ fields: fields }), + onCommit: function(panel, args) { + if(fields.validate()) { + var data = fields.getData(); + var command = { + "actions" : [ + { "add" : { "index" : index.name, "alias" : data["alias"] } } + ] + }; + this.config.cluster.post('_aliases', JSON.stringify(command), function(d) { + dialog.close(); + alert(JSON.stringify(d)); + this.fire("redraw"); + }.bind(this) ); + } + }.bind(this) + }).open(); + }, + _postIndexAction_handler: function(action, index, redraw) { + this.cluster.post(encodeURIComponent( index.name ) + "/" + encodeURIComponent( action ), null, function(r) { + alert(JSON.stringify(r)); + redraw && this.fire("redraw"); + }.bind(this)); + }, + _optimizeIndex_handler: function(index) { + var fields = new app.ux.FieldCollection({ + fields: [ + new ui.TextField({ label: i18n.text("OptimizeForm.MaxSegments"), name: "max_num_segments", value: "1", require: true }), + new ui.CheckField({ label: i18n.text("OptimizeForm.ExpungeDeletes"), name: "only_expunge_deletes", value: false }), + new ui.CheckField({ label: i18n.text("OptimizeForm.FlushAfter"), name: "flush", value: true }), + new ui.CheckField({ label: i18n.text("OptimizeForm.WaitForMerge"), name: "wait_for_merge", value: false }) + ] + }); + var dialog = new ui.DialogPanel({ + title: i18n.text("OptimizeForm.OptimizeIndex", index.name), + body: new ui.PanelForm({ fields: fields }), + onCommit: function( panel, args ) { + if(fields.validate()) { + this.cluster.post(encodeURIComponent( index.name ) + "/_optimize", fields.getData(), function(r) { + alert(JSON.stringify(r)); + }); + dialog.close(); + } + }.bind(this) + }).open(); + }, + _testAnalyser_handler: function(index) { + this.cluster.get(encodeURIComponent( index.name ) + "/_analyze?text=" + encodeURIComponent( prompt( i18n.text("IndexCommand.TextToAnalyze") ) ), function(r) { + alert(JSON.stringify(r, true, " ")); + }); + }, + _deleteIndexAction_handler: function(index) { + if( prompt( i18n.text("AliasForm.DeleteAliasMessage", i18n.text("Command.DELETE"), index.name ) ) === i18n.text("Command.DELETE") ) { + this.cluster["delete"](encodeURIComponent( index.name ), null, function(r) { + alert(JSON.stringify(r)); + this.fire("redraw"); + }.bind(this) ); + } + }, + _shutdownNode_handler: function(node) { + if(prompt( i18n.text("IndexCommand.ShutdownMessage", i18n.text("Command.SHUTDOWN"), node.cluster.name ) ) === i18n.text("Command.SHUTDOWN") ) { + this.cluster.post( "_cluster/nodes/" + encodeURIComponent( node.name ) + "/_shutdown", null, function(r) { + alert(JSON.stringify(r)); + this.fire("redraw"); + }.bind(this)); + } + }, + _deleteAliasAction_handler: function( index, alias ) { + if( confirm( i18n.text("Command.DeleteAliasMessage" ) ) ) { + var command = { + "actions" : [ + { "remove" : { "index" : index.name, "alias" : alias.name } } + ] + }; + this.config.cluster.post('_aliases', JSON.stringify(command), function(d) { + alert(JSON.stringify(d)); + this.fire("redraw"); + }.bind(this) ); + } + }, + + _replica_template: function(replica) { + var r = replica.replica; + return { tag: "DIV", + cls: "uiNodesView-replica" + (r.primary ? " primary" : "") + ( " state-" + r.state ), + text: r.shard.toString(), + onclick: function() { new ui.JsonPanel({ + json: replica.status || r, + title: r.index + "/" + r.node + " [" + r.shard + "]" }); + } + }; + }, + _routing_template: function(routing) { + var cell = { tag: "TD", cls: "uiNodesView-routing" + (routing.open ? "" : " close"), children: [] }; + for(var i = 0; i < routing.replicas.length; i++) { + if(i % routing.max_number_of_shards === 0 && i > 0) { + cell.children.push({ tag: "BR" }); + } + if( routing.replicas[i] ) { + cell.children.push(this._replica_template(routing.replicas[i])); + } else { + cell.children.push( { tag: "DIV", cls: "uiNodesView-nullReplica" } ); + } + } + return cell; + }, + _nodeControls_template: function( node ) { return ( + { tag: "DIV", cls: "uiNodesView-controls", children: [ + new ui.MenuButton({ + label: i18n.text("NodeInfoMenu.Title"), + menu: new ui.MenuPanel({ + items: [ + { text: i18n.text("NodeInfoMenu.ClusterNodeInfo"), onclick: function() { new ui.JsonPanel({ json: node.cluster, title: node.name });} }, + { text: i18n.text("NodeInfoMenu.NodeStats"), onclick: function() { new ui.JsonPanel({ json: node.stats, title: node.name });} } + ] + }) + }), + new ui.MenuButton({ + label: i18n.text("NodeActionsMenu.Title"), + menu: new ui.MenuPanel({ + items: [ + { text: i18n.text("NodeActionsMenu.Shutdown"), onclick: function() { this._shutdownNode_handler(node); }.bind(this) } + ] + }) + }) + ] } + ); }, + _nodeIcon_template: function( node ) { + var icon, alt; + if( node.name === "Unassigned" ) { + icon = "fa-exclamation-triangle"; + alt = i18n.text( "NodeType.Unassigned" ); + } else if( node.cluster.settings && "tribe" in node.cluster.settings) { + icon = "fa-sitemap"; + alt = i18n.text("NodeType.Tribe" ); + } else { + icon = "fa-" + (node.master_node ? "star" : "circle") + (node.data_node ? "" : "-o" ); + alt = i18n.text( node.master_node ? ( node.data_node ? "NodeType.Master" : "NodeType.Coord" ) : ( node.data_node ? "NodeType.Worker" : "NodeType.Client" ) ); + } + return { tag: "TD", title: alt, cls: "uiNodesView-icon", children: [ + { tag: "SPAN", cls: "fa fa-2x " + icon } + ] }; + }, + _node_template: function(node) { + return { tag: "TR", cls: "uiNodesView-node" + (node.master_node ? " master": ""), children: [ + this._nodeIcon_template( node ), + { tag: "TH", children: node.name === "Unassigned" ? [ + { tag: "H3", text: node.name } + ] : [ + { tag: "H3", text: node.cluster.name }, + { tag: "DIV", text: node.cluster.hostname }, + this.interactive ? this._nodeControls_template( node ) : null + ] } + ].concat(node.routings.map(this._routing_template, this))}; + }, + _indexHeaderControls_template: function( index ) { return ( + { tag: "DIV", cls: "uiNodesView-controls", children: [ + new ui.MenuButton({ + label: i18n.text("IndexInfoMenu.Title"), + menu: new ui.MenuPanel({ + items: [ + { text: i18n.text("IndexInfoMenu.Status"), onclick: function() { new ui.JsonPanel({ json: index.status, title: index.name }); } }, + { text: i18n.text("IndexInfoMenu.Metadata"), onclick: function() { new ui.JsonPanel({ json: index.metadata, title: index.name }); } } + ] + }) + }), + new ui.MenuButton({ + label: i18n.text("IndexActionsMenu.Title"), + menu: new ui.MenuPanel({ + items: [ + { text: i18n.text("IndexActionsMenu.NewAlias"), onclick: function() { this._newAliasAction_handler(index); }.bind(this) }, + { text: i18n.text("IndexActionsMenu.Refresh"), onclick: function() { this._postIndexAction_handler("_refresh", index, false); }.bind(this) }, + { text: i18n.text("IndexActionsMenu.Flush"), onclick: function() { this._postIndexAction_handler("_flush", index, false); }.bind(this) }, + { text: i18n.text("IndexActionsMenu.Optimize"), onclick: function () { this._optimizeIndex_handler(index); }.bind(this) }, + { text: i18n.text("IndexActionsMenu.Snapshot"), disabled: closed, onclick: function() { this._postIndexAction_handler("_gateway/snapshot", index, false); }.bind(this) }, + { text: i18n.text("IndexActionsMenu.Analyser"), onclick: function() { this._testAnalyser_handler(index); }.bind(this) }, + { text: (index.state === "close") ? i18n.text("IndexActionsMenu.Open") : i18n.text("IndexActionsMenu.Close"), onclick: function() { this._postIndexAction_handler((index.state === "close") ? "_open" : "_close", index, true); }.bind(this) }, + { text: i18n.text("IndexActionsMenu.Delete"), onclick: function() { this._deleteIndexAction_handler(index); }.bind(this) } + ] + }) + }) + ] } + ); }, + _indexHeader_template: function( index ) { + var closed = index.state === "close"; + var line1 = closed ? "index: close" : ( "size: " + (index.status && index.status.primaries && index.status.total ? ut.byteSize_template( index.status.primaries.store.size_in_bytes ) + " (" + ut.byteSize_template( index.status.total.store.size_in_bytes ) + ")" : "unknown" ) ); + var line2 = closed ? "\u00A0" : ( "docs: " + (index.status && index.status.primaries && index.status.primaries.docs && index.status.total && index.status.total.docs ? index.status.primaries.docs.count.toLocaleString() + " (" + (index.status.total.docs.count + index.status.total.docs.deleted).toLocaleString() + ")" : "unknown" ) ); + return index.name ? { tag: "TH", cls: (closed ? "close" : ""), children: [ + { tag: "H3", text: index.name }, + { tag: "DIV", text: line1 }, + { tag: "DIV", text: line2 }, + this.interactive ? this._indexHeaderControls_template( index ) : null + ] } : [ { tag: "TD" }, { tag: "TH" } ]; + }, + _aliasRender_template_none: function( cluster, indices ) { + return null; + }, + _aliasRender_template_list: function( cluster, indices ) { + return cluster.aliases.length && { tag: "TBODY", children: [ + { tag: "TR", children: [ + { tag: "TD" } + ].concat( indices.map( function( index ) { + return { tag: "TD", children: index.metadata && index.metadata.aliases.map( function( alias ) { + return { tag: "LI", text: alias }; + } ) }; + })) } + ] }; + }, + _aliasRender_template_full: function( cluster, indices ) { + return cluster.aliases.length && { tag: "TBODY", children: cluster.aliases.map( function(alias, row) { + return { tag: "TR", children: [ { tag: "TD" },{ tag: "TD" } ].concat(alias.indices.map(function(index, i) { + if (index) { + return { + tag: "TD", + css: { background: "#" + "9ce9c7fc9".substr((row+6)%7,3) }, + cls: "uiNodesView-hasAlias" + ( alias.min === i ? " min" : "" ) + ( alias.max === i ? " max" : "" ), + text: alias.name, + children: this.interactive ? [ + { tag: 'SPAN', + text: i18n.text("General.CloseGlyph"), + cls: 'uiNodesView-hasAlias-remove', + onclick: this._deleteAliasAction_handler.bind( this, index, alias ) + } + ]: null + }; + } else { + return { tag: "TD" }; + } + }, this ) ) }; + }, this ) }; + }, + _main_template: function(cluster, indices) { + return { tag: "TABLE", cls: "table uiNodesView", children: [ + this._styleSheetEl, + { tag: "THEAD", children: [ { tag: "TR", children: indices.map(this._indexHeader_template, this) } ] }, + this._aliasRenderFunction( cluster, indices ), + { tag: "TBODY", children: cluster.nodes.map(this._node_template, this) } + ] }; + } + + }); + +})( this.app, this.i18n, this.joey ); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/nodesView/nodesViewDemo.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/nodesView/nodesViewDemo.js new file mode 100644 index 000000000..9049163b0 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/nodesView/nodesViewDemo.js @@ -0,0 +1,17 @@ +$( function() { + + var ui = window.app.ns("ui"); + + var data = { + "cluster":{"nodes":[{"name":"cqTmT9GLSlSWx-B7pvM--w","routings":[{"name":"_river","replicas":[],"max_number_of_shards":"1","open":true},{"name":"ag_01","replicas":[null,{"replica":{"state":"STARTED","primary":true,"node":"cqTmT9GLSlSWx-B7pvM--w","relocating_node":null,"shard":1,"index":"ag_01"},"status":{"routing":{"state":"STARTED","primary":true,"node":"cqTmT9GLSlSWx-B7pvM--w","relocating_node":null,"shard":1,"index":"ag_01"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381731712637,"operations":0},"docs":{"num_docs":10328420,"max_doc":10329720,"deleted_docs":4},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"643ms","total_time_in_millis":643}}}],"max_number_of_shards":"2","open":true},{"name":"ag_02","replicas":[null,{"replica":{"state":"STARTED","primary":false,"node":"cqTmT9GLSlSWx-B7pvM--w","relocating_node":null,"shard":1,"index":"ag_02"},"status":{"routing":{"state":"STARTED","primary":false,"node":"cqTmT9GLSlSWx-B7pvM--w","relocating_node":null,"shard":1,"index":"ag_02"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381749663385,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":3,"total_time":"75ms","total_time_in_millis":75}}}],"max_number_of_shards":"3","open":true},{"name":"ag_03","replicas":[null,{"replica":{"state":"STARTED","primary":true,"node":"cqTmT9GLSlSWx-B7pvM--w","relocating_node":null,"shard":1,"index":"ag_03"},"status":{"routing":{"state":"STARTED","primary":true,"node":"cqTmT9GLSlSWx-B7pvM--w","relocating_node":null,"shard":1,"index":"ag_03"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381731770058,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"86ms","total_time_in_millis":86}}}],"max_number_of_shards":"2","open":true},{"name":"twitter_river","replicas":[],"max_number_of_shards":"5","open":false}],"master_node":false,"stats":{"timestamp":1381790346979,"name":"Elathan","transport_address":"inet[/127.0.0.1:9301]","hostname":"server","indices":{"docs":{"count":0,"deleted":0},"store":{"size":"277b","size_in_bytes":277,"throttle_time":"0s","throttle_time_in_millis":0},"indexing":{"index_total":0,"index_time":"0s","index_time_in_millis":0,"index_current":0,"delete_total":0,"delete_time":"0s","delete_time_in_millis":0,"delete_current":0},"get":{"total":0,"get_time":"0s","time_in_millis":0,"exists_total":0,"exists_time":"0s","exists_time_in_millis":0,"missing_total":0,"missing_time":"0s","missing_time_in_millis":0,"current":0},"search":{"open_contexts":0,"query_total":6,"query_time":"19ms","query_time_in_millis":19,"query_current":0,"fetch_total":0,"fetch_time":"0s","fetch_time_in_millis":0,"fetch_current":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":10,"total_time":"0s","total_time_in_millis":0},"flush":{"total":186,"total_time":"9.1s","total_time_in_millis":9191},"warmer":{"current":0,"total":3,"total_time":"6ms","total_time_in_millis":6},"filter_cache":{"memory_size":"0b","memory_size_in_bytes":0,"evictions":0},"id_cache":{"memory_size":"0b","memory_size_in_bytes":0},"fielddata":{"memory_size":"0b","memory_size_in_bytes":0,"evictions":0},"completion":{"size":"0b","size_in_bytes":0}},"os":{"timestamp":1381790346979,"uptime":"15.5m","uptime_in_millis":932146,"load_average":[1.79736328125,1.95166015625,1.904296875],"cpu":{"sys":22,"user":6,"idle":70,"stolen":0},"mem":{"free":"3.7gb","free_in_bytes":4065169408,"used":"4.2gb","used_in_bytes":4524765184,"free_percent":51,"used_percent":48,"actual_free":"4.1gb","actual_free_in_bytes":4426321920,"actual_used":"3.8gb","actual_used_in_bytes":4163612672},"swap":{"used":"2.8gb","used_in_bytes":3025272832,"free":"1.1gb","free_in_bytes":1269694464}},"process":{"timestamp":1381790346979,"open_file_descriptors":266,"cpu":{"percent":0,"sys":"2.8m","sys_in_millis":172614,"user":"2.3m","user_in_millis":142295,"total":"5.2m","total_in_millis":314909},"mem":{"resident":"21.6mb","resident_in_bytes":22728704,"share":"-1b","share_in_bytes":-1,"total_virtual":"3.6gb","total_virtual_in_bytes":3900530688}},"jvm":{"timestamp":1381790346980,"uptime":"4d","uptime_in_millis":349028405,"mem":{"heap_used":"31.3mb","heap_used_in_bytes":32851896,"heap_committed":"265.5mb","heap_committed_in_bytes":278462464,"non_heap_used":"39.3mb","non_heap_used_in_bytes":41210896,"non_heap_committed":"63.7mb","non_heap_committed_in_bytes":66809856,"pools":{"Code Cache":{"used":"2mb","used_in_bytes":2120704,"max":"48mb","max_in_bytes":50331648,"peak_used":"2mb","peak_used_in_bytes":2131520,"peak_max":"48mb","peak_max_in_bytes":50331648},"Par Eden Space":{"used":"24mb","used_in_bytes":25224136,"max":"66.5mb","max_in_bytes":69795840,"peak_used":"27mb","peak_used_in_bytes":28311552,"peak_max":"66.5mb","peak_max_in_bytes":69795840},"Par Survivor Space":{"used":"816.5kb","used_in_bytes":836128,"max":"8.3mb","max_in_bytes":8716288,"peak_used":"2mb","peak_used_in_bytes":2162688,"peak_max":"8.3mb","peak_max_in_bytes":8716288},"CMS Old Gen":{"used":"6.4mb","used_in_bytes":6791632,"max":"940.8mb","max_in_bytes":986513408,"peak_used":"8.2mb","peak_used_in_bytes":8653824,"peak_max":"940.8mb","peak_max_in_bytes":986513408},"CMS Perm Gen":{"used":"37.2mb","used_in_bytes":39090192,"max":"82mb","max_in_bytes":85983232,"peak_used":"37.2mb","peak_used_in_bytes":39090192,"peak_max":"82mb","peak_max_in_bytes":85983232}}},"threads":{"count":51,"peak_count":56},"gc":{"collection_count":43,"collection_time":"374ms","collection_time_in_millis":374,"collectors":{"ParNew":{"collection_count":41,"collection_time":"374ms","collection_time_in_millis":374},"ConcurrentMarkSweep":{"collection_count":2,"collection_time":"0s","collection_time_in_millis":0}}}},"thread_pool":{"generic":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":3,"completed":7505},"index":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"get":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"snapshot":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"merge":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"suggest":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"bulk":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"optimize":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"warmer":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":16},"flush":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":2,"completed":188},"search":{"threads":6,"queue":0,"active":0,"rejected":0,"largest":6,"completed":6},"percolate":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"management":{"threads":5,"queue":0,"active":1,"rejected":0,"largest":5,"completed":8593},"refresh":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0}},"network":{"tcp":{"active_opens":91033,"passive_opens":3206,"curr_estab":824,"in_segs":9438878,"out_segs":7330495,"retrans_segs":10420,"estab_resets":4179,"attempt_fails":2304,"in_errs":15,"out_rsts":-1}},"fs":{"timestamp":1381790347004,"data":[{"path":"/var/elasticsearch/es2/data/elasticsearch/nodes/0","mount":"/","dev":"/dev/disk0s2","total":"465.1gb","total_in_bytes":499418034176,"free":"215.3gb","free_in_bytes":231241613312,"available":"215.1gb","available_in_bytes":230979469312,"disk_reads":2641856,"disk_writes":3231915,"disk_read_size":"75.9gb","disk_read_size_in_bytes":81593427456,"disk_write_size":"76.2gb","disk_write_size_in_bytes":81856144384}]},"transport":{"server_open":60,"rx_count":155197,"rx_size":"6.9mb","rx_size_in_bytes":7339947,"tx_count":155195,"tx_size":"11.6mb","tx_size_in_bytes":12251491},"http":{"current_open":0,"total_opened":0}},"cluster":{"name":"Elathan","transport_address":"inet[/127.0.0.1:9301]","hostname":"server","version":"0.90.5","http_address":"inet[server/127.0.0.1:9203]"}},{"name":"jw4owU-ZQgOYdM7ElauDTg","routings":[{"name":"_river","replicas":[],"max_number_of_shards":"1","open":true},{"name":"ag_01","replicas":[null,{"replica":{"state":"STARTED","primary":false,"node":"jw4owU-ZQgOYdM7ElauDTg","relocating_node":null,"shard":1,"index":"ag_01"},"status":{"routing":{"state":"STARTED","primary":false,"node":"jw4owU-ZQgOYdM7ElauDTg","relocating_node":null,"shard":1,"index":"ag_01"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381731712637,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":6,"total_time":"194ms","total_time_in_millis":194}}}],"max_number_of_shards":"2","open":true},{"name":"ag_02","replicas":[{"replica":{"state":"STARTED","primary":true,"node":"jw4owU-ZQgOYdM7ElauDTg","relocating_node":null,"shard":0,"index":"ag_02"},"status":{"routing":{"state":"STARTED","primary":true,"node":"jw4owU-ZQgOYdM7ElauDTg","relocating_node":null,"shard":0,"index":"ag_02"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381749663369,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":3,"total_time":"107ms","total_time_in_millis":107}}}],"max_number_of_shards":"3","open":true},{"name":"ag_03","replicas":[],"max_number_of_shards":"2","open":true},{"name":"twitter_river","replicas":[],"max_number_of_shards":"5","open":false}],"master_node":false,"stats":{"timestamp":1381790346963,"name":"Numinus","transport_address":"inet[/127.0.0.1:9303]","hostname":"server","indices":{"docs":{"count":0,"deleted":0},"store":{"size":"178b","size_in_bytes":178,"throttle_time":"0s","throttle_time_in_millis":0},"indexing":{"index_total":2,"index_time":"50ms","index_time_in_millis":50,"index_current":0,"delete_total":0,"delete_time":"0s","delete_time_in_millis":0,"delete_current":0},"get":{"total":0,"get_time":"0s","time_in_millis":0,"exists_total":0,"exists_time":"0s","exists_time_in_millis":0,"missing_total":0,"missing_time":"0s","missing_time_in_millis":0,"current":0},"search":{"open_contexts":0,"query_total":12,"query_time":"32ms","query_time_in_millis":32,"query_current":0,"fetch_total":0,"fetch_time":"0s","fetch_time_in_millis":0,"fetch_current":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":9,"total_time":"66ms","total_time_in_millis":66},"flush":{"total":218,"total_time":"5.6s","total_time_in_millis":5697},"warmer":{"current":0,"total":2,"total_time":"4ms","total_time_in_millis":4},"filter_cache":{"memory_size":"0b","memory_size_in_bytes":0,"evictions":0},"id_cache":{"memory_size":"0b","memory_size_in_bytes":0},"fielddata":{"memory_size":"0b","memory_size_in_bytes":0,"evictions":0},"completion":{"size":"0b","size_in_bytes":0}},"os":{"timestamp":1381790346963,"uptime":"15.5m","uptime_in_millis":932146,"load_average":[1.79736328125,1.95166015625,1.904296875],"cpu":{"sys":22,"user":6,"idle":70,"stolen":0},"mem":{"free":"3.7gb","free_in_bytes":4058091520,"used":"4.2gb","used_in_bytes":4531843072,"free_percent":51,"used_percent":48,"actual_free":"4.1gb","actual_free_in_bytes":4419244032,"actual_used":"3.8gb","actual_used_in_bytes":4170690560},"swap":{"used":"2.8gb","used_in_bytes":3025272832,"free":"1.1gb","free_in_bytes":1269694464}},"process":{"timestamp":1381790346963,"open_file_descriptors":264,"cpu":{"percent":0,"sys":"2.9m","sys_in_millis":174208,"user":"2.3m","user_in_millis":139440,"total":"5.2m","total_in_millis":313648},"mem":{"resident":"27.2mb","resident_in_bytes":28606464,"share":"-1b","share_in_bytes":-1,"total_virtual":"3.6gb","total_virtual_in_bytes":3903823872}},"jvm":{"timestamp":1381790346978,"uptime":"4d","uptime_in_millis":349026382,"mem":{"heap_used":"12.8mb","heap_used_in_bytes":13428352,"heap_committed":"265.5mb","heap_committed_in_bytes":278462464,"non_heap_used":"39.8mb","non_heap_used_in_bytes":41791784,"non_heap_committed":"55.2mb","non_heap_committed_in_bytes":57950208,"pools":{"Code Cache":{"used":"1.9mb","used_in_bytes":2065280,"max":"48mb","max_in_bytes":50331648,"peak_used":"1.9mb","peak_used_in_bytes":2074880,"peak_max":"48mb","peak_max_in_bytes":50331648},"Par Eden Space":{"used":"2.4mb","used_in_bytes":2564176,"max":"66.5mb","max_in_bytes":69795840,"peak_used":"27mb","peak_used_in_bytes":28311552,"peak_max":"66.5mb","peak_max_in_bytes":69795840},"Par Survivor Space":{"used":"646.5kb","used_in_bytes":662048,"max":"8.3mb","max_in_bytes":8716288,"peak_used":"2.8mb","peak_used_in_bytes":3029584,"peak_max":"8.3mb","peak_max_in_bytes":8716288},"CMS Old Gen":{"used":"9.7mb","used_in_bytes":10202128,"max":"940.8mb","max_in_bytes":986513408,"peak_used":"9.7mb","peak_used_in_bytes":10202128,"peak_max":"940.8mb","peak_max_in_bytes":986513408},"CMS Perm Gen":{"used":"37.8mb","used_in_bytes":39726504,"max":"82mb","max_in_bytes":85983232,"peak_used":"37.8mb","peak_used_in_bytes":39726504,"peak_max":"82mb","peak_max_in_bytes":85983232}}},"threads":{"count":60,"peak_count":66},"gc":{"collection_count":42,"collection_time":"512ms","collection_time_in_millis":512,"collectors":{"ParNew":{"collection_count":40,"collection_time":"512ms","collection_time_in_millis":512},"ConcurrentMarkSweep":{"collection_count":2,"collection_time":"0s","collection_time_in_millis":0}}}},"thread_pool":{"generic":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":3,"completed":7490},"index":{"threads":2,"queue":0,"active":0,"rejected":0,"largest":2,"completed":2},"get":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"snapshot":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":2},"merge":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":2},"suggest":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"bulk":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"optimize":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"warmer":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":18},"flush":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":2,"completed":221},"search":{"threads":12,"queue":0,"active":0,"rejected":0,"largest":12,"completed":12},"percolate":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"management":{"threads":3,"queue":0,"active":1,"rejected":0,"largest":5,"completed":8597},"refresh":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":2}},"network":{"tcp":{"active_opens":91033,"passive_opens":3206,"curr_estab":824,"in_segs":9438878,"out_segs":7330495,"retrans_segs":10420,"estab_resets":4179,"attempt_fails":2304,"in_errs":15,"out_rsts":-1}},"fs":{"timestamp":1381790346992,"data":[{"path":"/var/elasticsearch/es4/data/elasticsearch/nodes/0","mount":"/","dev":"/dev/disk0s2","total":"465.1gb","total_in_bytes":499418034176,"free":"215.3gb","free_in_bytes":231241613312,"available":"215.1gb","available_in_bytes":230979469312,"disk_reads":2641856,"disk_writes":3231915,"disk_read_size":"75.9gb","disk_read_size_in_bytes":81593427456,"disk_write_size":"76.2gb","disk_write_size_in_bytes":81856144384}]},"transport":{"server_open":60,"rx_count":155179,"rx_size":"7mb","rx_size_in_bytes":7341687,"tx_count":155177,"tx_size":"11.6mb","tx_size_in_bytes":12249878},"http":{"current_open":0,"total_opened":0}},"cluster":{"name":"Numinus","transport_address":"inet[/127.0.0.1:9303]","hostname":"server","version":"0.90.5","http_address":"inet[server/127.0.0.1:9202]"}},{"name":"SwCmq0QKQuShZcJAbuW8OQ","routings":[{"name":"_river","replicas":[{"replica":{"state":"STARTED","primary":false,"node":"SwCmq0QKQuShZcJAbuW8OQ","relocating_node":null,"shard":0,"index":"_river"},"status":{"routing":{"state":"STARTED","primary":false,"node":"SwCmq0QKQuShZcJAbuW8OQ","relocating_node":null,"shard":0,"index":"_river"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1380240228838,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":62,"total_time":"1.6s","total_time_in_millis":1632}}}],"max_number_of_shards":"1","open":true},{"name":"ag_01","replicas":[{"replica":{"state":"STARTED","primary":false,"node":"SwCmq0QKQuShZcJAbuW8OQ","relocating_node":null,"shard":0,"index":"ag_01"},"status":{"routing":{"state":"STARTED","primary":false,"node":"SwCmq0QKQuShZcJAbuW8OQ","relocating_node":null,"shard":0,"index":"ag_01"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381731712651,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"216ms","total_time_in_millis":216}}}],"max_number_of_shards":"2","open":true},{"name":"ag_02","replicas":[null,null,{"replica":{"state":"STARTED","primary":true,"node":"SwCmq0QKQuShZcJAbuW8OQ","relocating_node":null,"shard":2,"index":"ag_02"},"status":{"routing":{"state":"STARTED","primary":true,"node":"SwCmq0QKQuShZcJAbuW8OQ","relocating_node":null,"shard":2,"index":"ag_02"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381749663407,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":4,"total_time":"17ms","total_time_in_millis":17}}}],"max_number_of_shards":"3","open":true},{"name":"ag_03","replicas":[],"max_number_of_shards":"2","open":true},{"name":"twitter_river","replicas":[],"max_number_of_shards":"5","open":false}],"master_node":false,"stats":{"timestamp":1381790346944,"name":"Ameridroid","transport_address":"inet[/127.0.0.1:9305]","hostname":"server","indices":{"docs":{"count":0,"deleted":0},"store":{"size":"257b","size_in_bytes":257,"throttle_time":"0s","throttle_time_in_millis":0},"indexing":{"index_total":6,"index_time":"64ms","index_time_in_millis":64,"index_current":0,"delete_total":0,"delete_time":"0s","delete_time_in_millis":0,"delete_current":0},"get":{"total":0,"get_time":"0s","time_in_millis":0,"exists_total":0,"exists_time":"0s","exists_time_in_millis":0,"missing_total":0,"missing_time":"0s","missing_time_in_millis":0,"current":0},"search":{"open_contexts":0,"query_total":12,"query_time":"27ms","query_time_in_millis":27,"query_current":0,"fetch_total":0,"fetch_time":"0s","fetch_time_in_millis":0,"fetch_current":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":10,"total_time":"113ms","total_time_in_millis":113},"flush":{"total":241,"total_time":"5.5s","total_time_in_millis":5553},"warmer":{"current":0,"total":3,"total_time":"4ms","total_time_in_millis":4},"filter_cache":{"memory_size":"0b","memory_size_in_bytes":0,"evictions":0},"id_cache":{"memory_size":"0b","memory_size_in_bytes":0},"fielddata":{"memory_size":"0b","memory_size_in_bytes":0,"evictions":0},"completion":{"size":"0b","size_in_bytes":0}},"os":{"timestamp":1381790346944,"uptime":"15.5m","uptime_in_millis":932146,"load_average":[1.79736328125,1.95166015625,1.904296875],"cpu":{"sys":22,"user":6,"idle":70,"stolen":0},"mem":{"free":"3.7gb","free_in_bytes":4059074560,"used":"4.2gb","used_in_bytes":4530860032,"free_percent":51,"used_percent":48,"actual_free":"4.1gb","actual_free_in_bytes":4419702784,"actual_used":"3.8gb","actual_used_in_bytes":4170231808},"swap":{"used":"2.8gb","used_in_bytes":3025272832,"free":"1.1gb","free_in_bytes":1269694464}},"process":{"timestamp":1381790346944,"open_file_descriptors":266,"cpu":{"percent":0,"sys":"2.8m","sys_in_millis":171912,"user":"2.3m","user_in_millis":143905,"total":"5.2m","total_in_millis":315817},"mem":{"resident":"30.4mb","resident_in_bytes":31936512,"share":"-1b","share_in_bytes":-1,"total_virtual":"3.6gb","total_virtual_in_bytes":3905077248}},"jvm":{"timestamp":1381790346944,"uptime":"4d","uptime_in_millis":349024271,"mem":{"heap_used":"16.6mb","heap_used_in_bytes":17485968,"heap_committed":"253.9mb","heap_committed_in_bytes":266272768,"non_heap_used":"39.7mb","non_heap_used_in_bytes":41733256,"non_heap_committed":"40.4mb","non_heap_committed_in_bytes":42405888,"pools":{"Code Cache":{"used":"1.9mb","used_in_bytes":2018624,"max":"48mb","max_in_bytes":50331648,"peak_used":"1.9mb","peak_used_in_bytes":2029504,"peak_max":"48mb","peak_max_in_bytes":50331648},"Par Eden Space":{"used":"5.9mb","used_in_bytes":6242912,"max":"66.5mb","max_in_bytes":69795840,"peak_used":"16.6mb","peak_used_in_bytes":17432576,"peak_max":"66.5mb","peak_max_in_bytes":69795840},"Par Survivor Space":{"used":"489.7kb","used_in_bytes":501496,"max":"8.3mb","max_in_bytes":8716288,"peak_used":"2mb","peak_used_in_bytes":2162688,"peak_max":"8.3mb","peak_max_in_bytes":8716288},"CMS Old Gen":{"used":"10.2mb","used_in_bytes":10741560,"max":"940.8mb","max_in_bytes":986513408,"peak_used":"10.2mb","peak_used_in_bytes":10741560,"peak_max":"940.8mb","peak_max_in_bytes":986513408},"CMS Perm Gen":{"used":"37.8mb","used_in_bytes":39714632,"max":"82mb","max_in_bytes":85983232,"peak_used":"37.8mb","peak_used_in_bytes":39714632,"peak_max":"82mb","peak_max_in_bytes":85983232}}},"threads":{"count":63,"peak_count":70},"gc":{"collection_count":61,"collection_time":"533ms","collection_time_in_millis":533,"collectors":{"ParNew":{"collection_count":61,"collection_time":"533ms","collection_time_in_millis":533},"ConcurrentMarkSweep":{"collection_count":0,"collection_time":"0s","collection_time_in_millis":0}}}},"thread_pool":{"generic":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":4,"completed":7504},"index":{"threads":4,"queue":0,"active":0,"rejected":0,"largest":4,"completed":6},"get":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"snapshot":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":4},"merge":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":4},"suggest":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"bulk":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"optimize":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"warmer":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":23},"flush":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":2,"completed":241},"search":{"threads":12,"queue":0,"active":0,"rejected":0,"largest":12,"completed":12},"percolate":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"management":{"threads":4,"queue":0,"active":1,"rejected":0,"largest":5,"completed":10284},"refresh":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":4}},"network":{"tcp":{"active_opens":91033,"passive_opens":3206,"curr_estab":824,"in_segs":9438844,"out_segs":7330461,"retrans_segs":10420,"estab_resets":4179,"attempt_fails":2304,"in_errs":15,"out_rsts":-1}},"fs":{"timestamp":1381790346959,"data":[{"path":"/var/elasticsearch/es6/data/elasticsearch/nodes/0","mount":"/","dev":"/dev/disk0s2","total":"465.1gb","total_in_bytes":499418034176,"free":"215.3gb","free_in_bytes":231240040448,"available":"215.1gb","available_in_bytes":230977896448,"disk_reads":2641849,"disk_writes":3231915,"disk_read_size":"75.9gb","disk_read_size_in_bytes":81593058816,"disk_write_size":"76.2gb","disk_write_size_in_bytes":81856144384}]},"transport":{"server_open":60,"rx_count":156880,"rx_size":"7mb","rx_size_in_bytes":7431874,"tx_count":156877,"tx_size":"11.9mb","tx_size_in_bytes":12480678},"http":{"current_open":0,"total_opened":0}},"cluster":{"name":"Ameridroid","transport_address":"inet[/127.0.0.1:9305]","hostname":"server","version":"0.90.5","http_address":"inet[server/127.0.0.1:9205]"}},{"name":"aBuoaKR5QVCfUZHgrJEfVg","routings":[{"name":"_river","replicas":[],"max_number_of_shards":"1","open":true},{"name":"ag_01","replicas":[{"replica":{"state":"STARTED","primary":true,"node":"aBuoaKR5QVCfUZHgrJEfVg","relocating_node":null,"shard":0,"index":"ag_01"},"status":{"routing":{"state":"STARTED","primary":true,"node":"aBuoaKR5QVCfUZHgrJEfVg","relocating_node":null,"shard":0,"index":"ag_01"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381731712651,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"382ms","total_time_in_millis":382}}}],"max_number_of_shards":"2","open":true},{"name":"ag_02","replicas":[null,null,{"replica":{"state":"STARTED","primary":false,"node":"aBuoaKR5QVCfUZHgrJEfVg","relocating_node":null,"shard":2,"index":"ag_02"},"status":{"routing":{"state":"STARTED","primary":false,"node":"aBuoaKR5QVCfUZHgrJEfVg","relocating_node":null,"shard":2,"index":"ag_02"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381749663407,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":3,"total_time":"15ms","total_time_in_millis":15}}}],"max_number_of_shards":"3","open":true},{"name":"ag_03","replicas":[{"replica":{"state":"STARTED","primary":true,"node":"aBuoaKR5QVCfUZHgrJEfVg","relocating_node":null,"shard":0,"index":"ag_03"},"status":{"routing":{"state":"STARTED","primary":true,"node":"aBuoaKR5QVCfUZHgrJEfVg","relocating_node":null,"shard":0,"index":"ag_03"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381731770063,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":6,"total_time":"101ms","total_time_in_millis":101}}}],"max_number_of_shards":"2","open":true},{"name":"twitter_river","replicas":[],"max_number_of_shards":"5","open":false}],"master_node":false,"stats":{"timestamp":1381790346945,"name":"Immortus","transport_address":"inet[/127.0.0.1:9302]","hostname":"server","indices":{"docs":{"count":0,"deleted":0},"store":{"size":"277b","size_in_bytes":277,"throttle_time":"0s","throttle_time_in_millis":0},"indexing":{"index_total":2,"index_time":"59ms","index_time_in_millis":59,"index_current":0,"delete_total":0,"delete_time":"0s","delete_time_in_millis":0,"delete_current":0},"get":{"total":0,"get_time":"0s","time_in_millis":0,"exists_total":0,"exists_time":"0s","exists_time_in_millis":0,"missing_total":0,"missing_time":"0s","missing_time_in_millis":0,"current":0},"search":{"open_contexts":0,"query_total":12,"query_time":"27ms","query_time_in_millis":27,"query_current":0,"fetch_total":1,"fetch_time":"9ms","fetch_time_in_millis":9,"fetch_current":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":9,"total_time":"72ms","total_time_in_millis":72},"flush":{"total":239,"total_time":"6.3s","total_time_in_millis":6363},"warmer":{"current":0,"total":3,"total_time":"8ms","total_time_in_millis":8},"filter_cache":{"memory_size":"0b","memory_size_in_bytes":0,"evictions":0},"id_cache":{"memory_size":"0b","memory_size_in_bytes":0},"fielddata":{"memory_size":"0b","memory_size_in_bytes":0,"evictions":0},"completion":{"size":"0b","size_in_bytes":0}},"os":{"timestamp":1381790346963,"uptime":"15.5m","uptime_in_millis":932146,"load_average":[1.79736328125,1.95166015625,1.904296875],"cpu":{"sys":22,"user":6,"idle":70,"stolen":0},"mem":{"free":"3.7gb","free_in_bytes":4058099712,"used":"4.2gb","used_in_bytes":4531834880,"free_percent":51,"used_percent":48,"actual_free":"4.1gb","actual_free_in_bytes":4419252224,"actual_used":"3.8gb","actual_used_in_bytes":4170682368},"swap":{"used":"2.8gb","used_in_bytes":3025272832,"free":"1.1gb","free_in_bytes":1269694464}},"process":{"timestamp":1381790346963,"open_file_descriptors":266,"cpu":{"percent":0,"sys":"2.9m","sys_in_millis":174105,"user":"2.4m","user_in_millis":145373,"total":"5.3m","total_in_millis":319478},"mem":{"resident":"29mb","resident_in_bytes":30453760,"share":"-1b","share_in_bytes":-1,"total_virtual":"3.6gb","total_virtual_in_bytes":3912540160}},"jvm":{"timestamp":1381790346963,"uptime":"4d","uptime_in_millis":349027381,"mem":{"heap_used":"28.5mb","heap_used_in_bytes":29980664,"heap_committed":"265.5mb","heap_committed_in_bytes":278462464,"non_heap_used":"40mb","non_heap_used_in_bytes":42021480,"non_heap_committed":"65.6mb","non_heap_committed_in_bytes":68853760,"pools":{"Code Cache":{"used":"2mb","used_in_bytes":2183808,"max":"48mb","max_in_bytes":50331648,"peak_used":"2mb","peak_used_in_bytes":2193408,"peak_max":"48mb","peak_max_in_bytes":50331648},"Par Eden Space":{"used":"23.8mb","used_in_bytes":25026800,"max":"66.5mb","max_in_bytes":69795840,"peak_used":"27mb","peak_used_in_bytes":28311552,"peak_max":"66.5mb","peak_max_in_bytes":69795840},"Par Survivor Space":{"used":"464.1kb","used_in_bytes":475296,"max":"8.3mb","max_in_bytes":8716288,"peak_used":"2mb","peak_used_in_bytes":2162688,"peak_max":"8.3mb","peak_max_in_bytes":8716288},"CMS Old Gen":{"used":"4.2mb","used_in_bytes":4478568,"max":"940.8mb","max_in_bytes":986513408,"peak_used":"12.4mb","peak_used_in_bytes":13054208,"peak_max":"940.8mb","peak_max_in_bytes":986513408},"CMS Perm Gen":{"used":"37.9mb","used_in_bytes":39837672,"max":"82mb","max_in_bytes":85983232,"peak_used":"38.2mb","peak_used_in_bytes":40134632,"peak_max":"82mb","peak_max_in_bytes":85983232}}},"threads":{"count":62,"peak_count":67},"gc":{"collection_count":80,"collection_time":"561ms","collection_time_in_millis":561,"collectors":{"ParNew":{"collection_count":78,"collection_time":"557ms","collection_time_in_millis":557},"ConcurrentMarkSweep":{"collection_count":2,"collection_time":"4ms","collection_time_in_millis":4}}}},"thread_pool":{"generic":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":4,"completed":7528},"index":{"threads":2,"queue":0,"active":0,"rejected":0,"largest":2,"completed":2},"get":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"snapshot":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":2},"merge":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":2},"suggest":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"bulk":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"optimize":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"warmer":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":26},"flush":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":2,"completed":242},"search":{"threads":12,"queue":0,"active":0,"rejected":0,"largest":12,"completed":13},"percolate":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"management":{"threads":5,"queue":0,"active":2,"rejected":0,"largest":5,"completed":10288},"refresh":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":2}},"network":{"tcp":{"active_opens":91033,"passive_opens":3206,"curr_estab":824,"in_segs":9438862,"out_segs":7330479,"retrans_segs":10420,"estab_resets":4179,"attempt_fails":2304,"in_errs":15,"out_rsts":-1}},"fs":{"timestamp":1381790346977,"data":[{"path":"/var/elasticsearch/es3/data/elasticsearch/nodes/0","mount":"/","dev":"/dev/disk0s2","total":"465.1gb","total_in_bytes":499418034176,"free":"215.3gb","free_in_bytes":231241089024,"available":"215.1gb","available_in_bytes":230978945024,"disk_reads":2641854,"disk_writes":3231915,"disk_read_size":"75.9gb","disk_read_size_in_bytes":81593402880,"disk_write_size":"76.2gb","disk_write_size_in_bytes":81856144384}]},"transport":{"server_open":60,"rx_count":156920,"rx_size":"7.1mb","rx_size_in_bytes":7451979,"tx_count":156915,"tx_size":"11.9mb","tx_size_in_bytes":12499329},"http":{"current_open":0,"total_opened":0}},"cluster":{"name":"Immortus","transport_address":"inet[/127.0.0.1:9302]","hostname":"server","version":"0.90.5","http_address":"inet[server/127.0.0.1:9201]"}},{"name":"3Rbfod0sS9eZ6VrOkY0JKw","routings":[{"name":"_river","replicas":[{"replica":{"state":"STARTED","primary":true,"node":"3Rbfod0sS9eZ6VrOkY0JKw","relocating_node":null,"shard":0,"index":"_river"},"status":{"routing":{"state":"STARTED","primary":true,"node":"3Rbfod0sS9eZ6VrOkY0JKw","relocating_node":null,"shard":0,"index":"_river"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1380240228838,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":62,"total_time":"833ms","total_time_in_millis":833}}}],"max_number_of_shards":"1","open":true},{"name":"ag_01","replicas":[],"max_number_of_shards":"2","open":true},{"name":"ag_02","replicas":[{"replica":{"state":"STARTED","primary":false,"node":"3Rbfod0sS9eZ6VrOkY0JKw","relocating_node":null,"shard":0,"index":"ag_02"},"status":{"routing":{"state":"STARTED","primary":false,"node":"3Rbfod0sS9eZ6VrOkY0JKw","relocating_node":null,"shard":0,"index":"ag_02"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381749663369,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":3,"total_time":"4ms","total_time_in_millis":4}}}],"max_number_of_shards":"3","open":true},{"name":"ag_03","replicas":[{"replica":{"state":"STARTED","primary":false,"node":"3Rbfod0sS9eZ6VrOkY0JKw","relocating_node":null,"shard":0,"index":"ag_03"},"status":{"routing":{"state":"STARTED","primary":false,"node":"3Rbfod0sS9eZ6VrOkY0JKw","relocating_node":null,"shard":0,"index":"ag_03"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381731770063,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"274ms","total_time_in_millis":274}}}],"max_number_of_shards":"2","open":true},{"name":"twitter_river","replicas":[],"max_number_of_shards":"5","open":false}],"master_node":true,"stats":{"timestamp":1381790346938,"name":"Steel Serpent","transport_address":"inet[server/127.0.0.1:9300]","hostname":"server","indices":{"docs":{"count":0,"deleted":0},"store":{"size":"237b","size_in_bytes":237,"throttle_time":"0s","throttle_time_in_millis":0},"indexing":{"index_total":2,"index_time":"59ms","index_time_in_millis":59,"index_current":0,"delete_total":0,"delete_time":"0s","delete_time_in_millis":0,"delete_current":0},"get":{"total":0,"get_time":"0s","time_in_millis":0,"exists_total":0,"exists_time":"0s","exists_time_in_millis":0,"missing_total":0,"missing_time":"0s","missing_time_in_millis":0,"current":0},"search":{"open_contexts":0,"query_total":12,"query_time":"32ms","query_time_in_millis":32,"query_current":0,"fetch_total":3,"fetch_time":"5ms","fetch_time_in_millis":5,"fetch_current":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":6,"total_time":"58ms","total_time_in_millis":58},"flush":{"total":240,"total_time":"4.3s","total_time_in_millis":4339},"warmer":{"current":0,"total":3,"total_time":"8ms","total_time_in_millis":8},"filter_cache":{"memory_size":"0b","memory_size_in_bytes":0,"evictions":0},"id_cache":{"memory_size":"0b","memory_size_in_bytes":0},"fielddata":{"memory_size":"0b","memory_size_in_bytes":0,"evictions":0},"completion":{"size":"0b","size_in_bytes":0}},"os":{"timestamp":1381790346938,"uptime":"15.5m","uptime_in_millis":932146,"load_average":[1.79736328125,1.95166015625,1.904296875],"cpu":{"sys":22,"user":6,"idle":70,"stolen":0},"mem":{"free":"3.7gb","free_in_bytes":4062093312,"used":"4.2gb","used_in_bytes":4527841280,"free_percent":51,"used_percent":48,"actual_free":"4.1gb","actual_free_in_bytes":4422721536,"actual_used":"3.8gb","actual_used_in_bytes":4167213056},"swap":{"used":"2.8gb","used_in_bytes":3025272832,"free":"1.1gb","free_in_bytes":1269694464}},"process":{"timestamp":1381790346938,"open_file_descriptors":272,"cpu":{"percent":0,"sys":"3.3m","sys_in_millis":200578,"user":"3.2m","user_in_millis":192613,"total":"6.5m","total_in_millis":393191},"mem":{"resident":"43.8mb","resident_in_bytes":46018560,"share":"-1b","share_in_bytes":-1,"total_virtual":"3.6gb","total_virtual_in_bytes":3910467584}},"jvm":{"timestamp":1381790346938,"uptime":"4d","uptime_in_millis":349029191,"mem":{"heap_used":"28.9mb","heap_used_in_bytes":30381984,"heap_committed":"253.9mb","heap_committed_in_bytes":266272768,"non_heap_used":"42.9mb","non_heap_used_in_bytes":45068896,"non_heap_committed":"43.3mb","non_heap_committed_in_bytes":45420544,"pools":{"Code Cache":{"used":"3.3mb","used_in_bytes":3534656,"max":"48mb","max_in_bytes":50331648,"peak_used":"3.3mb","peak_used_in_bytes":3545408,"peak_max":"48mb","peak_max_in_bytes":50331648},"Par Eden Space":{"used":"15.6mb","used_in_bytes":16402808,"max":"66.5mb","max_in_bytes":69795840,"peak_used":"16.6mb","peak_used_in_bytes":17432576,"peak_max":"66.5mb","peak_max_in_bytes":69795840},"Par Survivor Space":{"used":"44.9kb","used_in_bytes":46016,"max":"8.3mb","max_in_bytes":8716288,"peak_used":"2mb","peak_used_in_bytes":2162688,"peak_max":"8.3mb","peak_max_in_bytes":8716288},"CMS Old Gen":{"used":"13.2mb","used_in_bytes":13933160,"max":"940.8mb","max_in_bytes":986513408,"peak_used":"13.2mb","peak_used_in_bytes":13933160,"peak_max":"940.8mb","peak_max_in_bytes":986513408},"CMS Perm Gen":{"used":"39.6mb","used_in_bytes":41534240,"max":"82mb","max_in_bytes":85983232,"peak_used":"39.6mb","peak_used_in_bytes":41534240,"peak_max":"82mb","peak_max_in_bytes":85983232}}},"threads":{"count":64,"peak_count":68},"gc":{"collection_count":272,"collection_time":"967ms","collection_time_in_millis":967,"collectors":{"ParNew":{"collection_count":272,"collection_time":"967ms","collection_time_in_millis":967},"ConcurrentMarkSweep":{"collection_count":0,"collection_time":"0s","collection_time_in_millis":0}}}},"thread_pool":{"generic":{"threads":2,"queue":0,"active":0,"rejected":0,"largest":4,"completed":9499},"index":{"threads":2,"queue":0,"active":0,"rejected":0,"largest":2,"completed":2},"get":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"snapshot":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":2},"merge":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":2},"suggest":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"bulk":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"optimize":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"warmer":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":21},"flush":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":2,"completed":241},"search":{"threads":12,"queue":0,"active":0,"rejected":0,"largest":12,"completed":15},"percolate":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"management":{"threads":5,"queue":0,"active":1,"rejected":0,"largest":5,"completed":15207},"refresh":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":2}},"network":{"tcp":{"active_opens":91033,"passive_opens":3206,"curr_estab":824,"in_segs":9438818,"out_segs":7330435,"retrans_segs":10420,"estab_resets":4179,"attempt_fails":2304,"in_errs":15,"out_rsts":-1}},"fs":{"timestamp":1381790346956,"data":[{"path":"/var/elasticsearch/es1/data/elasticsearch/nodes/0","mount":"/","dev":"/dev/disk0s2","total":"465.1gb","total_in_bytes":499418034176,"free":"215.3gb","free_in_bytes":231240040448,"available":"215.1gb","available_in_bytes":230977896448,"disk_reads":2641849,"disk_writes":3231915,"disk_read_size":"75.9gb","disk_read_size_in_bytes":81593058816,"disk_write_size":"76.2gb","disk_write_size_in_bytes":81856144384}]},"transport":{"server_open":60,"rx_count":780551,"rx_size":"59mb","rx_size_in_bytes":61929023,"tx_count":780563,"tx_size":"35.2mb","tx_size_in_bytes":36961925},"http":{"current_open":6,"total_opened":201}},"cluster":{"name":"Steel Serpent","transport_address":"inet[server/127.0.0.1:9300]","hostname":"server","version":"0.90.5","http_address":"inet[server/127.0.0.1:9200]"}},{"name":"PO1wHIidQo-w7sGHaYHvjg","routings":[{"name":"_river","replicas":[],"max_number_of_shards":"1","open":true},{"name":"ag_01","replicas":[],"max_number_of_shards":"2","open":true},{"name":"ag_02","replicas":[null,{"replica":{"state":"STARTED","primary":true,"node":"PO1wHIidQo-w7sGHaYHvjg","relocating_node":null,"shard":1,"index":"ag_02"},"status":{"routing":{"state":"STARTED","primary":true,"node":"PO1wHIidQo-w7sGHaYHvjg","relocating_node":null,"shard":1,"index":"ag_02"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381749663385,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":4,"total_time":"122ms","total_time_in_millis":122}}}],"max_number_of_shards":"3","open":true},{"name":"ag_03","replicas":[null,{"replica":{"state":"STARTED","primary":false,"node":"PO1wHIidQo-w7sGHaYHvjg","relocating_node":null,"shard":1,"index":"ag_03"},"status":{"routing":{"state":"STARTED","primary":false,"node":"PO1wHIidQo-w7sGHaYHvjg","relocating_node":null,"shard":1,"index":"ag_03"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381731770058,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"137ms","total_time_in_millis":137}}}],"max_number_of_shards":"2","open":true},{"name":"twitter_river","replicas":[],"max_number_of_shards":"5","open":false}],"master_node":false,"stats":{"timestamp":1381790346964,"name":"Thumbelina","transport_address":"inet[/127.0.0.1:9304]","hostname":"server","indices":{"docs":{"count":0,"deleted":0},"store":{"size":"178b","size_in_bytes":178,"throttle_time":"0s","throttle_time_in_millis":0},"indexing":{"index_total":4,"index_time":"55ms","index_time_in_millis":55,"index_current":0,"delete_total":0,"delete_time":"0s","delete_time_in_millis":0,"delete_current":0},"get":{"total":0,"get_time":"0s","time_in_millis":0,"exists_total":0,"exists_time":"0s","exists_time_in_millis":0,"missing_total":0,"missing_time":"0s","missing_time_in_millis":0,"current":0},"search":{"open_contexts":0,"query_total":6,"query_time":"21ms","query_time_in_millis":21,"query_current":0,"fetch_total":2,"fetch_time":"10ms","fetch_time_in_millis":10,"fetch_current":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":9,"total_time":"81ms","total_time_in_millis":81},"flush":{"total":198,"total_time":"3.6s","total_time_in_millis":3662},"warmer":{"current":0,"total":2,"total_time":"3ms","total_time_in_millis":3},"filter_cache":{"memory_size":"0b","memory_size_in_bytes":0,"evictions":0},"id_cache":{"memory_size":"0b","memory_size_in_bytes":0},"fielddata":{"memory_size":"0b","memory_size_in_bytes":0,"evictions":0},"completion":{"size":"0b","size_in_bytes":0}},"os":{"timestamp":1381790346964,"uptime":"15.5m","uptime_in_millis":932146,"load_average":[1.79736328125,1.95166015625,1.904296875],"cpu":{"sys":22,"user":6,"idle":70,"stolen":0},"mem":{"free":"3.7gb","free_in_bytes":4058308608,"used":"4.2gb","used_in_bytes":4531625984,"free_percent":51,"used_percent":48,"actual_free":"4.1gb","actual_free_in_bytes":4419461120,"actual_used":"3.8gb","actual_used_in_bytes":4170473472},"swap":{"used":"2.8gb","used_in_bytes":3025272832,"free":"1.1gb","free_in_bytes":1269694464}},"process":{"timestamp":1381790346964,"open_file_descriptors":264,"cpu":{"percent":0,"sys":"2.8m","sys_in_millis":172378,"user":"2.3m","user_in_millis":140227,"total":"5.2m","total_in_millis":312605},"mem":{"resident":"28.5mb","resident_in_bytes":29892608,"share":"-1b","share_in_bytes":-1,"total_virtual":"3.6gb","total_virtual_in_bytes":3904798720}},"jvm":{"timestamp":1381790346976,"uptime":"4d","uptime_in_millis":349025339,"mem":{"heap_used":"20.8mb","heap_used_in_bytes":21889120,"heap_committed":"253.9mb","heap_committed_in_bytes":266272768,"non_heap_used":"40.2mb","non_heap_used_in_bytes":42232320,"non_heap_committed":"40.8mb","non_heap_committed_in_bytes":42799104,"pools":{"Code Cache":{"used":"2mb","used_in_bytes":2125312,"max":"48mb","max_in_bytes":50331648,"peak_used":"2mb","peak_used_in_bytes":2134912,"peak_max":"48mb","peak_max_in_bytes":50331648},"Par Eden Space":{"used":"8.4mb","used_in_bytes":8836504,"max":"66.5mb","max_in_bytes":69795840,"peak_used":"16.6mb","peak_used_in_bytes":17432576,"peak_max":"66.5mb","peak_max_in_bytes":69795840},"Par Survivor Space":{"used":"659.3kb","used_in_bytes":675192,"max":"8.3mb","max_in_bytes":8716288,"peak_used":"2mb","peak_used_in_bytes":2162688,"peak_max":"8.3mb","peak_max_in_bytes":8716288},"CMS Old Gen":{"used":"11.8mb","used_in_bytes":12377424,"max":"940.8mb","max_in_bytes":986513408,"peak_used":"11.8mb","peak_used_in_bytes":12377424,"peak_max":"940.8mb","peak_max_in_bytes":986513408},"CMS Perm Gen":{"used":"38.2mb","used_in_bytes":40107008,"max":"82mb","max_in_bytes":85983232,"peak_used":"38.2mb","peak_used_in_bytes":40107008,"peak_max":"82mb","peak_max_in_bytes":85983232}}},"threads":{"count":59,"peak_count":65},"gc":{"collection_count":61,"collection_time":"632ms","collection_time_in_millis":632,"collectors":{"ParNew":{"collection_count":61,"collection_time":"632ms","collection_time_in_millis":632},"ConcurrentMarkSweep":{"collection_count":0,"collection_time":"0s","collection_time_in_millis":0}}}},"thread_pool":{"generic":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":4,"completed":7515},"index":{"threads":4,"queue":0,"active":0,"rejected":0,"largest":4,"completed":4},"get":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"snapshot":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":2},"merge":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":2},"suggest":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"bulk":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"optimize":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"warmer":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":22},"flush":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":2,"completed":198},"search":{"threads":8,"queue":0,"active":0,"rejected":0,"largest":8,"completed":8},"percolate":{"threads":0,"queue":0,"active":0,"rejected":0,"largest":0,"completed":0},"management":{"threads":4,"queue":0,"active":1,"rejected":0,"largest":5,"completed":10266},"refresh":{"threads":1,"queue":0,"active":0,"rejected":0,"largest":1,"completed":2}},"network":{"tcp":{"active_opens":91033,"passive_opens":3206,"curr_estab":824,"in_segs":9438872,"out_segs":7330489,"retrans_segs":10420,"estab_resets":4179,"attempt_fails":2304,"in_errs":15,"out_rsts":-1}},"fs":{"timestamp":1381790347016,"data":[{"path":"/var/elasticsearch/es5/data/elasticsearch/nodes/0","mount":"/","dev":"/dev/disk0s2","total":"465.1gb","total_in_bytes":499418034176,"free":"215.3gb","free_in_bytes":231241613312,"available":"215.1gb","available_in_bytes":230979469312,"disk_reads":2641856,"disk_writes":3231915,"disk_read_size":"75.9gb","disk_read_size_in_bytes":81593427456,"disk_write_size":"76.2gb","disk_write_size_in_bytes":81856144384}]},"transport":{"server_open":60,"rx_count":156869,"rx_size":"7mb","rx_size_in_bytes":7444733,"tx_count":156866,"tx_size":"11.9mb","tx_size_in_bytes":12497730},"http":{"current_open":0,"total_opened":2}},"cluster":{"name":"Thumbelina","transport_address":"inet[/127.0.0.1:9304]","hostname":"server","version":"0.90.5","http_address":"inet[server/127.0.0.1:9204]"}}],"aliases":[{"name":"search","max":3,"min":1,"indices":[false,{"name":"ag_01","state":"open","metadata":{"state":"open","settings":{"index.number_of_replicas":"1","index.number_of_shards":"2","index.version.created":"900599"},"mappings":{},"aliases":["search"]},"status":{"index":{"primary_size":"198b","primary_size_in_bytes":198,"size":"356b","size_in_bytes":356},"translog":{"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":2,"total_time":"0s","total_time_in_millis":0},"flush":{"total":27,"total_time":"1.4s","total_time_in_millis":1435},"shards":{"0":[{"routing":{"state":"STARTED","primary":false,"node":"SwCmq0QKQuShZcJAbuW8OQ","relocating_node":null,"shard":0,"index":"ag_01"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381731712651,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"216ms","total_time_in_millis":216}},{"routing":{"state":"STARTED","primary":true,"node":"aBuoaKR5QVCfUZHgrJEfVg","relocating_node":null,"shard":0,"index":"ag_01"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381731712651,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"382ms","total_time_in_millis":382}}],"1":[{"routing":{"state":"STARTED","primary":true,"node":"cqTmT9GLSlSWx-B7pvM--w","relocating_node":null,"shard":1,"index":"ag_01"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381731712637,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"643ms","total_time_in_millis":643}},{"routing":{"state":"STARTED","primary":false,"node":"jw4owU-ZQgOYdM7ElauDTg","relocating_node":null,"shard":1,"index":"ag_01"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381731712637,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":6,"total_time":"194ms","total_time_in_millis":194}}]}}},{"name":"ag_02","state":"open","metadata":{"state":"open","settings":{"index.number_of_replicas":"1","index.number_of_shards":"3","index.version.created":"900599"},"mappings":{},"aliases":["search"]},"status":{"index":{"primary_size":"297b","primary_size_in_bytes":297,"size":"534b","size_in_bytes":534},"translog":{"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":3,"total_time":"0s","total_time_in_millis":0},"flush":{"total":20,"total_time":"340ms","total_time_in_millis":340},"shards":{"0":[{"routing":{"state":"STARTED","primary":true,"node":"jw4owU-ZQgOYdM7ElauDTg","relocating_node":null,"shard":0,"index":"ag_02"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381749663369,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":3,"total_time":"107ms","total_time_in_millis":107}},{"routing":{"state":"STARTED","primary":false,"node":"3Rbfod0sS9eZ6VrOkY0JKw","relocating_node":null,"shard":0,"index":"ag_02"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381749663369,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":3,"total_time":"4ms","total_time_in_millis":4}}],"1":[{"routing":{"state":"STARTED","primary":false,"node":"cqTmT9GLSlSWx-B7pvM--w","relocating_node":null,"shard":1,"index":"ag_02"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381749663385,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":3,"total_time":"75ms","total_time_in_millis":75}},{"routing":{"state":"STARTED","primary":true,"node":"PO1wHIidQo-w7sGHaYHvjg","relocating_node":null,"shard":1,"index":"ag_02"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381749663385,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":4,"total_time":"122ms","total_time_in_millis":122}}],"2":[{"routing":{"state":"STARTED","primary":true,"node":"SwCmq0QKQuShZcJAbuW8OQ","relocating_node":null,"shard":2,"index":"ag_02"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381749663407,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":4,"total_time":"17ms","total_time_in_millis":17}},{"routing":{"state":"STARTED","primary":false,"node":"aBuoaKR5QVCfUZHgrJEfVg","relocating_node":null,"shard":2,"index":"ag_02"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381749663407,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":3,"total_time":"15ms","total_time_in_millis":15}}]}}},{"name":"ag_03","state":"open","metadata":{"state":"open","settings":{"index.number_of_replicas":"1","index.number_of_shards":"2","index.version.created":"900599"},"mappings":{},"aliases":["search","live"]},"status":{"index":{"primary_size":"198b","primary_size_in_bytes":198,"size":"356b","size_in_bytes":356},"translog":{"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":2,"total_time":"0s","total_time_in_millis":0},"flush":{"total":27,"total_time":"598ms","total_time_in_millis":598},"shards":{"0":[{"routing":{"state":"STARTED","primary":true,"node":"aBuoaKR5QVCfUZHgrJEfVg","relocating_node":null,"shard":0,"index":"ag_03"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381731770063,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":6,"total_time":"101ms","total_time_in_millis":101}},{"routing":{"state":"STARTED","primary":false,"node":"3Rbfod0sS9eZ6VrOkY0JKw","relocating_node":null,"shard":0,"index":"ag_03"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381731770063,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"274ms","total_time_in_millis":274}}],"1":[{"routing":{"state":"STARTED","primary":true,"node":"cqTmT9GLSlSWx-B7pvM--w","relocating_node":null,"shard":1,"index":"ag_03"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381731770058,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"86ms","total_time_in_millis":86}},{"routing":{"state":"STARTED","primary":false,"node":"PO1wHIidQo-w7sGHaYHvjg","relocating_node":null,"shard":1,"index":"ag_03"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381731770058,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"137ms","total_time_in_millis":137}}]}}},false]},{"name":"live","max":3,"min":3,"indices":[false,false,false,{"name":"ag_03","state":"open","metadata":{"state":"open","settings":{"index.number_of_replicas":"1","index.number_of_shards":"2","index.version.created":"900599"},"mappings":{},"aliases":["search","live"]},"status":{"index":{"primary_size":"198b","primary_size_in_bytes":198,"size":"356b","size_in_bytes":356},"translog":{"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":2,"total_time":"0s","total_time_in_millis":0},"flush":{"total":27,"total_time":"598ms","total_time_in_millis":598},"shards":{"0":[{"routing":{"state":"STARTED","primary":true,"node":"aBuoaKR5QVCfUZHgrJEfVg","relocating_node":null,"shard":0,"index":"ag_03"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381731770063,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":6,"total_time":"101ms","total_time_in_millis":101}},{"routing":{"state":"STARTED","primary":false,"node":"3Rbfod0sS9eZ6VrOkY0JKw","relocating_node":null,"shard":0,"index":"ag_03"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381731770063,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"274ms","total_time_in_millis":274}}],"1":[{"routing":{"state":"STARTED","primary":true,"node":"cqTmT9GLSlSWx-B7pvM--w","relocating_node":null,"shard":1,"index":"ag_03"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381731770058,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"86ms","total_time_in_millis":86}},{"routing":{"state":"STARTED","primary":false,"node":"PO1wHIidQo-w7sGHaYHvjg","relocating_node":null,"shard":1,"index":"ag_03"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381731770058,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"137ms","total_time_in_millis":137}}]}}},false]}]}, + "indices":[{"name":null},{"name":"_river","state":"open","metadata":{"state":"open","settings":{"index.version.created":"900599","index.number_of_replicas":"1","index.number_of_shards":"1"},"mappings":{},"aliases":[]},"status":{"index":{"primary_size":"79b","primary_size_in_bytes":79,"size":"158b","size_in_bytes":158},"translog":{"operations":0},"docs":{"num_docs":1,"max_doc":1,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":124,"total_time":"2.4s","total_time_in_millis":2465},"shards":{"0":[{"routing":{"state":"STARTED","primary":false,"node":"SwCmq0QKQuShZcJAbuW8OQ","relocating_node":null,"shard":0,"index":"_river"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1380240228838,"operations":0},"docs":{"num_docs":187162420,"max_doc":187171320,"deleted_docs":9},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":62,"total_time":"1.6s","total_time_in_millis":1632}},{"routing":{"state":"STARTED","primary":true,"node":"3Rbfod0sS9eZ6VrOkY0JKw","relocating_node":null,"shard":0,"index":"_river"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1380240228838,"operations":0},"docs":{"num_docs":187162420,"max_doc":187171320,"deleted_docs":9},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":62,"total_time":"833ms","total_time_in_millis":833}}]}}},{"name":"ag_01","state":"open","metadata":{"state":"open","settings":{"index.number_of_replicas":"1","index.number_of_shards":"2","index.version.created":"900599"},"mappings":{},"aliases":["search"]},"status":{"index":{"primary_size":"198b","primary_size_in_bytes":198,"size":"356b","size_in_bytes":356},"translog":{"operations":0},"docs":{"num_docs":18716242,"max_doc":18717132,"deleted_docs":9},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":2,"total_time":"0s","total_time_in_millis":0},"flush":{"total":27,"total_time":"1.4s","total_time_in_millis":1435},"shards":{"0":[{"routing":{"state":"STARTED","primary":false,"node":"SwCmq0QKQuShZcJAbuW8OQ","relocating_node":null,"shard":0,"index":"ag_01"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381731712651,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"216ms","total_time_in_millis":216}},{"routing":{"state":"STARTED","primary":true,"node":"aBuoaKR5QVCfUZHgrJEfVg","relocating_node":null,"shard":0,"index":"ag_01"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381731712651,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"382ms","total_time_in_millis":382}}],"1":[{"routing":{"state":"STARTED","primary":true,"node":"cqTmT9GLSlSWx-B7pvM--w","relocating_node":null,"shard":1,"index":"ag_01"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381731712637,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"643ms","total_time_in_millis":643}},{"routing":{"state":"STARTED","primary":false,"node":"jw4owU-ZQgOYdM7ElauDTg","relocating_node":null,"shard":1,"index":"ag_01"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381731712637,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":6,"total_time":"194ms","total_time_in_millis":194}}]}}},{"name":"ag_02","state":"open","metadata":{"state":"open","settings":{"index.number_of_replicas":"1","index.number_of_shards":"3","index.version.created":"900599"},"mappings":{},"aliases":["search"]},"status":{"index":{"primary_size":"297b","primary_size_in_bytes":297,"size":"534b","size_in_bytes":534},"translog":{"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":3,"total_time":"0s","total_time_in_millis":0},"flush":{"total":20,"total_time":"340ms","total_time_in_millis":340},"shards":{"0":[{"routing":{"state":"STARTED","primary":true,"node":"jw4owU-ZQgOYdM7ElauDTg","relocating_node":null,"shard":0,"index":"ag_02"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381749663369,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":3,"total_time":"107ms","total_time_in_millis":107}},{"routing":{"state":"STARTED","primary":false,"node":"3Rbfod0sS9eZ6VrOkY0JKw","relocating_node":null,"shard":0,"index":"ag_02"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381749663369,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":3,"total_time":"4ms","total_time_in_millis":4}}],"1":[{"routing":{"state":"STARTED","primary":false,"node":"cqTmT9GLSlSWx-B7pvM--w","relocating_node":null,"shard":1,"index":"ag_02"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381749663385,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":3,"total_time":"75ms","total_time_in_millis":75}},{"routing":{"state":"STARTED","primary":true,"node":"PO1wHIidQo-w7sGHaYHvjg","relocating_node":null,"shard":1,"index":"ag_02"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381749663385,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":4,"total_time":"122ms","total_time_in_millis":122}}],"2":[{"routing":{"state":"STARTED","primary":true,"node":"SwCmq0QKQuShZcJAbuW8OQ","relocating_node":null,"shard":2,"index":"ag_02"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381749663407,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":4,"total_time":"17ms","total_time_in_millis":17}},{"routing":{"state":"STARTED","primary":false,"node":"aBuoaKR5QVCfUZHgrJEfVg","relocating_node":null,"shard":2,"index":"ag_02"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381749663407,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":3,"total_time":"15ms","total_time_in_millis":15}}]}}},{"name":"ag_03","state":"open","metadata":{"state":"open","settings":{"index.number_of_replicas":"1","index.number_of_shards":"2","index.version.created":"900599"},"mappings":{},"aliases":["search","live"]},"status":{"index":{"primary_size":"198b","primary_size_in_bytes":198,"size":"356b","size_in_bytes":356},"translog":{"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":2,"total_time":"0s","total_time_in_millis":0},"flush":{"total":27,"total_time":"598ms","total_time_in_millis":598},"shards":{"0":[{"routing":{"state":"STARTED","primary":true,"node":"aBuoaKR5QVCfUZHgrJEfVg","relocating_node":null,"shard":0,"index":"ag_03"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381731770063,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":6,"total_time":"101ms","total_time_in_millis":101}},{"routing":{"state":"STARTED","primary":false,"node":"3Rbfod0sS9eZ6VrOkY0JKw","relocating_node":null,"shard":0,"index":"ag_03"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381731770063,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"274ms","total_time_in_millis":274}}],"1":[{"routing":{"state":"STARTED","primary":true,"node":"cqTmT9GLSlSWx-B7pvM--w","relocating_node":null,"shard":1,"index":"ag_03"},"state":"STARTED","index":{"size":"99b","size_in_bytes":99},"translog":{"id":1381731770058,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":1,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"86ms","total_time_in_millis":86}},{"routing":{"state":"STARTED","primary":false,"node":"PO1wHIidQo-w7sGHaYHvjg","relocating_node":null,"shard":1,"index":"ag_03"},"state":"STARTED","index":{"size":"79b","size_in_bytes":79},"translog":{"id":1381731770058,"operations":0},"docs":{"num_docs":0,"max_doc":0,"deleted_docs":0},"merges":{"current":0,"current_docs":0,"current_size":"0b","current_size_in_bytes":0,"total":0,"total_time":"0s","total_time_in_millis":0,"total_docs":0,"total_size":"0b","total_size_in_bytes":0},"refresh":{"total":0,"total_time":"0s","total_time_in_millis":0},"flush":{"total":7,"total_time":"137ms","total_time_in_millis":137}}]}}},{"name":"twitter_river","state":"close","metadata":{"state":"close","settings":{"index.number_of_replicas":"1","index.version.created":"900599","index.number_of_shards":"5"},"mappings":{"status":{"properties":{"text":{"type":"string"},"location":{"properties":{"lon":{"type":"double"},"lat":{"type":"double"}}},"link":{"properties":{"start":{"type":"long"},"expand_url":{"type":"string"},"display_url":{"type":"string"},"url":{"type":"string"},"end":{"type":"long"}}},"hashtag":{"properties":{"text":{"type":"string"},"start":{"type":"long"},"end":{"type":"long"}}},"truncated":{"type":"boolean"},"source":{"type":"string"},"retweet":{"properties":{"id":{"type":"long"},"user_screen_name":{"type":"string"},"retweet_count":{"type":"long"},"user_id":{"type":"long"}}},"created_at":{"format":"dateOptionalTime","type":"date"},"retweet_count":{"type":"long"},"in_reply":{"properties":{"user_screen_name":{"type":"string"},"status":{"type":"long"},"user_id":{"type":"long"}}},"mention":{"properties":{"id":{"type":"long"},"start":{"type":"long"},"name":{"type":"string"},"screen_name":{"type":"string"},"end":{"type":"long"}}},"place":{"properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"},"country_code":{"type":"string"},"url":{"type":"string"},"full_name":{"type":"string"},"country":{"type":"string"}}},"user":{"properties":{"id":{"type":"long"},"profile_image_url_https":{"type":"string"},"location":{"type":"string"},"description":{"type":"string"},"name":{"type":"string"},"screen_name":{"type":"string"},"profile_image_url":{"type":"string"}}}}}},"aliases":[]},"status":null}] + }; + + window.builder = function() { + return new ui.NodesView({ + interactive: true, + data: data + }); + }; + +});
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/page/page.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/page/page.js new file mode 100644 index 000000000..8c5eb70a9 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/page/page.js @@ -0,0 +1,14 @@ +(function( app ) { + + var ui = app.ns("ui"); + + ui.Page = ui.AbstractWidget.extend({ + show: function() { + this.el.show(); + }, + hide: function() { + this.el.hide(); + } + }); + +})( this.app );
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/panelForm/panelForm.css b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/panelForm/panelForm.css new file mode 100644 index 000000000..cd4138e23 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/panelForm/panelForm.css @@ -0,0 +1,12 @@ +.uiPanelForm-field { + display: block; + padding: 2px 0; + clear: both; +} + +.uiPanelForm-label { + float: left; + width: 200px; + padding: 3px 7px; + text-align: right; +} diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/panelForm/panelForm.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/panelForm/panelForm.js new file mode 100644 index 000000000..8ed4fe7f0 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/panelForm/panelForm.js @@ -0,0 +1,26 @@ +(function( $, app ) { + + var ui = app.ns("ui"); + var ut = app.ns("ut"); + + ui.PanelForm = ui.AbstractWidget.extend({ + defaults: { + fields: null // (required) instanceof app.ux.FieldCollection + }, + init: function(parent) { + this._super(); + this.el = $.joey(this._main_template()); + this.attach( parent ); + }, + _main_template: function() { + return { tag: "DIV", id: this.id(), cls: "uiPanelForm", children: this.config.fields.fields.map(this._field_template, this) }; + }, + _field_template: function(field) { + return { tag: "LABEL", cls: "uiPanelForm-field", children: [ + { tag: "DIV", cls: "uiPanelForm-label", children: [ field.label, ut.require_template(field) ] }, + field + ]}; + } + }); + +})( this.jQuery, this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/queryFilter/queryFilter.css b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/queryFilter/queryFilter.css new file mode 100644 index 000000000..dfe055cd7 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/queryFilter/queryFilter.css @@ -0,0 +1,62 @@ +.uiQueryFilter { + width: 350px; + padding: 5px; + background: #d8e7ff; + background: -moz-linear-gradient(left, #d8e7ff, #e8f1ff); + background: -webkit-linear-gradient(left, #d8e7ff, #e8f1ff); +} + +.uiQueryFilter DIV.uiQueryFilter-section { + margin-bottom: 5px; +} + +.uiQueryFilter HEADER { + display: block; + font-variant: small-caps; + font-weight: bold; + margin: 5px 0; +} + +.uiQueryFilter-aliases SELECT { + width: 100%; +} + +.uiQueryFilter-booble { + cursor: pointer; + background: #e8f1ff; + border: 1px solid #e8f1ff; + border-radius: 5px; + padding: 1px 4px; + margin-bottom: 1px; + overflow: hidden; + white-space: nowrap; +} + +.uiQueryFilter-booble.selected { + background: #dae3f0; + border-top: 1px solid #c8d4e6; + border-left: 1px solid #c8d4e6; + border-bottom: 1px solid #ffffff; + border-right: 1px solid #ffffff; +} + +.uiQueryFilter-filterName { + background-color: #cbdfff; + margin-bottom: 4px; + padding: 3px; + cursor: pointer; +} + +.uiQueryFilter-filters INPUT { + width: 300px; +} + +.uiQueryFilter-subMultiFields { + padding-left: 10px; +} + +.uiQueryFilter-rangeHintFrom, +.uiQueryFilter-rangeHintTo { + margin: 0; + opacity: 0.75; +}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/queryFilter/queryFilter.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/queryFilter/queryFilter.js new file mode 100644 index 000000000..bd449a0b7 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/queryFilter/queryFilter.js @@ -0,0 +1,277 @@ +(function( $, app, i18n ) { + + var ui = app.ns("ui"); + var ut = app.ns("ut"); + + ui.QueryFilter = ui.AbstractWidget.extend({ + defaults: { + metadata: null, // (required) instanceof app.data.MetaData + query: null // (required) instanceof app.data.Query that the filters will act apon + }, + init: function() { + this._super(); + this.metadata = this.config.metadata; + this.query = this.config.query; + this.el = $(this._main_template()); + }, + helpTypeMap: { + "date" : "QueryFilter.DateRangeHelp" + }, + requestUpdate: function(jEv) { + if(jEv && jEv.originalEvent) { // we only want to update on real user interaction not generated events + this.query.setPage(1); + this.query.query(); + } + }, + getSpec: function(fieldName) { + return this.metadata.fields[fieldName]; + }, + _selectAlias_handler: function(jEv) { + var indices = (jEv.target.selectedIndex === 0) ? [] : this.metadata.getIndices($(jEv.target).val()); + $(".uiQueryFilter-index").each(function(i, el) { + var jEl = $(el); + if(indices.contains(jEl.text()) !== jEl.hasClass("selected")) { + jEl.click(); + } + }); + this.requestUpdate(jEv); + }, + _selectIndex_handler: function(jEv) { + var jEl = $(jEv.target).closest(".uiQueryFilter-index"); + jEl.toggleClass("selected"); + var selected = jEl.hasClass("selected"); + this.query.setIndex(jEl.text(), selected); + if(selected) { + var types = this.metadata.getTypes(this.query.indices); + this.el.find("DIV.uiQueryFilter-type.selected").each(function(n, el) { + if(! types.contains($(el).text())) { + $(el).click(); + } + }); + } + this.requestUpdate(jEv); + }, + _selectType_handler: function(jEv) { + var jEl = $(jEv.target).closest(".uiQueryFilter-type"); + jEl.toggleClass("selected"); + var type = jEl.text(), selected = jEl.hasClass("selected"); + this.query.setType(type, selected); + if(selected) { + var indices = this.metadata.types[type].indices; + // es throws a 500 if searching an index for a type it does not contain - so we prevent that + this.el.find("DIV.uiQueryFilter-index.selected").each(function(n, el) { + if(! indices.contains($(el).text())) { + $(el).click(); + } + }); + // es throws a 500 if you specify types from different indices with _all + jEl.siblings(".uiQueryFilter-type.selected").forEach(function(el) { + if(this.metadata.types[$(el).text()].indices.intersection(indices).length === 0) { + $(el).click(); + } + }, this); + } + this.requestUpdate(jEv); + }, + _openFilter_handler: function(section) { + var field_name = section.config.title; + if(! section.loaded) { + var spec = this.getSpec(field_name); + if(spec.core_type === "string") { + section.body.append(this._textFilter_template(spec)); + } else if(spec.core_type === "date") { + section.body.append(this._dateFilter_template(spec)); + section.body.append(new ui.DateHistogram({ printEl: section.body.find("INPUT"), cluster: this.cluster, query: this.query, spec: spec })); + } else if(spec.core_type === "number") { + section.body.append(this._numericFilter_template(spec)); + } else if(spec.core_type === 'boolean') { + section.body.append(this._booleanFilter_template(spec)); + } else if (spec.core_type === 'multi_field') { + section.body.append(this._multiFieldFilter_template(section, spec)); + } + section.loaded = true; + } + section.on("animComplete", function(section) { section.body.find("INPUT").focus(); }); + }, + _textFilterChange_handler: function(jEv) { + var jEl = $(jEv.target).closest("INPUT"); + var val = jEl.val(); + var spec = jEl.data("spec"); + var uqids = jEl.data("uqids") || []; + uqids.forEach(function(uqid) { + uqid && this.query.removeClause(uqid); + }, this); + if(val.length) { + if(jEl[0] === document.activeElement && jEl[0].selectionStart === jEl[0].selectionEnd) { + val = val.replace(new RegExp("(.{"+jEl[0].selectionStart+"})"), "$&*"); + } + uqids = val.split(/\s+/).map(function(term) { + // Figure out the actual field name - needed for multi_field, because + // querying for "field.field" will not work. Simply "field" must be used + // if nothing is aliased. + var fieldNameParts = spec.field_name.split('.'); + var part = fieldNameParts.length - 1; + var name = fieldNameParts[part]; + while (part >= 1) { + if (fieldNameParts[part] !== fieldNameParts[part - 1]) { + name = fieldNameParts[part - 1] + "." + name; + } + part--; + } + return term && this.query.addClause(term, name, "wildcard", "must"); + }, this); + } + jEl.data("uqids", uqids); + this.requestUpdate(jEv); + }, + _dateFilterChange_handler: function(jEv) { + var jEl = $(jEv.target).closest("INPUT"); + var val = jEl.val(); + var spec = jEl.data("spec"); + var uqid = jEl.data("uqid") || null; + var range = window.dateRangeParser.parse(val); + var lastRange = jEl.data("lastRange"); + if(!range || (lastRange && lastRange.start === range.start && lastRange.end === range.end)) { + return; + } + uqid && this.query.removeClause(uqid); + if((range.start && range.end) === null) { + uqid = null; + } else { + var value = {}; + if( range.start ) { + value["gte"] = range.start; + } + if( range.end ) { + value["lte"] = range.end; + } + uqid = this.query.addClause( value, spec.field_name, "range", "must"); + } + jEl.data("lastRange", range); + jEl.siblings(".uiQueryFilter-rangeHintFrom") + .text(i18n.text("QueryFilter.DateRangeHint.from", range.start && new Date(range.start).toUTCString())); + jEl.siblings(".uiQueryFilter-rangeHintTo") + .text(i18n.text("QueryFilter.DateRangeHint.to", range.end && new Date(range.end).toUTCString())); + jEl.data("uqid", uqid); + this.requestUpdate(jEv); + }, + _numericFilterChange_handler: function(jEv) { + var jEl = $(jEv.target).closest("INPUT"); + var val = jEl.val(); + var spec = jEl.data("spec"); + var uqid = jEl.data("uqid") || null; + var lastRange = jEl.data("lastRange"); + var range = (function(val) { + var ops = val.split(/->|<>|</).map( function(v) { return parseInt(v.trim(), 10); }); + if(/<>/.test(val)) { + return { gte: (ops[0] - ops[1]), lte: (ops[0] + ops[1]) }; + } else if(/->|</.test(val)) { + return { gte: ops[0], lte: ops[1] }; + } else { + return { gte: ops[0], lte: ops[0] }; + } + })(val || ""); + if(!range || (lastRange && lastRange.lte === range.lte && lastRange.gte === range.gte)) { + return; + } + jEl.data("lastRange", range); + uqid && this.query.removeClause(uqid); + uqid = this.query.addClause( range, spec.field_name, "range", "must"); + jEl.data("uqid", uqid); + this.requestUpdate(jEv); + }, + _booleanFilterChange_handler: function( jEv ) { + var jEl = $(jEv.target).closest("SELECT"); + var val = jEl.val(); + var spec = jEl.data("spec"); + var uqid = jEl.data("uqid") || null; + uqid && this.query.removeClause(uqid); + if(val === "true" || val === "false") { + jEl.data("uqid", this.query.addClause(val, spec.field_name, "term", "must") ); + } + this.requestUpdate(jEv); + }, + _main_template: function() { + return { tag: "DIV", id: this.id(), cls: "uiQueryFilter", children: [ + this._aliasSelector_template(), + this._indexSelector_template(), + this._typesSelector_template(), + this._filters_template() + ] }; + }, + _aliasSelector_template: function() { + var aliases = Object.keys(this.metadata.aliases).sort(); + aliases.unshift( i18n.text("QueryFilter.AllIndices") ); + return { tag: "DIV", cls: "uiQueryFilter-section uiQueryFilter-aliases", children: [ + { tag: "SELECT", onChange: this._selectAlias_handler, children: aliases.map(ut.option_template) } + ] }; + }, + _indexSelector_template: function() { + var indices = Object.keys( this.metadata.indices ).sort(); + return { tag: "DIV", cls: "uiQueryFilter-section uiQueryFilter-indices", children: [ + { tag: "HEADER", text: i18n.text("QueryFilter-Header-Indices") }, + { tag: "DIV", onClick: this._selectIndex_handler, children: indices.map( function( name ) { + return { tag: "DIV", cls: "uiQueryFilter-booble uiQueryFilter-index", text: name }; + })} + ] }; + }, + _typesSelector_template: function() { + var types = Object.keys( this.metadata.types ).sort(); + return { tag: "DIV", cls: "uiQueryFilter-section uiQueryFilter-types", children: [ + { tag: "HEADER", text: i18n.text("QueryFilter-Header-Types") }, + { tag: "DIV", onClick: this._selectType_handler, children: types.map( function( name ) { + return { tag: "DIV", cls: "uiQueryFilter-booble uiQueryFilter-type", text: name }; + })} + ] }; + }, + _filters_template: function() { + var _metadataFields = this.metadata.fields; + var fields = Object.keys( _metadataFields ).sort() + .filter(function(d) { return (_metadataFields[d].core_type !== undefined); }); + return { tag: "DIV", cls: "uiQueryFilter-section uiQueryFilter-filters", children: [ + { tag: "HEADER", text: i18n.text("QueryFilter-Header-Fields") }, + { tag: "DIV", children: fields.map( function(name ) { + return new app.ui.SidebarSection({ + title: name, + help: this.helpTypeMap[this.metadata.fields[ name ].type], + onShow: this._openFilter_handler + }); + }, this ) } + ] }; + }, + _textFilter_template: function(spec) { + return { tag: "INPUT", data: { spec: spec }, onKeyup: this._textFilterChange_handler }; + }, + _dateFilter_template: function(spec) { + return { tag: "DIV", children: [ + { tag: "INPUT", data: { spec: spec }, onKeyup: this._dateFilterChange_handler }, + { tag: "PRE", cls: "uiQueryFilter-rangeHintFrom", text: i18n.text("QueryFilter.DateRangeHint.from", "")}, + { tag: "PRE", cls: "uiQueryFilter-rangeHintTo", text: i18n.text("QueryFilter.DateRangeHint.to", "") } + ]}; + }, + _numericFilter_template: function(spec) { + return { tag: "INPUT", data: { spec: spec }, onKeyup: this._numericFilterChange_handler }; + }, + _booleanFilter_template: function(spec) { + return { tag: "SELECT", data: { spec: spec }, onChange: this._booleanFilterChange_handler, + children: [ i18n.text("QueryFilter.AnyValue"), "true", "false" ].map( function( val ) { + return { tag: "OPTION", value: val, text: val }; + }) + }; + }, + _multiFieldFilter_template: function(section, spec) { + return { + tag : "DIV", cls : "uiQueryFilter-subMultiFields", children : acx.eachMap(spec.fields, function(name, data) { + if (name === spec.field_name) { + section.config.title = spec.field_name + "." + name; + return this._openFilter_handler(section); + } + return new app.ui.SidebarSection({ + title : data.field_name, help : this.helpTypeMap[data.type], onShow : this._openFilter_handler + }); + }, this) + }; + } + }); + +})( this.jQuery, this.app, this.i18n ); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/refreshButton/refreshButton.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/refreshButton/refreshButton.js new file mode 100644 index 000000000..a776e21f8 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/refreshButton/refreshButton.js @@ -0,0 +1,41 @@ +(function( $, app, i18n ) { + + var ui = app.ns("ui"); + + ui.RefreshButton = ui.SplitButton.extend({ + defaults: { + timer: -1 + }, + init: function( parent ) { + this.config.label = i18n.text("General.RefreshResults"); + this._super( parent ); + this.set( this.config.timer ); + }, + set: function( value ) { + this.value = value; + window.clearInterval( this._timer ); + if( this.value > 0 ) { + this._timer = window.setInterval( this._refresh_handler, this.value ); + } + }, + _click_handler: function() { + this._refresh_handler(); + }, + _select_handler: function( el, event ) { + this.set( event.value ); + this.fire("change", this ); + }, + _refresh_handler: function() { + this.fire("refresh", this ); + }, + _getItems: function() { + return [ + { text: i18n.text("General.ManualRefresh"), value: -1 }, + { text: i18n.text("General.RefreshQuickly"), value: 100 }, + { text: i18n.text("General.Refresh5seconds"), value: 5000 }, + { text: i18n.text("General.Refresh1minute"), value: 60000 } + ]; + } + }); + +})( this.jQuery, this.app, this.i18n ); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/refreshButton/refreshButtonDemo.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/refreshButton/refreshButtonDemo.js new file mode 100644 index 000000000..c37df9c90 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/refreshButton/refreshButtonDemo.js @@ -0,0 +1,12 @@ +$( function() { + + var ui = window.app.ns("ui"); + + window.builder = function() { + return new ui.RefreshButton({ + onRefresh: function() { console.log("-> refresh", arguments ); }, + onChange: function() { console.log("-> change", arguments ); } + }); + }; + +}); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/refreshButton/refreshButtonSpec.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/refreshButton/refreshButtonSpec.js new file mode 100644 index 000000000..8cc325f42 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/refreshButton/refreshButtonSpec.js @@ -0,0 +1,92 @@ +describe("app.ui.RefreshButton", function() { + + var RefreshButton = window.app.ui.RefreshButton; + + var r, refresh_handler, change_handler; + + function openMenuPanel( button, label ) { + button.el.find("BUTTON").eq(1).click(); + $(".uiMenuPanel-label:contains(" + label + ")").click(); + test.clock.tick(); // menuPanel -> bind _close_handler + } + + + beforeEach( function() { + test.clock.steal(); + refresh_handler = jasmine.createSpy("refresh_handler"); + change_handler = jasmine.createSpy("change_handler"); + r = new RefreshButton({ + onRefresh: refresh_handler, + onChange: change_handler + }); + r.attach( document.body ); + }); + + afterEach( function() { + r.remove(); + test.clock.restore(); + }); + + it("should have an initial default value", function() { + expect( r.value ).toBe( -1 ); + }); + + it("should fire a refresh event after clicking the refresh button ", function() { + r.el.find("BUTTON").eq(0).click(); + + expect( refresh_handler ).toHaveBeenCalled(); + }); + + it("should change the refresh rate when set it called", function() { + r.set( 100 ); + expect( r.value ).toBe( 100 ); + }); + + it("should set an interval when rate is set to a positive value", function() { + r.set( 100 ); + test.clock.tick(); + expect( refresh_handler.calls.count() ).toBe( 1 ); + }); + + it("should not set an interval when rate is set to a non positive value", function() { + r.set( -1 ); + test.clock.tick(); + expect( refresh_handler.calls.count() ).toBe( 0 ); + }); + + it("should fire a refresh event on intervals if refresh menu item is set to quickly", function() { + openMenuPanel( r, "quickly" ); + + expect( refresh_handler.calls.count() ).toBe( 0 ); + test.clock.tick(); + expect( refresh_handler.calls.count() ).toBe( 1 ); + test.clock.tick(); + expect( refresh_handler.calls.count() ).toBe( 2 ); + }); + + it("should not fire refresh events when user selects Manual", function() { + + openMenuPanel( r, "quickly" ); + + expect( refresh_handler.calls.count() ).toBe( 0 ); + test.clock.tick(); + expect( refresh_handler.calls.count() ).toBe( 1 ); + + openMenuPanel( r, "Manual" ); + + test.clock.tick(); + expect( refresh_handler.calls.count() ).toBe( 1 ); + test.clock.tick(); + expect( refresh_handler.calls.count() ).toBe( 1 ); + }); + + it("should fire a change event when a new refresh rate is selected", function() { + openMenuPanel( r, "quickly" ); + expect( change_handler.calls.count() ).toBe( 1 ); + expect( r.value ).toBe( 100 ); + openMenuPanel( r, "Manual" ); + expect( change_handler.calls.count() ).toBe( 2 ); + expect( r.value ).toBe( -1 ); + }); + +}); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/resultTable/resultTable.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/resultTable/resultTable.js new file mode 100644 index 000000000..6c7cf558d --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/resultTable/resultTable.js @@ -0,0 +1,55 @@ +(function( $, app ) { + + var ui = app.ns("ui"); + + ui.ResultTable = ui.Table.extend({ + defaults: { + width: 500, + height: 400 + }, + + init: function() { + this._super(); + this.on("rowClick", this._showPreview_handler); + this.selectedRow = null; + $(document).bind("keydown", this._nav_handler); + }, + remove: function() { + $(document).unbind("keydown", this._nav_handler); + this._super(); + }, + attach: function(parent) { + if(parent) { + var height = parent.height() || ( $(document).height() - parent.offset().top - 41 ); // 41 = height in px of .uiTable-tools + uiTable-header + var width = parent.width(); + this.el.width( width ); + this.body.width( width ).height( height ); + } + this._super(parent); + }, + showPreview: function(row) { + row.addClass("selected"); + this.preview = new app.ui.JsonPanel({ + title: i18n.text("Browser.ResultSourcePanelTitle"), + json: row.data("row")._source, + onClose: function() { row.removeClass("selected"); } + }); + }, + _nav_handler: function(jEv) { + if(jEv.keyCode !== 40 && jEv.keyCode !== 38) { + return; + } + this.selectedRow && this.preview && this.preview.remove(); + if(jEv.keyCode === 40) { // up arrow + this.selectedRow = this.selectedRow ? this.selectedRow.next("TR") : this.body.find("TR:first"); + } else if(jEv.keyCode === 38) { // down arrow + this.selectedRow = this.selectedRow ? this.selectedRow.prev("TR") : this.body.find("TR:last"); + } + this.selectedRow && this.showPreview(this.selectedRow); + }, + _showPreview_handler: function(obj, data) { + this.showPreview(this.selectedRow = data.row); + } + }); + +})( this.jQuery, this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/selectMenuPanel/selectMenuPanel.css b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/selectMenuPanel/selectMenuPanel.css new file mode 100644 index 000000000..7315527df --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/selectMenuPanel/selectMenuPanel.css @@ -0,0 +1,11 @@ +.uiSelectMenuPanel .uiMenuPanel-label { + margin-left: 1em; + padding-left: 4px; +} + +.uiSelectMenuPanel .uiMenuPanel-item.selected .uiMenuPanel-label:before { + content: "\2713"; + width: 12px; + margin-left: -12px; + display: inline-block; +} diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/selectMenuPanel/selectMenuPanel.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/selectMenuPanel/selectMenuPanel.js new file mode 100644 index 000000000..8cbecc56c --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/selectMenuPanel/selectMenuPanel.js @@ -0,0 +1,33 @@ +(function( app ) { + + var ui = app.ns("ui"); + + ui.SelectMenuPanel = ui.MenuPanel.extend({ + defaults: { + items: [], // (required) an array of menu items + value: null + }, + _baseCls: "uiSelectMenuPanel uiMenuPanel", + init: function() { + this.value = this.config.value; + this._super(); + }, + _getItems: function() { + return this.config.items.map( function( item ) { + return { + text: item.text, + selected: this.value === item.value, + onclick: function( jEv ) { + var el = $( jEv.target ).closest("LI"); + el.parent().children().removeClass("selected"); + el.addClass("selected"); + this.fire( "select", this, { value: item.value } ); + this.value = item.value; + }.bind(this) + }; + }, this ); + + } + }); + +})( this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/sidebarSection/sidebarSection.css b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/sidebarSection/sidebarSection.css new file mode 100644 index 000000000..654389fcd --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/sidebarSection/sidebarSection.css @@ -0,0 +1,28 @@ +.uiSidebarSection-head { + background-color: #b9cfff; + background-image: url('data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAcCAMAAABifa5OAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAMAUExURQUCFf///wICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkNDQ0REREVFRUZGRkdHR0hISElJSUpKSktLS0xMTE1NTU5OTk9PT1BQUFFRUVJSUlNTU1RUVFVVVVZWVldXV1hYWFlZWVpaWltbW1xcXF1dXV5eXl9fX2BgYGFhYWJiYmNjY2RkZGVlZWZmZmdnZ2hoaGlpaWpqamtra2xsbG1tbW5ubm9vb3BwcHFxcXJycnNzc3R0dHV1dXZ2dnd3d3h4eHl5eXp6ent7e3x8fH19fX5+fn9/f4CAgIGBgYKCgoODg4SEhIWFhYaGhoeHh4iIiImJiYqKiouLi4yMjI2NjY6Ojo+Pj5CQkJGRkZKSkpOTk5SUlJWVlZaWlpeXl5iYmJmZmZqampubm5ycnJ2dnZ6enp+fn6CgoKGhoaKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq6ysrK2tra6urq+vr7CwsLGxsbKysrOzs7S0tLW1tba2tre3t7i4uLm5ubq6uru7u7y8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvLy8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tPT09TU1NXV1dbW1tfX19jY2NnZ2dra2tvb29zc3N3d3d7e3t/f3+Dg4OHh4eLi4uPj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6uvr6+zs7O3t7e7u7u/v7/Dw8PHx8fLy8vPz8/T09PX19fb29vf39/j4+Pn5+fr6+vv7+/z8/P39/f7+/v///2Oyy/cAAAACdFJOU/8A5bcwSgAAADxJREFUeNq8zzkOACAMA8Hd/3+agiuRcIsrRopIjArOoLK1QAMNNBCRPkhLyzkn35Bjfd7JR1Nr09NoDACnvgDl1zlzoQAAAABJRU5ErkJggg=='); + background-repeat: no-repeat; + background-position: 2px 5px; + margin-bottom: 1px; + padding: 3px 3px 3px 17px; + cursor: pointer; +} + +.shown > .uiSidebarSection-head { + background-position: 2px -13px; +} + +.uiSidebarSection-body { + margin-bottom: 3px; + display: none; +} + +.uiSidebarSection-help { + text-shadow: #228 1px 1px 2px; + color: blue; + cursor: pointer; +} + +.uiSidebarSection-help:hover { + text-decoration: underline; +} diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/sidebarSection/sidebarSection.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/sidebarSection/sidebarSection.js new file mode 100644 index 000000000..d5ab98449 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/sidebarSection/sidebarSection.js @@ -0,0 +1,41 @@ +(function( $, app, i18n ) { + + var ui = app.ns("ui"); + + ui.SidebarSection = ui.AbstractWidget.extend({ + defaults: { + title: "", + help: null, + body: null, + open: false + }, + init: function() { + this._super(); + this.el = $.joey( this._main_template() ); + this.body = this.el.children(".uiSidebarSection-body"); + this.config.open && ( this.el.addClass("shown") && this.body.css("display", "block") ); + }, + _showSection_handler: function( ev ) { + var shown = $( ev.target ).closest(".uiSidebarSection") + .toggleClass("shown") + .children(".uiSidebarSection-body").slideToggle(200, function() { this.fire("animComplete", this); }.bind(this)) + .end() + .hasClass("shown"); + this.fire(shown ? "show" : "hide", this); + }, + _showHelp_handler: function( ev ) { + new ui.HelpPanel({ref: this.config.help}); + ev.stopPropagation(); + }, + _main_template: function() { return ( + { tag: "DIV", cls: "uiSidebarSection", children: [ + (this.config.title && { tag: "DIV", cls: "uiSidebarSection-head", onclick: this._showSection_handler, children: [ + this.config.title, + ( this.config.help && { tag: "SPAN", cls: "uiSidebarSection-help pull-right", onclick: this._showHelp_handler, text: i18n.text("General.HelpGlyph") } ) + ] }), + { tag: "DIV", cls: "uiSidebarSection-body", children: [ this.config.body ] } + ] } + ); } + }); + +})( this.jQuery, this.app, this.i18n ); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/splitButton/splitButton.css b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/splitButton/splitButton.css new file mode 100644 index 000000000..e8d275296 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/splitButton/splitButton.css @@ -0,0 +1,33 @@ +.uiSplitButton { + white-space: nowrap; +} + +.uiSplitButton .uiButton:first-child { + margin-right: 0; + display: inline-block; +} + +.uiSplitButton .uiButton:first-child .uiButton-content { + border-right-width: 1; + border-right-color: #5296c7; + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.uiSplitButton .uiMenuButton { + margin-left: 0; +} + +.uiSplitButton .uiButton:last-child .uiButton-content { + border-radius: 2px; + border-left-width: 1; + border-left-color: #96c6eb; + border-top-left-radius: 0; + border-bottom-left-radius: 0; + height: 20px; +} + +.uiSplitButton .uiButton:last-child .uiButton-label { + padding: 2px 17px 2px 6px; + margin-left: -8px; +} diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/splitButton/splitButton.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/splitButton/splitButton.js new file mode 100644 index 000000000..8785b99c5 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/splitButton/splitButton.js @@ -0,0 +1,54 @@ +(function( $, app ) { + + var ui = app.ns("ui"); + + ui.SplitButton = ui.AbstractWidget.extend({ + defaults: { + items: [], + label: "" + }, + _baseCls: "uiSplitButton", + init: function( parent ) { + this._super( parent ); + this.value = null; + this.button = new ui.Button({ + label: this.config.label, + onclick: this._click_handler + }); + this.menu = new ui.SelectMenuPanel({ + value: this.config.value, + items: this._getItems(), + onSelect: this._select_handler + }); + this.menuButton = new ui.MenuButton({ + label: "\u00a0", + menu: this.menu + }); + this.el = $.joey(this._main_template()); + }, + remove: function() { + this.menu.remove(); + }, + disable: function() { + this.button.disable(); + }, + enable: function() { + this.button.enable(); + }, + _click_handler: function() { + this.fire("click", this, { value: this.value } ); + }, + _select_handler: function( panel, event ) { + this.fire( "select", this, event ); + }, + _getItems: function() { + return this.config.items; + }, + _main_template: function() { + return { tag: "DIV", cls: this._baseCls, children: [ + this.button, this.menuButton + ] }; + } + }); + +})( this.jQuery, this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/splitButton/splitButtonDemo.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/splitButton/splitButtonDemo.js new file mode 100644 index 000000000..76b6fa2dc --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/splitButton/splitButtonDemo.js @@ -0,0 +1,16 @@ +$( function() { + + var ui = window.app.ns("ui"); + + window.builder = function() { + return new ui.SplitButton({ + label: "Default", + items: [ + { label: "Action" }, + { label: "Another Action" }, + { label: "Selected", selected: true } + ] + }); + }; + +});
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/structuredQuery/structuredQuery.css b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/structuredQuery/structuredQuery.css new file mode 100644 index 000000000..502204587 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/structuredQuery/structuredQuery.css @@ -0,0 +1,7 @@ +.uiStructuredQuery { + padding: 10px; +} + +.uiStructuredQuery-out { + min-height: 30px; +} diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/structuredQuery/structuredQuery.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/structuredQuery/structuredQuery.js new file mode 100644 index 000000000..aeb4b6b8f --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/structuredQuery/structuredQuery.js @@ -0,0 +1,95 @@ +(function( $, app, i18n ) { + + var ui = app.ns("ui"); + var data = app.ns("data"); + + var StructuredQuery = ui.AbstractWidget.extend({ + defaults: { + cluster: null // (required) instanceof app.services.Cluster + }, + _baseCls: "uiStructuredQuery", + init: function(parent) { + this._super(); + this.selector = new ui.IndexSelector({ + onIndexChanged: this._indexChanged_handler, + cluster: this.config.cluster + }); + this.el = $(this._main_template()); + this.out = this.el.find("DIV.uiStructuredQuery-out"); + this.attach( parent ); + }, + + _indexChanged_handler: function( index ) { + this.filter && this.filter.remove(); + this.filter = new ui.FilterBrowser({ + cluster: this.config.cluster, + index: index, + onStartingSearch: function() { this.el.find("DIV.uiStructuredQuery-out").text( i18n.text("General.Searching") ); this.el.find("DIV.uiStructuredQuery-src").hide(); }.bind(this), + onSearchSource: this._searchSource_handler, + onResults: this._results_handler + }); + this.el.find(".uiStructuredQuery-body").append(this.filter); + }, + + _results_handler: function( filter, event ) { + var typeMap = { + "json": this._jsonResults_handler, + "table": this._tableResults_handler, + "csv": this._csvResults_handler + }; + typeMap[ event.type ].call( this, event.data, event.metadata ); + }, + _jsonResults_handler: function( results ) { + this.el.find("DIV.uiStructuredQuery-out").empty().append( new ui.JsonPretty({ obj: results })); + }, + _csvResults_handler: function( results ) { + this.el.find("DIV.uiStructuredQuery-out").empty().append( new ui.CSVTable({ results: results })); + }, + _tableResults_handler: function( results, metadata ) { + // hack up a QueryDataSourceInterface so that StructuredQuery keeps working without using a Query object + var qdi = new data.QueryDataSourceInterface({ metadata: metadata, query: new data.Query() }); + var tab = new ui.Table( { + store: qdi, + height: 400, + width: this.out.innerWidth() + } ).attach(this.out.empty()); + qdi._results_handler(qdi.config.query, results); + }, + + _showRawJSON : function() { + if($("#rawJsonText").length === 0) { + var hiddenButton = $("#showRawJSON"); + var jsonText = $({tag: "P", type: "p", id: "rawJsonText"}); + jsonText.text(hiddenButton[0].value); + hiddenButton.parent().append(jsonText); + } + }, + + _searchSource_handler: function(src) { + var searchSourceDiv = this.el.find("DIV.uiStructuredQuery-src"); + searchSourceDiv.empty().append(new app.ui.JsonPretty({ obj: src })); + if(typeof JSON !== "undefined") { + var showRawJSON = $({ tag: "BUTTON", type: "button", text: i18n.text("StructuredQuery.ShowRawJson"), id: "showRawJSON", value: JSON.stringify(src), onclick: this._showRawJSON }); + searchSourceDiv.append(showRawJSON); + } + searchSourceDiv.show(); + }, + + _main_template: function() { + return { tag: "DIV", cls: this._baseCls, children: [ + this.selector, + { tag: "DIV", cls: "uiStructuredQuery-body" }, + { tag: "DIV", cls: "uiStructuredQuery-src", css: { display: "none" } }, + { tag: "DIV", cls: "uiStructuredQuery-out" } + ]}; + } + }); + + ui.StructuredQuery = ui.Page.extend({ + init: function() { + this.q = new StructuredQuery( this.config ); + this.el = this.q.el; + } + }); + +})( this.jQuery, this.app, this.i18n ); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/table/table.css b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/table/table.css new file mode 100644 index 000000000..ea8e0cfd4 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/table/table.css @@ -0,0 +1,92 @@ +.uiTable TABLE { + border-collapse: collapse; +} + +.uiTable-body { + overflow-y: scroll; + overflow-x: auto; +} + +.uiTable-headers { + overflow-x: hidden; +} + +.uiTable-body TD { + white-space: nowrap; +} + +.uiTable-body .uiTable-header-row TH, +.uiTable-body .uiTable-header-row TH DIV { + padding-top: 0; + padding-bottom: 0; +} + +.uiTable-body .uiTable-header-cell > DIV { + height: 0; + overflow: hidden; +} + +.uiTable-headercell-menu { + float: right; +} + +.uiTable-tools { + padding: 3px 4px; + height: 14px; +} + +.uiTable-header-row { + background: #ddd; + background: -moz-linear-gradient(top, #eee, #ccc); + background: -webkit-linear-gradient(top, #eee, #ccc); +} + +.uiTable-headercell-text { + margin-right: 20px; +} + +.uiTable-headercell-menu { + display: none; +} + +.uiTable-header-row TH { + border-right: 1px solid #bbb; + padding: 0; + text-align: left; +} + +.uiTable-header-row TH > DIV { + padding: 3px 4px; + border-right: 1px solid #eee; +} + +.uiTable-headerEndCap > DIV { + width: 19px; +} + +.uiTable-header-row .uiTable-sort { + background: #ccc; + background: -moz-linear-gradient(top, #bebebe, #ccc); + background: -webkit-linear-gradient(top, #bebebe, #ccc); +} +.uiTable-header-row TH.uiTable-sort > DIV { + border-right: 1px solid #ccc; +} + +.uiTable-sort .uiTable-headercell-menu { + display: block; +} + +.uiTable TABLE TD { + border-right: 1px solid transparent; + padding: 3px 4px; +} + +.uiTable-body TABLE TR:nth-child(even) { + background: #f3f3f3; +} + +.uiTable-body TABLE TR.selected { + color: white; + background: #6060f1; +} diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/table/table.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/table/table.js new file mode 100644 index 000000000..eb847a056 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/table/table.js @@ -0,0 +1,102 @@ +( function( $, app ) { + + var ui = app.ns("ui"); + + ui.Table = ui.AbstractWidget.extend({ + defaults: { + store: null, // (required) implements interface app.data.DataSourceInterface + height: 0, + width: 0 + }, + _baseCls: "uiTable", + init: function(parent) { + this._super(); + this.initElements(parent); + this.config.store.on("data", this._data_handler); + }, + attach: function(parent) { + if(parent) { + this._super(parent); + this._reflow(); + } + }, + initElements: function(parent) { + this.el = $.joey(this._main_template()); + this.body = this.el.find(".uiTable-body"); + this.headers = this.el.find(".uiTable-headers"); + this.tools = this.el.find(".uiTable-tools"); + this.attach( parent ); + }, + _data_handler: function(store) { + this.tools.text(store.summary); + this.headers.empty().append(this._header_template(store.columns)); + this.body.empty().append(this._body_template(store.data, store.columns)); + this._reflow(); + }, + _reflow: function() { + var firstCol = this.body.find("TR:first TH.uiTable-header-cell > DIV"), + headers = this.headers.find("TR:first TH.uiTable-header-cell > DIV"); + for(var i = 0; i < headers.length; i++) { + $(headers[i]).width( $(firstCol[i]).width() ); + } + this._scroll_handler(); + }, + _scroll_handler: function(ev) { + this.el.find(".uiTable-headers").scrollLeft(this.body.scrollLeft()); + }, + _dataClick_handler: function(ev) { + var row = $(ev.target).closest("TR"); + if(row.length) { + this.fire("rowClick", this, { row: row } ); + } + }, + _headerClick_handler: function(ev) { + var header = $(ev.target).closest("TH.uiTable-header-cell"); + if(header.length) { + this.fire("headerClick", this, { header: header, column: header.data("column"), dir: header.data("dir") }); + } + }, + _main_template: function() { + return { tag: "DIV", id: this.id(), css: { width: this.config.width + "px" }, cls: this._baseCls, children: [ + { tag: "DIV", cls: "uiTable-tools" }, + { tag: "DIV", cls: "uiTable-headers", onclick: this._headerClick_handler }, + { tag: "DIV", cls: "uiTable-body", + onclick: this._dataClick_handler, + onscroll: this._scroll_handler, + css: { height: this.config.height + "px", width: this.config.width + "px" } + } + ] }; + }, + _header_template: function(columns) { + var ret = { tag: "TABLE", children: [ this._headerRow_template(columns) ] }; + ret.children[0].children.push(this._headerEndCap_template()); + return ret; + }, + _headerRow_template: function(columns) { + return { tag: "TR", cls: "uiTable-header-row", children: columns.map(function(column) { + var dir = ((this.config.store.sort.column === column) && this.config.store.sort.dir) || "none"; + return { tag: "TH", data: { column: column, dir: dir }, cls: "uiTable-header-cell" + ((dir !== "none") ? " uiTable-sort" : ""), children: [ + { tag: "DIV", children: [ + { tag: "DIV", cls: "uiTable-headercell-menu", text: dir === "asc" ? "\u25b2" : "\u25bc" }, + { tag: "DIV", cls: "uiTable-headercell-text", text: column } + ]} + ]}; + }, this)}; + }, + _headerEndCap_template: function() { + return { tag: "TH", cls: "uiTable-headerEndCap", children: [ { tag: "DIV" } ] }; + }, + _body_template: function(data, columns) { + return { tag: "TABLE", children: [] + .concat(this._headerRow_template(columns)) + .concat(data.map(function(row) { + return { tag: "TR", data: { row: row }, cls: "uiTable-row", children: columns.map(function(column){ + return { tag: "TD", cls: "uiTable-cell", children: [ { tag: "DIV", text: (row[column] || "").toString() } ] }; + })}; + })) + }; + } + + }); + +})( this.jQuery, this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/textField/textField.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/textField/textField.js new file mode 100644 index 000000000..c7348962d --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/textField/textField.js @@ -0,0 +1,24 @@ +(function( app ) { + + var ui = app.ns("ui"); + + ui.TextField = ui.AbstractField.extend({ + init: function() { + this._super(); + }, + _keyup_handler: function() { + this.fire("change", this ); + }, + _main_template: function() { + return { tag: "DIV", id: this.id(), cls: "uiField uiTextField", children: [ + { tag: "INPUT", + type: "text", + name: this.config.name, + placeholder: this.config.placeholder, + onkeyup: this._keyup_handler + } + ]}; + } + }); + +})( this.app ); diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/textField/textFieldDemo.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/textField/textFieldDemo.js new file mode 100644 index 000000000..25790d489 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/textField/textFieldDemo.js @@ -0,0 +1,13 @@ +$( function() { + + var ui = window.app.ns("ui"); + + window.builder = function() { return ( + { tag: "DIV", children: [ + new ui.TextField({}), + new ui.TextField({ placeholder: "placeholder" }), + new ui.TextField({ onchange: function( tf ) { console.log( tf.val() ); } }) + ] } + ); }; + +});
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/toolbar/toolbar.css b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/toolbar/toolbar.css new file mode 100644 index 000000000..e5cf72f1f --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/toolbar/toolbar.css @@ -0,0 +1,24 @@ +.uiToolbar { + height: 28px; + background: #fdfefe; + background: -moz-linear-gradient(top, #fdfefe, #eaedef); + background: -webkit-linear-gradient(top, #fdfefe, #eaedef); + border-bottom: 1px solid #d2d5d7; + padding: 3px 10px; +} + +.uiToolbar H2 { + display: inline-block; + font-size: 120%; + margin: 0; + padding: 5px 20px 5px 0; +} + +.uiToolbar .uiTextField { + display: inline-block; +} + +.uiToolbar .uiTextField INPUT { + padding-top: 2px; + padding-bottom: 5px; +}
\ No newline at end of file diff --git a/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/toolbar/toolbar.js b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/toolbar/toolbar.js new file mode 100644 index 000000000..d64eefe32 --- /dev/null +++ b/sdnr/wt/devicemanager/provider/src/test/resources/elasticsearch/plugins/head/src/app/ui/toolbar/toolbar.js @@ -0,0 +1,25 @@ +(function( $, app ) { + + var ui = app.ns("ui"); + + ui.Toolbar = ui.AbstractWidget.extend({ + defaults: { + label: "", + left: [], + right: [] + }, + init: function(parent) { + this._super(); + this.el = $.joey(this._main_template()); + }, + _main_template: function() { + return { tag: "DIV", cls: "uiToolbar", children: [ + { tag: "DIV", cls: "pull-left", children: [ + { tag: "H2", text: this.config.label } + ].concat(this.config.left) }, + { tag: "DIV", cls: "pull-right", children: this.config.right } + ]}; + } + }); + +})( this.jQuery, this.app ); |