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