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