import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.bgp.rib.impl.rev130409.RibInstance;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.bgp.rib.impl.rev130409.modules.module.configuration.BgpApplicationPeer;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.bgp.rib.impl.rev130409.modules.module.configuration.BgpApplicationPeerBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.bgp.rib.impl.rev130409.modules.module.configuration.bgp.application.peer.DataBrokerBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.bgp.rib.impl.rev130409.modules.module.configuration.bgp.application.peer.TargetRib;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.bgp.rib.impl.rev130409.modules.module.configuration.bgp.application.peer.TargetRibBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.rev130405.modules.Module;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.rev130405.modules.ModuleBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.rev130405.modules.ModuleKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.dom.rev131028.DomAsyncDataBroker;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
}
};
+ private static final Function<String, org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.bgp.rib.impl.rev130409.modules.
+ module.configuration.bgp.application.peer.DataBroker> TO_DATABROKER_FUNCTION = new Function<String, org.opendaylight.yang.gen.v1.urn.opendaylight.
+ params.xml.ns.yang.controller.bgp.rib.impl.rev130409.modules.module.configuration.bgp.application.peer.DataBroker>() {
+ @Override
+ public org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.bgp.rib.impl.rev130409.modules.module.configuration.bgp.application.peer.DataBroker apply(final String name) {
+ return new DataBrokerBuilder().setName(name).setType(DomAsyncDataBroker.class).build();
+ }
+ };
+
private final BGPConfigHolder<Neighbor> neighborState;
private final BGPConfigHolder<Bgp> globalState;
private final BGPConfigModuleProvider configModuleOp;
final ModuleKey ribImplKey = globalState.getModuleKey(GlobalIdentifier.GLOBAL_IDENTIFIER);
if (ribImplKey != null) {
try {
- final TargetRib rib = RibInstanceFunction.getRibInstance(this.configModuleOp, this.TO_RIB_FUNCTION, ribImplKey.getName(), rTx);
- final Module peerConfigModule = toPeerConfigModule(modifiedAppNeighbor, rib);
+ final String ribImplName = ribImplKey.getName();
+ final TargetRib rib = RibInstanceFunction.getRibInstance(this.configModuleOp, this.TO_RIB_FUNCTION, ribImplName, rTx);
+ final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.bgp.rib.impl.rev130409.modules.module.
+ configuration.bgp.application.peer.DataBroker moduleDataBroker = DataBrokerFunction.getRibInstance(this.configModuleOp,
+ this.TO_DATABROKER_FUNCTION, ribImplName, rTx);
+
+ final Module peerConfigModule = toPeerConfigModule(modifiedAppNeighbor, rib, moduleDataBroker);
configModuleOp.putModuleConfiguration(peerConfigModule, dataBroker.newWriteOnlyTransaction());
neighborState.addOrUpdate(peerConfigModule.getKey(), modifiedAppNeighbor.getKey(), modifiedAppNeighbor);
} catch (final Exception e) {
private static Module toPeerConfigModule(final Neighbor neighbor, final Module currentModule) {
final BgpApplicationPeer appPeerConfig = (BgpApplicationPeer) currentModule.getConfiguration();
final BgpApplicationPeerBuilder bgpPeerConfigBuilder = toBgpPeerConfig(neighbor, appPeerConfig.getTargetRib());
+ bgpPeerConfigBuilder.setDataBroker(appPeerConfig.getDataBroker());
bgpPeerConfigBuilder.setApplicationRibId(appPeerConfig.getApplicationRibId());
- final ModuleBuilder mBuilder = new ModuleBuilder();
+ final ModuleBuilder mBuilder = new ModuleBuilder(currentModule);
mBuilder.setConfiguration(bgpPeerConfigBuilder.build());
return mBuilder.build();
}
- private static Module toPeerConfigModule(final Neighbor neighbor, final TargetRib rib) {
+ private static Module toPeerConfigModule(final Neighbor neighbor, final TargetRib rib, final org.opendaylight.yang.gen.v1.urn.opendaylight.params.
+ xml.ns.yang.controller.bgp.rib.impl.rev130409.modules.module.configuration.bgp.application.peer.DataBroker moduleDataBroker) {
final ModuleBuilder mBuilder = new ModuleBuilder();
mBuilder.setName(createAppPeerName(neighbor.getNeighborAddress().getIpv4Address()));
mBuilder.setType(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.bgp.rib.impl.rev130409.BgpApplicationPeer.class);
- mBuilder.setConfiguration(toBgpPeerConfig(neighbor, rib).build());
+ final BgpApplicationPeerBuilder bgpPeerConfigBuilder = toBgpPeerConfig(neighbor, rib);
+ bgpPeerConfigBuilder.setDataBroker(moduleDataBroker);
+ mBuilder.setConfiguration(bgpPeerConfigBuilder.build());
mBuilder.setKey(new ModuleKey(mBuilder.getName(), mBuilder.getType()));
return mBuilder.build();
}
final BgpApplicationPeerBuilder bgpAppPeerBuilder = new BgpApplicationPeerBuilder();
bgpAppPeerBuilder.setTargetRib(rib);
final Ipv4Address address = neighbor.getNeighborAddress().getIpv4Address();
- bgpAppPeerBuilder.setBgpPeerId(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address(address.getValue()));
+ bgpAppPeerBuilder.setBgpPeerId(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.
+ Ipv4Address(address.getValue()));
bgpAppPeerBuilder.setApplicationRibId(new ApplicationRibId(createAppRibName(address)));
return bgpAppPeerBuilder;
}
package org.opendaylight.protocol.bgp.openconfig.impl.moduleconfig;
import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
import org.opendaylight.controller.md.sal.binding.api.ReadTransaction;
import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
private static final InstanceIdentifier<Modules> MODULES_IID = InstanceIdentifier.builder(Modules.class).build();
void putModuleConfiguration(final Module module, final WriteTransaction wTx) throws TransactionCommitFailedException {
+ final ModuleKey moduleKey = Preconditions.checkNotNull(module, "Supplied module may not be null").getKey();
LOG.debug("Adding/Updating configuration module: {}", module);
- wTx.put(LogicalDatastoreType.CONFIGURATION, MODULES_IID.child(Module.class, module.getKey()), module);
+ checkModuleKey(moduleKey);
+ wTx.put(LogicalDatastoreType.CONFIGURATION, MODULES_IID.child(Module.class, moduleKey), module);
wTx.submit().checkedGet();
}
+ private void checkModuleKey(final ModuleKey moduleKey) {
+ Preconditions.checkNotNull(moduleKey.getName(), "Supplied moduleKey Name may not be null");
+ Preconditions.checkNotNull(moduleKey.getType(), "Supplied moduleKey Type may not be null");
+ }
+
void removeModuleConfiguration(final ModuleKey moduleKey, final WriteTransaction wTx) throws TransactionCommitFailedException {
LOG.debug("Removing configuration module with key: {}", moduleKey);
+ checkModuleKey(moduleKey);
wTx.delete(LogicalDatastoreType.CONFIGURATION, MODULES_IID.child(Module.class, moduleKey));
wTx.submit().checkedGet();
}
Optional<Module> readModuleConfiguration(final ModuleKey moduleKey, final ReadTransaction rTx) throws ReadFailedException {
+ checkModuleKey(moduleKey);
return rTx.read(LogicalDatastoreType.CONFIGURATION, MODULES_IID.child(Module.class, moduleKey)).checkedGet();
}
Optional<Service> readConfigService(final ServiceKey serviceKey, final ReadTransaction rTx) throws ReadFailedException {
+ Preconditions.checkNotNull(serviceKey.getType(), "Supplied serviceKey Type may not be null");
return rTx.read(LogicalDatastoreType.CONFIGURATION, SERVICES_IID.child(Service.class, serviceKey)).checkedGet();
}
--- /dev/null
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. 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.protocol.bgp.openconfig.impl.moduleconfig;
+
+import com.google.common.base.Function;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import org.opendaylight.protocol.bgp.openconfig.impl.util.OpenConfigUtil;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.rev130405.ServiceRef;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.rev130405.modules.Module;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.rev130405.services.Service;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.rev130405.services.ServiceKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.rev130405.services.service.Instance;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.dom.rev131028.DomAsyncDataBroker;
+import org.opendaylight.yangtools.yang.binding.ChildOf;
+
+final public class DataBrokerFunction {
+ private DataBrokerFunction() {
+ throw new UnsupportedOperationException();
+ }
+
+ public static <T extends ServiceRef & ChildOf<Module>> T getRibInstance(final BGPConfigModuleProvider configModuleOp, final Function<String, T>
+ function, final String instanceName, final ReadOnlyTransaction rTx) {
+ Preconditions.checkNotNull(rTx);
+ try {
+ final Optional<Service> maybeService = configModuleOp.readConfigService(new ServiceKey(DomAsyncDataBroker.class), rTx);
+ if (maybeService.isPresent()) {
+ final Optional<Instance> maybeInstance = Iterables.tryFind(maybeService.get().getInstance(), new Predicate<Instance>() {
+ @Override
+ public boolean apply(final Instance instance) {
+ final String moduleName = OpenConfigUtil.getModuleName(instance.getProvider());
+ if (moduleName.equals(instanceName)) {
+ return true;
+ }
+ return false;
+ }
+ });
+ if (maybeInstance.isPresent()) {
+ return function.apply(maybeInstance.get().getName());
+ }
+ }
+ return null;
+ } catch (ReadFailedException e) {
+ throw new IllegalStateException("Failed to read service.", e);
+ }
+ }
+}
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.bgp.rib.impl.rev130409.modules.module.configuration.bgp.application.peer.TargetRib;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.rev130405.modules.Module;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.rev130405.modules.ModuleKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.config.rev130405.modules.module.State;
import org.opendaylight.yangtools.concepts.Identifier;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
Mockito.doReturn(this.globalState).when(configHolders).getBGPConfigHolder(Bgp.class);
Mockito.doReturn(this.neighborState).when(configHolders).getBGPConfigHolder(Neighbor.class);
Mockito.doReturn(mKey).when(this.neighborState).getModuleKey(Mockito.any(NeighborKey.class));
+ Mockito.doReturn("mkey").when(mKey).getName();
+ Mockito.doReturn(ModuleKey.class).when(mKey).getType();
Mockito.doReturn("mKey").when(mKey).toString();
Mockito.doReturn(Boolean.TRUE).when(this.neighborState).remove(Mockito.any(ModuleKey.class), Mockito.any(Neighbor.class));
Mockito.doReturn(Boolean.TRUE).when(this.neighborState).addOrUpdate(Mockito.any(ModuleKey.class), Mockito.any(Identifier.class), Mockito.any(Neighbor.class));
Mockito.doReturn(Boolean.TRUE).when(moduleOpt).isPresent();
final Module module = Mockito.mock(Module.class);
Mockito.doReturn(module).when(moduleOpt).get();
+ Mockito.doReturn("mkey").when(module).getName();
+ Mockito.doReturn(mKey).when(module).getKey();
+ State state = Mockito.mock(State.class);
+ Mockito.doReturn(state).when(module).getState();
final BgpApplicationPeer appPeer = Mockito.mock(BgpApplicationPeer.class);
Mockito.doReturn(appPeer).when(module).getConfiguration();
final TargetRib rib = Mockito.mock(TargetRib.class);
Mockito.doReturn(rib).when(appPeer).getTargetRib();
final ApplicationRibId appRib = Mockito.mock(ApplicationRibId.class);
Mockito.doReturn(appRib).when(appPeer).getApplicationRibId();
+ final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.bgp.rib.impl.rev130409.modules.module.configuration.bgp.
+ application.peer.DataBroker dataBroker = Mockito.mock(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.bgp.rib
+ .impl.rev130409.modules.module.configuration.bgp.application.peer.DataBroker.class);
+ Mockito.doReturn(dataBroker).when(appPeer).getDataBroker();
Mockito.doReturn("appRib").when(appRib).toString();
Mockito.doReturn("targetRib").when(rib).toString();
}
public void setUp() throws Exception {
Mockito.doReturn(this.key).when(this.module).getKey();
Mockito.doReturn("key").when(this.key).toString();
+ Mockito.doReturn("key").when(this.key).getName();
+ Mockito.doReturn(ModuleKey.class).when(this.key).getType();
Mockito.doReturn("module").when(this.module).toString();
Mockito.doNothing().when(this.wtx).put(Mockito.any(LogicalDatastoreType.class), Mockito.any(KeyedInstanceIdentifier.class), Mockito.any(Module.class));
Mockito.doNothing().when(this.wtx).delete(Mockito.any(LogicalDatastoreType.class), Mockito.any(KeyedInstanceIdentifier.class));
public void testReadTransactions() throws InterruptedException, ExecutionException, ReadFailedException {
PROVIDER.readModuleConfiguration(this.key, this.rtx);
final ServiceKey sKey = Mockito.mock(ServiceKey.class);
+ Mockito.doReturn("key").when(this.key).getName();
+ Mockito.doReturn(ModuleKey.class).when(sKey).getType();
PROVIDER.readConfigService(sKey, this.rtx);
Mockito.verify(this.rtx, Mockito.times(2)).read(Mockito.any(LogicalDatastoreType.class), Mockito.any(InstanceIdentifier.class));
}
final ModuleKey mKey = Mockito.mock(ModuleKey.class);
Mockito.doReturn(mKey).when(this.neighborState).getModuleKey(this.neighbor.getKey());
Mockito.doReturn("mKey").when(mKey).toString();
+ Mockito.doReturn("mKey").when(mKey).getName();
+ Mockito.doReturn(ModuleKey.class).when(mKey).getType();
Mockito.doReturn(Boolean.TRUE).when(this.neighborState).remove(mKey, createNeighbor());
this.peerProvider = new BGPPeerProvider(configHolders, moduleProvider, this.dataBroker);
Mockito.doReturn(this.moduleKey).when(globalState).getModuleKey(Mockito.any(GlobalIdentifier.class));
Mockito.doReturn("module-key").when(this.moduleKey).toString();
+ Mockito.doReturn("module-key").when(this.moduleKey).getName();
+ Mockito.doReturn(ModuleKey.class).when(this.moduleKey).getType();
Mockito.doReturn(Boolean.TRUE).when(globalState).remove(Mockito.any(ModuleKey.class), Mockito.any(Global.class));
Mockito.doReturn(Boolean.FALSE).when(globalState).remove(this.moduleKey, null);
Mockito.doReturn(Boolean.TRUE).when(globalState).addOrUpdate(Mockito.any(ModuleKey.class), Mockito.any(GlobalIdentifier.class), Mockito.any(Global.class));