Updated demo scripts: the demo now outputs per-protocol information.
[affinity.git] / nfchain / impl / src / main / java / org / opendaylight / affinity / nfchain / provider / NfchainManager.java
1
2 /*
3  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
4  *
5  * This program and the accompanying materials are made available under the
6  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
7  * and is available at http://www.eclipse.org/legal/epl-v10.html
8  */
9
10 package org.opendaylight.affinity.nfchain.provider;
11
12 import java.util.Collections;
13 import java.util.List;
14 import java.util.ArrayList;
15
16 import java.util.concurrent.Callable;
17 import java.util.concurrent.ExecutorService;
18 import java.util.concurrent.Executors;
19 import java.util.concurrent.Future;
20
21 import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
22 import org.opendaylight.controller.sal.common.util.Futures;
23 import org.opendaylight.controller.sal.common.util.Rpcs;
24
25 import org.opendaylight.yangtools.yang.common.RpcError;
26 import org.opendaylight.yangtools.yang.common.RpcResult;
27
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.affinity.nfchain.rev131020.NfchainService;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.affinity.nfchain.rev131020.NfchainData;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.affinity.nfchain.rev131020.NfdbBuilder;
31
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.affinity.nfchain.rev131020.chain.Gateway;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.affinity.nfchain.rev131020.Nfdb;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.affinity.nfchain.rev131020.NfdbBuilder;
35
36
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.affinity.nfchain.rev131020.AddchainInput;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.affinity.nfchain.rev131020.EnablechainInput;
39
40 import org.opendaylight.affinity.nfchainagent.NFchainconfig;
41
42 import org.opendaylight.controller.hosttracker.hostAware.HostNodeConnector;
43 import org.opendaylight.controller.sal.core.Node;
44 import org.opendaylight.controller.sal.core.NodeConnector;
45 import org.opendaylight.controller.sal.packet.BitBufferHelper;
46 import org.slf4j.Logger;
47 import org.slf4j.LoggerFactory;
48
49 import org.opendaylight.controller.hosttracker.IfIptoHost;
50 import org.opendaylight.controller.hosttracker.IfNewHostNotify;
51
52
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.affinity.nfchain.rev131020.addchain.input.Chain;
54 import java.net.InetAddress;
55 import org.opendaylight.controller.sal.compability.ToSalConversionsUtils;
56
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.affinity.nfchain.rev131020.chain.Flow;
58    
59 /**
60  * NfchainManager -- sends flow programming rules to flow programming service. 
61  */
62 public class NfchainManager implements NfchainService, NfchainData {
63     private static final long serialVersionUID = 1L;
64     protected static final Logger log = LoggerFactory.getLogger(NfchainManager.class);
65     
66     private NotificationProviderService notificationProvider; 
67     private Future<RpcResult<Void>> currentTask;
68
69     public NfchainManager() {
70     }
71
72     @Override
73     public Nfdb getNfdb() {
74         NfdbBuilder builder = new NfdbBuilder();
75         return builder.build();
76     }
77
78     /**
79      * Convert API Flow objects to flow programmer flow objects. 
80      */
81     List<org.opendaylight.controller.sal.flowprogrammer.Flow> fromAPIFlowlist(List<Flow> fl) {
82         List<org.opendaylight.controller.sal.flowprogrammer.Flow> flowlist = new ArrayList<org.opendaylight.controller.sal.flowprogrammer.Flow>();
83         
84         for (Flow f: fl) {
85             org.opendaylight.controller.sal.flowprogrammer.Flow fp_flow = ToSalConversionsUtils.toFlow(f);
86             flowlist.add(fp_flow);
87         }
88         return flowlist;
89     }
90     
91     /**
92      * addchain synchronous. 
93      */
94     @Override
95     public Future<RpcResult<Void>> addchain(AddchainInput input) {
96         // TODO Auto-generated method stub
97         Chain chain = input.getChain();
98
99         List<org.opendaylight.controller.sal.flowprogrammer.Flow> flowlist = fromAPIFlowlist(chain.getFlow());
100         List<Gateway> gatewaylist = chain.getGateway();
101         String name = chain.getName();
102
103         if (gatewaylist.size() > 1) {
104             log.info("addNfchain function chain has {} elements", gatewaylist.size());
105         } else {
106
107             log.info("add gateway - Received input chain = {}, gateway = {}.", input.getChain(), chain.getGateway());
108             Gateway gw = gatewaylist.get(0);
109             InetAddress ip = ToSalConversionsUtils.inetAddressFrom(gw.getLocation());
110             NFchainconfig nfcc = new NFchainconfig(name, flowlist, ip);
111             /*        nfchainagent.addNfchain(); */
112         }
113         RpcResult<Void> result = Rpcs.<Void> getRpcResult(true, null, Collections.<RpcError> emptySet());
114         return Futures.immediateFuture(result);
115     }
116
117     @Override
118     public Future<RpcResult<java.lang.Void>> enablechain(EnablechainInput input) {
119         log.info("enable chain");
120
121         RpcResult<Void> result = Rpcs.<Void> getRpcResult(true, null, Collections.<RpcError> emptySet());
122         return Futures.immediateFuture(result);
123     }
124
125     public void setNotificationProvider(NotificationProviderService salService) {
126         this.notificationProvider = salService;
127     }
128 }