eb1ba99c1ed15f91a2e54052d4d81fc95f130656
[netvirt.git] / coe / impl / src / main / java / org / opendaylight / netvirt / coe / utils / NetworkPolicyUtils.java
1 /*
2  * Copyright (c) 2018 Red Hat, 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.netvirt.coe.utils;
9
10 import com.google.common.collect.ImmutableBiMap;
11 import java.util.List;
12 import javax.annotation.Nonnull;
13 import javax.annotation.Nullable;
14 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.k8s.core.rev181205.Protocol;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.k8s.meta.v1.rev181205.label.selector.MatchLabels;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.k8s.meta.v1.rev181205.label.selector.MatchLabelsBuilder;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.k8s.network.policy.rev181205.PolicyType;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.k8s.network.policy.rev181205.ip.block.IpBlock;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.k8s.network.policy.rev181205.ip.block.IpBlockBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.k8s.network.policy.rev181205.network.policy.NetworkPolicies;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.k8s.network.policy.rev181205.network.policy.egress.rule.NetworkPolicyEgressRule;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.k8s.network.policy.rev181205.network.policy.egress.rule.NetworkPolicyEgressRuleBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.k8s.network.policy.rev181205.network.policy.egress.rule.network.policy.egress.rule.EgressPorts;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.k8s.network.policy.rev181205.network.policy.egress.rule.network.policy.egress.rule.EgressPortsBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.k8s.network.policy.rev181205.network.policy.egress.rule.network.policy.egress.rule.To;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.k8s.network.policy.rev181205.network.policy.egress.rule.network.policy.egress.rule.ToBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.k8s.network.policy.rev181205.network.policy.ingress.rule.NetworkPolicyIngressRule;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.k8s.network.policy.rev181205.network.policy.ingress.rule.NetworkPolicyIngressRuleBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.k8s.network.policy.rev181205.network.policy.ingress.rule.network.policy.ingress.rule.From;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.k8s.network.policy.rev181205.network.policy.ingress.rule.network.policy.ingress.rule.FromBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.k8s.network.policy.rev181205.network.policy.ingress.rule.network.policy.ingress.rule.IngressPorts;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.k8s.network.policy.rev181205.network.policy.ingress.rule.network.policy.ingress.rule.IngressPortsBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.k8s.network.policy.rev181205.network.policy.network.policies.NetworkPolicy;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.k8s.network.policy.rev181205.network.policy.network.policies.NetworkPolicyBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.k8s.network.policy.rev181205.network.policy.network.policies.NetworkPolicyKey;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.k8s.network.policy.rev181205.network.policy.peer.NetworkPolicyPeer;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.k8s.network.policy.rev181205.network.policy.peer.NetworkPolicyPeerBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.k8s.network.policy.rev181205.network.policy.port.NetworkPolicyPort;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.k8s.network.policy.rev181205.network.policy.port.NetworkPolicyPortBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.k8s.network.policy.rev181205.network.policy.spec.NetworkPolicySpec;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.k8s.network.policy.rev181205.network.policy.spec.NetworkPolicySpecBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.k8s.network.policy.rev181205.network.policy.spec.network.policy.spec.Egress;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.k8s.network.policy.rev181205.network.policy.spec.network.policy.spec.EgressBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.k8s.network.policy.rev181205.network.policy.spec.network.policy.spec.Ingress;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.k8s.network.policy.rev181205.network.policy.spec.network.policy.spec.IngressBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.k8s.network.policy.rev181205.network.policy.spec.network.policy.spec.PodSelector;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.k8s.network.policy.rev181205.network.policy.spec.network.policy.spec.PodSelectorBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.k8s.rev181205.K8s;
50 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
51
52 public final class NetworkPolicyUtils {
53     public static final ImmutableBiMap<Protocol, Short> PROTOCOL_MAP = ImmutableBiMap.of(
54         Protocol.TCP, (short)6,
55         Protocol.UDP, (short)17,
56         Protocol.SCTP, (short)132
57     );
58
59     private NetworkPolicyUtils() {}
60
61     @Nonnull
62     public static MatchLabels buildMatchLabels(@Nonnull String key, @Nonnull String value) {
63         return new MatchLabelsBuilder().setKey(key).setValue(value).build();
64     }
65
66     @Nonnull
67     public static PodSelector buildPodSelector(@Nonnull List<MatchLabels> matchLabels) {
68         return new PodSelectorBuilder().setMatchLabels(matchLabels).build();
69     }
70
71     @Nonnull
72     public static InstanceIdentifier<NetworkPolicy> getNetworkPolicyIid(@Nonnull String uuid) {
73         return InstanceIdentifier.create(K8s.class).child(NetworkPolicies.class)
74             .child(NetworkPolicy.class, new NetworkPolicyKey(new Uuid(uuid)));
75     }
76
77     @Nonnull
78     public static IpBlock buildIpBlock(@Nonnull String cidr, @Nullable List<String> except) {
79         IpBlockBuilder ipBlockBuilder = new IpBlockBuilder().setCidr(cidr);
80
81         if (except != null && !except.isEmpty()) {
82             ipBlockBuilder.setExcept(except);
83         }
84
85         return new IpBlockBuilder().setCidr(cidr).setExcept(except).build();
86     }
87
88     // TODO add pod and namespace selector handling
89     @Nonnull
90     public static NetworkPolicyPeer buildNetworkPolicyPeer(@Nonnull IpBlock ipBlock) {
91         return new NetworkPolicyPeerBuilder().setIpBlock(ipBlock).build();
92     }
93
94     @Nonnull
95     public static NetworkPolicyPort buildNetworkPolicyPort(@Nonnull String port, @Nonnull Protocol protocol) {
96         return new NetworkPolicyPortBuilder().setPort(port).setProtocol(protocol).build();
97     }
98
99     @Nonnull
100     public static IngressPorts buildIngressPorts(@Nonnull NetworkPolicyPort port) {
101         return new IngressPortsBuilder().setNetworkPolicyPort(port).build();
102     }
103
104     @Nonnull
105     public static From buildFrom(@Nonnull NetworkPolicyPeer peer) {
106         return new FromBuilder().setNetworkPolicyPeer(peer).build();
107     }
108
109     @Nonnull
110     public static EgressPorts buildEgressPorts(@Nonnull NetworkPolicyPort port) {
111         return new EgressPortsBuilder().setNetworkPolicyPort(port).build();
112     }
113
114     @Nonnull
115     public static To buildTo(@Nonnull NetworkPolicyPeer peer) {
116         return new ToBuilder().setNetworkPolicyPeer(peer).build();
117     }
118
119     @Nonnull
120     public static NetworkPolicyIngressRule buildNetworkPolicyIngressRule(@Nullable List<IngressPorts> ports,
121                                                                          @Nullable List<From> fromList) {
122
123         NetworkPolicyIngressRuleBuilder networkPolicyIngressRuleBuilder = new NetworkPolicyIngressRuleBuilder();
124
125         if (ports != null && !ports.isEmpty()) {
126             networkPolicyIngressRuleBuilder.setIngressPorts(ports);
127         }
128         if (fromList != null && !fromList.isEmpty()) {
129             networkPolicyIngressRuleBuilder.setFrom(fromList);
130         }
131
132         return networkPolicyIngressRuleBuilder.build();
133     }
134
135     @Nonnull
136     public static NetworkPolicyEgressRule buildNetworkPolicyEgressRule(@Nullable List<EgressPorts> ports,
137                                                                        @Nullable List<To> toList) {
138
139         NetworkPolicyEgressRuleBuilder networkPolicyEgressRuleBuilder = new NetworkPolicyEgressRuleBuilder();
140
141         if (ports != null && !ports.isEmpty()) {
142             networkPolicyEgressRuleBuilder.setEgressPorts(ports);
143         }
144         if (toList != null && !toList.isEmpty()) {
145             networkPolicyEgressRuleBuilder.setTo(toList);
146         }
147
148         return networkPolicyEgressRuleBuilder.build();
149     }
150
151     @Nonnull
152     public static Ingress buildIngress(@Nonnull NetworkPolicyIngressRule rule) {
153         return new IngressBuilder().setNetworkPolicyIngressRule(rule).build();
154     }
155
156     @Nonnull
157     public static Egress buildEgress(@Nonnull NetworkPolicyEgressRule rule) {
158         return new EgressBuilder().setNetworkPolicyEgressRule(rule).build();
159     }
160
161     @Nonnull
162     public static NetworkPolicySpec buildNetworkPolicySpec(@Nonnull PodSelector podSelector,
163                                                            @Nullable List<Ingress> ingress,
164                                                            @Nullable List<Egress> egress,
165                                                            @Nullable List<PolicyType> policyTypes) {
166         NetworkPolicySpecBuilder networkPolicySpecBuilder = new NetworkPolicySpecBuilder().setPodSelector(podSelector);
167
168         if (ingress != null && !ingress.isEmpty()) {
169             networkPolicySpecBuilder.setIngress(ingress);
170         }
171         if (egress != null && !egress.isEmpty()) {
172             networkPolicySpecBuilder.setEgress(egress);
173         }
174         if (policyTypes != null && !policyTypes.isEmpty()) {
175             networkPolicySpecBuilder.setPolicyTypes(policyTypes);
176         }
177
178         return networkPolicySpecBuilder.build();
179     }
180
181     @Nonnull
182     public static NetworkPolicy buildNetworkPolicy(@Nonnull String uuid, @Nullable String name,
183                                                    @Nullable NetworkPolicySpec spec) {
184         NetworkPolicyBuilder networkPolicyBuilder = new NetworkPolicyBuilder().setUuid(new Uuid(uuid));
185         if (name != null) {
186             networkPolicyBuilder.setName(name);
187         }
188         if (spec != null) {
189             networkPolicyBuilder.setNetworkPolicySpec(spec);
190         }
191
192         return networkPolicyBuilder.build();
193     }
194 }