You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by st...@apache.org on 2012/04/23 16:37:40 UTC

svn commit: r1329263 - in /lucene/dev/trunk/solr: core/src/java/org/apache/solr/handler/PingRequestHandler.java webapp/web/css/styles/dashboard.css webapp/web/js/scripts/dashboard.js webapp/web/tpl/dashboard.html

Author: steffkes
Date: Mon Apr 23 14:37:39 2012
New Revision: 1329263

URL: http://svn.apache.org/viewvc?rev=1329263&view=rev
Log:
SOLR-3301: Add PingRequestHandler for Trunk

Modified:
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/PingRequestHandler.java
    lucene/dev/trunk/solr/webapp/web/css/styles/dashboard.css
    lucene/dev/trunk/solr/webapp/web/js/scripts/dashboard.js
    lucene/dev/trunk/solr/webapp/web/tpl/dashboard.html

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/PingRequestHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/PingRequestHandler.java?rev=1329263&r1=1329262&r2=1329263&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/PingRequestHandler.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/PingRequestHandler.java Mon Apr 23 14:37:39 2012
@@ -18,6 +18,9 @@
 package org.apache.solr.handler;
 
 import java.io.File;
+import java.io.FileWriter;
+import java.text.SimpleDateFormat;
+import java.util.Date;
 
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.CommonParams;
@@ -35,17 +38,70 @@ import org.apache.solr.response.SolrQuer
  */
 public class PingRequestHandler extends RequestHandlerBase 
 {
+
+  SimpleDateFormat formatRFC3339 = new SimpleDateFormat("yyyy-MM-dd'T'h:m:ss.SZ");
+  protected enum ACTIONS {STATUS, ENABLE, DISABLE, PING};
+  private String healthcheck = null;
+  
   @Override
   public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception 
   {
+    
     SolrParams params = req.getParams();
     SolrCore core = req.getCore();
     
     // Check if the service is available
-    String healthcheck = core.getSolrConfig().get("admin/healthcheck/text()", null );
-    if( healthcheck != null && !new File(healthcheck).exists() ) {
-      throw new SolrException(SolrException.ErrorCode.SERVICE_UNAVAILABLE, "Service disabled");
+    healthcheck = core.getSolrConfig().get("admin/healthcheck/text()", null );
+    
+    String actionParam = params.get("action");
+    ACTIONS action = null;
+    if (actionParam == null){
+      action = ACTIONS.PING;
+    }
+    else {
+      try {
+        action = ACTIONS.valueOf(actionParam.toUpperCase());
+      }
+      catch (IllegalArgumentException iae){
+        throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, 
+        "Unknown action: " + actionParam);
+      }
+    }
+    switch(action){
+      case PING:
+        if( healthcheck != null && !new File(healthcheck).exists() ) {
+          throw new SolrException(SolrException.ErrorCode.SERVICE_UNAVAILABLE, "Service disabled");
+        }
+        handlePing(req, rsp);
+        break;
+      case ENABLE:
+        handleEnable(healthcheck,true);
+        break;
+      case DISABLE:
+        handleEnable(healthcheck,false);
+        break;
+      case STATUS:
+        if( healthcheck == null){
+          SolrException e = new SolrException(SolrException.ErrorCode.SERVICE_UNAVAILABLE, "healthcheck not configured");
+          rsp.setException(e);
+        }
+        else {
+          if ( new File(healthcheck).exists() ){
+            rsp.add( "status",  "enabled");      
+          }
+          else {
+            rsp.add( "status",  "disabled");      
+          }
+        }
     }
+
+  }
+  
+  protected void handlePing(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception
+  {
+    
+    SolrParams params = req.getParams();
+    SolrCore core = req.getCore();
     
     // Get the RequestHandler
     String qt = params.get( CommonParams.QT );//optional; you get the default otherwise
@@ -79,7 +135,27 @@ public class PingRequestHandler extends 
     rsp.add( "status", "OK" );
   }
   
-  
+  protected void handleEnable(String healthcheck, boolean enable) throws Exception
+  {
+    if (healthcheck == null) {
+      throw new SolrException(SolrException.ErrorCode.SERVICE_UNAVAILABLE, 
+        "No healthcheck file defined.");
+    }
+    File enableFile = new File(healthcheck);
+    if ( enable ) {
+      enableFile.createNewFile();
+      
+      // write out when the file was created
+      FileWriter fw = new FileWriter(enableFile);      
+      fw.write(formatRFC3339.format(new Date()));
+      fw.close(); 
+      
+    } else {
+      if (enableFile.exists() && !enableFile.delete()){
+        throw new SolrException( SolrException.ErrorCode.NOT_FOUND,"Did not successfully delete healthcheck file:'"+healthcheck+"'");
+      }
+    }
+  }
   //////////////////////// SolrInfoMBeans methods //////////////////////
 
   @Override

Modified: lucene/dev/trunk/solr/webapp/web/css/styles/dashboard.css
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/webapp/web/css/styles/dashboard.css?rev=1329263&r1=1329262&r2=1329263&view=diff
==============================================================================
--- lucene/dev/trunk/solr/webapp/web/css/styles/dashboard.css (original)
+++ lucene/dev/trunk/solr/webapp/web/css/styles/dashboard.css Mon Apr 23 14:37:39 2012
@@ -4,19 +4,19 @@
   width: 49%;
 }
 
-#content #dashboard #statistics
+#content #dashboard .fieldlist
 {
   float: left;
 }
 
-#content #dashboard #statistics dt,
-#content #dashboard #statistics dd
+#content #dashboard .fieldlist dt,
+#content #dashboard .fieldlist dd
 {
   display: block;
   float: left;
 }
 
-#content #dashboard #statistics dt
+#content #dashboard .fieldlist dt
 {
   clear: left;
   margin-right: 2%;
@@ -24,28 +24,28 @@
   width: 23%;
 }
 
-#content #dashboard #statistics dd
+#content #dashboard .fieldlist dd
 {
   width: 74%;
 }
 
-#content #dashboard #statistics .index_optimized
+#content #dashboard .fieldlist .index_optimized
 {
   margin-top: 10px;
 }
 
-#content #dashboard #statistics .ico
+#content #dashboard .fieldlist .ico
 {
   background-image: url( ../../img/ico/slash.png );
   height: 20px;
 }
 
-#content #dashboard #statistics .ico.ico-1
+#content #dashboard .fieldlist .ico.ico-1
 {
   background-image: url( ../../img/ico/tick.png );
 }
 
-#content #dashboard #statistics .ico span
+#content #dashboard .fieldlist .ico span
 {
   display: none;
 }
@@ -111,4 +111,17 @@
 #content #dashboard #replication.is-master h2 { background-image: url( ../../img/ico/node-master.png ); }
 #content #dashboard #replication.is-slave h2 { background-image: url( ../../img/ico/node-slave.png ); }
 #content #dashboard #dataimport h2 { background-image: url( ../../img/ico/document-import.png ); }
-#content #dashboard #admin-extra h2 { background-image: url( ../../img/ico/plus-button.png ); }
\ No newline at end of file
+#content #dashboard #admin-extra h2 { background-image: url( ../../img/ico/plus-button.png ); }
+
+#content #dashboard #healthcheck .ico
+{
+  background-image: url( ../../img/ico/slash.png );
+  height: 20px;
+  padding-left: 20px;
+  width: 60%;
+}
+
+#content #dashboard #healthcheck .ico.ico-1
+{
+  background-image: url( ../../img/ico/tick.png );
+}

Modified: lucene/dev/trunk/solr/webapp/web/js/scripts/dashboard.js
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/webapp/web/js/scripts/dashboard.js?rev=1329263&r1=1329262&r2=1329263&view=diff
==============================================================================
--- lucene/dev/trunk/solr/webapp/web/js/scripts/dashboard.js (original)
+++ lucene/dev/trunk/solr/webapp/web/js/scripts/dashboard.js Mon Apr 23 14:37:39 2012
@@ -15,6 +15,27 @@
  limitations under the License.
 */
 
+var set_healthcheck_status = function( status )
+{
+  var hc_button = $( '.healthcheck-status' )
+  if ( status == 'enable' )
+  {
+    hc_button.parents( 'dd' )
+      .removeClass( 'ico-0' )
+      .addClass( 'ico-1' );
+    hc_button
+      .addClass( 'enabled' )
+      .html( 'disable ping' );
+  } else {
+    hc_button.parents( 'dd' )
+      .removeClass( 'ico-1')
+      .addClass( 'ico-0' );
+    hc_button
+      .removeClass( 'enabled' )
+      .html( 'enable ping' );
+  }
+};
+
 // #/:core
 sammy.get
 (
@@ -410,8 +431,110 @@ sammy.get
             }
           }
         );
+
+        $.ajax
+        (
+          {
+            url : core_basepath + '/admin/ping?action=status&wt=json',
+            dataType : 'json',
+            context : $( '#healthcheck', dashboard_element ),
+            beforeSend : function( xhr, settings )
+            {
+              $( 'h2', this )
+                .addClass( 'loader' );
+                            
+              $( '.message', this )
+                .show()
+                .html( 'Loading' );
+
+              $( '.content', this )
+                .hide();
+            },
+            success : function( response, text_status, xhr )
+            {
+              $( '.message', this )
+                .empty()
+                .hide();
+                            
+              $( '.content', this )
+                .show();
+
+              var status_element = $( '.value.status', this );
+              var toggle_button = $( '.healthcheck-status', this );
+              var status = response['status'];
+              $( 'span', status_element ).html( status );
+
+              var action = ( response['status'] == 'enabled' ) ? 'enable' : 'disable';  
+              set_healthcheck_status(action);
+
+              if( response['status'] == 'enabled' )
+              {
+                status_element
+                  .addClass( 'ico-1' );
+                toggle_button
+                  .addClass( 'enabled' );
+              }
+              else
+              {
+                status_element
+                  .addClass( 'ico-0' );
+              }
+              
+              $( '.healthcheck-status', status_element )
+                .die( 'click' )
+                .live
+                (
+                  'click',
+                  function( event )
+                  {                      
+                    var action = $(this).hasClass( 'enabled' ) ? 'disable' : 'enable';  
+                    $.ajax
+                    (
+                      {
+                        url : core_basepath + '/admin/ping?action=' + action + '&wt=json',
+                        dataType : 'json',
+                        context : $( this ),
+                        beforeSend : function( xhr, settings )
+                        {
+                          this
+                            .addClass( 'loader' );
+                        },
+                        success : function( response, text_status, xhr )
+                        {
+                          set_healthcheck_status(action);
+                        },
+                        error : function( xhr, text_status, error_thrown)
+                        {
+                          console.warn( 'd0h, enable broken!' );
+                        },
+                        complete : function( xhr, text_status )
+                        {
+                          this
+                            .removeClass( 'loader' );
+                        }
+                      }
+                    );
+                  }
+                );
+            },
+            error : function( xhr, text_status, error_thrown)
+            {
+              this
+                .addClass( 'disabled' );
+                            
+              $( '.message', this )
+                .show()
+                .html( 'Ping request handler is not configured.' );
+            },
+            complete : function( xhr, text_status )
+            {
+              $( 'h2', this )
+                .removeClass( 'loader' );
+            }
+          }
+        );
                 
       }
     );
   }
-);
\ No newline at end of file
+);

Modified: lucene/dev/trunk/solr/webapp/web/tpl/dashboard.html
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/webapp/web/tpl/dashboard.html?rev=1329263&r1=1329262&r2=1329263&view=diff
==============================================================================
--- lucene/dev/trunk/solr/webapp/web/tpl/dashboard.html (original)
+++ lucene/dev/trunk/solr/webapp/web/tpl/dashboard.html Mon Apr 23 14:37:39 2012
@@ -18,7 +18,7 @@ limitations under the License.
 
   <div class="clearfix">
 
-    <div class="block" id="statistics">
+    <div class="block fieldlist" id="statistics">
 
       <h2><span>Statistics</span></h2>
             
@@ -137,5 +137,28 @@ limitations under the License.
     </div>
 
   </div>
+  
+    <div class="block fieldlist" id="healthcheck">
+
+      <h2><span>Healthcheck</span></h2>
+
+      <div class="message-container">
+        <div class="message"></div>
+      </div>
+
+      <div class="content">
+        <dl>
+                    
+          <dt class="status">Status:</dt>
+          <dd class="status value ico">
+            <button class="healthcheck-status">Healthcheck Status</button>
+          </dd>
+        </dl>
+      </div>
+
+    </div>
+
+  </div>
+  
 
 </div>
\ No newline at end of file