Merge "Bug 5117 - DOS chars in shell script"
[groupbasedpolicy.git] / renderers / faas / src / test / java / org / opendaylight / groupbasedpolicy / renderer / faas / FaasPolicyManagerTest.java
1 /*
2  * Copyright (c) 2016 Huawei Technologies 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.groupbasedpolicy.renderer.faas;
9
10 import static org.junit.Assert.assertTrue;
11 import static org.junit.Assert.fail;
12 import static org.mockito.Mockito.mock;
13 import static org.mockito.Mockito.when;
14
15 import java.util.ArrayList;
16 import java.util.HashMap;
17 import java.util.HashSet;
18 import java.util.List;
19 import java.util.Map;
20 import java.util.Set;
21 import java.util.concurrent.Executors;
22 import java.util.concurrent.ScheduledExecutorService;
23 import java.util.concurrent.TimeUnit;
24
25 import org.junit.Before;
26 import org.junit.Test;
27 import org.junit.runner.RunWith;
28 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
29 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
30 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
31 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
32 import org.opendaylight.faas.uln.datastore.api.UlnDatastoreApi;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.faas.logical.faas.common.rev151013.Uuid;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContractId;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.EndpointGroupId;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L2BridgeDomainId;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L2FloodDomainId;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L3ContextId;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SubnetId;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.faas.rev151009.ServiceCommunicationLayer;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L2BridgeDomain;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L2BridgeDomainBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L2FloodDomain;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L2FloodDomainBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L3Context;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L3ContextBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.Subnet;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.SubnetBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.EndpointGroup;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.EndpointGroupBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.ResolvedPolicy;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.ResolvedPolicy.ExternalImplicitGroup;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.ResolvedPolicyBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.resolved.policy.PolicyRuleGroupWithEndpointConstraints;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.resolved.policy.PolicyRuleGroupWithEndpointConstraintsBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.resolved.policy.policy.rule.group.with.endpoint.constraints.PolicyRuleGroup;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.resolved.policy.policy.rule.group.with.endpoint.constraints.PolicyRuleGroupBuilder;
59 import org.opendaylight.yangtools.yang.binding.DataObject;
60 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
61 import org.powermock.api.mockito.PowerMockito;
62 import org.powermock.core.classloader.annotations.PrepareForTest;
63 import org.powermock.modules.junit4.PowerMockRunner;
64
65 import com.google.common.util.concurrent.CheckedFuture;
66
67 @PrepareForTest(UlnDatastoreApi.class)
68 @RunWith(PowerMockRunner.class)
69 public class FaasPolicyManagerTest {
70
71     private InstanceIdentifier<DataObject> policyId;
72     private AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> change;
73     DataBroker dataProvider;
74     private final ScheduledExecutorService executor = Executors.newScheduledThreadPool(Runtime.getRuntime()
75         .availableProcessors());
76     EndpointGroupId consumerEpgId = new EndpointGroupId("consumerEpgId");
77     SubnetId consumerSubnet = new SubnetId("consumerSubnet");
78     SubnetId providerSubnet = new SubnetId("providerSubnet");
79     EndpointGroupId providerEpgId = new EndpointGroupId("providerEpgId");
80     ContractId contractId = new ContractId("contractId");
81     TenantId tenantId = new TenantId("tenantId");
82     Uuid faasTenantId = new Uuid("0eb98cf5-086c-4a81-8a4e-0c3b4566108b");
83     Uuid faasSecRulesId = new Uuid("1eb98cf5-086c-4a81-8a4e-0c3b4566108b");
84     L3ContextId l3Context = new L3ContextId("l3ContextId");
85
86     @SuppressWarnings("unchecked")
87     @Before
88     public void init() {
89         policyId = mock(InstanceIdentifier.class);
90         change = mock(AsyncDataChangeEvent.class);
91         policyId = mock(InstanceIdentifier.class);
92         dataProvider = mock(DataBroker.class);
93         PowerMockito.mockStatic(UlnDatastoreApi.class);
94         WriteTransaction writeTransaction = mock(WriteTransaction.class);
95         when(dataProvider.newWriteOnlyTransaction()).thenReturn(writeTransaction);
96         CheckedFuture<Void, TransactionCommitFailedException> checkedFuture = mock(CheckedFuture.class);
97         when(writeTransaction.submit()).thenReturn(checkedFuture);
98
99         Set<InstanceIdentifier<?>> removedPaths = new HashSet<>();
100         removedPaths.add(policyId);
101         when(change.getRemovedPaths()).thenReturn(removedPaths);
102     }
103
104     @SuppressWarnings("resource")
105     @Test
106     public void testLayer2ResolvedPolicyWithImpExternalEpg() {
107         // prepare input test data
108         MockFaasPolicyManager policyManager = new MockFaasPolicyManager(dataProvider, executor);
109
110         // mock input test policy
111         policyManager.storeTestEpg(makeTestEndpointGroup(consumerEpgId));
112         policyManager.storeTestEpg(makeTestEndpointGroup(providerEpgId));
113         policyManager.storeTestFaasTenantId(tenantId, faasTenantId);
114         L2BridgeDomain brdg = makeTestBridgeDomain("bridge");
115         policyManager.storeTestL2BridgeDomain(brdg);
116         L2FloodDomain fld1 = makeTestL2FloodDomain("fld1", brdg.getId());
117         policyManager.storeTestL2FloodDomain(fld1);
118         policyManager.storeTestSubnet(makeTestSubnet(consumerSubnet, fld1.getId()));
119         L2FloodDomain fld2 = makeTestL2FloodDomain("fld2", brdg.getId());
120         policyManager.storeTestL2FloodDomain(fld2);
121         policyManager.storeTestSubnet(makeTestSubnet(providerSubnet, fld2.getId()));
122         policyManager.storeTestSecIdPerContract(contractId, faasSecRulesId);
123
124         // mock endpoint attached to consumer side
125         policyManager.registerTenant(tenantId, consumerEpgId);
126         policyManager.registerSubnetWithEpg(consumerEpgId, tenantId, consumerSubnet);
127         // mock endpoint attached to provider side
128         policyManager.registerTenant(tenantId, providerEpgId);
129         policyManager.registerSubnetWithEpg(providerEpgId, tenantId, providerSubnet);
130
131         // input test resolved policy
132         DataObject testPolicy = makeTestResolvedPolicyWithImpExternalEpg();
133         Map<InstanceIdentifier<?>, DataObject> testData = new HashMap<>();
134         testData.put(policyId, testPolicy);
135         when(change.getCreatedData()).thenReturn(testData);
136         when(change.getOriginalData()).thenReturn(testData);
137         when(change.getUpdatedData()).thenReturn(testData);
138         // invoke event -- expected data is verified in mocked classes
139         policyManager.onDataChanged(change);
140
141         // make sure internal threads have completed
142         try {
143             executor.shutdown();
144             executor.awaitTermination(10, TimeUnit.SECONDS);
145         } catch (InterruptedException e) {
146             fail("FaasPolicyManagerTest: Exception = " + e.toString());
147         }
148
149         // verify
150         assertTrue("FaasPolicyManagerTest", policyManager.getComLayer().equals(ServiceCommunicationLayer.Layer2));
151         assertTrue("FaasPolicyManagerTest", policyManager.getExternalImplicitGroup() != null);
152     }
153
154     @SuppressWarnings("resource")
155     @Test
156     public void testLayer3ResolvedPolicy() {
157         // prepare input test data
158         MockFaasPolicyManager policyManager = new MockFaasPolicyManager(dataProvider, executor);
159
160         // mock input test policy
161         policyManager.storeTestL3Contextes(makeTestL3Context());
162         policyManager.storeTestEpg(makeTestEndpointGroup(consumerEpgId));
163         policyManager.storeTestEpg(makeTestEndpointGroup(providerEpgId));
164         policyManager.storeTestFaasTenantId(tenantId, faasTenantId);
165         L2BridgeDomain brdg1 = makeTestBridgeDomain("bridge1");
166         policyManager.storeTestL2BridgeDomain(brdg1);
167         L2FloodDomain fld1 = makeTestL2FloodDomain("fld1", brdg1.getId());
168         policyManager.storeTestL2FloodDomain(fld1);
169         policyManager.storeTestSubnet(makeTestSubnet(consumerSubnet, fld1.getId()));
170         L2BridgeDomain brdg2 = makeTestBridgeDomain("bridge2");
171         policyManager.storeTestL2BridgeDomain(brdg2);
172         L2FloodDomain fld2 = makeTestL2FloodDomain("fld2", brdg2.getId());
173         policyManager.storeTestL2FloodDomain(fld2);
174         policyManager.storeTestSubnet(makeTestSubnet(providerSubnet, fld2.getId()));
175         policyManager.storeTestSecIdPerContract(contractId, faasSecRulesId);
176
177         // mock endpoint attached to consumer side
178         policyManager.registerTenant(tenantId, consumerEpgId);
179         policyManager.registerSubnetWithEpg(consumerEpgId, tenantId, consumerSubnet);
180         // mock endpoint attached to provider side
181         policyManager.registerTenant(tenantId, providerEpgId);
182         policyManager.registerSubnetWithEpg(providerEpgId, tenantId, providerSubnet);
183
184         // input test resolved policy
185         DataObject testPolicy = makeTestResolvedPolicy();
186         Map<InstanceIdentifier<?>, DataObject> testData = new HashMap<>();
187         testData.put(policyId, testPolicy);
188         when(change.getCreatedData()).thenReturn(testData);
189         when(change.getOriginalData()).thenReturn(testData);
190         when(change.getUpdatedData()).thenReturn(testData);
191         // invoke event -- expected data is verified in mocked classes
192         policyManager.onDataChanged(change);
193
194         // make sure internal threads have completed
195         try {
196             executor.shutdown();
197             executor.awaitTermination(10, TimeUnit.SECONDS);
198         } catch (InterruptedException e) {
199             fail("FaasPolicyManagerTest: Exception = " + e.toString());
200         }
201
202         // verify
203         assertTrue("FaasPolicyManagerTest", policyManager.getComLayer().equals(ServiceCommunicationLayer.Layer3));
204         assertTrue("FaasPolicyManagerTest", policyManager.getExternalImplicitGroup() == null);
205     }
206
207     private L3Context makeTestL3Context() {
208         L3ContextBuilder builder = new L3ContextBuilder();
209         builder.setId(l3Context);
210         return builder.build();
211     }
212
213     private L2FloodDomain makeTestL2FloodDomain(String id, L2BridgeDomainId brdgId) {
214         L2FloodDomainBuilder builder = new L2FloodDomainBuilder();
215         builder.setId(new L2FloodDomainId(id));
216         builder.setParent(brdgId);
217         return builder.build();
218     }
219
220     private L2BridgeDomain makeTestBridgeDomain(String id) {
221         L2BridgeDomainBuilder builder = new L2BridgeDomainBuilder();
222         builder.setId(new L2BridgeDomainId(id));
223         builder.setParent(l3Context);
224         return builder.build();
225     }
226
227     private EndpointGroup makeTestEndpointGroup(EndpointGroupId epgId) {
228         EndpointGroupBuilder builder = new EndpointGroupBuilder();
229         builder.setId(epgId);
230         return builder.build();
231     }
232
233     private Subnet makeTestSubnet(SubnetId subnetId, L2FloodDomainId l2FloodDomainId) {
234         SubnetBuilder builder = new SubnetBuilder();
235         builder.setId(subnetId);
236         builder.setParent(l2FloodDomainId);
237         return builder.build();
238
239     }
240
241     private DataObject makeTestResolvedPolicy() {
242         ResolvedPolicyBuilder builder = new ResolvedPolicyBuilder();
243         builder.setConsumerEpgId(consumerEpgId);
244         builder.setConsumerTenantId(tenantId);
245         builder.setProviderEpgId(providerEpgId);
246         builder.setProviderTenantId(tenantId);
247         List<PolicyRuleGroupWithEndpointConstraints> pRulesGrpsWEp = new ArrayList<>();
248         PolicyRuleGroupWithEndpointConstraintsBuilder pRulesGrpWEp = new PolicyRuleGroupWithEndpointConstraintsBuilder();
249         List<PolicyRuleGroup> pRulesGrps = new ArrayList<>();
250         PolicyRuleGroupBuilder pRulesGrp = new PolicyRuleGroupBuilder();
251         pRulesGrp.setContractId(contractId);
252         pRulesGrps.add(pRulesGrp.build());
253         pRulesGrpWEp.setPolicyRuleGroup(pRulesGrps);
254         pRulesGrpsWEp.add(pRulesGrpWEp.build());
255         builder.setPolicyRuleGroupWithEndpointConstraints(pRulesGrpsWEp);
256         return builder.build();
257     }
258
259     private DataObject makeTestResolvedPolicyWithImpExternalEpg() {
260         ResolvedPolicyBuilder builder = new ResolvedPolicyBuilder((ResolvedPolicy) makeTestResolvedPolicy());
261         builder.setExternalImplicitGroup(ExternalImplicitGroup.ConsumerEpg);
262         return builder.build();
263     }
264 }