/**
* This file is part of CloudML [ http://cloudml.org ]
*
* Copyright (C) 2012 - SINTEF ICT
* Contact: Franck Chauvel <franck.chauvel@sintef.no>
*
* Module: root
*
* CloudML is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version.
*
* CloudML is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General
* Public License along with CloudML. If not, see
* <http://www.gnu.org/licenses/>.
*/
package org.cloudml.monitoring.synchronization;
import com.github.kevinsawicki.http.HttpRequest;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import it.polimi.modaclouds.qos_models.monitoring_ontology.VM;
import org.cloudml.core.ExternalComponent;
import java.util.List;
import java.util.logging.Level;
/**
* @author Lorenzo Cianciaruso
*/
public class MonitoringAPI {
private String address;
private final String version = "v1";
private static final java.util.logging.Logger journal = java.util.logging.Logger.getLogger(MonitoringAPI.class.getName());
public static final int SUCCESS_NO_CONTENT = 204;
public static final int INTERNAL_SERVER_ERROR = 500;
public static final int SUCCESS = 200;
public static final int CLIENT_ERROR_NOT_FOUND = 404;
public static final int NO_RESPONSE = 0;
public MonitoringAPI(String address) {
this.address = address;
}
/**
* This method sends a request to upload a monitoring rule to the monitoring manager.
@param rule is the monitoring rule to be uploaded
@return the response of the monitoring manager
*/
public String addMonitoringRule(String rule){
String url = address + "/" + version + "/monitoring-rules";
String response = null;
try {
response = HttpRequest.post(url).send(rule).body();
} catch (Exception e) {
journal.log(Level.INFO, "Connection to the monitoring manager refused");
}
return response;
}
/**
* This methods sends a request to get all the metrics available
*
* @return a list of metrics
*/
public List<String> getMetrics(){
String url = address + "/" + version + "/metrics";
try {
String response = HttpRequest.get(url).body();
} catch (Exception e) {
journal.log(Level.INFO, "Connection to the monitoring manager refused");
return null;
}
//TODO parse results
return null;
}
/**
* This method sends a request to attach an observer to a specific metric
* @param callback the address on which the observer is running
*
* @param metric the requested metric
*/
public void attachObserver(String callback, String metric) {
String url = address + "/" + version + "/metrics/" + metric + "/observers";
try {
HttpRequest.post(url).send(callback).code();
journal.log(Level.INFO, "Observer attached");
} catch (Exception e) {
journal.log(Level.INFO, "Connection to the monitoring manager refused");
}
}
/**
* This method sends an update to the monitoring manager about the state of the deployment
*
* @param update the state of the deployment
*/
public void addInstances(Model update){
String url = address + "/" + version + "/model/resources";
int result;
Gson gson = new GsonBuilder().serializeNulls().create();
String json = gson.toJson(update);
try {
journal.log(Level.INFO, ">> Connecting to the monitoring platform at "+address+"...");
printComponentname(update);
result = HttpRequest.post(url).send(json).code();
} catch (Exception e) {
result = 0;
}
printResult(result);
}
/**
* This method upload the deployment model in the monitoring manager
*
* @param model the state of the deployment
*/
public void uploadDeployment(Model model){
String url = address + "/" + version + "/model/resources";
int result;
Gson gson = new GsonBuilder().serializeNulls().create();
String json = gson.toJson(model);
try {
journal.log(Level.INFO, ">> Connecting to the monitoring platform at "+address+"...");
result = HttpRequest.put(url).send(json).code();
printComponentname(model);
} catch (Exception e) {
result = 0;
}
printResult(result);
}
/**
* This method tells to the monitoring manager which instances must be removed
* from the deployment model
*
* @param id are the IDs of the instances to be deleted
* @return int code status of the connection
*/
public int deleteInstances(String id){
String url = address + "/" + version + "/model/resources/" + id;
int result;
try {
journal.log(Level.INFO, ">> Connecting to the monitoring platform at "+address+"...");
result = HttpRequest.delete(url).code();
} catch (Exception e) {
result = NO_RESPONSE;
}
printResult(result);
return result;
}
private void printComponentname(Model model){
for(VM vm : model.getvMs()){
journal.log(Level.INFO, "VM name: "+vm.getId());
}
}
private void printResult(int result){
String message = "";
switch(result) {
case SUCCESS:
message = " Connection successful";
break;
case SUCCESS_NO_CONTENT:
message = " Connection successful no content";
break;
case INTERNAL_SERVER_ERROR:
message = " Error during connection, internal server error";
break;
case CLIENT_ERROR_NOT_FOUND:
message = " Connection error, resource not found";
break;
case NO_RESPONSE:
message = " Connection to the monitoring manager refused";
break;
}
journal.log(Level.INFO, String.valueOf(result) + message);
}
}