/**
* Copyright (c) 2017 Ericsson Spain and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
package org.opendaylight.sfc.ovs;
import static com.google.common.base.Preconditions.checkState;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSet.Builder;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.opendaylight.controller.md.sal.binding.api.DataBroker;
import org.opendaylight.controller.md.sal.binding.test.AbstractDataBrokerTest;
import org.opendaylight.sfc.provider.SfcProviderRpc;
import org.opendaylight.sfc.provider.api.SfcDataStoreAPI;
import org.opendaylight.sfc.provider.api.SfcInstanceIdentifiers;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.service.path.id.rev150804.service.path.ids.ServicePathId;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.acl.rev151001.AccessListsState;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.rendered.service.paths.RenderedServicePath;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.scf.rev140701.ServiceFunctionClassifiers;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.service.functions.ServiceFunction;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.service.functions.state.ServiceFunctionState;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfc.rev140701.service.function.chain.grouping.ServiceFunctionChain;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.ovs.rev140701.SffOvsBridgeAugmentation;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.ovs.rev140701.SffOvsLocatorOptionsAugmentation;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarder;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfg.rev150214.service.function.groups.ServiceFunctionGroup;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev140701.service.function.paths.ServiceFunctionPath;
import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sft.rev140701.ServiceFunctionTypes;
import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.AccessLists;
import org.opendaylight.yang.gen.v1.urn.intel.params.xml.ns.sf.desc.mon.rev141201.ServiceFunctionState1;
import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
/**
* Abstract datastore for testing purposes.
*
* @author ebrjohn
*
*/
public class AbstractDataStoreManager extends AbstractDataBrokerTest {
protected DataBroker dataBroker;
protected SfcInstanceIdentifiers sfcIids;
protected static ExecutorService executor = Executors.newFixedThreadPool(5);
protected void setupSfc() {
dataBroker = getDataBroker();
SfcDataStoreAPI.setDataProviderAux(dataBroker);
SfcProviderRpc.setDataProviderAux(dataBroker);
sfcIids = new SfcInstanceIdentifiers();
}
protected void close() throws ExecutionException, InterruptedException {
if (sfcIids != null) {
// Deletes everything from SFC that was created in the datastore
sfcIids.close();
}
}
/*
* loads only SFC YANG modules needed for these tests - increased
* performance Specify a class from YANG which should be loaded
*/
@Override
protected Iterable<YangModuleInfo> getModuleInfos() throws Exception {
Builder<YangModuleInfo> moduleInfoSet = ImmutableSet.<YangModuleInfo>builder();
loadModuleInfos(ServiceFunction.class, moduleInfoSet);
loadModuleInfos(ServiceFunctionForwarder.class, moduleInfoSet);
loadModuleInfos(ServiceFunctionChain.class, moduleInfoSet);
loadModuleInfos(ServiceFunctionPath.class, moduleInfoSet);
loadModuleInfos(ServiceFunctionGroup.class, moduleInfoSet);
loadModuleInfos(ServicePathId.class, moduleInfoSet);
loadModuleInfos(RenderedServicePath.class, moduleInfoSet);
loadModuleInfos(AccessLists.class, moduleInfoSet);
loadModuleInfos(AccessListsState.class, moduleInfoSet);
loadModuleInfos(ServiceFunctionClassifiers.class, moduleInfoSet);
loadModuleInfos(ServiceFunctionState.class, moduleInfoSet);
loadModuleInfos(ServiceFunctionState1.class, moduleInfoSet);
loadModuleInfos(ServiceFunctionTypes.class, moduleInfoSet);
loadModuleInfos(SffOvsBridgeAugmentation.class, moduleInfoSet);
loadModuleInfos(SffOvsLocatorOptionsAugmentation.class, moduleInfoSet);
return moduleInfoSet.build();
}
public static void loadModuleInfos(Class<?> clazzFromModule, Builder<YangModuleInfo> moduleInfoSet)
throws Exception {
YangModuleInfo moduleInfo = BindingReflections.getModuleInfo(clazzFromModule);
checkState(moduleInfo != null, "Module Info for %s is not available.", clazzFromModule);
collectYangModuleInfo(moduleInfo, moduleInfoSet);
}
private static void collectYangModuleInfo(final YangModuleInfo moduleInfo,
final Builder<YangModuleInfo> moduleInfoSet) throws IOException {
moduleInfoSet.add(moduleInfo);
for (YangModuleInfo dependency : moduleInfo.getImportedModules()) {
collectYangModuleInfo(dependency, moduleInfoSet);
}
}
}