*/
package org.opendaylight.controller.config.yang.bgp.rib.impl;
-import java.util.Hashtable;
+import com.google.common.reflect.AbstractInvocationHandler;
+import com.google.common.reflect.Reflection;
+import java.lang.reflect.Method;
+import java.util.Collections;
import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
import org.opendaylight.controller.config.api.JmxAttributeValidationException;
-import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
-import org.opendaylight.controller.sal.core.api.model.SchemaService;
-import org.opendaylight.protocol.bgp.openconfig.spi.BGPConfigModuleTracker;
-import org.opendaylight.protocol.bgp.openconfig.spi.BGPOpenconfigMapper;
-import org.opendaylight.protocol.bgp.openconfig.spi.InstanceConfigurationIdentifier;
-import org.opendaylight.protocol.bgp.openconfig.spi.pojo.BGPRibInstanceConfiguration;
-import org.opendaylight.protocol.bgp.rib.impl.RIBImpl;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.AsNumber;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.multiprotocol.rev130919.BgpTableType;
-import org.opendaylight.yangtools.sal.binding.generator.impl.GeneratedClassLoadingStrategy;
-import org.opendaylight.yangtools.yang.model.api.SchemaContextListener;
+import org.opendaylight.controller.config.api.osgi.WaitingServiceTracker;
+import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService;
+import org.opendaylight.protocol.bgp.mode.api.PathSelectionMode;
+import org.opendaylight.protocol.bgp.rib.impl.spi.BGPBestPathSelection;
+import org.opendaylight.protocol.bgp.rib.impl.spi.BgpDeployer;
+import org.opendaylight.protocol.bgp.rib.impl.spi.InstanceType;
+import org.opendaylight.protocol.bgp.rib.impl.spi.RIB;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.Bgp;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.bgp.rev151009.bgp.top.bgp.Global;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.Protocols;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.Protocol;
+import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.ProtocolKey;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.openconfig.extensions.rev160614.Protocol1;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.rib.rev130925.rib.TablesKey;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
import org.osgi.framework.BundleContext;
/**
*
*/
+@Deprecated
public final class RIBImplModule extends org.opendaylight.controller.config.yang.bgp.rib.impl.AbstractRIBImplModule {
private static final String IS_NOT_SET = "is not set.";
JmxAttributeValidationException.checkNotNull(getRibId(), IS_NOT_SET, ribIdJmxAttribute);
JmxAttributeValidationException.checkNotNull(getLocalAs(), IS_NOT_SET, localAsJmxAttribute);
JmxAttributeValidationException.checkNotNull(getBgpRibId(), IS_NOT_SET, bgpRibIdJmxAttribute);
- JmxAttributeValidationException.checkNotNull(getTcpReconnectStrategy(), IS_NOT_SET, tcpReconnectStrategyJmxAttribute);
- JmxAttributeValidationException.checkNotNull(getSessionReconnectStrategy(), IS_NOT_SET, sessionReconnectStrategyJmxAttribute);
JmxAttributeValidationException.checkNotNull(getLocalTable(), IS_NOT_SET, localTableJmxAttribute);
}
@Override
public java.lang.AutoCloseable createInstance() {
- final AsNumber asNumber = new AsNumber(getLocalAs());
- final RIBImpl rib = new RIBImpl(getRibId(), asNumber, getBgpRibId(), getClusterId(), getExtensionsDependency(),
- getBgpDispatcherDependency(), getTcpReconnectStrategyDependency(), getCodecTreeFactoryDependency(), getSessionReconnectStrategyDependency(),
- getDataProviderDependency(), getDomDataProviderDependency(), getLocalTableDependency(), classLoadingStrategy(),
- new RIBImplModuleTracker(getGlobalWriter()), getOpenconfigProviderDependency());
- registerSchemaContextListener(rib);
- return rib;
- }
-
- private GeneratedClassLoadingStrategy classLoadingStrategy() {
- return getExtensionsDependency().getClassLoadingStrategy();
- }
-
- private void registerSchemaContextListener(final RIBImpl rib) {
- final DOMDataBroker domBroker = getDomDataProviderDependency();
- if(domBroker instanceof SchemaService) {
- ((SchemaService) domBroker).registerSchemaContextListener(rib);
- } else {
- // FIXME:Get bundle context and register global schema service from bundle
- // context.
- bundleContext.registerService(SchemaContextListener.class, rib, new Hashtable<String,String>());
- }
+ final WaitingServiceTracker<BgpDeployer> bgpDeployerTracker =
+ WaitingServiceTracker.create(BgpDeployer.class, this.bundleContext);
+ final BgpDeployer bgpDeployer = bgpDeployerTracker.waitForService(WaitingServiceTracker.FIVE_MINUTES);
+ //map configuration to OpenConfig BGP
+ final Protocol protocol = bgpDeployer.getMappingService().fromRib(getBgpRibId(), getClusterId(), getRibId(),
+ new AsNumber(getLocalAs()), getLocalTableDependency(),
+ mapBestPathSelectionStrategyByFamily(getRibPathSelectionModeDependency()));
+ final Global global = protocol.getAugmentation(Protocol1.class).getBgp().getGlobal();
+ final KeyedInstanceIdentifier<Protocol, ProtocolKey> protocolIId = bgpDeployer.getInstanceIdentifier().child(Protocols.class)
+ .child(Protocol.class, protocol.getKey());
+ final InstanceIdentifier<Bgp> bgpIID = protocolIId.augmentation(Protocol1.class).child(Bgp.class);
+ bgpDeployer.onGlobalModified(bgpIID, global, () -> bgpDeployer.writeConfiguration(protocol, protocolIId));
+
+ //get rib instance service, use filter
+ final WaitingServiceTracker<RIB> ribTracker = WaitingServiceTracker.create(RIB.class,
+ this.bundleContext, "(" + InstanceType.RIB.getBeanName() + "=" + getRibId().getValue() + ")");
+ final RIB rib = ribTracker.waitForService(WaitingServiceTracker.FIVE_MINUTES);
+ final RIBImplRuntimeRegistration register = getRootRuntimeBeanRegistratorWrapper().register(rib.getRenderStats());
+
+ return Reflection.newProxy(AutoCloseableRIB.class, new AbstractInvocationHandler() {
+ @Override
+ protected Object handleInvocation(final Object proxy, final Method method, final Object[] args) throws Throwable {
+ if (method.getName().equals("close")) {
+ bgpDeployer.onGlobalRemoved(bgpIID);
+ register.close();
+ bgpDeployerTracker.close();
+ ribTracker.close();
+ return null;
+ } else {
+ return method.invoke(rib, args);
+ }
+ }
+ });
}
public void setBundleContext(final BundleContext bundleContext) {
this.bundleContext = bundleContext;
}
- private BGPOpenconfigMapper<BGPRibInstanceConfiguration> getGlobalWriter() {
- if (getOpenconfigProviderDependency() != null) {
- return getOpenconfigProviderDependency().getOpenConfigMapper(BGPRibInstanceConfiguration.class);
- }
- return null;
+ private Map<TablesKey, PathSelectionMode> mapBestPathSelectionStrategyByFamily(final List<BGPBestPathSelection> bestPathSelectionDependency) {
+ return Collections.unmodifiableMap(bestPathSelectionDependency.stream().collect(
+ Collectors.toMap(st -> new TablesKey(st.getAfi(), st.getSafi()), st -> st.getStrategy())));
}
- private final class RIBImplModuleTracker implements BGPConfigModuleTracker {
-
- private final BGPOpenconfigMapper<BGPRibInstanceConfiguration> globalWriter;
- private final InstanceConfigurationIdentifier identifier;
-
- public RIBImplModuleTracker(final BGPOpenconfigMapper<BGPRibInstanceConfiguration> globalWriter) {
- this.globalWriter = globalWriter;
- this.identifier = new InstanceConfigurationIdentifier(getIdentifier().getInstanceName());
- }
-
- @Override
- public void onInstanceCreate() {
- if (globalWriter != null) {
- final List<BgpTableType> tableDependency = getLocalTableDependency();
- final org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.AsNumber as = Rev130715Util.getASNumber(getLocalAs());
- final Ipv4Address bgpRibId = Rev130715Util.getIpv4Address(getBgpRibId());
- final Ipv4Address clusterId = Rev130715Util.getIpv4Address(getClusterId());
-
- final BGPRibInstanceConfiguration bgpRibConfig = new BGPRibInstanceConfiguration(identifier, as, bgpRibId, clusterId, tableDependency);
- globalWriter.writeConfiguration(bgpRibConfig);
- }
- }
-
- @Override
- public void onInstanceClose() {
- if (globalWriter != null) {
- globalWriter.removeConfiguration(identifier);
- }
- }
-
+ private static interface AutoCloseableRIB extends RIB, AutoCloseable {
}