ios-xe-renderer policy-manager update
[groupbasedpolicy.git] / renderers / ios-xe / src / main / java / org / opendaylight / groupbasedpolicy / renderer / ios_xe_provider / impl / writer / NodeWriter.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.groupbasedpolicy.renderer.ios_xe_provider.impl.writer;
10
11 import com.google.common.util.concurrent.CheckedFuture;
12 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
13 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
14 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
15 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
16 import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.NodeManager;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.RendererName;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.Renderers;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.Renderer;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.RendererKey;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.RendererNodes;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.RendererNodesBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.nodes.RendererNode;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.nodes.RendererNodeKey;
25 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
26 import org.slf4j.Logger;
27 import org.slf4j.LoggerFactory;
28
29 import java.util.ArrayList;
30 import java.util.List;
31
32 public class NodeWriter {
33
34     private static final Logger LOG = LoggerFactory.getLogger(NodeWriter.class);
35     private List<RendererNode> rendererNodesCache;
36
37     public NodeWriter() {
38         rendererNodesCache = new ArrayList<>();
39     }
40
41     public void cache(RendererNode node) {
42         rendererNodesCache.add(node);
43     }
44
45     /**
46      * Put all cached items to data store
47      *
48      * @param dataBroker appropriate data provider
49      */
50     public void commitToDatastore(DataBroker dataBroker) {
51         RendererNodes rendererNodes = buildRendererNodes();
52         WriteTransaction wtx = dataBroker.newWriteOnlyTransaction();
53         InstanceIdentifier<RendererNodes> iid = buildRendererNodesIid();
54         try {
55             wtx.merge(LogicalDatastoreType.OPERATIONAL, iid, rendererNodes, true);
56             CheckedFuture<Void, TransactionCommitFailedException> submitFuture = wtx.submit();
57             submitFuture.checkedGet();
58             // Clear cache
59             rendererNodesCache.clear();
60         } catch (TransactionCommitFailedException e) {
61             LOG.error("Write transaction failed to {}", e.getMessage());
62         } catch (Exception e) {
63             LOG.error("Failed to .. {}", e.getMessage());
64         }
65     }
66
67     /**
68      * Removes all cached items from data store
69      *
70      * @param dataBroker appropriate data provider
71      */
72     public void removeFromDatastore(DataBroker dataBroker) {
73         WriteTransaction wtx = dataBroker.newWriteOnlyTransaction();
74         for (RendererNode nodeToRemove : rendererNodesCache) {
75             InstanceIdentifier<RendererNode> iid = buildRendererNodeIid(nodeToRemove);
76             try {
77                 wtx.delete(LogicalDatastoreType.OPERATIONAL, iid);
78                 CheckedFuture<Void, TransactionCommitFailedException> submitFuture = wtx.submit();
79                 submitFuture.checkedGet();
80                 // Clear cache
81             } catch (TransactionCommitFailedException e) {
82                 LOG.error("Write transaction failed to {}", e.getMessage());
83             } catch (Exception e) {
84                 LOG.error("Failed to .. {}", e.getMessage());
85             }
86         }
87         rendererNodesCache.clear();
88     }
89
90     private InstanceIdentifier<RendererNodes> buildRendererNodesIid() {
91         return InstanceIdentifier.builder(Renderers.class)
92                 .child(Renderer.class, new RendererKey(new RendererName(NodeManager.iosXeRenderer))) // TODO unify renderer name
93                 .child(RendererNodes.class)
94                 .build();
95     }
96
97     private InstanceIdentifier<RendererNode> buildRendererNodeIid(RendererNode rendererNode) {
98         return InstanceIdentifier.builder(Renderers.class)
99                 .child(Renderer.class, new RendererKey(new RendererName(NodeManager.iosXeRenderer))) // TODO unify renderer name
100                 .child(RendererNodes.class)
101                 .child(RendererNode.class, new RendererNodeKey(rendererNode.getNodePath()))
102                 .build();
103     }
104
105     private RendererNodes buildRendererNodes() {
106         RendererNodesBuilder rendererNodesBuilder = new RendererNodesBuilder();
107         rendererNodesBuilder.setRendererNode(new ArrayList<>(rendererNodesCache));
108         return rendererNodesBuilder.build();
109     }
110 }