2 * Copyright (c) 2016 Cisco Systems Inc and others. All rights reserved.
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
8 package org.opendaylight.unimgr.mef.nrp.cisco.xr.common.helper;
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;
34 import java.util.ArrayList;
35 import java.util.List;
36 import java.util.Optional;
37 import java.util.stream.Collectors;
39 import static org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType.CONFIGURATION;
42 public class BandwidthProfileHelper {
44 private static final Logger LOG = LoggerFactory.getLogger(BandwidthProfileHelper.class);
46 private static String SEPARATOR = "_";
48 private static String CLASS_DEFAULT = "class-default";
50 private static class PolicyMapNameGenerator {
52 public static String generate(String fcName, BandwidthProfileComposition.BwpDirection direction, BandwidthProfileComposition.BwpApplicability applicability) {
53 //TODO naming convention
54 return new StringBuilder()
57 .append(direction.name().toLowerCase())
59 .append(applicability.name().toLowerCase())
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)
71 .map(nadg -> nadg.collect(x -> x::getLpSpec))
72 .collect(Collectors.toList());
74 for(NullAwareDatastoreGetter<LpSpec> lpSpecNadg : lpSpecNadgs) {
75 NullAwareDatastoreGetter<AdapterSpec1> adapterSpecNadg = lpSpecNadg
76 .collect(x -> x::getAdapterSpec)
77 .collect(x -> x::getAugmentation, AdapterSpec1.class);
79 NullAwareDatastoreGetter<TerminationSpec1> terminationSpecNadg = lpSpecNadg
80 .collect(x -> x::getTerminationSpec)
81 .collect(x -> x::getAugmentation, TerminationSpec1.class);
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())
95 return bwCompositionList;
98 private List<BandwidthProfileComposition> bandwidthProfiles;
100 private List<PolicyMap> policyMaps;
102 public BandwidthProfileHelper(DataBroker dataBroker, FcPort port) {
103 bandwidthProfiles = BandwidthProfileHelper.retrieveBandwidthProfiles(dataBroker, port);
104 policyMaps = new ArrayList<>();
107 public List<BandwidthProfileComposition> getBandwidthProfiles() {
108 return bandwidthProfiles;
111 public boolean isQosEnabled() {
112 for(BandwidthProfileComposition bandwidthProfileComposition : bandwidthProfiles) {
113 if(bandwidthProfileComposition.hasAnyProfileDefined()) {
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;
127 return new PoliceBuilder()
129 .setRate(new RateBuilder().setUnits(new RateUnits("bps")).setValue(cir).build())
132 .setBurst(new BurstBuilder().setUnits(new ThresholdUnits("bytes")).setValue(cbs).build())
135 .setPeakRate(new PeakRateBuilder().setUnits(new RateUnits("bps")).setValue(pir).build())
138 .setPeakBurst(new PeakBurstBuilder().setUnits(new ThresholdUnits("bytes")).setValue(pbs).build())
140 // GREEN-marked frames action configuration
141 .setConformAction(new ConformActionBuilder().setTransmit(true).build())
143 // YELLOW-marked frames action configuration
144 .setViolateAction(new ViolateActionBuilder().setTransmit(true).build())
146 // RED-marked frames action configuration
147 .setExceedAction(new ExceedActionBuilder().setDrop(true).build())
152 public BandwidthProfileHelper addPolicyMap(String fcName, BandwidthProfileComposition.BwpDirection direction, BandwidthProfileComposition.BwpApplicability applicability) {
153 if(bandwidthProfiles.size() > 0) {
155 Optional<GNRPBwpFlow> bwProfileOptional = bandwidthProfiles.get(0).get(direction, applicability);
157 if (bwProfileOptional.isPresent()) {
158 List<PolicyMapRule> policyMapRules = new ArrayList<>();
160 new PolicyMapRuleBuilder()
161 .setClassName(CLASS_DEFAULT)
162 .setPolice(addPolice(bwProfileOptional.get()))
167 policyMaps.add(new PolicyMapBuilder()
168 .setName(PolicyMapNameGenerator.generate(fcName, direction, applicability))
169 .setPolicyMapRule(policyMapRules)
177 LOG.warn("Cannot configure policy map - there are no Bandwidth Profiles defined.");
181 public Optional<PolicyManager> build() {
182 if (policyMaps.size() == 0) {
183 return Optional.empty();
186 return Optional.of(new PolicyManagerBuilder()
187 .setPolicyMaps(new PolicyMapsBuilder().setPolicyMap(policyMaps).build())