ios-xe-renderer version reporting
[groupbasedpolicy.git] / renderers / ios-xe / src / main / java / org / opendaylight / groupbasedpolicy / renderer / ios_xe_provider / impl / manager / PolicyManagerImpl.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.manager;
10
11 import static org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.PolicyManagerImpl.DsAction.Create;
12 import static org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.manager.PolicyManagerImpl.DsAction.Delete;
13
14 import java.util.HashMap;
15 import java.util.List;
16 import java.util.Map;
17
18 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
19 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
20 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
21 import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.api.manager.PolicyManager;
22 import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.util.PolicyManagerUtil;
23 import org.opendaylight.groupbasedpolicy.renderer.ios_xe_provider.impl.writer.PolicyWriter;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.Renderers;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.Renderer;
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.RendererPolicy;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.RendererPolicyBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.Configuration;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.endpoints.AddressEndpointWithLocation;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.RendererEndpoint;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.renderer.policy.configuration.renderer.endpoints.renderer.endpoint.PeerEndpointWithPolicy;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.sxp.database.rev160308.Sgt;
34 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
35 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
36 import org.slf4j.Logger;
37 import org.slf4j.LoggerFactory;
38
39 import com.google.common.base.Preconditions;
40 import com.google.common.util.concurrent.Futures;
41 import com.google.common.util.concurrent.ListenableFuture;
42
43 public class PolicyManagerImpl implements PolicyManager {
44
45     private static final Logger LOG = LoggerFactory.getLogger(PolicyManagerImpl.class);
46     private static final String policyMapName = "service-chains";
47     private final DataBroker dataBroker;
48     private final NodeManager nodeManager;
49
50     public PolicyManagerImpl(final DataBroker dataBroker,
51                              final NodeManager nodeManager) {
52         this.dataBroker = Preconditions.checkNotNull(dataBroker);
53         this.nodeManager = Preconditions.checkNotNull(nodeManager);
54     }
55
56     @Override
57     public ListenableFuture<Boolean> syncPolicy(final Configuration dataAfter, final Configuration dataBefore,
58             long version) {
59         ListenableFuture<Boolean> result = Futures.immediateFuture(false);
60         if (dataBefore == null && dataAfter != null) {
61             result = syncPolicy(dataAfter, Create);
62         } else if (dataBefore != null && dataAfter != null) {
63             // TODO implement
64             return Futures.immediateFuture(false);
65         } else if (dataBefore != null) {
66             result = syncPolicy(dataBefore, Delete);
67         }
68         reportVersion(version);
69         return result;
70     }
71
72     private ListenableFuture<Boolean> syncPolicy(final Configuration dataAfter, DsAction action) {
73         if (dataAfter.getRendererEndpoints() == null
74                 || dataAfter.getRendererEndpoints().getRendererEndpoint() == null) {
75             LOG.debug("no configuration obtained - skipping");
76             return Futures.immediateFuture(true);
77         }
78         final Map<DataBroker, PolicyWriter> policyWriterPerDeviceCache = new HashMap<>();
79         for (RendererEndpoint rendererEndpoint : dataAfter.getRendererEndpoints().getRendererEndpoint()) {
80             if (dataAfter.getEndpoints() == null || dataAfter.getEndpoints().getAddressEndpointWithLocation() == null) {
81                 LOG.debug("renderer-endpoint: missing address-endpoint-with-location");
82                 continue;
83             }
84             final List<AddressEndpointWithLocation> endpointsWithLocation = dataAfter.getEndpoints()
85                     .getAddressEndpointWithLocation();
86             final InstanceIdentifier mountpointIid = PolicyManagerUtil.getAbsoluteLocationMountpoint(rendererEndpoint, endpointsWithLocation);
87             final DataBroker mountpoint = nodeManager.getNodeMountPoint(mountpointIid);
88             if (mountpoint == null) {
89                 LOG.debug("no data-broker for mount-point [{}] available", mountpointIid);
90                 continue;
91             }
92             // Find policy writer
93             PolicyWriter policyWriter = policyWriterPerDeviceCache.get(mountpoint);
94             if (policyWriter == null) {
95                 // Initialize new policy writer
96                 final String interfaceName = PolicyManagerUtil.getInterfaceNameForPolicyMap(rendererEndpoint, endpointsWithLocation);
97                 final NodeId nodeId = nodeManager.getNodeIdByMountpointIid(mountpointIid);
98                 final String managementIpAddress = nodeManager.getNodeManagementIpByMountPointIid(mountpointIid);
99                 if (interfaceName == null || managementIpAddress == null) {
100                     LOG.debug("can not create policyWriter: interface={}, managementIpAddress={}",
101                             interfaceName, managementIpAddress);
102                     continue;
103                 }
104                 policyWriter = new PolicyWriter(mountpoint, interfaceName, managementIpAddress, policyMapName, nodeId);
105                 policyWriterPerDeviceCache.put(mountpoint, policyWriter);
106             }
107
108             final Sgt sourceSgt = PolicyManagerUtil.findSgtTag(rendererEndpoint, dataAfter.getEndpoints()
109                     .getAddressEndpointWithLocation());
110             // Peer Endpoint
111             for (PeerEndpointWithPolicy peerEndpoint : rendererEndpoint.getPeerEndpointWithPolicy()) {
112                 final Sgt destinationSgt = PolicyManagerUtil.findSgtTag(peerEndpoint, dataAfter.getEndpoints()
113                         .getAddressEndpointWithLocation());
114                 if (sourceSgt == null || destinationSgt == null) {
115                     LOG.debug("endpoint-policy: missing sgt value(sourceSgt={}, destinationSgt={})",
116                             sourceSgt, destinationSgt);
117                     continue;
118                 }
119                 PolicyManagerUtil.syncPolicyEntities(sourceSgt, destinationSgt, policyWriter, dataAfter, peerEndpoint);
120             }
121         }
122         if (action.equals(Create)) {
123             policyWriterPerDeviceCache.values().forEach(PolicyWriter::commitToDatastore);
124             return Futures.immediateFuture(true);
125         } else if (action.equals(Delete)) {
126             policyWriterPerDeviceCache.values().forEach(PolicyWriter::removeFromDatastore);
127             return Futures.immediateFuture(true);
128         }
129         return Futures.immediateFuture(false);
130     }
131
132     private void reportVersion(long version) {
133         WriteTransaction wtx = dataBroker.newWriteOnlyTransaction();
134         InstanceIdentifier<RendererPolicy> iid = InstanceIdentifier.create(Renderers.class)
135                 .child(Renderer.class, new RendererKey(NodeManager.iosXeRenderer))
136                 .child(RendererPolicy.class);
137         wtx.merge(LogicalDatastoreType.OPERATIONAL, iid, new RendererPolicyBuilder().setVersion(version).build());
138         wtx.submit();
139     }
140
141     @Override
142     public void close() {
143         //NOOP
144     }
145
146     enum DsAction {Create, Delete}
147
148     public enum ActionCase {ALLOW, CHAIN}
149 }