Convert DataChangeListeners to DataTreeChangeListeners
[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.mockito.Mockito.doReturn;
12 import static org.mockito.Mockito.mock;
13 import static org.mockito.Mockito.when;
14
15 import com.google.common.util.concurrent.CheckedFuture;
16 import com.google.common.util.concurrent.MoreExecutors;
17 import java.util.ArrayList;
18 import java.util.Collections;
19 import java.util.List;
20 import org.junit.Before;
21 import org.junit.Test;
22 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
23 import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
24 import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
25 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
26 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.faas.logical.faas.common.rev151013.Uuid;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContractId;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.EndpointGroupId;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L2BridgeDomainId;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L2FloodDomainId;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L3ContextId;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SubnetId;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.faas.rev151009.ServiceCommunicationLayer;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L2BridgeDomain;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L2BridgeDomainBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L2FloodDomain;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L2FloodDomainBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L3Context;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L3ContextBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.Subnet;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.SubnetBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.EndpointGroup;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.EndpointGroupBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.ResolvedPolicy;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.ResolvedPolicy.ExternalImplicitGroup;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.ResolvedPolicyBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.resolved.policy.PolicyRuleGroupWithEndpointConstraints;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.resolved.policy.PolicyRuleGroupWithEndpointConstraintsBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.resolved.policy.policy.rule.group.with.endpoint.constraints.PolicyRuleGroup;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.resolved.policy.policy.rule.group.with.endpoint.constraints.PolicyRuleGroupBuilder;
53 import org.opendaylight.yangtools.yang.binding.DataObject;
54 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
55
56 public class FaasPolicyManagerTest {
57
58     private InstanceIdentifier<DataObject> policyId;
59     DataBroker dataProvider;
60     EndpointGroupId consumerEpgId = new EndpointGroupId("consumerEpgId");
61     SubnetId consumerSubnet = new SubnetId("consumerSubnet");
62     SubnetId providerSubnet = new SubnetId("providerSubnet");
63     EndpointGroupId providerEpgId = new EndpointGroupId("providerEpgId");
64     ContractId contractId = new ContractId("contractId");
65     TenantId tenantId = new TenantId("tenantId");
66     Uuid faasTenantId = new Uuid("0eb98cf5-086c-4a81-8a4e-0c3b4566108b");
67     Uuid faasSecRulesId = new Uuid("1eb98cf5-086c-4a81-8a4e-0c3b4566108b");
68     L3ContextId l3Context = new L3ContextId("l3ContextId");
69
70     @SuppressWarnings("unchecked")
71     @Before
72     public void init() {
73         policyId = mock(InstanceIdentifier.class);
74         policyId = mock(InstanceIdentifier.class);
75         dataProvider = mock(DataBroker.class);
76         WriteTransaction writeTransaction = mock(WriteTransaction.class);
77         when(dataProvider.newWriteOnlyTransaction()).thenReturn(writeTransaction);
78         CheckedFuture<Void, TransactionCommitFailedException> checkedFuture = mock(CheckedFuture.class);
79         when(writeTransaction.submit()).thenReturn(checkedFuture);
80     }
81
82     @SuppressWarnings("resource")
83     @Test
84     public void testLayer2ResolvedPolicyWithImpExternalEpg() {
85         // prepare input test data
86         MockFaasPolicyManager policyManager = new MockFaasPolicyManager(dataProvider, MoreExecutors.directExecutor());
87
88         // mock input test policy
89         policyManager.storeTestEpg(makeTestEndpointGroup(consumerEpgId));
90         policyManager.storeTestEpg(makeTestEndpointGroup(providerEpgId));
91         policyManager.storeTestFaasTenantId(tenantId, faasTenantId);
92         L2BridgeDomain brdg = makeTestBridgeDomain("bridge");
93         policyManager.storeTestL2BridgeDomain(brdg);
94         L2FloodDomain fld1 = makeTestL2FloodDomain("fld1", brdg.getId());
95         policyManager.storeTestL2FloodDomain(fld1);
96         policyManager.storeTestSubnet(makeTestSubnet(consumerSubnet, fld1.getId()));
97         L2FloodDomain fld2 = makeTestL2FloodDomain("fld2", brdg.getId());
98         policyManager.storeTestL2FloodDomain(fld2);
99         policyManager.storeTestSubnet(makeTestSubnet(providerSubnet, fld2.getId()));
100         policyManager.storeTestSecIdPerContract(contractId, faasSecRulesId);
101
102         // mock endpoint attached to consumer side
103         policyManager.registerTenant(tenantId, consumerEpgId);
104         policyManager.registerSubnetWithEpg(consumerEpgId, tenantId, consumerSubnet);
105         // mock endpoint attached to provider side
106         policyManager.registerTenant(tenantId, providerEpgId);
107         policyManager.registerSubnetWithEpg(providerEpgId, tenantId, providerSubnet);
108
109         // input test resolved policy
110         DataObject testPolicy = makeTestResolvedPolicyWithImpExternalEpg();
111
112         DataTreeModification<ResolvedPolicy> mockDataTreeModification = mock(DataTreeModification.class);
113         DataObjectModification<ResolvedPolicy> mockModification = mock(DataObjectModification.class);
114         doReturn(mockModification).when(mockDataTreeModification).getRootNode();
115         doReturn(DataObjectModification.ModificationType.WRITE).when(mockModification).getModificationType();
116         doReturn(testPolicy).when(mockModification).getDataAfter();
117
118         // invoke event -- expected data is verified in mocked classes
119         policyManager.onDataTreeChanged(Collections.singletonList(mockDataTreeModification));
120
121         // verify
122         assertTrue("FaasPolicyManagerTest", policyManager.getComLayer().equals(ServiceCommunicationLayer.Layer2));
123         assertTrue("FaasPolicyManagerTest", policyManager.getExternalImplicitGroup() != null);
124     }
125
126     @SuppressWarnings("resource")
127     @Test
128     public void testLayer3ResolvedPolicy() {
129         // prepare input test data
130         MockFaasPolicyManager policyManager = new MockFaasPolicyManager(dataProvider, MoreExecutors.directExecutor());
131
132         // mock input test policy
133         policyManager.storeTestL3Contextes(makeTestL3Context());
134         policyManager.storeTestEpg(makeTestEndpointGroup(consumerEpgId));
135         policyManager.storeTestEpg(makeTestEndpointGroup(providerEpgId));
136         policyManager.storeTestFaasTenantId(tenantId, faasTenantId);
137         L2BridgeDomain brdg1 = makeTestBridgeDomain("bridge1");
138         policyManager.storeTestL2BridgeDomain(brdg1);
139         L2FloodDomain fld1 = makeTestL2FloodDomain("fld1", brdg1.getId());
140         policyManager.storeTestL2FloodDomain(fld1);
141         policyManager.storeTestSubnet(makeTestSubnet(consumerSubnet, fld1.getId()));
142         L2BridgeDomain brdg2 = makeTestBridgeDomain("bridge2");
143         policyManager.storeTestL2BridgeDomain(brdg2);
144         L2FloodDomain fld2 = makeTestL2FloodDomain("fld2", brdg2.getId());
145         policyManager.storeTestL2FloodDomain(fld2);
146         policyManager.storeTestSubnet(makeTestSubnet(providerSubnet, fld2.getId()));
147         policyManager.storeTestSecIdPerContract(contractId, faasSecRulesId);
148
149         // mock endpoint attached to consumer side
150         policyManager.registerTenant(tenantId, consumerEpgId);
151         policyManager.registerSubnetWithEpg(consumerEpgId, tenantId, consumerSubnet);
152         // mock endpoint attached to provider side
153         policyManager.registerTenant(tenantId, providerEpgId);
154         policyManager.registerSubnetWithEpg(providerEpgId, tenantId, providerSubnet);
155
156         // input test resolved policy
157         DataObject testPolicy = makeTestResolvedPolicy();
158
159         DataTreeModification<ResolvedPolicy> mockDataTreeModification = mock(DataTreeModification.class);
160         DataObjectModification<ResolvedPolicy> mockModification = mock(DataObjectModification.class);
161         doReturn(mockModification).when(mockDataTreeModification).getRootNode();
162         doReturn(DataObjectModification.ModificationType.WRITE).when(mockModification).getModificationType();
163         doReturn(testPolicy).when(mockModification).getDataAfter();
164
165         // invoke event -- expected data is verified in mocked classes
166         policyManager.onDataTreeChanged(Collections.singletonList(mockDataTreeModification));
167
168         // verify
169         assertTrue("FaasPolicyManagerTest", policyManager.getComLayer().equals(ServiceCommunicationLayer.Layer3));
170         assertTrue("FaasPolicyManagerTest", policyManager.getExternalImplicitGroup() == null);
171     }
172
173     private L3Context makeTestL3Context() {
174         L3ContextBuilder builder = new L3ContextBuilder();
175         builder.setId(l3Context);
176         return builder.build();
177     }
178
179     private L2FloodDomain makeTestL2FloodDomain(String id, L2BridgeDomainId brdgId) {
180         L2FloodDomainBuilder builder = new L2FloodDomainBuilder();
181         builder.setId(new L2FloodDomainId(id));
182         builder.setParent(brdgId);
183         return builder.build();
184     }
185
186     private L2BridgeDomain makeTestBridgeDomain(String id) {
187         L2BridgeDomainBuilder builder = new L2BridgeDomainBuilder();
188         builder.setId(new L2BridgeDomainId(id));
189         builder.setParent(l3Context);
190         return builder.build();
191     }
192
193     private EndpointGroup makeTestEndpointGroup(EndpointGroupId epgId) {
194         EndpointGroupBuilder builder = new EndpointGroupBuilder();
195         builder.setId(epgId);
196         return builder.build();
197     }
198
199     private Subnet makeTestSubnet(SubnetId subnetId, L2FloodDomainId l2FloodDomainId) {
200         SubnetBuilder builder = new SubnetBuilder();
201         builder.setId(subnetId);
202         builder.setParent(l2FloodDomainId);
203         return builder.build();
204
205     }
206
207     private DataObject makeTestResolvedPolicy() {
208         ResolvedPolicyBuilder builder = new ResolvedPolicyBuilder();
209         builder.setConsumerEpgId(consumerEpgId);
210         builder.setConsumerTenantId(tenantId);
211         builder.setProviderEpgId(providerEpgId);
212         builder.setProviderTenantId(tenantId);
213         List<PolicyRuleGroupWithEndpointConstraints> pRulesGrpsWEp = new ArrayList<>();
214         PolicyRuleGroupWithEndpointConstraintsBuilder pRulesGrpWEp = new PolicyRuleGroupWithEndpointConstraintsBuilder();
215         List<PolicyRuleGroup> pRulesGrps = new ArrayList<>();
216         PolicyRuleGroupBuilder pRulesGrp = new PolicyRuleGroupBuilder();
217         pRulesGrp.setContractId(contractId);
218         pRulesGrps.add(pRulesGrp.build());
219         pRulesGrpWEp.setPolicyRuleGroup(pRulesGrps);
220         pRulesGrpsWEp.add(pRulesGrpWEp.build());
221         builder.setPolicyRuleGroupWithEndpointConstraints(pRulesGrpsWEp);
222         return builder.build();
223     }
224
225     private DataObject makeTestResolvedPolicyWithImpExternalEpg() {
226         ResolvedPolicyBuilder builder = new ResolvedPolicyBuilder((ResolvedPolicy) makeTestResolvedPolicy());
227         builder.setExternalImplicitGroup(ExternalImplicitGroup.ConsumerEpg);
228         return builder.build();
229     }
230 }