Remove useless UnsupportedOperationExceptions
[bgpcep.git] / bgp / openconfig-rp-spi / src / main / java / org / opendaylight / protocol / bgp / openconfig / routing / policy / spi / registry / BgpAttributeConditionsUtil.java
1 /*
2  * Copyright (c) 2018 AT&T Intellectual Property. 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.protocol.bgp.openconfig.routing.policy.spi.registry;
9
10 import java.util.List;
11 import java.util.Objects;
12 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.policy.rev151009.bgp.attribute.conditions.AsPathLength;
13 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.policy.rev151009.routing.policy.policy.definitions.policy.definition.statements.statement.conditions.BgpConditions;
14 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.AfiSafiType;
15 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.types.rev151009.BgpOriginAttrType;
16 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.policy.types.rev151009.AttributeComparison;
17 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.policy.types.rev151009.AttributeEq;
18 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.policy.types.rev151009.AttributeGe;
19 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.policy.types.rev151009.AttributeLe;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.path.attributes.Attributes;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.path.attributes.attributes.AsPath;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.path.attributes.attributes.LocalPref;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.path.attributes.attributes.MultiExitDisc;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.path.attributes.attributes.Origin;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev180329.path.attributes.attributes.as.path.Segments;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.AsPathSegment;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.next.hop.CNextHop;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.next.hop.c.next.hop.EmptyNextHopCase;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.next.hop.c.next.hop.Ipv4NextHopCase;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.next.hop.c.next.hop.Ipv6NextHopCase;
32 import org.opendaylight.yangtools.yang.common.Uint32;
33
34 /**
35  * Bgp Attribute Conditions Util per check conditions matches.
36  *
37  * @author Claudio D. Gasparini
38  */
39 final class BgpAttributeConditionsUtil {
40     private BgpAttributeConditionsUtil() {
41         // Hidden on purpose
42     }
43
44     static boolean matchConditions(
45             final Class<? extends AfiSafiType> afiSafi,
46             final Attributes attributes,
47             final BgpConditions conditions) {
48         return matchAfiSafi(afiSafi, conditions.getAfiSafiIn())
49             && matchAsPathLength(attributes.getAsPath(), conditions.getAsPathLength())
50             && matchMED(attributes.getMultiExitDisc(), conditions.getMedEq())
51             && matchOrigin(attributes.getOrigin(), conditions.getOriginEq())
52             && matchNextHopIn(attributes.getCNextHop(), conditions.getNextHopIn())
53             && matchLocalPref(attributes.getLocalPref(), conditions.getLocalPrefEq());
54     }
55
56     private static boolean matchAfiSafi(
57             final Class<? extends AfiSafiType> afiSafi,
58             final List<Class<? extends AfiSafiType>> afiSafiIn) {
59         return afiSafiIn == null ? true : afiSafiIn.contains(afiSafi);
60     }
61
62     private static boolean matchMED(final MultiExitDisc multiExitDisc, final Uint32 med) {
63         return multiExitDisc == null || med == null || med.equals(multiExitDisc.getMed());
64     }
65
66     private static boolean matchOrigin(final Origin origin, final BgpOriginAttrType originEq) {
67         return origin == null || originEq == null || origin.getValue().getIntValue() == originEq.getIntValue();
68     }
69
70     private static boolean matchAsPathLength(final AsPath asPath, final AsPathLength asPathLength) {
71         if (asPath == null || asPathLength == null) {
72             return true;
73         }
74
75         final List<Segments> segments = asPath.getSegments();
76         int total = segments.stream().map(AsPathSegment::getAsSequence)
77                 .filter(Objects::nonNull).mapToInt(List::size).sum();
78
79         if (total == 0) {
80             total = segments.stream().map(AsPathSegment::getAsSet)
81                     .filter(Objects::nonNull).mapToInt(List::size).sum();
82         }
83
84         final Class<? extends AttributeComparison> comp = asPathLength.getOperator();
85         final long asLength = asPathLength.getValue().toJava();
86         if (comp == AttributeEq.class) {
87             return total == asLength;
88         } else if (comp == AttributeGe.class) {
89             return total >= asLength;
90         } else if (comp == AttributeLe.class) {
91             return total <= asLength;
92         }
93         return false;
94     }
95
96     private static boolean matchNextHopIn(final CNextHop nextHop, final List<IpAddress> nextHopIn) {
97         if (nextHop == null || nextHopIn == null || nextHop instanceof EmptyNextHopCase) {
98             return true;
99         }
100
101         IpAddress global;
102         if (nextHop instanceof Ipv4NextHopCase) {
103             global = new IpAddress(((Ipv4NextHopCase) nextHop).getIpv4NextHop().getGlobal());
104         } else {
105             global = new IpAddress(((Ipv6NextHopCase) nextHop).getIpv6NextHop().getGlobal());
106         }
107         return nextHopIn.contains(global);
108     }
109
110     private static boolean matchLocalPref(final LocalPref localPref, final Uint32 localPrefEq) {
111         return localPref == null || localPrefEq == null || localPrefEq.equals(localPref.getPref());
112     }
113 }