a396a618319a96b1969f47e08b2487aa504cb35d
[sfc.git] /
1 /**
2  * Copyright (c) 2014, 2017 Ericsson India Global Services Pvt Ltd. 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 package org.opendaylight.sfc.ofrenderer;
10
11 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
12 import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
13 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
14 import org.opendaylight.sfc.ofrenderer.listeners.SfcOfRendererDataListener;
15 import org.opendaylight.sfc.ofrenderer.listeners.SfcOfRspDataListener;
16 import org.opendaylight.sfc.ofrenderer.listeners.SfcOfSfgDataListener;
17 import org.opendaylight.sfc.ofrenderer.openflow.SfcIpv4PacketInHandler;
18 import org.opendaylight.sfc.ofrenderer.openflow.SfcOfFlowProgrammerImpl;
19 import org.opendaylight.sfc.ofrenderer.openflow.SfcOfFlowProgrammerInterface;
20 import org.opendaylight.sfc.ofrenderer.processors.SfcOfRspProcessor;
21 import org.opendaylight.sfc.ofrenderer.utils.SfcOfBaseProviderUtils;
22 import org.opendaylight.sfc.ofrenderer.utils.SfcOfProviderUtils;
23 import org.opendaylight.sfc.ofrenderer.utils.SfcSynchronizer;
24 import org.opendaylight.sfc.util.openflow.writer.SfcOfFlowWriterImpl;
25 import org.opendaylight.yangtools.concepts.Registration;
26 import org.slf4j.Logger;
27 import org.slf4j.LoggerFactory;
28
29 /**
30  * Entry point for the sfc openflow renderer (blueprint-instantiated).
31  */
32 public final class SfcOfRenderer implements AutoCloseable {
33     private static final Logger LOG = LoggerFactory.getLogger(SfcOfRenderer.class);
34
35     private final SfcOfRspProcessor sfcOfRspProcessor;
36     private final SfcOfFlowProgrammerInterface sfcOfFlowProgrammer;
37     private final Registration pktInRegistration;
38     private final SfcSynchronizer sfcSynchronizer;
39
40     private SfcOfRspDataListener openflowRspDataListener;
41     private SfcOfSfgDataListener sfcOfSfgDataListener;
42     private SfcIpv4PacketInHandler packetInHandler;
43     private SfcOfRendererDataListener sfcOfRendererListener;
44
45     public SfcOfRenderer(DataBroker dataBroker, NotificationProviderService notificationService,
46                           RpcProviderRegistry rpcProviderRegistry) {
47         LOG.info("SfcOfRenderer starting the SfcOfRenderer plugin...");
48
49         this.sfcSynchronizer = new SfcSynchronizer();
50         SfcOfFlowWriterImpl sfcofflowwriterimpl = new SfcOfFlowWriterImpl();
51         sfcofflowwriterimpl.setDataProvider(dataBroker);
52         this.sfcOfFlowProgrammer = new SfcOfFlowProgrammerImpl(sfcofflowwriterimpl);
53         SfcOfBaseProviderUtils sfcOfProviderUtils = new SfcOfProviderUtils();
54         this.sfcOfRspProcessor = new SfcOfRspProcessor(sfcOfFlowProgrammer, sfcOfProviderUtils, sfcSynchronizer,
55                 rpcProviderRegistry, dataBroker);
56
57         this.openflowRspDataListener = new SfcOfRspDataListener(dataBroker, sfcOfRspProcessor);
58         this.sfcOfSfgDataListener = new SfcOfSfgDataListener(dataBroker, sfcOfFlowProgrammer, sfcOfProviderUtils);
59         this.sfcOfRendererListener = new SfcOfRendererDataListener(dataBroker, sfcOfFlowProgrammer, sfcSynchronizer);
60
61         this.packetInHandler = new SfcIpv4PacketInHandler((SfcOfFlowProgrammerImpl) sfcOfFlowProgrammer);
62         this.pktInRegistration = notificationService.registerNotificationListener(packetInHandler);
63
64         LOG.info("SfcOfRenderer successfully started the SfcOfRenderer plugin");
65     }
66
67     /**
68      * Implemented from the AutoCloseable interface.
69      */
70     @Override
71     public void close() throws Exception {
72         LOG.info("SfcOfRenderer auto-closed");
73         try {
74             if (sfcOfFlowProgrammer != null) {
75                 sfcOfFlowProgrammer.shutdown();
76             }
77             if (pktInRegistration != null) {
78                 pktInRegistration.close();
79             }
80             openflowRspDataListener.close();
81         } finally {
82             openflowRspDataListener = null;
83         }
84     }
85 }