Remove OvsdbConfigurationService
[ovsdb.git] / openstack / net-virt / src / main / java / org / opendaylight / ovsdb / openstack / netvirt / PortHandler.java
1 /*
2  * Copyright (C) 2013 Red Hat, Inc.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  *
8  * Authors : Madhu Venugopal, Brent Salisbury
9  */
10 package org.opendaylight.ovsdb.openstack.netvirt;
11
12 import org.opendaylight.neutron.spi.INeutronPortAware;
13 import org.opendaylight.neutron.spi.NeutronPort;
14 import org.opendaylight.ovsdb.openstack.netvirt.api.Action;
15 import org.opendaylight.ovsdb.openstack.netvirt.api.Constants;
16 import org.opendaylight.ovsdb.openstack.netvirt.api.OvsdbConnectionService;
17 import org.opendaylight.ovsdb.openstack.netvirt.impl.MdsalUtils;
18 import org.opendaylight.ovsdb.openstack.netvirt.impl.NeutronL3Adapter;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentation;
20 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
21
22 import org.slf4j.Logger;
23 import org.slf4j.LoggerFactory;
24
25 import java.net.HttpURLConnection;
26 import java.util.List;
27
28 /**
29  * Handle requests for Neutron Port.
30  */
31 public class PortHandler extends AbstractHandler implements INeutronPortAware {
32     static final Logger logger = LoggerFactory.getLogger(PortHandler.class);
33
34     // The implementation for each of these services is resolved by the OSGi Service Manager
35     private volatile OvsdbConnectionService connectionService;
36     private volatile NeutronL3Adapter neutronL3Adapter;
37
38     /**
39      * Invoked when a port creation is requested
40      * to indicate if the specified port can be created.
41      *
42      * @param port     An instance of proposed new Port object.
43      * @return A HTTP status code to the creation request.
44      */
45     @Override
46     public int canCreatePort(NeutronPort port) {
47         return HttpURLConnection.HTTP_OK;
48     }
49
50     /**
51      * Invoked to take action after a port has been created.
52      *
53      * @param port An instance of new Neutron Port object.
54      */
55     @Override
56     public void neutronPortCreated(NeutronPort neutronPort) {
57         enqueueEvent(new NorthboundEvent(neutronPort, Action.ADD));
58     }
59     private void doNeutronPortCreated(NeutronPort neutronPort) {
60         logger.debug(" Port-ADD successful for tenant-id - {}," +
61                      " network-id - {}, port-id - {}",
62                      neutronPort.getTenantID(), neutronPort.getNetworkUUID(),
63                      neutronPort.getID());
64         neutronL3Adapter.handleNeutronPortEvent(neutronPort, Action.ADD);
65     }
66
67     /**
68      * Invoked when a port update is requested
69      * to indicate if the specified port can be changed
70      * using the specified delta.
71      *
72      * @param delta    Updates to the port object using patch semantics.
73      * @param original An instance of the Neutron Port object
74      *                  to be updated.
75      * @return A HTTP status code to the update request.
76      */
77     @Override
78     public int canUpdatePort(NeutronPort delta,
79                              NeutronPort original) {
80         return HttpURLConnection.HTTP_OK;
81     }
82
83     /**
84      * Invoked to take action after a port has been updated.
85      *
86      * @param port An instance of modified Neutron Port object.
87      */
88     @Override
89     public void neutronPortUpdated(NeutronPort neutronPort) {
90         enqueueEvent(new NorthboundEvent(neutronPort, Action.UPDATE));
91     }
92     private void doNeutronPortUpdated(NeutronPort neutronPort) {
93         logger.debug("Handling neutron update port " + neutronPort);
94         neutronL3Adapter.handleNeutronPortEvent(neutronPort, Action.UPDATE);
95     }
96
97     /**
98      * Invoked when a port deletion is requested
99      * to indicate if the specified port can be deleted.
100      *
101      * @param port     An instance of the Neutron Port object to be deleted.
102      * @return A HTTP status code to the deletion request.
103      */
104     @Override
105     public int canDeletePort(NeutronPort port) {
106         return HttpURLConnection.HTTP_OK;
107     }
108
109     /**
110      * Invoked to take action after a port has been deleted.
111      *
112      * @param neutronPort  An instance of deleted Neutron Port object.
113      */
114     @Override
115     public void neutronPortDeleted(NeutronPort neutronPort) {
116         enqueueEvent(new NorthboundEvent(neutronPort, Action.DELETE));
117     }
118     private void doNeutronPortDeleted(NeutronPort neutronPort) {
119         logger.debug("Handling neutron delete port " + neutronPort);
120         neutronL3Adapter.handleNeutronPortEvent(neutronPort, Action.DELETE);
121
122         List<Node> nodes = connectionService.getNodes();
123         for (Node node : nodes) {
124             try {
125                 List<OvsdbTerminationPointAugmentation> ports = MdsalUtils.getPorts(node);
126                 for (OvsdbTerminationPointAugmentation port : ports) {
127                     String neutronPortId =
128                             MdsalUtils.getInterfaceExternalIdsValue(port, Constants.EXTERNAL_ID_INTERFACE_ID);
129                     if (neutronPortId != null && neutronPortId.equalsIgnoreCase(neutronPort.getPortUUID())) {
130                         logger.trace("neutronPortDeleted: Delete interface {}", port.getName());
131                         MdsalUtils.deletePort(node, port.getName());
132                         break;
133                     }
134                 }
135             } catch (Exception e) {
136                 logger.error("Exception during handlingNeutron port delete", e);
137             }
138         }
139         logger.debug(" PORT delete successful for tenant-id - {}, " +
140                      " network-id - {}, port-id - {}",
141                      neutronPort.getTenantID(), neutronPort.getNetworkUUID(),
142                      neutronPort.getID());
143     }
144
145     /**
146      * Process the event.
147      *
148      * @param abstractEvent the {@link org.opendaylight.ovsdb.openstack.netvirt.AbstractEvent} event to be handled.
149      * @see EventDispatcher
150      */
151     @Override
152     public void processEvent(AbstractEvent abstractEvent) {
153         if (!(abstractEvent instanceof NorthboundEvent)) {
154             logger.error("Unable to process abstract event " + abstractEvent);
155             return;
156         }
157         NorthboundEvent ev = (NorthboundEvent) abstractEvent;
158         switch (ev.getAction()) {
159             case ADD:
160                 doNeutronPortCreated(ev.getPort());
161                 break;
162             case DELETE:
163                 doNeutronPortDeleted(ev.getPort());
164                 break;
165             case UPDATE:
166                 doNeutronPortUpdated(ev.getPort());
167                 break;
168             default:
169                 logger.warn("Unable to process event action " + ev.getAction());
170                 break;
171         }
172     }
173 }