b3785de612b7e48965b71fba09e899c877eac273
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / connection / SwitchConnectionProviderImpl.java
1 /*
2  * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.
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
9
10 package org.opendaylight.openflowjava.protocol.impl.connection;
11
12 import org.opendaylight.openflowjava.protocol.api.connection.ConnectionConfiguration;
13 import org.opendaylight.openflowjava.protocol.api.connection.SwitchConnectionHandler;
14 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;
15 import org.opendaylight.openflowjava.protocol.api.extensibility.MessageCodeKey;
16 import org.opendaylight.openflowjava.protocol.api.extensibility.MessageTypeKey;
17 import org.opendaylight.openflowjava.protocol.api.extensibility.OFGeneralDeserializer;
18 import org.opendaylight.openflowjava.protocol.api.extensibility.OFGeneralSerializer;
19 import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;
20 import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey;
21 import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey;
22 import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterActionDeserializerKey;
23 import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterActionSerializerKey;
24 import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterDeserializerKey;
25 import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterInstructionDeserializerKey;
26 import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterInstructionSerializerKey;
27 import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterSerializerKey;
28 import org.opendaylight.openflowjava.protocol.impl.core.PublishingChannelInitializerFactory;
29 import org.opendaylight.openflowjava.protocol.impl.core.TcpHandler;
30 import org.opendaylight.openflowjava.protocol.impl.deserialization.DeserializationFactory;
31 import org.opendaylight.openflowjava.protocol.impl.deserialization.DeserializerRegistryImpl;
32 import org.opendaylight.openflowjava.protocol.impl.serialization.SerializationFactory;
33 import org.opendaylight.openflowjava.protocol.impl.serialization.SerializerRegistryImpl;
34 import org.opendaylight.openflowjava.protocol.spi.connection.SwitchConnectionProvider;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmClassBase;
37 import org.slf4j.Logger;
38 import org.slf4j.LoggerFactory;
39
40 import com.google.common.util.concurrent.ListenableFuture;
41 import com.google.common.util.concurrent.SettableFuture;
42
43 /**
44  * Exposed class for server handling
45  * @author mirehak
46  * @author michal.polkorab
47  */
48 public class SwitchConnectionProviderImpl implements SwitchConnectionProvider {
49
50     private static final Logger LOGGER = LoggerFactory
51             .getLogger(SwitchConnectionProviderImpl.class);
52     private SwitchConnectionHandler switchConnectionHandler;
53     private ServerFacade serverFacade;
54     private ConnectionConfiguration connConfig;
55     private SerializationFactory serializationFactory;
56     private SerializerRegistry serializerRegistry;
57     private DeserializerRegistry deserializerRegistry;
58     private DeserializationFactory deserializationFactory;
59
60     /** Constructor */
61     public SwitchConnectionProviderImpl() {
62         serializerRegistry = new SerializerRegistryImpl();
63         serializerRegistry.init();
64         serializationFactory = new SerializationFactory();
65         serializationFactory.setSerializerTable(serializerRegistry);
66         deserializerRegistry = new DeserializerRegistryImpl();
67         deserializerRegistry.init();
68         deserializationFactory = new DeserializationFactory();
69         deserializationFactory.setRegistry(deserializerRegistry);
70     }
71
72     @Override
73     public void setConfiguration(ConnectionConfiguration connConfig) {
74         this.connConfig = connConfig;
75     }
76
77     @Override
78     public void setSwitchConnectionHandler(SwitchConnectionHandler switchConnectionHandler) {
79         LOGGER.debug("setSwitchConnectionHandler");
80         this.switchConnectionHandler = switchConnectionHandler;
81     }
82
83     @Override
84     public ListenableFuture<Boolean> shutdown() {
85         LOGGER.debug("Shutdown summoned");
86         //TODO: provide exception in case of: not started, not configured (already stopped)
87         ListenableFuture<Boolean> result = serverFacade.shutdown();
88         return result;
89     }
90
91     @Override
92     public ListenableFuture<Boolean> startup() {
93         LOGGER.debug("Startup summoned");
94         serverFacade = createAndConfigureServer();
95         
96         LOGGER.debug("Starting ..");
97         ListenableFuture<Boolean> result = null;
98         try {
99             if (serverFacade == null) {
100                 throw new IllegalStateException("No server configured");
101             }
102             if (serverFacade.getIsOnlineFuture().isDone()) {
103                 throw new IllegalStateException("Server already running");
104             }
105             if (switchConnectionHandler == null) {
106                 throw new IllegalStateException("switchConnectionHandler is not set");
107             }
108             new Thread(serverFacade).start();
109             result = serverFacade.getIsOnlineFuture();
110         } catch (Exception e) {
111             SettableFuture<Boolean> exResult = SettableFuture.create();
112             exResult.setException(e);
113             result = exResult;
114         }
115         return result;
116     }
117
118     /**
119      * @return
120      */
121     private TcpHandler createAndConfigureServer() {
122         LOGGER.debug("Configuring ..");
123         TcpHandler server = new TcpHandler(connConfig.getAddress(), connConfig.getPort());
124         PublishingChannelInitializerFactory factory = new PublishingChannelInitializerFactory();
125         factory.setSwitchConnectionHandler(switchConnectionHandler);
126         factory.setSwitchIdleTimeout(connConfig.getSwitchIdleTimeout());
127         factory.setTlsConfig(connConfig.getTlsConfiguration());
128         factory.setSerializationFactory(serializationFactory);
129         factory.setDeserializationFactory(deserializationFactory);
130         server.setChannelInitializer(factory.createPublishingChannelInitializer());
131         server.setThreadConfig(connConfig.getThreadConfiguration());
132         return server;
133     }
134
135     /**
136      * @return servers
137      */
138     public ServerFacade getServerFacade() {
139         return serverFacade;
140     }
141
142     @Override
143     public void close() throws Exception {
144         shutdown();
145     }
146
147     @Override
148     public boolean unregisterSerializer(ExperimenterSerializerKey key) {
149         return serializerRegistry.unregisterSerializer((MessageTypeKey<?>) key);
150     }
151
152     @Override
153     public boolean unregisterDeserializer(ExperimenterDeserializerKey key) {
154         return deserializerRegistry.unregisterDeserializer((MessageCodeKey) key);
155     }
156
157     @Override
158     public void registerActionSerializer(ExperimenterActionSerializerKey key,
159             OFGeneralSerializer serializer) {
160         serializerRegistry.registerSerializer(key, serializer);
161     }
162
163     @Override
164     public void registerActionDeserializer(ExperimenterActionDeserializerKey key,
165             OFGeneralDeserializer deserializer) {
166         deserializerRegistry.registerDeserializer(key, deserializer);
167     }
168
169     @Override
170     public void registerInstructionSerializer(ExperimenterInstructionSerializerKey key,
171             OFGeneralSerializer serializer) {
172         serializerRegistry.registerSerializer(key, serializer);
173     }
174
175     @Override
176     public void registerInstructionDeserializer(ExperimenterInstructionDeserializerKey key,
177             OFGeneralDeserializer deserializer) {
178         deserializerRegistry.registerDeserializer(key, deserializer);
179     }
180
181     @Override
182     public <OXM_CLASS extends OxmClassBase, OXM_TYPE extends MatchField> void registerMatchEntrySerializer(MatchEntrySerializerKey<OXM_CLASS, OXM_TYPE> key,
183             OFGeneralSerializer serializer) {
184         serializerRegistry.registerSerializer(key, serializer);
185     }
186
187     @Override
188     public void registerMatchEntryDeserializer(MatchEntryDeserializerKey key,
189             OFGeneralDeserializer deserializer) {
190         deserializerRegistry.registerDeserializer(key, deserializer);
191     }
192 }