00c8c694693dcd16ff48b5a7c6e15a3f351a18a1
[onosfw.git] /
1 /*
2  * Copyright 2015 Open Networking Laboratory
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package org.onosproject.pcep.controller.impl;
17
18 import java.util.Collection;
19 import java.util.Collections;
20 import java.util.HashSet;
21 import java.util.Set;
22 import java.util.concurrent.ConcurrentHashMap;
23
24 import org.apache.felix.scr.annotations.Activate;
25 import org.apache.felix.scr.annotations.Component;
26 import org.apache.felix.scr.annotations.Deactivate;
27 import org.apache.felix.scr.annotations.Service;
28 import org.onosproject.pcep.controller.PccId;
29 import org.onosproject.pcep.controller.PcepClient;
30 import org.onosproject.pcep.controller.PcepClientController;
31 import org.onosproject.pcep.controller.PcepClientListener;
32 import org.onosproject.pcep.controller.PcepEventListener;
33 import org.onosproject.pcep.controller.driver.PcepAgent;
34 import org.onosproject.pcepio.protocol.PcepMessage;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
37
38 import com.google.common.collect.Sets;
39
40 /**
41  * Implementation of PCEP client controller.
42  */
43 @Component(immediate = true)
44 @Service
45 public class PcepClientControllerImpl implements PcepClientController {
46
47     private static final Logger log = LoggerFactory.getLogger(PcepClientControllerImpl.class);
48
49     protected ConcurrentHashMap<PccId, PcepClient> connectedClients =
50             new ConcurrentHashMap<>();
51
52     protected PcepClientAgent agent = new PcepClientAgent();
53     protected Set<PcepClientListener> pcepClientListener = new HashSet<>();
54
55     protected Set<PcepEventListener> pcepEventListener = Sets.newHashSet();
56
57     private final Controller ctrl = new Controller();
58
59     @Activate
60     public void activate() {
61         ctrl.start(agent);
62         log.info("Started");
63     }
64
65     @Deactivate
66     public void deactivate() {
67         // Close all connected clients
68         closeConnectedClients();
69         ctrl.stop();
70         log.info("Stopped");
71     }
72
73     @Override
74     public Collection<PcepClient> getClients() {
75         return connectedClients.values();
76     }
77
78     @Override
79     public PcepClient getClient(PccId pccId) {
80         return connectedClients.get(pccId);
81     }
82
83     @Override
84     public void addListener(PcepClientListener listener) {
85         if (!pcepClientListener.contains(listener)) {
86             this.pcepClientListener.add(listener);
87         }
88     }
89
90     @Override
91     public void removeListener(PcepClientListener listener) {
92         this.pcepClientListener.remove(listener);
93     }
94
95     @Override
96     public void addEventListener(PcepEventListener listener) {
97         pcepEventListener.add(listener);
98     }
99
100     @Override
101     public void removeEventListener(PcepEventListener listener) {
102         pcepEventListener.remove(listener);
103     }
104
105     @Override
106     public void writeMessage(PccId pccId, PcepMessage msg) {
107         this.getClient(pccId).sendMessage(msg);
108     }
109
110     @Override
111     public void processClientMessage(PccId pccId, PcepMessage msg) {
112         PcepClient pc = getClient(pccId);
113
114         switch (msg.getType()) {
115         case NONE:
116             break;
117         case OPEN:
118             break;
119         case KEEP_ALIVE:
120             break;
121         case PATH_COMPUTATION_REQUEST:
122             break;
123         case PATH_COMPUTATION_REPLY:
124             break;
125         case NOTIFICATION:
126             break;
127         case ERROR:
128             break;
129         case CLOSE:
130             log.info("Sending Close Message  to {" + pccId.toString() + "}");
131             pc.sendMessage(Collections.singletonList(pc.factory().buildCloseMsg().build()));
132             //now disconnect client
133             pc.disconnectClient();
134             break;
135         case REPORT:
136             for (PcepEventListener l : pcepEventListener) {
137                 l.handleMessage(pccId, msg);
138             }
139             break;
140         case UPDATE:
141             for (PcepEventListener l : pcepEventListener) {
142                 l.handleMessage(pccId, msg);
143             }
144             break;
145         case INITIATE:
146             for (PcepEventListener l : pcepEventListener) {
147                 l.handleMessage(pccId, msg);
148             }
149             break;
150         case LABEL_UPDATE:
151             break;
152         case MAX:
153             break;
154         case END:
155             break;
156         default:
157             break;
158         }
159     }
160
161     @Override
162     public void closeConnectedClients() {
163         PcepClient pc;
164         for (PccId id : connectedClients.keySet()) {
165             pc = getClient(id);
166             pc.disconnectClient();
167         }
168     }
169
170     /**
171      * Implementation of an Pcep Agent which is responsible for
172      * keeping track of connected clients and the state in which
173      * they are.
174      */
175     public class PcepClientAgent implements PcepAgent {
176
177         private final Logger log = LoggerFactory.getLogger(PcepClientAgent.class);
178
179         @Override
180         public boolean addConnectedClient(PccId pccId, PcepClient pc) {
181
182             if (connectedClients.get(pccId) != null) {
183                 log.error("Trying to add connectedClient but found a previous "
184                         + "value for pcc ip: {}", pccId.toString());
185                 return false;
186             } else {
187                 log.debug("Added Client {}", pccId.toString());
188                 connectedClients.put(pccId, pc);
189                 for (PcepClientListener l : pcepClientListener) {
190                     l.clientConnected(pccId);
191                 }
192                 return true;
193             }
194         }
195
196         @Override
197         public boolean validActivation(PccId pccId) {
198             if (connectedClients.get(pccId) == null) {
199                 log.error("Trying to activate client but is not in "
200                         + "connected client: pccIp {}. Aborting ..", pccId.toString());
201                 return false;
202             }
203
204             return true;
205         }
206
207         @Override
208         public void removeConnectedClient(PccId pccId) {
209
210             connectedClients.remove(pccId);
211             for (PcepClientListener l : pcepClientListener) {
212                 log.warn("removal for {}", pccId.toString());
213                 l.clientDisconnected(pccId);
214             }
215         }
216
217         @Override
218         public void processPcepMessage(PccId pccId, PcepMessage m) {
219             processClientMessage(pccId, m);
220         }
221     }
222 }