Refactoring of cisco-xr-driver and impl modules.
[unimgr.git] / cisco-xr-driver / src / main / java / org / opendaylight / unimgr / mef / nrp / cisco / xr / common / helper / BandwidthProfileHelper.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 package org.opendaylight.unimgr.mef.nrp.cisco.xr.common.helper;
9
10 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
11 import org.opendaylight.unimgr.utils.MdsalUtils;
12 import org.opendaylight.unimgr.utils.NullAwareDatastoreGetter;
13 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.asr9k.policymgr.cfg.rev150518.PolicyManager;
14 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.asr9k.policymgr.cfg.rev150518.PolicyManagerBuilder;
15 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.asr9k.policymgr.cfg.rev150518.RateUnits;
16 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.asr9k.policymgr.cfg.rev150518.ThresholdUnits;
17 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.asr9k.policymgr.cfg.rev150518.policy.manager.PolicyMapsBuilder;
18 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.asr9k.policymgr.cfg.rev150518.policy.manager.policy.maps.PolicyMap;
19 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.asr9k.policymgr.cfg.rev150518.policy.manager.policy.maps.PolicyMapBuilder;
20 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.asr9k.policymgr.cfg.rev150518.policy.map.rule.PolicyMapRule;
21 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.asr9k.policymgr.cfg.rev150518.policy.map.rule.PolicyMapRuleBuilder;
22 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.asr9k.policymgr.cfg.rev150518.policy.map.rule.policy.map.rule.Police;
23 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.asr9k.policymgr.cfg.rev150518.policy.map.rule.policy.map.rule.PoliceBuilder;
24 import org.opendaylight.yang.gen.v1.http.cisco.com.ns.yang.cisco.ios.xr.asr9k.policymgr.cfg.rev150518.policy.map.rule.policy.map.rule.police.*;
25 import org.opendaylight.yang.gen.v1.urn.mef.nrp.bandwidth.profile.rev160630.GNRPBwpFlow;
26 import org.opendaylight.yang.gen.v1.urn.mef.nrp.specs.rev160630.AdapterSpec1;
27 import org.opendaylight.yang.gen.v1.urn.mef.nrp.specs.rev160630.TerminationSpec1;
28 import org.opendaylight.yang.gen.v1.urn.onf.core.network.module.rev160630.TerminationPoint1;
29 import org.opendaylight.yang.gen.v1.urn.onf.core.network.module.rev160630.g_forwardingconstruct.FcPort;
30 import org.opendaylight.yang.gen.v1.urn.onf.core.network.module.rev160630.g_layerprotocol.LpSpec;
31 import org.slf4j.Logger;
32 import org.slf4j.LoggerFactory;
33
34 import java.util.ArrayList;
35 import java.util.List;
36 import java.util.Optional;
37 import java.util.stream.Collectors;
38
39 import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.CONFIGURATION;
40
41
42 public class BandwidthProfileHelper {
43
44     private static final Logger LOG = LoggerFactory.getLogger(BandwidthProfileHelper.class);
45
46     private static String SEPARATOR  = "_";
47
48     private static String CLASS_DEFAULT = "class-default";
49
50     private static class PolicyMapNameGenerator {
51
52         public static String generate(String fcName, BandwidthProfileComposition.BwpDirection direction, BandwidthProfileComposition.BwpApplicability applicability) {
53             //TODO naming convention
54             return new StringBuilder()
55                     .append(fcName)
56                     .append(SEPARATOR)
57                     .append(direction.name().toLowerCase())
58                     .append(SEPARATOR)
59                     .append(applicability.name().toLowerCase())
60                     .toString();
61         }
62     }
63
64     private static List<BandwidthProfileComposition> retrieveBandwidthProfiles(DataBroker dataBroker, FcPort port) {
65         List<BandwidthProfileComposition> bwCompositionList = new ArrayList<>();
66         List<NullAwareDatastoreGetter<LpSpec>> lpSpecNadgs = new NullAwareDatastoreGetter<>(MdsalUtils.readTerminationPoint(dataBroker, CONFIGURATION, port))
67                 .collect(x -> x::getAugmentation, TerminationPoint1.class)
68                 .collect(x -> x::getLtpAttrs)
69                 .collectMany(x -> x::getLpList)
70                 .stream()
71                 .map(nadg -> nadg.collect(x -> x::getLpSpec))
72                 .collect(Collectors.toList());
73
74         for(NullAwareDatastoreGetter<LpSpec> lpSpecNadg : lpSpecNadgs) {
75             NullAwareDatastoreGetter<AdapterSpec1> adapterSpecNadg = lpSpecNadg
76                     .collect(x -> x::getAdapterSpec)
77                     .collect(x -> x::getAugmentation, AdapterSpec1.class);
78
79             NullAwareDatastoreGetter<TerminationSpec1> terminationSpecNadg = lpSpecNadg
80                     .collect(x -> x::getTerminationSpec)
81                     .collect(x -> x::getAugmentation, TerminationSpec1.class);
82
83             bwCompositionList.add(
84                 BandwidthProfileComposition.builder()
85                         .defaultIngressBwProfile(adapterSpecNadg.collect(x -> x::getNrpConnAdaptSpecAttrs).collect(x -> x::getIngressBwpFlow).get())
86                         .defaultEgressBwProfile(adapterSpecNadg.collect(x -> x::getNrpConnAdaptSpecAttrs).collect(x -> x::getEgressBwpFlow).get())
87                         .ingressBwProfilePerEvc(adapterSpecNadg.collect(x -> x::getNrpEvcEndpointConnAdaptSpecAttrs).collect(x -> x::getIngressBwpFlow).get())
88                         .egressBwProfilePerEvc(adapterSpecNadg.collect(x -> x::getNrpEvcEndpointConnAdaptSpecAttrs).collect(x -> x::getEgressBwpFlow).get())
89                         .ingressBwProfilePerUni(terminationSpecNadg.collect(x -> x::getNrpUniTerminationAttrs).collect(x -> x::getIngressBwpUni).get())
90                         .egressBwProfilePerUni(terminationSpecNadg.collect(x -> x::getNrpUniTerminationAttrs).collect(x -> x::getEgressBwpUni).get())
91                         .build()
92             );
93         }
94
95         return bwCompositionList;
96     }
97
98     private List<BandwidthProfileComposition> bandwidthProfiles;
99
100     private List<PolicyMap> policyMaps;
101
102     public BandwidthProfileHelper(DataBroker dataBroker, FcPort port) {
103         bandwidthProfiles = BandwidthProfileHelper.retrieveBandwidthProfiles(dataBroker, port);
104         policyMaps = new ArrayList<>();
105     }
106
107     public List<BandwidthProfileComposition> getBandwidthProfiles() {
108         return bandwidthProfiles;
109     }
110
111     public boolean isQosEnabled() {
112         for(BandwidthProfileComposition bandwidthProfileComposition : bandwidthProfiles) {
113             if(bandwidthProfileComposition.hasAnyProfileDefined()) {
114                 return true;
115             }
116         }
117
118         return false;
119     }
120
121     private Police addPolice(GNRPBwpFlow bandwidthProfile) {
122         Long cir = bandwidthProfile.getCir().getValue();
123         Long cbs = bandwidthProfile.getCbs().getValue();
124         Long pir = bandwidthProfile.getEir().getValue() + cir;
125         Long pbs = bandwidthProfile.getEbs().getValue() + cbs;
126
127         return new PoliceBuilder()
128                 // CIR configuration
129                 .setRate(new RateBuilder().setUnits(new RateUnits("bps")).setValue(cir).build())
130
131                 // CBS configuration
132                 .setBurst(new BurstBuilder().setUnits(new ThresholdUnits("bytes")).setValue(cbs).build())
133
134                 // PIR configuration
135                 .setPeakRate(new PeakRateBuilder().setUnits(new RateUnits("bps")).setValue(pir).build())
136
137                 // PBS configuration
138                 .setPeakBurst(new PeakBurstBuilder().setUnits(new ThresholdUnits("bytes")).setValue(pbs).build())
139
140                 // GREEN-marked frames action configuration
141                 .setConformAction(new ConformActionBuilder().setTransmit(true).build())
142
143                 // YELLOW-marked frames action configuration
144                 .setViolateAction(new ViolateActionBuilder().setTransmit(true).build())
145
146                 // RED-marked frames action configuration
147                 .setExceedAction(new ExceedActionBuilder().setDrop(true).build())
148
149                 .build();
150     }
151
152     public BandwidthProfileHelper addPolicyMap(String fcName, BandwidthProfileComposition.BwpDirection direction, BandwidthProfileComposition.BwpApplicability applicability) {
153         if(bandwidthProfiles.size() > 0) {
154             //TODO .get(0) ?
155             Optional<GNRPBwpFlow> bwProfileOptional = bandwidthProfiles.get(0).get(direction, applicability);
156
157             if (bwProfileOptional.isPresent()) {
158                 List<PolicyMapRule> policyMapRules = new ArrayList<>();
159                 policyMapRules.add(
160                         new PolicyMapRuleBuilder()
161                                 .setClassName(CLASS_DEFAULT)
162                                 .setPolice(addPolice(bwProfileOptional.get()))
163                                 .build()
164                 );
165
166
167                 policyMaps.add(new PolicyMapBuilder()
168                         .setName(PolicyMapNameGenerator.generate(fcName, direction, applicability))
169                         .setPolicyMapRule(policyMapRules)
170                         .build()
171                 );
172
173                 return this;
174             }
175         }
176
177         LOG.warn("Cannot configure policy map - there are no Bandwidth Profiles defined.");
178         return this;
179     }
180
181     public Optional<PolicyManager> build() {
182         if (policyMaps.size() == 0) {
183             return Optional.empty();
184         }
185
186         return Optional.of(new PolicyManagerBuilder()
187                 .setPolicyMaps(new PolicyMapsBuilder().setPolicyMap(policyMaps).build())
188                 .build()
189         );
190     }
191 }