From a2a1997c4976499912dae2aadef52a73c764840b Mon Sep 17 00:00:00 2001 From: Dan Timoney Date: Tue, 19 Dec 2017 13:13:36 -0500 Subject: Enhance health check In HA environment, different types of health check are needed for load balancers (which care about state of each node in cluster) vs external applications (which case about state of entire cluster). So, separate APIs are needed for these 2 types of needs. Change-Id: I99cd21cef7a7e2b4b8c96c1f22c0d6210bb91e96 Issue-ID: CCSDK-157 Signed-off-by: Dan Timoney --- sliapi/model/src/main/yang/sliapi.yang | 6 ++ .../onap/ccsdk/sli/core/sliapi/sliapiProvider.java | 64 ++++++++++++++++++++-- 2 files changed, 65 insertions(+), 5 deletions(-) diff --git a/sliapi/model/src/main/yang/sliapi.yang b/sliapi/model/src/main/yang/sliapi.yang index 8deb8a10f..f0e79c068 100755 --- a/sliapi/model/src/main/yang/sliapi.yang +++ b/sliapi/model/src/main/yang/sliapi.yang @@ -108,4 +108,10 @@ module SLI-API { } } + rpc vlbcheck { + output { + uses response-fields; + } + } + } diff --git a/sliapi/provider/src/main/java/org/onap/ccsdk/sli/core/sliapi/sliapiProvider.java b/sliapi/provider/src/main/java/org/onap/ccsdk/sli/core/sliapi/sliapiProvider.java index 88c475174..82e660083 100644 --- a/sliapi/provider/src/main/java/org/onap/ccsdk/sli/core/sliapi/sliapiProvider.java +++ b/sliapi/provider/src/main/java/org/onap/ccsdk/sli/core/sliapi/sliapiProvider.java @@ -8,9 +8,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -21,11 +21,14 @@ package org.onap.ccsdk.sli.core.sliapi; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; import java.util.Enumeration; import java.util.LinkedList; import java.util.Properties; import java.util.concurrent.Future; - import org.onap.ccsdk.sli.core.sli.provider.SvcLogicService; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; @@ -47,11 +50,14 @@ import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.Hea import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.HealthcheckOutputBuilder; import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.SLIAPIService; import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.TestResults; +import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.VlbcheckOutput; +import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.VlbcheckOutputBuilder; import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.execute.graph.input.SliParameter; import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.test.results.TestResult; import org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.core.sliapi.rev161110.test.results.TestResultBuilder; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.common.RpcError.ErrorType; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.yangtools.yang.common.RpcResultBuilder; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; @@ -69,7 +75,6 @@ import org.osgi.framework.FrameworkUtil; import org.osgi.framework.ServiceReference; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import com.google.common.util.concurrent.Futures; @@ -120,6 +125,8 @@ public class sliapiProvider implements AutoCloseable, SLIAPIService{ private static String SLIAPI_NAMESPACE = "org:onap:ccsdk:sli:core:sliapi"; private static String SLIAPI_REVISION = "2016-11-10"; + private static String SDNC_STATUS_FILE = "SDNC_STATUS_FILE"; + private static String sdncStatusFile = null; private static QName TEST_RESULTS_QNAME = null; private static QName TEST_RESULT_QNAME = null; @@ -142,7 +149,8 @@ public class sliapiProvider implements AutoCloseable, SLIAPIService{ public void initialize(){ LOG.info( "Initializing provider for " + appName ); //initialization code goes here. - + sdncStatusFile = System.getenv(SDNC_STATUS_FILE); + LOG.info( "SDNC STATUS FILE = " + sdncStatusFile ); rpcRegistration = rpcRegistry.addRpcImplementation(SLIAPIService.class, this); LOG.info( "Initialization complete for " + appName ); } @@ -554,4 +562,50 @@ public class sliapiProvider implements AutoCloseable, SLIAPIService{ } + @Override + public Future> vlbcheck() { + RpcResult rpcResult = null; + VlbcheckOutputBuilder respBuilder = new VlbcheckOutputBuilder(); + boolean suspended = false; + BufferedReader br = null; + String line = ""; + + // check the state based on the config file + + if (sdncStatusFile != null) { + try { + br = new BufferedReader(new FileReader(sdncStatusFile)); + while((line = br.readLine()) != null) + { + if ("ODL_STATE=SUSPENDED".equals(line)) { + suspended = true; + LOG.debug("vlbcheck: server is suspended"); + } + } + br.close(); + } catch (FileNotFoundException e) { + LOG.trace("Caught File not found exception " + sdncStatusFile +"\n",e); + } catch (Exception e) { + LOG.trace("Failed to read status file " + sdncStatusFile +"\n",e); + } finally { + if (br != null) { + try { + br.close(); + } catch (IOException e) { + LOG.warn("Failed to close status file " + sdncStatusFile +"\n",e); + } + } + } + } + + if (suspended) { + rpcResult = RpcResultBuilder.failed().withError(ErrorType.APPLICATION, + "resource-denied", "Server Suspended").build(); + } else { + respBuilder.setResponseMessage("server is normal"); + rpcResult = RpcResultBuilder. status(true) + .withResult(respBuilder.build()).build(); + } + return (Futures.immediateFuture(rpcResult)); + } } -- cgit 1.2.3-korg