/*
- * Copyright (C) 2013 Red Hat, Inc.
+ * Copyright (c) 2014, 2015 Red Hat, Inc. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
- *
- * Authors : Dave Tucker, Flavio Fernandes
*/
+
package org.opendaylight.ovsdb.openstack.netvirt;
-import org.opendaylight.controller.networkconfig.neutron.INeutronRouterAware;
-import org.opendaylight.controller.networkconfig.neutron.NeutronRouter;
-import org.opendaylight.controller.networkconfig.neutron.NeutronRouter_Interface;
-import org.opendaylight.ovsdb.plugin.api.OvsdbConfigurationService;
-import org.opendaylight.ovsdb.plugin.api.OvsdbConnectionService;
-import org.opendaylight.ovsdb.plugin.api.OvsdbInventoryListener;
+import java.net.HttpURLConnection;
+import org.opendaylight.neutron.spi.INeutronRouterAware;
+import org.opendaylight.neutron.spi.NeutronRouter;
+import org.opendaylight.neutron.spi.NeutronRouter_Interface;
+import org.opendaylight.ovsdb.openstack.netvirt.api.Action;
+import org.opendaylight.ovsdb.openstack.netvirt.api.EventDispatcher;
+import org.opendaylight.ovsdb.openstack.netvirt.impl.NeutronL3Adapter;
+import org.opendaylight.ovsdb.utils.servicehelper.ServiceHelper;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.net.HttpURLConnection;
-
/**
* Handle requests for Neutron Router.
*/
-public class RouterHandler extends AbstractHandler
- implements INeutronRouterAware {
+public class RouterHandler extends AbstractHandler implements INeutronRouterAware, ConfigInterface {
+ private static final Logger LOG = LoggerFactory.getLogger(RouterHandler.class);
- /**
- * Logger instance.
- */
- static final Logger logger = LoggerFactory.getLogger(RouterHandler.class);
-
- private volatile OvsdbConfigurationService ovsdbConfigurationService;
- private volatile OvsdbConnectionService connectionService;
- private volatile OvsdbInventoryListener ovsdbInventoryListener;
+ // The implementation for each of these services is resolved by the OSGi Service Manager
+ private volatile NeutronL3Adapter neutronL3Adapter;
/**
* Services provide this interface method to indicate if the specified router can be created
*/
@Override
public void neutronRouterCreated(NeutronRouter router) {
- logger.debug(" Router created {}, uuid {}", router.getName(), router.getRouterUUID());
+ enqueueEvent(new NorthboundEvent(router, Action.ADD));
}
/**
*
* @param delta
* updates to the router object using patch semantics
- * @param router
+ * @param original
* instance of the Neutron Router object to be updated
* @return integer
* the return value is understood to be a HTTP status code. A return value outside of 200 through 299
*/
@Override
public void neutronRouterUpdated(NeutronRouter router) {
- logger.debug(" Router updated {}", router.getName());
+ enqueueEvent(new NorthboundEvent(router, Action.UPDATE));
}
/**
*/
@Override
public void neutronRouterDeleted(NeutronRouter router) {
- logger.debug(" Router deleted {}, uuid {}", router.getName(), router.getRouterUUID());
+ enqueueEvent(new NorthboundEvent(router, Action.DELETE));
}
/**
*/
@Override
public int canAttachInterface(NeutronRouter router, NeutronRouter_Interface routerInterface) {
- logger.debug(" Router {} asked if it can attach interface {}. Subnet {}",
+ LOG.debug(" Router {} asked if it can attach interface {}. Subnet {}",
router.getName(),
routerInterface.getPortUUID(),
routerInterface.getSubnetUUID());
*/
@Override
public void neutronRouterInterfaceAttached(NeutronRouter router, NeutronRouter_Interface routerInterface) {
- logger.debug(" Router {} interface {} attached. Subnet {}", router.getName(), routerInterface.getPortUUID(),
- routerInterface.getSubnetUUID());
+ enqueueEvent(new NorthboundEvent(router, routerInterface, Action.ADD));
}
/**
*/
@Override
public int canDetachInterface(NeutronRouter router, NeutronRouter_Interface routerInterface) {
- logger.debug(" Router {} asked if it can detach interface {}. Subnet {}",
+ LOG.debug(" Router {} asked if it can detach interface {}. Subnet {}",
router.getName(),
routerInterface.getPortUUID(),
routerInterface.getSubnetUUID());
*/
@Override
public void neutronRouterInterfaceDetached(NeutronRouter router, NeutronRouter_Interface routerInterface) {
- logger.debug(" Router {} interface {} detached. Subnet {}", router.getName(), routerInterface.getPortUUID(),
- routerInterface.getSubnetUUID());
+ enqueueEvent(new NorthboundEvent(router, routerInterface, Action.DELETE));
}
+
+ /**
+ * Process the event.
+ *
+ * @param abstractEvent the {@link org.opendaylight.ovsdb.openstack.netvirt.AbstractEvent} event to be handled.
+ * @see org.opendaylight.ovsdb.openstack.netvirt.api.EventDispatcher
+ */
+ @Override
+ public void processEvent(AbstractEvent abstractEvent) {
+ if (!(abstractEvent instanceof NorthboundEvent)) {
+ LOG.error("Unable to process abstract event {}", abstractEvent);
+ return;
+ }
+ NorthboundEvent ev = (NorthboundEvent) abstractEvent;
+ switch (ev.getAction()) {
+ case ADD:
+ // fall through
+ case DELETE:
+ // fall through
+ case UPDATE:
+ if (ev.getRouterInterface() == null) {
+ neutronL3Adapter.handleNeutronRouterEvent(ev.getRouter(), ev.getAction());
+ } else {
+ neutronL3Adapter.handleNeutronRouterInterfaceEvent(ev.getRouter(),
+ ev.getRouterInterface(),
+ ev.getAction());
+ }
+ break;
+ default:
+ LOG.warn("Unable to process event action {}", ev.getAction());
+ break;
+ }
+ }
+
+ @Override
+ public void setDependencies(BundleContext bundleContext, ServiceReference serviceReference) {
+ neutronL3Adapter =
+ (NeutronL3Adapter) ServiceHelper.getGlobalInstance(NeutronL3Adapter.class, this);
+ eventDispatcher =
+ (EventDispatcher) ServiceHelper.getGlobalInstance(EventDispatcher.class, this);
+ eventDispatcher.eventHandlerAdded(
+ bundleContext.getServiceReference(INeutronRouterAware.class.getName()), this);
+ }
+
+ @Override
+ public void setDependencies(Object impl) {}
}