2 * Copyright (c) 2016 Huawei Technologies and others. All rights reserved.
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
8 package org.opendaylight.groupbasedpolicy.renderer.faas;
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;
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;
57 public class FaasPolicyManagerTest {
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);
72 @SuppressWarnings("unchecked")
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);
84 @SuppressWarnings("resource")
86 public void testLayer2ResolvedPolicyWithImpExternalEpg() {
87 // prepare input test data
88 MockFaasPolicyManager policyManager = new MockFaasPolicyManager(dataProvider, MoreExecutors.directExecutor(),
89 mockUlnDatastoreUtil);
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);
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);
112 // input test resolved policy
113 DataObject testPolicy = makeTestResolvedPolicyWithImpExternalEpg();
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();
121 // invoke event -- expected data is verified in mocked classes
122 policyManager.onDataTreeChanged(Collections.singletonList(mockDataTreeModification));
125 assertTrue("FaasPolicyManagerTest", policyManager.getComLayer().equals(ServiceCommunicationLayer.Layer2));
126 assertTrue("FaasPolicyManagerTest", policyManager.getExternalImplicitGroup() != null);
129 @SuppressWarnings("resource")
131 public void testLayer3ResolvedPolicy() {
132 // prepare input test data
133 MockFaasPolicyManager policyManager = new MockFaasPolicyManager(dataProvider, MoreExecutors.directExecutor(),
134 mockUlnDatastoreUtil);
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);
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);
160 // input test resolved policy
161 DataObject testPolicy = makeTestResolvedPolicy();
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();
169 // invoke event -- expected data is verified in mocked classes
170 policyManager.onDataTreeChanged(Collections.singletonList(mockDataTreeModification));
173 assertTrue("FaasPolicyManagerTest", policyManager.getComLayer().equals(ServiceCommunicationLayer.Layer3));
174 assertTrue("FaasPolicyManagerTest", policyManager.getExternalImplicitGroup() == null);
177 private L3Context makeTestL3Context() {
178 L3ContextBuilder builder = new L3ContextBuilder();
179 builder.setId(l3Context);
180 return builder.build();
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();
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();
197 private EndpointGroup makeTestEndpointGroup(EndpointGroupId epgId) {
198 EndpointGroupBuilder builder = new EndpointGroupBuilder();
199 builder.setId(epgId);
200 return builder.build();
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();
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();
229 private DataObject makeTestResolvedPolicyWithImpExternalEpg() {
230 ResolvedPolicyBuilder builder = new ResolvedPolicyBuilder((ResolvedPolicy) makeTestResolvedPolicy());
231 builder.setExternalImplicitGroup(ExternalImplicitGroup.ConsumerEpg);
232 return builder.build();