b3b12af5de754e3422d06508ce2374a79e771eb0
[openflowplugin.git] / openflowplugin-impl / src / main / java / org / opendaylight / openflowplugin / impl / device / DeviceContextImpl.java
1 /**
2  * Copyright (c) 2015 Cisco Systems, Inc. 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 package org.opendaylight.openflowplugin.impl.device;
9
10 import com.google.common.annotations.VisibleForTesting;
11 import com.google.common.base.Preconditions;
12 import com.google.common.util.concurrent.SettableFuture;
13 import org.opendaylight.controller.md.sal.binding.api.BindingTransactionChain;
14 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
15 import org.opendaylight.controller.md.sal.binding.api.ReadTransaction;
16 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
17 import org.opendaylight.controller.md.sal.common.api.data.AsyncTransaction;
18 import org.opendaylight.controller.md.sal.common.api.data.TransactionChain;
19 import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener;
20 import org.opendaylight.openflowplugin.api.openflow.connection.ConnectionContext;
21 import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
22 import org.opendaylight.openflowplugin.api.openflow.device.DeviceState;
23 import org.opendaylight.openflowplugin.api.openflow.device.RequestContext;
24 import org.opendaylight.openflowplugin.api.openflow.device.RequestFutureContext;
25 import org.opendaylight.openflowplugin.api.openflow.device.Xid;
26 import org.opendaylight.openflowplugin.api.openflow.device.XidGenerator;
27 import org.opendaylight.openflowplugin.api.openflow.md.core.SwitchConnectionDistinguisher;
28 import org.opendaylight.openflowplugin.openflow.md.core.session.SwitchConnectionCookieOFImpl;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TableFeatures;
31 import org.opendaylight.yangtools.yang.binding.ChildOf;
32 import org.opendaylight.yangtools.yang.binding.DataObject;
33 import org.slf4j.Logger;
34 import org.slf4j.LoggerFactory;
35 import javax.annotation.Nonnull;
36 import java.math.BigInteger;
37 import java.util.HashMap;
38 import java.util.Map;
39
40 /**
41  *
42  */
43 public class DeviceContextImpl implements DeviceContext, TransactionChainListener {
44
45     private static final Logger LOG = LoggerFactory.getLogger(DeviceContextImpl.class);
46
47     private final ConnectionContext primaryConnectionContext;
48     private final DeviceState deviceState;
49     private final DataBroker dataBroker;
50     private final XidGenerator xidGenerator;
51
52     private final Map<Xid, RequestFutureContext> requests;
53     private final Map<SwitchConnectionDistinguisher, ConnectionContext> auxiliaryConnectionContexts;
54     private BindingTransactionChain txChainFactory;
55
56     @VisibleForTesting
57     DeviceContextImpl(@Nonnull final ConnectionContext primaryConnectionContext,
58                       @Nonnull final DeviceState deviceState, @Nonnull final DataBroker dataBroker) {
59         this.primaryConnectionContext = Preconditions.checkNotNull(primaryConnectionContext);
60         this.deviceState = Preconditions.checkNotNull(deviceState);
61         this.dataBroker = Preconditions.checkNotNull(dataBroker);
62         xidGenerator = new XidGenerator();
63         txChainFactory = dataBroker.createTransactionChain(DeviceContextImpl.this);
64         auxiliaryConnectionContexts = new HashMap<>();
65         requests = new HashMap<>();
66     }
67
68     @Override
69     public <M extends ChildOf<DataObject>> void onMessage(final M message, final RequestContext requestContext) {
70         // TODO Auto-generated method stub
71
72     }
73
74     @Override
75     public void addAuxiliaryConenctionContext(final ConnectionContext connectionContext) {
76         final SwitchConnectionDistinguisher connectionDistinguisher = new SwitchConnectionCookieOFImpl(connectionContext.getFeatures().getAuxiliaryId());
77         auxiliaryConnectionContexts.put(connectionDistinguisher, connectionContext);
78     }
79
80     @Override
81     public void removeAuxiliaryConenctionContext(final ConnectionContext connectionContext) {
82         // TODO Auto-generated method stub
83
84     }
85
86     @Override
87     public DeviceState getDeviceState() {
88         return deviceState;
89     }
90
91     @Override
92     public ReadTransaction getReadTransaction() {
93         return dataBroker.newReadOnlyTransaction();
94     }
95
96     @Override
97     public WriteTransaction getWriteTransaction() {
98         // FIXME : we wana to have only one WriteTransaction exposed in one time
99         // so thing about blocking notification mechanism for wait to new transaction
100         return txChainFactory.newWriteOnlyTransaction();
101     }
102
103     @Override
104     public TableFeatures getCapabilities() {
105         // TODO Auto-generated method stub
106         return null;
107     }
108
109     @Override
110     public ConnectionContext getPrimaryConnectionContext() {
111         return primaryConnectionContext;
112     }
113
114     @Override
115     public ConnectionContext getAuxiliaryConnectiobContexts(final BigInteger cookie) {
116         return auxiliaryConnectionContexts.get(new SwitchConnectionCookieOFImpl(cookie.longValue()));
117     }
118
119     @Override
120     public Xid getNextXid() {
121         return xidGenerator.generate();
122     }
123
124     @Override
125     public Map<Xid, RequestFutureContext> getRequests() {
126         return requests;
127     }
128
129     @Override
130     public void hookRequestCtx(final Xid xid, final RequestFutureContext requestFutureContext) {
131         requests.put(xid, requestFutureContext);
132     }
133
134     @Override
135     public void processReply(final Xid xid, final OfHeader ofHeader) {
136         final SettableFuture replyFuture = getRequests().get(xid).getFuture();
137         replyFuture.set(ofHeader);
138     }
139
140     @Override
141     public void onTransactionChainFailed(final TransactionChain<?, ?> chain,
142                                          final AsyncTransaction<?, ?> transaction, final Throwable cause) {
143         txChainFactory.close();
144         txChainFactory = dataBroker.createTransactionChain(DeviceContextImpl.this);
145     }
146
147     @Override
148     public void onTransactionChainSuccessful(final TransactionChain<?, ?> chain) {
149         // NOOP - only yet, here is probably place for notification to get new WriteTransaction
150     }
151
152 }