import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
-import org.onap.ccsdk.sli.core.dblib.DBLibConnection;
import org.onap.ccsdk.sli.core.dblib.DbLibService;
import org.onap.ccsdk.sli.plugins.grtoolkit.data.ClusterActor;
import org.onap.ccsdk.sli.plugins.grtoolkit.data.MemberBuilder;
private static final String HEALTHY = "HEALTHY";
private static final String FAULTY = "FAULTY";
private static final String VALUE = "value";
+ private static final String OUTPUT = "output";
+ private static final int CONNECTION_TIMEOUT = 5000; // 5 second timeout
private String akkaConfig;
private String jolokiaClusterPath;
private String shardManagerPath;
DatabaseHealthOutputBuilder outputBuilder = new DatabaseHealthOutputBuilder();
outputBuilder.setStatus("200");
outputBuilder.setHealth(getDatabaseHealth());
+ outputBuilder.setServedBy(member);
return Futures.immediateFuture(RpcResultBuilder.<DatabaseHealthOutput>status(true).withResult(outputBuilder.build()).build());
}
AdminHealthOutputBuilder outputBuilder = new AdminHealthOutputBuilder();
outputBuilder.setStatus("200");
outputBuilder.setHealth(getAdminHealth());
-
+ outputBuilder.setServedBy(member);
+ log.info(outputBuilder.build().toString());
return Futures.immediateFuture(RpcResultBuilder.<AdminHealthOutput>status(true).withResult(outputBuilder.build()).build());
}
HaltAkkaTrafficOutputBuilder outputBuilder = new HaltAkkaTrafficOutputBuilder();
outputBuilder.setStatus("200");
modifyIpTables(IpTables.ADD, input.getNodeInfo().toArray());
+ outputBuilder.setServedBy(member);
return Futures.immediateFuture(RpcResultBuilder.<HaltAkkaTrafficOutput>status(true).withResult(outputBuilder.build()).build());
}
ResumeAkkaTrafficOutputBuilder outputBuilder = new ResumeAkkaTrafficOutputBuilder();
outputBuilder.setStatus("200");
modifyIpTables(IpTables.DELETE, input.getNodeInfo().toArray());
+ outputBuilder.setServedBy(member);
return Futures.immediateFuture(RpcResultBuilder.<ResumeAkkaTrafficOutput>status(true).withResult(outputBuilder.build()).build());
}
SiteIdentifierOutputBuilder outputBuilder = new SiteIdentifierOutputBuilder();
outputBuilder.setStatus("200");
outputBuilder.setId(siteIdentifier);
+ outputBuilder.setServedBy(member);
return Futures.immediateFuture(RpcResultBuilder.<SiteIdentifierOutput>status(true).withResult(outputBuilder.build()).build());
}
public ListenableFuture<RpcResult<FailoverOutput>> failover(FailoverInput input) {
log.info("{}:failover invoked.", APP_NAME);
FailoverOutputBuilder outputBuilder = new FailoverOutputBuilder();
+ outputBuilder.setServedBy(member);
if(siteConfiguration != SiteConfiguration.GEO) {
log.info("Cannot failover non-GEO site.");
outputBuilder.setMessage("Failover aborted. This is not a GEO configuration.");
outputBuilder.setSite2Health(FAULTY);
}
+ outputBuilder.setServedBy(member);
RpcResult<ClusterHealthOutput> rpcResult = RpcResultBuilder.<ClusterHealthOutput>status(true).withResult(outputBuilder.build()).build();
+ log.info("{}:cluster-health: Site 1 | Healthy ODLs {}", APP_NAME, site1Health);
+ if(siteConfiguration == SiteConfiguration.GEO) {
+ log.info("{}:cluster-health: Site 2 | Healthy ODLs {}", APP_NAME, site2Health);
+ }
return Futures.immediateFuture(rpcResult);
}
if(!performedCrossSiteHealthCheck) {
try {
String content = getRequestContent(httpProtocol + clusterActor.getNode() + ":" + port + "/restconf/operations/gr-toolkit:site-identifier", HttpMethod.POST);
- crossSiteIdentifier = new JSONObject(content).getJSONObject("output").getString("id");
+ crossSiteIdentifier = new JSONObject(content).getJSONObject(OUTPUT).getString("id");
crossSiteDbHealthy = crossSiteHealthRequest(httpProtocol + clusterActor.getNode() + ":" + port + "/restconf/operations/gr-toolkit:database-health");
crossSiteAdminHealthy = crossSiteHealthRequest(httpProtocol + clusterActor.getNode() + ":" + port + "/restconf/operations/gr-toolkit:admin-health");
performedCrossSiteHealthCheck = true;
} catch(Exception e) {
- log.info("Cannot get site identifier from {}", clusterActor.getNode());
+ log.info("Cannot get cross site health from {}", clusterActor.getNode());
+ log.info("siteIdentifier: {} | dbHealth: {} | adminHealth: {}", crossSiteIdentifier, crossSiteDbHealthy, crossSiteAdminHealthy);
log.error("Site Health Error", e);
}
}
outputBuilder.getSites().add(builder.build());
builder = getSitesBuilder(site2HealthyODLs, site2Voting, crossSiteAdminHealthy, crossSiteDbHealthy, crossSiteIdentifier);
outputBuilder.getSites().add(builder.build());
+ log.info("{}:site-health: Site 1 ({}) | hasVotingMembers?: {} | Healthy ODLs: {} | ADM isHealthy?: {} | DB isHealthy?: {}", APP_NAME, siteIdentifier, site1Voting, site1HealthyODLs, HEALTHY.equals(adminHealth), HEALTHY.equals(databaseHealth));
+ log.info("{}:site-health: Site 2 ({}) | hasVotingMembers?: {} | Healthy ODLs: {} | ADM isHealthy?: {} | DB isHealthy?: {}", APP_NAME, crossSiteIdentifier, site2Voting, site2HealthyODLs, crossSiteAdminHealthy, crossSiteDbHealthy);
}
else {
// Make calls over to site 1 healthchecks
if(!performedCrossSiteHealthCheck) {
try {
String content = getRequestContent(httpProtocol + clusterActor.getNode() + ":" + port + "/restconf/operations/gr-toolkit:site-identifier", HttpMethod.POST);
- crossSiteIdentifier = new JSONObject(content).getJSONObject("output").getString("id");
+ crossSiteIdentifier = new JSONObject(content).getJSONObject(OUTPUT).getString("id");
crossSiteDbHealthy = crossSiteHealthRequest(httpProtocol + clusterActor.getNode() + ":" + port + "/restconf/operations/gr-toolkit:database-health");
crossSiteAdminHealthy = crossSiteHealthRequest(httpProtocol + clusterActor.getNode() + ":" + port + "/restconf/operations/gr-toolkit:admin-health");
performedCrossSiteHealthCheck = true;
} catch(Exception e) {
- log.info("Cannot get site identifier from {}", clusterActor.getNode());
+ log.info("Cannot get cross site health from {}", clusterActor.getNode());
+ log.info("siteIdentifier: {} | dbHealth: {} | adminHealth: {}", crossSiteIdentifier, crossSiteDbHealthy, crossSiteAdminHealthy);
log.error("Site Health Error", e);
}
}
outputBuilder.getSites().add(builder.build());
builder = getSitesBuilder(site2HealthyODLs, site2Voting, HEALTHY.equals(adminHealth), HEALTHY.equals(databaseHealth), siteIdentifier);
outputBuilder.getSites().add(builder.build());
+ log.info("{}:site-health: Site 1 ({}) | hasVotingMembers?: {} | Healthy ODLs: {} | ADM isHealthy?: {} | DB isHealthy?: {}", APP_NAME, siteIdentifier, site1Voting, site1HealthyODLs, HEALTHY.equals(adminHealth), HEALTHY.equals(databaseHealth));
+ log.info("{}:site-health: Site 2 ({}) | hasVotingMembers?: {} | Healthy ODLs: {} | ADM isHealthy?: {} | DB isHealthy?: {}", APP_NAME, crossSiteIdentifier, site2Voting, site2HealthyODLs, crossSiteAdminHealthy, crossSiteDbHealthy);
}
}
+ outputBuilder.setServedBy(member);
RpcResult<SiteHealthOutput> rpcResult = RpcResultBuilder.<SiteHealthOutput>status(true).withResult(outputBuilder.build()).build();
return Futures.immediateFuture(rpcResult);
}
(org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.plugins.gr.toolkit.rev180926.halt.akka.traffic.input.NodeInfo) node;
log.info("Isolating {}", n.getNode());
executeCommand(String.format("sudo /sbin/iptables -A INPUT -p tcp --destination-port %s -j DROP -s %s", properties.get(PropertyKeys.CONTROLLER_PORT_AKKA), n.getNode()));
- executeCommand(String.format("sudo /sbin/iptables -A OUTPUT -p tcp --destination-port %s -j DROP -s %s", n.getPort(), n.getNode()));
+ executeCommand(String.format("sudo /sbin/iptables -A OUTPUT -p tcp --destination-port %s -j DROP -d %s", n.getPort(), n.getNode()));
}
} else if(task == IpTables.DELETE) {
(org.opendaylight.yang.gen.v1.org.onap.ccsdk.sli.plugins.gr.toolkit.rev180926.resume.akka.traffic.input.NodeInfo) node;
log.info("De-isolating {}", n.getNode());
executeCommand(String.format("sudo /sbin/iptables -D INPUT -p tcp --destination-port %s -j DROP -s %s", properties.get(PropertyKeys.CONTROLLER_PORT_AKKA), n.getNode()));
- executeCommand(String.format("sudo /sbin/iptables -D OUTPUT -p tcp --destination-port %s -j DROP -s %s", n.getPort(), n.getNode()));
+ executeCommand(String.format("sudo /sbin/iptables -D OUTPUT -p tcp --destination-port %s -j DROP -d %s", n.getPort(), n.getNode()));
}
}
String content = getRequestContent(path, HttpMethod.POST);
try {
JSONObject responseJson = new JSONObject(content);
- JSONObject responseValue = responseJson.getJSONObject(VALUE);
+ JSONObject responseValue = responseJson.getJSONObject(OUTPUT);
return HEALTHY.equals(responseValue.getString("health"));
} catch(JSONException e) {
log.error("Error parsing JSON", e);
log.info("Determining database health...");
try {
Connection connection = dbLib.getConnection();
- log.info("DBLib isActive(): {}", dbLib.isActive());
- log.info("DBLib isReadOnly(): {}", connection.isReadOnly());
- log.info("DBLib isClosed(): {}", connection.isClosed());
+ log.debug("DBLib isActive(): {}", dbLib.isActive());
+ log.debug("DBLib isReadOnly(): {}", connection.isReadOnly());
+ log.debug("DBLib isClosed(): {}", connection.isClosed());
if(!dbLib.isActive() || connection.isClosed() || connection.isReadOnly()) {
log.warn("Database is FAULTY");
connection.close();
}
bufferedReader.close();
connection.disconnect();
- return content.toString();
+
+ String response = content.toString();
+ log.debug("getRequestContent(): Response:\n{}", response);
+ return response;
}
private int getRequestStatus(String path, HttpMethod method) throws IOException {
connection.addRequestProperty("Authorization", auth);
connection.setRequestProperty("Connection", "keep-alive");
connection.setRequestProperty("Proxy-Connection", "keep-alive");
+ connection.setConnectTimeout(CONNECTION_TIMEOUT);
+ connection.setReadTimeout(CONNECTION_TIMEOUT);
return connection;
}