package org.opennaas.extensions.ryu.capability.monitoringmodule;
/*
* #%L
* OpenNaaS :: Ryu Resource
* %%
* Copyright (C) 2007 - 2015 Fundació Privada i2CAT, Internet i Innovació a Catalunya
* %%
* 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.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
import java.io.IOException;
import java.util.Hashtable;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.cxf.binding.BindingFactoryManager;
import org.apache.cxf.endpoint.Server;
import org.apache.cxf.jaxrs.JAXRSBindingFactory;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
import org.opennaas.core.resources.ActivatorException;
import org.opennaas.core.resources.action.IAction;
import org.opennaas.core.resources.action.IActionSet;
import org.opennaas.core.resources.capability.AbstractCapability;
import org.opennaas.core.resources.capability.CapabilityException;
import org.opennaas.core.resources.configurationadmin.ConfigurationAdminUtil;
import org.opennaas.core.resources.descriptor.CapabilityDescriptor;
import org.opennaas.core.resources.protocol.IProtocolSessionManager;
import org.opennaas.core.resources.protocol.ProtocolException;
import org.opennaas.extensions.protocols.http.HttpProtocolSession;
import org.opennaas.extensions.ryu.Activator;
import org.opennaas.extensions.ryu.alarm.AlarmInformation;
import org.opennaas.extensions.ryu.alarm.IAlarmObserver;
import org.opennaas.extensions.ryu.alarm.IMonitoringModuleAlarmHandler;
import org.opennaas.extensions.ryu.alarm.MonitoringModuleAlarmHandler;
import org.opennaas.extensions.ryu.client.monitoringmodule.IMonitoringModuleCallbackAPI;
import org.opennaas.extensions.ryu.client.monitoringmodule.IMonitoringModuleclient;
import org.opennaas.extensions.ryu.client.monitoringmodule.MonitoringModuleJsonProvider;
import org.osgi.framework.ServiceRegistration;
import com.google.common.net.InetAddresses;
/**
*
* @author Adrián Roselló Rey (i2CAT)
*
*/
public class MonitoringModuleCapability extends AbstractCapability implements IMonitoringModuleCapability {
private static final String HOST_KEY = "org.apache.felix.http.host";
private static final String PORT_KEY = "org.osgi.service.http.port";
private static final String HOST_INFO_URL = "org.ops4j.pax.web";
public final static String CAPABILITY_TYPE = "monitoringmodule";
private final static String URL_PREFIX = "/xifi/raise_alarm";
public final String URL_WITH_RESOURCE;
Log log = LogFactory.getLog(MonitoringModuleCapability.class);
private String resourceId = "";
private IMonitoringModuleclient monitoringClient;
private IMonitoringModuleAlarmHandler monitoringModuleAlarmHandler;
private HttpProtocolSession httpProtocolSession;
private String host;
private String port;
private ServiceRegistration callbackRegistration;
public MonitoringModuleCapability(CapabilityDescriptor descriptor, String resourceId) throws CapabilityException {
super(descriptor);
this.resourceId = resourceId;
try {
ConfigurationAdminUtil configurationAdmin = new ConfigurationAdminUtil(Activator.getContext());
host = configurationAdmin.getProperty(HOST_INFO_URL, HOST_KEY);
port = configurationAdmin.getProperty(HOST_INFO_URL, PORT_KEY);
if (StringUtils.isEmpty(host) || StringUtils.isEmpty(port))
throw new CapabilityException(HOST_KEY + " and " + PORT_KEY + " property are required for capability MonitoringModule.");
if (!InetAddresses.isInetAddress(host) && !StringUtils.equals("localhost", host))
throw new CapabilityException(HOST_KEY + " must be a valid ip address. Given value: " + host);
if (!StringUtils.isNumeric(port))
throw new CapabilityException(PORT_KEY + " must be numeric. Given value: " + host);
httpProtocolSession = getHttpProtocolSession(Activator.getProtocolManagerService().getProtocolSessionManager(resourceId));
monitoringClient = httpProtocolSession.getClient(IMonitoringModuleclient.class, new MonitoringModuleJsonProvider());
} catch (ProtocolException e) {
throw new CapabilityException(e);
} catch (ActivatorException e) {
throw new CapabilityException(e);
} catch (IOException e) {
throw new CapabilityException(e);
}
// initialize URL_WITH_RESOURCE
this.URL_WITH_RESOURCE = URL_PREFIX + "/" + this.resourceId;
log.debug("Built new MonitoringModule Capability");
}
@Override
public void registerAlarmObservation(String dpid, String port, String threshold, IAlarmObserver alarmObserver) {
log.info("Registering alarm: [dpid=" + dpid + ",port=" + port + ",threshold=" + threshold + "]");
// register alarm
AlarmInformation alarmInformation = new AlarmInformation(threshold, this.host, this.port, URL_WITH_RESOURCE);
monitoringModuleAlarmHandler.addAlarmObserver(dpid, Integer.valueOf(port), alarmObserver);
monitoringClient.registerAlarm(dpid, port, alarmInformation);
log.info("Alarm registered.");
}
@Override
public void unregisterAlarmObservation(String dpid, String port) {
log.info("Unregistering alarm: [dpid=" + dpid + ",port=" + port + "]");
monitoringModuleAlarmHandler.removeAlarmObserver(dpid, Integer.valueOf(port));
monitoringClient.unregisterAlarm(dpid, port);
log.info("Alarm unregistered");
}
@Override
public String getCapabilityName() {
return CAPABILITY_TYPE;
}
@Override
public IActionSet getActionSet() throws CapabilityException {
throw new UnsupportedOperationException("MonitoringModuleCapability has no actionset.");
}
@Override
public void queueAction(IAction action) throws CapabilityException {
throw new UnsupportedOperationException("MonitoringModuleCapability has no queue.");
}
@Override
public void activate() throws CapabilityException {
super.activate();
monitoringModuleAlarmHandler = new MonitoringModuleAlarmHandler();
// callbackServer = createServer(this.host, this.port, URL_PREFIX);
// callbackServer.start();
registerService();
}
@Override
public void deactivate() throws CapabilityException {
super.deactivate();
callbackRegistration.unregister();
// callbackServer.stop();
}
private Server createServer(String host, String port, String path) {
JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
sf.setResourceClasses(IMonitoringModuleCallbackAPI.class);
sf.setResourceProvider(IMonitoringModuleCallbackAPI.class, new SingletonResourceProvider(monitoringModuleAlarmHandler));
sf.setAddress("http://localhost:" + port + path);
BindingFactoryManager manager = sf.getBus().getExtension(BindingFactoryManager.class);
JAXRSBindingFactory factory = new JAXRSBindingFactory();
factory.setBus(sf.getBus());
manager.registerBindingFactory(JAXRSBindingFactory.JAXRS_BINDING_ID, factory);
return sf.create();
}
protected HttpProtocolSession getHttpProtocolSession(IProtocolSessionManager protocolSessionManager) throws ProtocolException {
return (HttpProtocolSession) protocolSessionManager.obtainSessionByProtocol(HttpProtocolSession.HTTP_PROTOCOL_TYPE, false);
}
protected void registerService() throws CapabilityException {
Hashtable<String, String> props = new Hashtable<String, String>();
// Rest
props.put("service.exported.interfaces", "*");
props.put("service.exported.configs", "org.apache.cxf.rs");
props.put("service.exported.intents", "HTTP");
props.put("org.apache.cxf.rs.httpservice.context", URL_WITH_RESOURCE);
props.put("org.apache.cxf.rs.address", "/");
log.info("Registering ws: \n " +
"in url: " + props.get("org.apache.cxf.rs.address") + "\n" +
"in context: " + props.get("org.apache.cxf.rs.httpservice.context"));
callbackRegistration = Activator.getContext().registerService(IMonitoringModuleCallbackAPI.class.getName(), monitoringModuleAlarmHandler,
props);
}
}