Introduced InterfaceManager in VPP renderer
[groupbasedpolicy.git] / renderers / vpp / src / main / java / org / opendaylight / controller / config / yang / config / vpp_provider / impl / VppRenderer.java
1 /*
2  * Copyright (c) 2016 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
9 package org.opendaylight.controller.config.yang.config.vpp_provider.impl;
10
11 import java.util.List;
12
13 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
14 import org.opendaylight.controller.md.sal.binding.api.MountPointService;
15 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
16 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
17 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
18 import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
19 import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
20 import org.opendaylight.groupbasedpolicy.renderer.vpp.iface.InterfaceManager;
21 import org.opendaylight.groupbasedpolicy.renderer.vpp.listener.VppEndpointListener;
22 import org.opendaylight.groupbasedpolicy.renderer.vpp.listener.VppNodeListener;
23 import org.opendaylight.groupbasedpolicy.renderer.vpp.manager.VppNodeManager;
24 import org.opendaylight.groupbasedpolicy.renderer.vpp.sf.AllowAction;
25 import org.opendaylight.groupbasedpolicy.renderer.vpp.sf.EtherTypeClassifier;
26 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.MountedDataBrokerProvider;
27 import org.opendaylight.groupbasedpolicy.renderer.vpp.util.VppIidFactory;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.Renderer;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.RendererBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.RendererKey;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.CapabilitiesBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.RendererNodesBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.SupportedActionDefinition;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.SupportedActionDefinitionBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.SupportedClassifierDefinition;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.SupportedClassifierDefinitionBuilder;
37 import org.slf4j.Logger;
38 import org.slf4j.LoggerFactory;
39
40 import com.google.common.base.Preconditions;
41 import com.google.common.collect.ImmutableList;
42 import com.google.common.eventbus.EventBus;
43 import com.google.common.util.concurrent.CheckedFuture;
44 import com.google.common.util.concurrent.FutureCallback;
45 import com.google.common.util.concurrent.Futures;
46
47 public class VppRenderer implements AutoCloseable, BindingAwareProvider {
48
49     private static final Logger LOG = LoggerFactory.getLogger(VppRenderer.class);
50
51     private final List<SupportedActionDefinition> actionDefinitions =
52             ImmutableList.of(new SupportedActionDefinitionBuilder().setActionDefinitionId(new AllowAction().getId())
53                 .setSupportedParameterValues(new AllowAction().getSupportedParameterValues())
54                 .build());
55     private final List<SupportedClassifierDefinition> classifierDefinitions = ImmutableList
56         .of(new SupportedClassifierDefinitionBuilder().setClassifierDefinitionId(new EtherTypeClassifier(null).getId())
57             .setSupportedParameterValues(new EtherTypeClassifier(null).getSupportedParameterValues())
58             .build());
59
60     private final DataBroker dataBroker;
61
62     private VppNodeManager vppNodeManager;
63     private InterfaceManager interfaceManager;
64
65     private VppNodeListener vppNodeListener;
66     private VppEndpointListener vppEndpointListener;
67
68     public VppRenderer(DataBroker dataBroker, BindingAwareBroker bindingAwareBroker) {
69         this.dataBroker = Preconditions.checkNotNull(dataBroker);
70         bindingAwareBroker.registerProvider(this);
71     }
72
73     @Override
74     public void close() throws Exception {
75         LOG.info("Closing Vpp renderer");
76         if (vppNodeListener != null) {
77             vppNodeListener.close();
78         }
79         if (vppEndpointListener != null) {
80             vppEndpointListener.close();
81         }
82         if (interfaceManager != null) {
83             interfaceManager.close();
84         }
85         unregisterFromRendererManager();
86     }
87
88     @Override
89     public void onSessionInitiated(BindingAwareBroker.ProviderContext providerContext) {
90         LOG.info("starting vpp renderer");
91
92         MountPointService mountService = Preconditions.checkNotNull(providerContext.getSALService(MountPointService.class));
93         MountedDataBrokerProvider mountDataProvider = new MountedDataBrokerProvider(mountService);
94         vppNodeManager = new VppNodeManager(dataBroker, providerContext);
95
96         EventBus dtoEventBus = new EventBus("DTO events");
97         interfaceManager = new InterfaceManager(mountDataProvider, dataBroker);
98         dtoEventBus.register(interfaceManager);
99
100         vppNodeListener = new VppNodeListener(dataBroker, vppNodeManager, dtoEventBus);
101         vppEndpointListener = new VppEndpointListener(dataBroker, dtoEventBus);
102
103         registerToRendererManager();
104     }
105
106     private void registerToRendererManager() {
107         WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();
108
109         Renderer renderer = new RendererBuilder().setName(VppNodeManager.vppRenderer)
110             .setRendererNodes(new RendererNodesBuilder().build())
111             .setCapabilities(new CapabilitiesBuilder().setSupportedActionDefinition(actionDefinitions)
112                 .setSupportedClassifierDefinition(classifierDefinitions)
113                 .build())
114             .build();
115
116         writeTransaction.put(LogicalDatastoreType.OPERATIONAL, VppIidFactory.getRendererIID(renderer.getKey()),
117                 renderer, true);
118         CheckedFuture<Void, TransactionCommitFailedException> future = writeTransaction.submit();
119         Futures.addCallback(future, new FutureCallback<Void>() {
120
121             @Override
122             public void onFailure(Throwable throwable) {
123                 LOG.error("Could not register renderer {}: {}", renderer, throwable);
124             }
125
126             @Override
127             public void onSuccess(Void result) {
128                 LOG.debug("Renderer {} successfully registered.", renderer);
129             }
130         });
131     }
132
133
134     private void unregisterFromRendererManager() {
135         WriteTransaction writeTransaction = dataBroker.newWriteOnlyTransaction();
136         writeTransaction.delete(LogicalDatastoreType.OPERATIONAL, VppIidFactory.getRendererIID(new RendererKey(VppNodeManager.vppRenderer)));
137
138         CheckedFuture<Void, TransactionCommitFailedException> future = writeTransaction.submit();
139         Futures.addCallback(future, new FutureCallback<Void>() {
140
141             @Override
142             public void onFailure(Throwable throwable) {
143                 LOG.error("Could not unregister renderer {}: {}", VppNodeManager.vppRenderer, throwable);
144             }
145
146             @Override
147             public void onSuccess(Void result) {
148                 LOG.debug("Renderer {} successfully unregistered.", VppNodeManager.vppRenderer);
149             }
150         });
151     }
152 }