xtend-gen
classes
out/
+.externalToolBuilders
+maven-eclipse.xml
<version>1.1-SNAPSHOT</version>
<packaging>maven-archetype</packaging>
+ <properties>
+ <nexusproxy>http://nexus.opendaylight.org/content</nexusproxy>
+ <nexus.repository.release>opendaylight.release</nexus.repository.release>
+ <nexus.repository.snapshot>opendaylight.snapshot</nexus.repository.snapshot>
+ </properties>
+
<name>odl-model-project</name>
<scm>
<connection>scm:git:ssh://git.opendaylight.org:29418/controller.git</connection>
<distributionManagement>
<repository>
<id>opendaylight-release</id>
- <url>http://nexus.opendaylight.org/content/repositories/opendaylight.release/</url>
+ <url>${nexusproxy}/repositories/${nexus.repository.release}/</url>
</repository>
<snapshotRepository>
<id>opendaylight-snapshot</id>
- <url>http://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/</url>
+ <url>${nexusproxy}/repositories/${nexus.repository.snapshot}/</url>
</snapshotRepository>
<site>
<id>website</id>
<properties>\r
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\r
<nexusproxy>http://nexus.opendaylight.org/content</nexusproxy>\r
+ <nexus.repository.release>opendaylight.release</nexus.repository.release>
+ <nexus.repository.snapshot>opendaylight.release</nexus.repository.snaphot>
<yang.version>0.6.2-SNAPSHOT</yang.version>\r
<yang.codegen.version>0.6.2-SNAPSHOT</yang.codegen.version>\r
<bundle.plugin.version>2.3.7</bundle.plugin.version>\r
<pluginRepository>\r
<id>opendaylight-snapshot</id>\r
<name>opendaylight-snapshot</name>\r
- <url>${nexusproxy}/repositories/opendaylight.snapshot/</url>\r
+ <url>${nexusproxy}/repositories/${nexus.repository.snapshot}/</url>
<snapshots>\r
<enabled>true</enabled>\r
</snapshots>\r
<repository>\r
<id>opendaylight-snapshot</id>\r
<name>opendaylight-snapshot</name>\r
- <url>${nexusproxy}/repositories/opendaylight.snapshot/</url>\r
+ <url>${nexusproxy}/repositories/${nexus.repository.snapshot}/</url>
<snapshots>\r
<enabled>true</enabled>\r
</snapshots>\r
<!-- OpenDayLight Released artifact -->\r
<repository>\r
<id>opendaylight-release</id>\r
- <url>${nexusproxy}/repositories/opendaylight.release/</url>\r
+ <url>${nexusproxy}/repositories/${nexus.repository.release}/</url>
</repository>\r
<!-- OpenDayLight Snapshot artifact -->\r
<snapshotRepository>\r
<id>opendaylight-snapshot</id>\r
- <url>${nexusproxy}/repositories/opendaylight.snapshot/</url>\r
+ <url>${nexusproxy}/repositories/${nexus.repository.snapshot}/</url>
</snapshotRepository>\r
<!-- Site deployment -->\r
<site>\r
<!-- OpenDayLight Released artifact -->
<repository>
<id>opendaylight-release</id>
- <url>${nexusproxy}/repositories/opendaylight.release/</url>
+ <url>${nexusproxy}/repositories/${nexus.repository.release}/</url>
</repository>
<!-- OpenDayLight Snapshot artifact -->
<snapshotRepository>
<id>opendaylight-snapshot</id>
- <url>${nexusproxy}/repositories/opendaylight.snapshot/</url>
+ <url>${nexusproxy}/repositories/${nexus.repository.snapshot}/</url>
</snapshotRepository>
<!-- Site deployment -->
<site>
import org.opendaylight.controller.sal.core.ComponentActivatorAbstractBase;
import org.opendaylight.controller.sal.packet.IDataPacketService;
import org.opendaylight.controller.sal.packet.IListenDataPacket;
-import org.opendaylight.controller.sal.routing.IRouting;
import org.opendaylight.controller.switchmanager.ISwitchManager;
import org.opendaylight.controller.topologymanager.ITopologyManager;
import org.slf4j.Logger;
* instantiated in order to get an fully working implementation
* Object
*/
+ @Override
public Object[] getImplementations() {
Object[] res = { ArpHandler.class };
return res;
* also optional per-container different behavior if needed, usually
* should not be the case though.
*/
+ @Override
public void configureInstance(Component c, Object imp, String containerName) {
if (imp.equals(ArpHandler.class)) {
// export the service
"setClusterContainerService", "unsetClusterContainerService")
.setRequired(true));
- c.add(createContainerServiceDependency(containerName).setService(
- IRouting.class).setCallbacks("setRouting","unsetRouting")
- .setRequired(false));
-
// the Host Listener is optional
c.add(createContainerServiceDependency(containerName).setService(
IfHostListener.class).setCallbacks("setHostListener",
}
}
- void setRouting(IRouting r) {
- this.routing = r;
- }
-
- void unsetRouting(IRouting r) {
- if (this.routing == r) {
- this.routing = null;
- }
- }
-
void setHostListener(IfHostListener s) {
if (this.hostListeners != null) {
this.hostListeners.add(s);
byte[] targetIP = tIP.getAddress();
ARP arp = createARP(ARP.REPLY, sMAC, senderIP, tMAC, targetIP);
+ if(log.isTraceEnabled()) {
+ log.trace("Sending Arp Reply with srcMac {} - srcIp {} - dstMac {} - dstIp {} - outport {}",
+ HexEncode.bytesToHexString(sMAC),
+ sIP, HexEncode.bytesToHexString(tMAC), tIP, p);
+ }
+
Ethernet ethernet = createEthernet(sMAC, tMAC, arp);
RawPacket destPkt = this.dataPacketService.encodeDataPacket(ethernet);
this.dataPacketService.transmitDataPacket(destPkt);
}
+ private void logArpPacket(ARP pkt, NodeConnector p) {
+ try {
+ if (pkt.getOpCode() == ARP.REQUEST) {
+ log.trace("Received Arp Request with srcMac {} - srcIp {} - dstMac {} - dstIp {} - inport {}", HexEncode.bytesToHexString(pkt.getSenderHardwareAddress()),
+ InetAddress.getByAddress(pkt.getSenderProtocolAddress()), HexEncode.bytesToHexString(pkt.getTargetHardwareAddress()),
+ InetAddress.getByAddress(pkt.getTargetProtocolAddress()), p);
+ } else if(pkt.getOpCode() == ARP.REPLY) {
+ log.trace("Received Arp Reply with srcMac {} - srcIp {} - dstMac {} - dstIp {} - inport {}", HexEncode.bytesToHexString(pkt.getSenderHardwareAddress()),
+ InetAddress.getByAddress(pkt.getSenderProtocolAddress()), HexEncode.bytesToHexString(pkt.getTargetHardwareAddress()),
+ InetAddress.getByAddress(pkt.getTargetProtocolAddress()), p);
+ }
+ } catch(UnknownHostException e) {
+ log.warn("Illegal Ip Address in the ARP packet", e);
+ }
+ }
+
protected void handleARPPacket(Ethernet eHeader, ARP pkt, NodeConnector p) {
+ if(log.isTraceEnabled()) {
+ logArpPacket(pkt, p);
+ }
+
byte[] sourceMAC = eHeader.getSourceMACAddress();
byte[] targetMAC = eHeader.getDestinationMACAddress();
/*
byte[] targetIPByte = targetIP.getAddress();
ARP arp = createARP(ARP.REQUEST, getControllerMAC(), senderIP, targetHardwareAddress, targetIPByte);
+ if(log.isTraceEnabled()) {
+ log.trace("Sending Broadcast Arp Request with srcMac {} - srcIp {} - dstMac {} - dstIp {} - outport {}", HexEncode.bytesToHexString(getControllerMAC()),
+ subnet.getNetworkAddress(), HexEncode.bytesToHexString(targetHardwareAddress), targetIP, p);
+ }
+
byte[] destMACAddress = NetUtils.getBroadcastMACAddr();
Ethernet ethernet = createEthernet(getControllerMAC(), destMACAddress, arp);
byte[] targetMAC = host.getDataLayerAddressBytes();
ARP arp = createARP(ARP.REQUEST, getControllerMAC(), senderIP, targetMAC, targetIP);
+ if(log.isTraceEnabled()) {
+ log.trace("Sending Unicast Arp Request with srcMac {} - srcIp {} - dstMac {} - dstIp {} - outport {}",
+ HexEncode.bytesToHexString(getControllerMAC()),
+ subnet.getNetworkAddress(), HexEncode.bytesToHexString(targetMAC), host.getNetworkAddress(),
+ outPort);
+ }
+
Ethernet ethernet = createEthernet(getControllerMAC(), targetMAC, arp);
RawPacket destPkt = this.dataPacketService.encodeDataPacket(ethernet);
// see if we know about the host
// Hosttracker hosts db key implementation
- IHostId id = HostIdFactory.create(dIP, null);
- HostNodeConnector host = hostTracker.hostFind(id);
+ HostNodeConnector host = hostTracker.hostFind(dIP);
if (host == null) {
- // if we don't, know about the host, try to find it
+ // if we don't know about the host, try to find it
log.trace("Punted IP pkt to {}, sending bcast ARP event...", dIP);
/*
* unknown destination host, initiate bcast ARP request
*/
arpRequestReplyEvent.put(new ARPRequest(dIP, subnet), false);
- } else if (routing == null || routing.getRoute(p.getNode(), host.getnodeconnectorNode()) != null) {
- /*
- * if IRouting is available, make sure that this packet can get it's
- * destination normally before teleporting it there. If it's not
- * available, then assume it's reachable.
- *
- * TODO: come up with a way to do this in the absence of IRouting
- */
-
- log.trace("forwarding punted IP pkt to {} received at {}", dIP, p);
-
- /*
- * if we know where the host is and there's a path from where this
- * packet was punted to where the host is, then deliver it to the
- * host for now
- */
- NodeConnector nc = host.getnodeConnector();
-
- // re-encode the Ethernet packet (the parent of the IPv4 packet)
- RawPacket rp = this.dataPacketService.encodeDataPacket(pkt.getParent());
- rp.setOutgoingNodeConnector(nc);
- this.dataPacketService.transmitDataPacket(rp);
} else {
- log.trace("ignoring punted IP pkt to {} because there is no route from {}", dIP, p);
+ log.trace("Ignoring punted IP pkt to known host: {} (received on: {})", dIP, p);
}
}
package org.opendaylight.controller.clustering.services_implementation.internal;
import java.util.Map;
+
import org.opendaylight.controller.clustering.services.ICacheUpdateAware;
import org.opendaylight.controller.clustering.services.IClusterGlobalServices;
import org.slf4j.Logger;
@Override
void setCacheUpdateAware(Map props, ICacheUpdateAware s) {
- logger.trace("setCacheUpdateAware");
+ logger.trace("setCacheUpdateAware: {}",s);
if (props.get("containerName") != null) {
// If we got a reference with the containerName property
// that is not what we are looking for, so filter it out.
@Override
void unsetCacheUpdateAware(Map props, ICacheUpdateAware s) {
- logger.trace("unsetCacheUpdateAware");
+ logger.trace("unsetCacheUpdateAware: {}",s);
if (props.get("containerName") != null) {
// If we got a reference with the containerName property
// that is not what we are looking for, so filter it out.
* export the interface ICoordinatorChangeAware
*/
class ListenCoordinatorChange implements IListenRoleChange {
+ @Override
public void newActiveAvailable() {
if (coordinatorChangeAware != null) {
// Make sure to look the set while walking it
logger.trace("cachenames provided below:");
for (String cache : caches) {
if (this.cacheUpdateAware.get(cache) != null) {
- logger.error("cachename:{} on container:{} has " +
- "already a listener", cache,
- this.containerName);
+ logger.error("cachename:{} on container:{} has already a listener", cache, this.containerName);
} else {
- GetUpdatesContainer<?, ?> up =
- new GetUpdatesContainer(s, this.containerName,
- cache);
+ GetUpdatesContainer<?, ?> up = new GetUpdatesContainer(s, this.containerName, cache);
if (up != null) {
try {
this.clusterService.addListener(this.containerName,
"been registered", cache,
this.containerName);
} catch (CacheListenerAddException exc) {
+ logger.debug("Cache {} didn't exist when {} tried to register to its updates", cache, s);
// Do nothing, the important is that
// we don't register the listener in
// the shadow, and we are not doing
<properties>
<nexusproxy>http://nexus.opendaylight.org/content</nexusproxy>
+ <nexus.repository.release>opendaylight.release</nexus.repository.release>
+ <nexus.repository.snapshot>opendaylight.snapshot</nexus.repository.snapshot>
<sitedeploy>dav:http://nexus.opendaylight.org/content/sites/site</sitedeploy>
</properties>
<distributionManagement>
<!-- OpenDayLight Released artifact -->
<repository>
<id>opendaylight-release</id>
- <url>${nexusproxy}/repositories/opendaylight.release/</url>
+ <url>${nexusproxy}/repositories/${nexus.repository.release}/</url>
</repository>
<!-- OpenDayLight Snapshot artifact -->
<snapshotRepository>
<id>opendaylight-snapshot</id>
- <url>${nexusproxy}/repositories/opendaylight.snapshot/</url>
+ <url>${nexusproxy}/repositories/${nexus.repository.snapshot}/</url>
</snapshotRepository>
<!-- Site deployment -->
<site>
<commons.httpclient.version>0.1.2-SNAPSHOT</commons.httpclient.version>
<concepts.version>0.5.2-SNAPSHOT</concepts.version>
<protocol-framework.version>0.5.0-SNAPSHOT</protocol-framework.version>
- <netty.version>4.0.10.Final</netty.version>
+ <netty.version>4.0.17.Final</netty.version>
<commons.io.version>2.4</commons.io.version>
<bundlescanner.version>0.4.2-SNAPSHOT</bundlescanner.version>
<usermanager.version>0.4.2-SNAPSHOT</usermanager.version>
<artifactId>concepts</artifactId>
<version>${concepts.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-remoterpc-connector</artifactId>
+ <version>${mdsal.version}</version>
+ </dependency>
<!-- config-->
<artifactId>yang-jmx-generator</artifactId>
<version>${config.version}</version>
</dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>yang-store-api</artifactId>
- <version>${config.version}</version>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>yang-store-impl</artifactId>
- <version>${config.version}</version>
- </dependency>
<dependency>
<groupId>org.opendaylight.controller</groupId>
<artifactId>logback-config</artifactId>
<pluginRepository>
<id>opendaylight-snapshot</id>
<name>opendaylight-snapshot</name>
- <url>${nexusproxy}/repositories/opendaylight.snapshot/</url>
+ <url>${nexusproxy}/repositories/${nexus.repository.snapshot}/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<repository>
<id>opendaylight-snapshot</id>
<name>opendaylight-snapshot</name>
- <url>${nexusproxy}/repositories/opendaylight.snapshot/</url>
+ <url>${nexusproxy}/repositories/${nexus.repository.snapshot}/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<!-- OpenDayLight Released artifact -->
<repository>
<id>opendaylight-release</id>
- <url>${nexusproxy}/repositories/opendaylight.release/</url>
+ <url>${nexusproxy}/repositories/${nexus.repository.release}/</url>
</repository>
<!-- OpenDayLight Snapshot artifact -->
<snapshotRepository>
<id>opendaylight-snapshot</id>
- <url>${nexusproxy}/repositories/opendaylight.snapshot/</url>
+ <url>${nexusproxy}/repositories/${nexus.repository.snapshot}/</url>
</snapshotRepository>
<!-- Site deployment -->
<site>
</scm>
<properties>
- <nexusdeploy>http://nexus.opendaylight.org/content</nexusdeploy>
+ <nexusproxy>http://nexus.opendaylight.org/content</nexusproxy>
+ <nexus.repository.release>opendaylight.release</nexus.repository.release>
+ <nexus.repository.snapshot>opendaylight.snapshot</nexus.repository.snapshot>
<sitedeploy>dav:http://nexus.opendaylight.org/content/sites/site</sitedeploy>
<releaseplugin.version>2.3.2</releaseplugin.version>
</properties>
<!-- OpenDayLight Released artifact -->
<repository>
<id>opendaylight-release</id>
- <url>${nexusdeploy}/repositories/opendaylight.release/</url>
+ <url>${nexusproxy}/repositories/${nexus.repository.release}/</url>
</repository>
<!-- OpenDayLight Snapshot artifact -->
<snapshotRepository>
<id>opendaylight-snapshot</id>
- <url>${nexusdeploy}/repositories/opendaylight.snapshot/</url>
+ <url>${nexusproxy}/repositories/${nexus.repository.snapshot}/</url>
</snapshotRepository>
<!-- Site deployment -->
<site>
+++ /dev/null
-/*
- * Copyright (c) 2013 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.controller.config.manager.impl.osgi;
-
-import org.opendaylight.yangtools.yang.data.impl.codec.BindingIndependentMappingService;
-import org.opendaylight.yangtools.yang.data.impl.codec.CodecRegistry;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
-import org.osgi.util.tracker.ServiceTrackerCustomizer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class BindingIndependentMappingServiceTracker implements ServiceTrackerCustomizer<BindingIndependentMappingService, BindingIndependentMappingService> {
- private static final Logger logger = LoggerFactory.getLogger(BindingIndependentMappingServiceTracker.class);
-
- private final ConfigManagerActivator activator;
- private final BundleContext ctx;
- private BindingIndependentMappingService service;
-
- public BindingIndependentMappingServiceTracker(BundleContext context, ConfigManagerActivator activator) {
- this.ctx = context;
- this.activator = activator;
- }
-
- @Override
- public synchronized BindingIndependentMappingService addingService(
- ServiceReference<BindingIndependentMappingService> moduleFactoryServiceReference) {
-
- if (service != null) {
- // FIXME
- // Second registration appears from
- // org.opendaylight.controller.config.yang.md.sal.binding.impl.RuntimeMappingModule
- logger.debug("BindingIndependentMappingService was already added as {}" + " now added as {}",
- service, ctx.getService(moduleFactoryServiceReference));
- return null;
- }
-
- BindingIndependentMappingService service = ctx.getService(moduleFactoryServiceReference);
- this.service = service;
- CodecRegistry codecRegistry = service.getCodecRegistry();
- logger.debug("Codec registry acquired {}", codecRegistry);
-// activator.initConfigManager(ctx, codecRegistry);
- return service;
- }
-
- @Override
- public void modifiedService(ServiceReference <BindingIndependentMappingService> moduleFactoryServiceReference, BindingIndependentMappingService o) {
- // TODO crash
- }
-
- @Override
- public void removedService(ServiceReference<BindingIndependentMappingService> moduleFactoryServiceReference, BindingIndependentMappingService o) {
- // TODO crash
- }
-}
*/
package org.opendaylight.controller.config.manager.impl.osgi;
-import java.lang.management.ManagementFactory;
-import java.util.Collection;
-
-import javax.management.InstanceAlreadyExistsException;
-import javax.management.MBeanServer;
-
import org.opendaylight.controller.config.manager.impl.ConfigRegistryImpl;
import org.opendaylight.controller.config.manager.impl.jmx.ConfigRegistryJMXRegistrator;
+import org.opendaylight.controller.config.manager.impl.osgi.mapping.CodecRegistryProvider;
import org.opendaylight.controller.config.manager.impl.osgi.mapping.ModuleInfoBundleTracker;
-import org.opendaylight.controller.config.manager.impl.osgi.mapping.RuntimeGeneratedMappingServiceActivator;
+import org.opendaylight.controller.config.manager.impl.osgi.mapping.RefreshingSCPModuleInfoRegistry;
+import org.opendaylight.controller.config.manager.impl.util.OsgiRegistrationUtil;
import org.opendaylight.controller.config.spi.ModuleFactory;
-import org.opendaylight.yangtools.concepts.Registration;
+import org.opendaylight.yangtools.concepts.ObjectRegistration;
+import org.opendaylight.yangtools.sal.binding.generator.impl.ModuleInfoBackedContext;
import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
-import org.opendaylight.yangtools.yang.data.impl.codec.CodecRegistry;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceRegistration;
import org.osgi.util.tracker.ServiceTracker;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-public class ConfigManagerActivator implements BundleActivator {
- private static final Logger logger = LoggerFactory.getLogger(ConfigManagerActivator.class);
+import javax.management.InstanceAlreadyExistsException;
+import javax.management.MBeanServer;
+import java.lang.management.ManagementFactory;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
- private ExtensibleBundleTracker<Collection<Registration<YangModuleInfo>>> bundleTracker;
- private ConfigRegistryImpl configRegistry;
- private ConfigRegistryJMXRegistrator configRegistryJMXRegistrator;
- private ServiceRegistration configRegistryServiceRegistration;
+import static org.opendaylight.controller.config.manager.impl.util.OsgiRegistrationUtil.registerService;
+import static org.opendaylight.controller.config.manager.impl.util.OsgiRegistrationUtil.wrap;
+public class ConfigManagerActivator implements BundleActivator {
private final MBeanServer configMBeanServer = ManagementFactory.getPlatformMBeanServer();
- private RuntimeGeneratedMappingServiceActivator mappingServiceActivator;
+ private AutoCloseable autoCloseable;
@Override
public void start(BundleContext context) {
- // track bundles containing YangModuleInfo
- ModuleInfoBundleTracker moduleInfoBundleTracker = new ModuleInfoBundleTracker();
- mappingServiceActivator = new RuntimeGeneratedMappingServiceActivator(moduleInfoBundleTracker);
- CodecRegistry codecRegistry = mappingServiceActivator.startRuntimeMappingService(context).getCodecRegistry();
+ ModuleInfoBackedContext moduleInfoBackedContext = ModuleInfoBackedContext.create();// the inner strategy is backed by thread context cl?
+
+ RefreshingSCPModuleInfoRegistry moduleInfoRegistryWrapper = new RefreshingSCPModuleInfoRegistry(
+ moduleInfoBackedContext, moduleInfoBackedContext, context);
+
+ ModuleInfoBundleTracker moduleInfoBundleTracker = new ModuleInfoBundleTracker(moduleInfoRegistryWrapper);
+
+ CodecRegistryProvider codecRegistryProvider = new CodecRegistryProvider(moduleInfoBackedContext, context);
// start config registry
BundleContextBackedModuleFactoriesResolver bundleContextBackedModuleFactoriesResolver = new BundleContextBackedModuleFactoriesResolver(
context);
- configRegistry = new ConfigRegistryImpl(bundleContextBackedModuleFactoriesResolver, configMBeanServer,
- codecRegistry);
+ ConfigRegistryImpl configRegistry = new ConfigRegistryImpl(bundleContextBackedModuleFactoriesResolver, configMBeanServer,
+ codecRegistryProvider.getCodecRegistry());
// track bundles containing factories
BlankTransactionServiceTracker blankTransactionServiceTracker = new BlankTransactionServiceTracker(
blankTransactionServiceTracker);
// start extensible tracker
- bundleTracker = new ExtensibleBundleTracker<>(context, moduleInfoBundleTracker, moduleFactoryBundleTracker);
+ ExtensibleBundleTracker<Collection<ObjectRegistration<YangModuleInfo>>> bundleTracker = new ExtensibleBundleTracker<>(context, moduleInfoBundleTracker, moduleFactoryBundleTracker);
bundleTracker.open();
// register config registry to OSGi
- configRegistryServiceRegistration = context.registerService(ConfigRegistryImpl.class, configRegistry, null);
+ AutoCloseable configRegReg = registerService(context, configRegistry, ConfigRegistryImpl.class);
// register config registry to jmx
- configRegistryJMXRegistrator = new ConfigRegistryJMXRegistrator(configMBeanServer);
+ ConfigRegistryJMXRegistrator configRegistryJMXRegistrator = new ConfigRegistryJMXRegistrator(configMBeanServer);
try {
configRegistryJMXRegistrator.registerToJMX(configRegistry);
} catch (InstanceAlreadyExistsException e) {
throw new IllegalStateException("Config Registry was already registered to JMX", e);
}
+ // TODO wire directly via moduleInfoBundleTracker
ServiceTracker<ModuleFactory, Object> serviceTracker = new ServiceTracker<>(context, ModuleFactory.class,
blankTransactionServiceTracker);
serviceTracker.open();
+
+ List<AutoCloseable> list = Arrays.asList(
+ codecRegistryProvider, configRegistry, wrap(bundleTracker), configRegReg, configRegistryJMXRegistrator, wrap(serviceTracker));
+ autoCloseable = OsgiRegistrationUtil.aggregate(list);
}
@Override
- public void stop(BundleContext context) {
- try {
- configRegistry.close();
- } catch (Exception e) {
- logger.warn("Exception while closing config registry", e);
- }
- try {
- bundleTracker.close();
- } catch (Exception e) {
- logger.warn("Exception while closing extender", e);
- }
- try {
- configRegistryJMXRegistrator.close();
- } catch (Exception e) {
- logger.warn(
- "Exception while closing config registry jmx registrator",
- e);
- }
- try {
- configRegistryServiceRegistration.unregister();
- } catch (Exception e) {
- logger.warn("Exception while unregistering config registry", e);
- }
- try {
- mappingServiceActivator.close();
- } catch (Exception e) {
- logger.warn("Exception while closing mapping service", e);
- }
+ public void stop(BundleContext context) throws Exception {
+ autoCloseable.close();
}
}
--- /dev/null
+/*
+ * Copyright (c) 2013 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.controller.config.manager.impl.osgi.mapping;
+
+import javassist.ClassPool;
+import org.opendaylight.controller.config.manager.impl.util.OsgiRegistrationUtil;
+import org.opendaylight.yangtools.sal.binding.generator.api.ClassLoadingStrategy;
+import org.opendaylight.yangtools.sal.binding.generator.impl.RuntimeGeneratedMappingServiceImpl;
+import org.opendaylight.yangtools.yang.data.impl.codec.BindingIndependentMappingService;
+import org.opendaylight.yangtools.yang.data.impl.codec.CodecRegistry;
+import org.opendaylight.yangtools.yang.model.api.SchemaServiceListener;
+import org.osgi.framework.BundleContext;
+
+/**
+ * Creates and initializes {@link RuntimeGeneratedMappingServiceImpl}, which is used to get {@link CodecRegistry}.
+ * Also maintains service registrations of {@link RuntimeGeneratedMappingServiceImpl}.
+ */
+// TODO move to yang runtime
+public class CodecRegistryProvider implements AutoCloseable {
+ private static final ClassPool CLASS_POOL = ClassPool.getDefault();
+
+ private final RuntimeGeneratedMappingServiceImpl service;
+ private final AutoCloseable registration;
+
+ public CodecRegistryProvider(ClassLoadingStrategy classLoadingStrategy, BundleContext context) {
+ service = new RuntimeGeneratedMappingServiceImpl(classLoadingStrategy);
+ service.setPool(CLASS_POOL);
+ service.init();
+ registration = OsgiRegistrationUtil.registerService(context, service,
+ SchemaServiceListener.class, BindingIndependentMappingService.class);
+ }
+
+ public CodecRegistry getCodecRegistry() {
+ return service.getCodecRegistry();
+ }
+
+ @Override
+ public void close() throws Exception {
+ registration.close();
+ }
+}
*/
package org.opendaylight.controller.config.manager.impl.osgi.mapping;
+import static java.lang.String.format;
+
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+
import org.apache.commons.io.IOUtils;
-import org.opendaylight.yangtools.concepts.Registration;
-import org.opendaylight.yangtools.sal.binding.generator.impl.GeneratedClassLoadingStrategy;
-import org.opendaylight.yangtools.sal.binding.generator.impl.ModuleInfoBackedContext;
+import org.opendaylight.yangtools.concepts.ObjectRegistration;
+import org.opendaylight.yangtools.sal.binding.generator.api.ModuleInfoRegistry;
import org.opendaylight.yangtools.yang.binding.YangModelBindingProvider;
import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
import org.osgi.framework.Bundle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.Collection;
-import java.util.LinkedList;
-import java.util.List;
-
-import static java.lang.String.format;
-
/**
- * Tracks bundles and attempts to retrieve YangModuleInfo.
+ * Tracks bundles and attempts to retrieve YangModuleInfo, which is then fed into ModuleInfoRegistry
*/
-public final class ModuleInfoBundleTracker implements BundleTrackerCustomizer<Collection<Registration<YangModuleInfo>>> {
+public final class ModuleInfoBundleTracker implements BundleTrackerCustomizer<Collection<ObjectRegistration<YangModuleInfo>>> {
private static final Logger logger = LoggerFactory.getLogger(ModuleInfoBundleTracker.class);
- public static final String GET_MODULE_INFO_METHOD = "getModuleInfo";
public static final String MODULE_INFO_PROVIDER_PATH_PREFIX = "META-INF/services/";
- private ModuleInfoBackedContext moduleInfoLoadingStrategy = ModuleInfoBackedContext.create();
- public GeneratedClassLoadingStrategy getModuleInfoLoadingStrategy() {
- return moduleInfoLoadingStrategy;
+ private final ModuleInfoRegistry moduleInfoRegistry;
+
+ public ModuleInfoBundleTracker(ModuleInfoRegistry moduleInfoRegistry) {
+ this.moduleInfoRegistry = moduleInfoRegistry;
}
@Override
- public Collection<Registration<YangModuleInfo>> addingBundle(Bundle bundle, BundleEvent event) {
+ public Collection<ObjectRegistration<YangModuleInfo>> addingBundle(Bundle bundle, BundleEvent event) {
URL resource = bundle.getEntry(MODULE_INFO_PROVIDER_PATH_PREFIX + YangModelBindingProvider.class.getName());
-
+ logger.debug("Got addingBundle({}) with YangModelBindingProvider resource {}", bundle, resource);
if(resource==null) {
return null;
}
-
- List<Registration<YangModuleInfo>> registrations = new LinkedList<>();
+ List<ObjectRegistration<YangModuleInfo>> registrations = new LinkedList<>();
try (InputStream inputStream = resource.openStream()) {
List<String> lines = IOUtils.readLines(inputStream);
for (String moduleInfoName : lines) {
+ logger.trace("Retrieve ModuleInfo({}, {})", moduleInfoName, bundle);
YangModuleInfo moduleInfo = retrieveModuleInfo(moduleInfoName, bundle);
- registrations.add(moduleInfoLoadingStrategy.registerModuleInfo(moduleInfo));
+ registrations.add(moduleInfoRegistry.registerModuleInfo(moduleInfo));
}
-
} catch (Exception e) {
logger.error("Error while reading {}", resource, e);
throw new RuntimeException(e);
}
-
+ logger.trace("Got following registrations {}", registrations);
return registrations;
}
@Override
- public void modifiedBundle(Bundle bundle, BundleEvent event, Collection<Registration<YangModuleInfo>> object) {
- // NOOP
+ public void modifiedBundle(Bundle bundle, BundleEvent event, Collection<ObjectRegistration<YangModuleInfo>> object) {
}
@Override
- public void removedBundle(Bundle bundle, BundleEvent event, Collection<Registration<YangModuleInfo>> regs) {
+ public void removedBundle(Bundle bundle, BundleEvent event, Collection<ObjectRegistration<YangModuleInfo>> regs) {
if(regs == null) {
return;
}
- for (Registration<YangModuleInfo> reg : regs) {
+ for (ObjectRegistration<YangModuleInfo> reg : regs) {
try {
reg.close();
} catch (Exception e) {
errorMessage = logMessage("Could not instantiate {} in bundle {}, reason {}", moduleInfoClass, bundle, e);
throw new IllegalStateException(errorMessage, e);
} catch (IllegalAccessException e) {
- errorMessage = logMessage("Illegal access during instatiation of class {} in bundle {}, reason {}",
+ errorMessage = logMessage("Illegal access during instantiation of class {} in bundle {}, reason {}",
moduleInfoClass, bundle, e);
throw new IllegalStateException(errorMessage, e);
}
try {
return bundle.loadClass(moduleInfoClass);
} catch (ClassNotFoundException e) {
- String errorMessage = logMessage("Could not find class {} in bunde {}, reason {}", moduleInfoClass, bundle, e);
+ String errorMessage = logMessage("Could not find class {} in bundle {}, reason {}", moduleInfoClass, bundle, e);
throw new IllegalStateException(errorMessage);
}
}
--- /dev/null
+/*
+ * Copyright (c) 2013 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.controller.config.manager.impl.osgi.mapping;
+
+import org.opendaylight.yangtools.concepts.ObjectRegistration;
+import org.opendaylight.yangtools.sal.binding.generator.api.ModuleInfoRegistry;
+import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
+import org.opendaylight.yangtools.yang.model.api.SchemaContextProvider;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+
+import java.util.Hashtable;
+
+/**
+ * Update SchemaContext service in Service Registry each time new YangModuleInfo is added or removed.
+ */
+public class RefreshingSCPModuleInfoRegistry implements ModuleInfoRegistry, AutoCloseable {
+
+ private final ModuleInfoRegistry moduleInfoRegistry;
+ private final ServiceRegistration<SchemaContextProvider> osgiReg;
+
+ public RefreshingSCPModuleInfoRegistry(ModuleInfoRegistry moduleInfoRegistry,
+ SchemaContextProvider schemaContextProvider, BundleContext bundleContext) {
+ this.moduleInfoRegistry = moduleInfoRegistry;
+ osgiReg = bundleContext.registerService(SchemaContextProvider.class, schemaContextProvider, new Hashtable<String, String>());
+ }
+
+ private void updateService() {
+ osgiReg.setProperties(null); // send modifiedService event
+ }
+
+ @Override
+ public ObjectRegistration<YangModuleInfo> registerModuleInfo(YangModuleInfo yangModuleInfo) {
+ ObjectRegistration<YangModuleInfo> yangModuleInfoObjectRegistration = moduleInfoRegistry.registerModuleInfo(yangModuleInfo);
+ ObjectRegistrationWrapper wrapper = new ObjectRegistrationWrapper(yangModuleInfoObjectRegistration);
+ updateService();
+ return wrapper;
+ }
+
+
+ @Override
+ public void close() {
+ osgiReg.unregister();
+ }
+
+ private class ObjectRegistrationWrapper implements ObjectRegistration<YangModuleInfo> {
+ private final ObjectRegistration<YangModuleInfo> inner;
+
+ private ObjectRegistrationWrapper(ObjectRegistration<YangModuleInfo> inner) {
+ this.inner = inner;
+ }
+
+ @Override
+ public YangModuleInfo getInstance() {
+ return inner.getInstance();
+ }
+
+ @Override
+ public void close() throws Exception {
+ inner.close();
+ updateService();// send modify event when a bundle disappears
+ }
+
+
+ @Override
+ public String toString() {
+ return inner.toString();
+ }
+ }
+}
+++ /dev/null
-/*
- * Copyright (c) 2013 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.controller.config.manager.impl.osgi.mapping;
-
-import javassist.ClassPool;
-import org.opendaylight.yangtools.sal.binding.generator.impl.RuntimeGeneratedMappingServiceImpl;
-import org.opendaylight.yangtools.yang.data.impl.codec.BindingIndependentMappingService;
-import org.opendaylight.yangtools.yang.model.api.SchemaServiceListener;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceRegistration;
-
-import java.util.Hashtable;
-
-public class RuntimeGeneratedMappingServiceActivator implements AutoCloseable {
-
- private static final ClassPool CLASS_POOL = ClassPool.getDefault();
-
- private ServiceRegistration<SchemaServiceListener> listenerReg;
- private ServiceRegistration<BindingIndependentMappingService> mappingReg;
- private ModuleInfoBundleTracker moduleInfoBundleTracker;
-
- public RuntimeGeneratedMappingServiceActivator(ModuleInfoBundleTracker moduleInfoBundleTracker) {
- this.moduleInfoBundleTracker = moduleInfoBundleTracker;
- }
-
- public RuntimeGeneratedMappingServiceImpl startRuntimeMappingService(BundleContext context) {
- RuntimeGeneratedMappingServiceImpl service = new RuntimeGeneratedMappingServiceImpl(moduleInfoBundleTracker.getModuleInfoLoadingStrategy());
- service.setPool(CLASS_POOL);
- service.init();
- startRuntimeMappingService(service, context);
- return service;
- }
-
- private void startRuntimeMappingService(RuntimeGeneratedMappingServiceImpl service, BundleContext context) {
- Hashtable<String, String> properties = new Hashtable<String, String>();
- listenerReg = context.registerService(SchemaServiceListener.class, service, properties);
- mappingReg = context.registerService(BindingIndependentMappingService.class, service, properties);
-
- }
-
- @Override
- public void close() throws Exception {
- mappingReg.unregister();
- listenerReg.unregister();
- }
-}
--- /dev/null
+/*
+ * Copyright (c) 2013 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.controller.config.manager.impl.util;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.util.tracker.BundleTracker;
+import org.osgi.util.tracker.ServiceTracker;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.ListIterator;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+public class OsgiRegistrationUtil {
+ private static final Logger logger = LoggerFactory.getLogger(OsgiRegistrationUtil.class);
+
+ @SafeVarargs
+ public static <T> AutoCloseable registerService(BundleContext bundleContext, T service, Class<? super T> ... interfaces) {
+ checkNotNull(service);
+ checkNotNull(interfaces);
+ List<AutoCloseable> autoCloseableList = new ArrayList<>();
+ for (Class<? super T> ifc : interfaces) {
+ ServiceRegistration<? super T> serviceRegistration = bundleContext.registerService(ifc, service, null);
+ autoCloseableList.add(wrap(serviceRegistration));
+ }
+ return aggregate(autoCloseableList);
+ }
+
+ public static AutoCloseable wrap(final ServiceRegistration<?> reg) {
+ checkNotNull(reg);
+ return new AutoCloseable() {
+ @Override
+ public void close() throws Exception {
+ reg.unregister();
+ }
+ };
+ }
+
+ public static AutoCloseable wrap(final BundleTracker bundleTracker) {
+ checkNotNull(bundleTracker);
+ return new AutoCloseable() {
+ @Override
+ public void close() throws Exception {
+ bundleTracker.close();
+ }
+ };
+ }
+
+ public static AutoCloseable wrap(final ServiceTracker<?, ?> serviceTracker) {
+ checkNotNull(serviceTracker);
+ return new AutoCloseable() {
+ @Override
+ public void close() throws Exception {
+ serviceTracker.close();
+ }
+ };
+ }
+
+ /**
+ * Close list of auto closeables in reverse order
+ */
+ public static AutoCloseable aggregate(final List<? extends AutoCloseable> list) {
+ checkNotNull(list);
+
+ return new AutoCloseable() {
+ @Override
+ public void close() throws Exception {
+ Exception firstException = null;
+ for (ListIterator<? extends AutoCloseable> it = list.listIterator(list.size()); it.hasPrevious();) {
+ AutoCloseable ac = it.previous();
+ try {
+ ac.close();
+ } catch (Exception e) {
+ logger.warn("Exception while closing {}", ac, e);
+ if (firstException == null) {
+ firstException = e;
+ } else {
+ firstException.addSuppressed(e);
+ }
+ }
+ }
+ if (firstException != null) {
+ throw firstException;
+ }
+ }
+ };
+ }
+}
private void assertSnapshot(ConfigSnapshotHolder result, String directory) throws Exception {
SortedSet<String> expectedCapabilities = new TreeSet<>(IOUtils.readLines(getClass().getResourceAsStream("/" + directory + "/expectedCapabilities.txt")));
String expectedSnapshot = IOUtils.toString(getClass().getResourceAsStream("/" + directory + "/expectedSnapshot.xml"));
+ expectedSnapshot = expectedSnapshot.replaceAll("\r","");
+ String _snapshot = result.getConfigSnapshot();
+ _snapshot = _snapshot.replaceAll("\r","");
assertEquals(expectedCapabilities, result.getCapabilities());
- assertEquals(expectedSnapshot, result.getConfigSnapshot());
+ assertEquals(expectedSnapshot, _snapshot);
}
}
<module>config-persister-file-xml-adapter</module>
<module>yang-jmx-generator</module>
<module>yang-jmx-generator-plugin</module>
- <module>yang-store-api</module>
- <module>yang-store-impl</module>
<module>yang-test</module>
<module>logback-config</module>
<module>threadpool-config-api</module>
<artifactId>yang-maven-plugin-spi</artifactId>
<version>${yangtools.version}</version>
</dependency>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>yang-store-api</artifactId>
- <version>${config.version}</version>
- </dependency>
<dependency>
<groupId>org.opendaylight.controller</groupId>
+++ /dev/null
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <artifactId>config-subsystem</artifactId>
- <groupId>org.opendaylight.controller</groupId>
- <version>0.2.5-SNAPSHOT</version>
- <relativePath>..</relativePath>
- </parent>
- <artifactId>yang-store-api</artifactId>
- <name>${project.artifactId}</name>
- <packaging>bundle</packaging>
-
- <dependencies>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>yang-jmx-generator</artifactId>
- </dependency>
- </dependencies>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.felix</groupId>
- <artifactId>maven-bundle-plugin</artifactId>
- <configuration>
- <instructions>
- <Export-Package>
- org.opendaylight.controller.config.yang.store.api,
- </Export-Package>
- </instructions>
- </configuration>
- </plugin>
- </plugins>
- </build>
-
-</project>
+++ /dev/null
-target
-.classpath
-.settings
+++ /dev/null
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <artifactId>config-subsystem</artifactId>
- <groupId>org.opendaylight.controller</groupId>
- <version>0.2.5-SNAPSHOT</version>
- <relativePath>..</relativePath>
- </parent>
- <artifactId>yang-store-impl</artifactId>
- <name>${project.artifactId}</name>
- <packaging>bundle</packaging>
-
- <dependencies>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>yang-store-api</artifactId>
- </dependency>
- <dependency>
- <groupId>org.osgi</groupId>
- <artifactId>org.osgi.core</artifactId>
- </dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-api</artifactId>
- </dependency>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>yang-jmx-generator</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>binding-type-provider</artifactId>
- </dependency>
- <dependency>
- <groupId>commons-io</groupId>
- <artifactId>commons-io</artifactId>
- </dependency>
- <dependency>
- <groupId>com.google.guava</groupId>
- <artifactId>guava</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>mockito-configuration</artifactId>
- </dependency>
- <dependency>
- <groupId>com.google.code.findbugs</groupId>
- <artifactId>jsr305</artifactId>
- </dependency>
- </dependencies>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.felix</groupId>
- <artifactId>maven-bundle-plugin</artifactId>
- <configuration>
- <instructions>
- <Bundle-Activator>org.opendaylight.controller.config.yang.store.impl.YangStoreActivator</Bundle-Activator>
- <Export-Package>
- </Export-Package>
- </instructions>
- </configuration>
- </plugin>
- <!-- test jar -->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-jar-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
-
-</project>
+++ /dev/null
-/*
- * Copyright (c) 2013 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.controller.config.yang.store.impl;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Function;
-import com.google.common.base.Optional;
-import com.google.common.base.Preconditions;
-import com.google.common.collect.Collections2;
-import com.google.common.collect.HashMultimap;
-import com.google.common.collect.Multimap;
-import org.opendaylight.controller.config.yang.store.api.YangStoreException;
-import org.opendaylight.controller.config.yang.store.api.YangStoreService;
-import org.opendaylight.controller.config.yang.store.api.YangStoreSnapshot;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.BundleEvent;
-import org.osgi.util.tracker.BundleTracker;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.concurrent.GuardedBy;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Note on consistency:
- * When this bundle is activated after other bundles containing yang files, the resolving order
- * is not preserved. We thus maintain two maps, one containing consistent snapshot, other inconsistent. The
- * container should eventually send all events and thus making the inconsistent map redundant.
- */
-public class ExtenderYangTracker extends BundleTracker<Object> implements YangStoreService, AutoCloseable {
-
- private static final Logger logger = LoggerFactory.getLogger(ExtenderYangTracker.class);
-
- private final Multimap<Bundle, URL> consistentBundlesToYangURLs = HashMultimap.create();
-
- /*
- Map of currently problematic yang files that should get fixed eventually after all events are received.
- */
- private final Multimap<Bundle, URL> inconsistentBundlesToYangURLs = HashMultimap.create();
-
- private final YangStoreCache cache = new YangStoreCache();
- private final MbeParser mbeParser;
-
-
- public ExtenderYangTracker(Optional<Pattern> maybeBlacklist, BundleContext bundleContext) {
- this(new MbeParser(), maybeBlacklist, bundleContext);
- }
-
- @GuardedBy("this")
- private Optional<Pattern> maybeBlacklist;
-
- @VisibleForTesting
- ExtenderYangTracker(MbeParser mbeParser, Optional<Pattern> maybeBlacklist, BundleContext bundleContext) {
- super(bundleContext, BundleEvent.RESOLVED | BundleEvent.UNRESOLVED, null);
- this.mbeParser = mbeParser;
- this.maybeBlacklist = maybeBlacklist;
- open();
- }
-
- @Override
- public synchronized Object addingBundle(Bundle bundle, BundleEvent event) {
-
- // Ignore system bundle:
- // system bundle might have config-api on classpath &&
- // config-api contains yang files =>
- // system bundle might contain yang files from that bundle
- if (bundle.getBundleId() == 0)
- return bundle;
-
- if (maybeBlacklist.isPresent()) {
- Matcher m = maybeBlacklist.get().matcher(bundle.getSymbolicName());
- if (m.matches()) {
- logger.debug("Ignoring {} because it is in blacklist {}", bundle, maybeBlacklist);
- return bundle;
- }
- }
-
- Enumeration<URL> enumeration = bundle.findEntries("META-INF/yang", "*.yang", false);
- if (enumeration != null && enumeration.hasMoreElements()) {
- synchronized (this) {
- List<URL> addedURLs = new ArrayList<>();
- while (enumeration.hasMoreElements()) {
- URL url = enumeration.nextElement();
- addedURLs.add(url);
- }
- logger.trace("Bundle {} has event {}, bundle state {}, URLs {}", bundle, event, bundle.getState(), addedURLs);
- // test that yang store is consistent
- Multimap<Bundle, URL> proposedNewState = HashMultimap.create(consistentBundlesToYangURLs);
- proposedNewState.putAll(inconsistentBundlesToYangURLs);
- proposedNewState.putAll(bundle, addedURLs);
-
- Preconditions.checkArgument(addedURLs.size() > 0, "No change can occur when no URLs are changed");
-
- try(YangStoreSnapshotImpl snapshot = createSnapshot(mbeParser, proposedNewState)) {
- onSnapshotSuccess(proposedNewState, snapshot);
- } catch(YangStoreException e) {
- onSnapshotFailure(bundle, addedURLs, e);
- }
- }
- }
- return bundle;
- }
-
- private synchronized void onSnapshotFailure(Bundle bundle, List<URL> addedURLs, Exception failureReason) {
- // inconsistent state
- inconsistentBundlesToYangURLs.putAll(bundle, addedURLs);
-
- logger.debug("Yang store is falling back to last consistent state containing {}, inconsistent yang files {}",
- consistentBundlesToYangURLs, inconsistentBundlesToYangURLs, failureReason);
- logger.info("Yang store is falling back to last consistent state containing {} files, keeping {} inconsistent yang files due to {}",
- consistentBundlesToYangURLs.size(), inconsistentBundlesToYangURLs.size(), failureReason.toString());
- cache.setInconsistentURLsForReporting(inconsistentBundlesToYangURLs.values());
- }
-
- private synchronized void onSnapshotSuccess(Multimap<Bundle, URL> proposedNewState, YangStoreSnapshotImpl snapshot) {
- // consistent state
- // merge into
- consistentBundlesToYangURLs.clear();
- consistentBundlesToYangURLs.putAll(proposedNewState);
-
- logger.debug("Yang store updated to new consistent state containing {}", consistentBundlesToYangURLs);
-
- // If we cleared up some inconsistent models, report that
- if (!inconsistentBundlesToYangURLs.isEmpty()) {
- inconsistentBundlesToYangURLs.clear();
- logger.info("Yang store updated to new consistent state containing {} yang files", consistentBundlesToYangURLs.size());
- }
-
- updateCache(snapshot);
- cache.setInconsistentURLsForReporting(Collections.<URL> emptySet());
- }
-
- private synchronized void updateCache(YangStoreSnapshotImpl snapshot) {
- cache.cacheYangStore(consistentBundlesToYangURLs, snapshot);
- }
-
- @Override
- public void modifiedBundle(Bundle bundle, BundleEvent event, Object object) {
- logger.debug("Modified bundle {} {} {}", bundle, event, object);
- }
-
- /**
- * If removing YANG files makes yang store inconsistent, method {@link #getYangStoreSnapshot()}
- * will throw exception. There is no rollback.
- */
- @Override
- public synchronized void removedBundle(Bundle bundle, BundleEvent event, Object object) {
- logger.debug("Removed bundle {} {} {}", bundle, event, object);
- inconsistentBundlesToYangURLs.removeAll(bundle);
- consistentBundlesToYangURLs.removeAll(bundle);
- }
-
- @Override
- public synchronized YangStoreSnapshot getYangStoreSnapshot()
- throws YangStoreException {
- Optional<YangStoreSnapshot> yangStoreOpt = cache.getSnapshotIfPossible(consistentBundlesToYangURLs);
- if (yangStoreOpt.isPresent()) {
- logger.debug("Returning cached yang store {}", yangStoreOpt.get());
- return yangStoreOpt.get();
- }
-
- YangStoreSnapshotImpl snapshot = createSnapshot(mbeParser, consistentBundlesToYangURLs);
- updateCache(snapshot);
- return snapshot;
- }
-
- private static YangStoreSnapshotImpl createSnapshot(MbeParser mbeParser, Multimap<Bundle, URL> multimap) throws YangStoreException {
- try {
- YangStoreSnapshotImpl yangStoreSnapshot = mbeParser.parseYangFiles(fromUrlsToInputStreams(multimap));
- logger.trace("{} module entries parsed successfully from {} yang files",
- yangStoreSnapshot.countModuleMXBeanEntries(), multimap.values().size());
- return yangStoreSnapshot;
- } catch (RuntimeException e) {
- StringBuffer causeStr = new StringBuffer();
- Throwable cause = e;
- while (cause != null) {
- causeStr.append(e.getMessage());
- causeStr.append("\n");
- cause = e.getCause();
- }
- throw new YangStoreException("Unable to parse yang files. \n" + causeStr.toString() +
- "URLs: " + multimap, e);
- }
- }
-
- private static Collection<InputStream> fromUrlsToInputStreams(Multimap<Bundle, URL> multimap) {
- return Collections2.transform(multimap.values(),
- new Function<URL, InputStream>() {
-
- @Override
- public InputStream apply(URL url) {
- try {
- return url.openStream();
- } catch (IOException e) {
- logger.warn("Unable to open stream from {}", url);
- throw new IllegalStateException(
- "Unable to open stream from " + url, e);
- }
- }
- });
- }
-
- public synchronized void setMaybeBlacklist(Optional<Pattern> maybeBlacklistPattern) {
- maybeBlacklist = maybeBlacklistPattern;
- cache.invalidate();
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2013 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.controller.config.yang.store.impl;
-
-import com.google.common.collect.Sets;
-import org.apache.commons.io.IOUtils;
-import org.opendaylight.controller.config.yang.store.api.YangStoreException;
-import org.opendaylight.yangtools.yang.model.api.Module;
-import org.opendaylight.yangtools.yang.model.api.SchemaContext;
-import org.opendaylight.yangtools.yang.model.parser.api.YangModelParser;
-import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
-public class YangParserWrapper {
-
- /**
- * throw IllegalStateException if it is unable to parse yang files
- */
- public static SchemaContext parseYangFiles(Collection<? extends InputStream> yangFilesAsInputStreams) {
- YangParserImpl parser = getYangParserInstance();
- Map<InputStream, Module> mappedYangModules = null;
- try {
- mappedYangModules = parseYangFiles(parser, yangFilesAsInputStreams);
- } catch (YangStoreException e) {
- throw new IllegalStateException("Unable to parse yang files", e);
- }
- return getSchemaContextFromModules(parser, mappedYangModules);
- }
-
- static YangParserImpl getYangParserInstance() {
- return new YangParserImpl();
- }
-
- static SchemaContext getSchemaContextFromModules(YangModelParser parser, Map<InputStream, Module> allYangModules) {
- return parser.resolveSchemaContext(Sets
- .newHashSet(allYangModules.values()));
- }
-
- static Map<InputStream, Module> parseYangFiles(YangModelParser parser, Collection<? extends InputStream> allInput) throws YangStoreException {
- List<InputStream> bufferedInputStreams = new ArrayList<>();
- for (InputStream is : allInput) {
- String content;
- try {
- content = IOUtils.toString(is);
- } catch (IOException e) {
- throw new YangStoreException("Can not get yang as String from "
- + is, e);
- }
- InputStream buf = new ByteArrayInputStream(content.getBytes());
- bufferedInputStreams.add(buf);
- }
-
- return parser
- .parseYangModelsFromStreamsMapped(bufferedInputStreams);
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2013 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.controller.config.yang.store.impl;
-
-import com.google.common.base.Optional;
-import org.opendaylight.controller.config.yang.store.api.YangStoreService;
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Dictionary;
-import java.util.Hashtable;
-import java.util.regex.Pattern;
-
-public class YangStoreActivator implements BundleActivator {
- private static final Logger logger = LoggerFactory.getLogger(YangStoreActivator.class);
-
- @Override
- public void start(BundleContext context) throws Exception {
- // get blacklist
- Optional<Pattern> maybeBlacklistPattern = Optional.absent();
- String blacklist = context.getProperty("yangstore.blacklist");
- if (blacklist != null) {
- try {
- maybeBlacklistPattern = Optional.of(Pattern.compile(blacklist));
- } catch (RuntimeException e) {
- logger.error("Cannot parse blacklist regex " + blacklist, e);
- throw e;
- }
- }
- ExtenderYangTracker extenderYangTracker = new ExtenderYangTracker(maybeBlacklistPattern, context);
- Dictionary<String, ?> properties = new Hashtable<>();
- context.registerService(YangStoreService.class, extenderYangTracker, properties);
- }
-
- @Override
- public void stop(BundleContext context) throws Exception {
-
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2014 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.controller.config.yang.store.impl;
-
-import com.google.common.base.Optional;
-import com.google.common.base.Preconditions;
-import com.google.common.collect.Multimap;
-import com.google.common.collect.Sets;
-import org.opendaylight.controller.config.yang.store.api.YangStoreSnapshot;
-import org.opendaylight.controller.config.yangjmxgenerator.ModuleMXBeanEntry;
-import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.model.api.Module;
-import org.osgi.framework.Bundle;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.annotation.concurrent.GuardedBy;
-import java.net.URL;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Map;
-import java.util.Set;
-
-class YangStoreCache {
- private static final Logger logger = LoggerFactory.getLogger(YangStoreCache.class);
-
- @GuardedBy("this")
- private Set<URL> cachedUrls = null;
- @GuardedBy("this")
- private Optional<YangStoreSnapshot> cachedYangStoreSnapshot = getInitialSnapshot();
- @GuardedBy("this")
- private Collection<URL> inconsistentURLsForReporting = Collections.emptySet();
-
- synchronized Optional<YangStoreSnapshot> getSnapshotIfPossible(Multimap<Bundle, URL> bundlesToYangURLs) {
- Set<URL> urls = setFromMultimapValues(bundlesToYangURLs);
-
- if (cachedUrls==null || cachedUrls.equals(urls)) {
- Preconditions.checkState(cachedYangStoreSnapshot.isPresent());
- YangStoreSnapshot freshSnapshot = YangStoreSnapshotImpl.copy(cachedYangStoreSnapshot.get());
- if (inconsistentURLsForReporting.size() > 0){
- logger.warn("Some yang URLs are ignored: {}", inconsistentURLsForReporting);
- }
- return Optional.of(freshSnapshot);
- }
-
- return Optional.absent();
- }
-
- private static Set<URL> setFromMultimapValues(
- Multimap<Bundle, URL> bundlesToYangURLs) {
- Set<URL> urls = Sets.newHashSet(bundlesToYangURLs.values());
- Preconditions.checkState(bundlesToYangURLs.size() == urls.size());
- return urls;
- }
-
- synchronized void cacheYangStore(Multimap<Bundle, URL> urls,
- YangStoreSnapshot yangStoreSnapshot) {
- this.cachedUrls = setFromMultimapValues(urls);
- this.cachedYangStoreSnapshot = Optional.of(yangStoreSnapshot);
- }
-
- synchronized void invalidate() {
- cachedUrls.clear();
- if (cachedYangStoreSnapshot.isPresent()){
- cachedYangStoreSnapshot.get().close();
- cachedYangStoreSnapshot = Optional.absent();
- }
- }
-
- public synchronized void setInconsistentURLsForReporting(Collection<URL> urls){
- inconsistentURLsForReporting = urls;
- }
-
- private Optional<YangStoreSnapshot> getInitialSnapshot() {
- YangStoreSnapshot initialSnapshot = new YangStoreSnapshot() {
- @Override
- public Map<String, Map<String, ModuleMXBeanEntry>> getModuleMXBeanEntryMap() {
- return Collections.emptyMap();
- }
-
- @Override
- public Map<QName, Map<String, ModuleMXBeanEntry>> getQNamesToIdentitiesToModuleMXBeanEntries() {
- return Collections.emptyMap();
- }
-
- @Override
- public Set<Module> getModules() {
- return Collections.emptySet();
- }
-
- @Override
- public Map<Module, String> getModulesToSources() {
- return Collections.emptyMap();
- }
-
- @Override
- public String getModuleSource(Module module) {
- throw new IllegalArgumentException("Cannot get sources in empty snapshot");
- }
-
- @Override
- public int countModuleMXBeanEntries() {
- return 0;
- }
-
- @Override
- public void close() {
- }
- };
- return Optional.of(initialSnapshot);
- }
-}
+++ /dev/null
-/*
- * Copyright (c) 2013 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.controller.config.yang.store.impl;
-
-import org.opendaylight.controller.config.yang.store.api.YangStoreSnapshot;
-import org.opendaylight.controller.config.yangjmxgenerator.ModuleMXBeanEntry;
-import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.model.api.Module;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Collections;
-import java.util.Map;
-import java.util.Set;
-
-public class YangStoreSnapshotImpl implements YangStoreSnapshot {
- private static final Logger logger = LoggerFactory.getLogger(YangStoreSnapshotImpl.class);
-
- @Deprecated
- private final Map<String /* Namespace from yang file */,
- Map<String /* Name of module entry from yang file */, ModuleMXBeanEntry>> moduleMXBeanEntryMap;
-
- private final Map<Module, String> modulesToSources;
- private final Map<QName, Map<String, ModuleMXBeanEntry>> qNamesToIdentitiesToModuleMXBeanEntries;
-
- public YangStoreSnapshotImpl(Map<String, Map<String, ModuleMXBeanEntry>> moduleMXBeanEntryMap,
- Map<Module, String> modulesToSources,
- Map<QName, Map<String, ModuleMXBeanEntry>> qNamesToIdentitiesToModuleMXBeanEntries) {
-
- this.moduleMXBeanEntryMap = Collections.unmodifiableMap(moduleMXBeanEntryMap);
- this.modulesToSources = Collections.unmodifiableMap(modulesToSources);
- this.qNamesToIdentitiesToModuleMXBeanEntries = Collections.unmodifiableMap(qNamesToIdentitiesToModuleMXBeanEntries);
- }
-
- public static YangStoreSnapshotImpl copy(YangStoreSnapshot yangStoreSnapshot) {
- return new YangStoreSnapshotImpl(
- yangStoreSnapshot.getModuleMXBeanEntryMap(),
- yangStoreSnapshot.getModulesToSources(),
- yangStoreSnapshot.getQNamesToIdentitiesToModuleMXBeanEntries());
- }
-
- /**
- * @return all loaded config modules. Key of outer map is namespace of yang file.
- * Key of inner map is name of module entry. Value is module entry.
- */
- @Override
- public Map<String, Map<String, ModuleMXBeanEntry>> getModuleMXBeanEntryMap() {
- return moduleMXBeanEntryMap;
- }
-
- @Override
- public Map<QName, Map<String, ModuleMXBeanEntry>> getQNamesToIdentitiesToModuleMXBeanEntries() {
- return qNamesToIdentitiesToModuleMXBeanEntries;
- }
-
- @Override
- public Set<Module> getModules() {
- return modulesToSources.keySet();
- }
-
- @Override
- public String getModuleSource(Module module) {
- String result = modulesToSources.get(module);
- if (result == null) {
- logger.trace("Cannot find module {} in {}", module, modulesToSources);
- throw new IllegalArgumentException("Module not found in this snapshot:" + module);
- }
- return result;
- }
-
- @Override
- public Map<Module, String> getModulesToSources() {
- return modulesToSources;
- }
-
- @Override
- public int countModuleMXBeanEntries() {
- int i = 0;
- for (Map<String, ModuleMXBeanEntry> value : moduleMXBeanEntryMap
- .values()) {
- i += value.keySet().size();
- }
- return i;
- }
-
- @Override
- public void close() {
- // TODO: reference counting
- }
-
-}
+++ /dev/null
-/*
- * Copyright (c) 2013 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.controller.config.yang.store.impl;
-
-import com.google.common.base.Optional;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.opendaylight.controller.config.yang.store.api.YangStoreException;
-import org.opendaylight.controller.config.yang.store.api.YangStoreSnapshot;
-import org.opendaylight.yangtools.yang.model.api.Module;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.BundleListener;
-
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Pattern;
-
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyCollectionOf;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-
-public class ExtenderYangTrackerCustomizerTest {
-
-
- private ExtenderYangTracker tested;
- @Mock
- private MbeParser parser;
- @Mock
- private YangStoreSnapshotImpl yangStoreSnapshot;
- @Mock
- private BundleContext bundleContext;
-
- private Map<String, Map.Entry<Module, String>> moduleMap = Maps.newHashMap();
-
- @Before
- public void setUp() throws YangStoreException {
-
- moduleMap.put("1", new Map.Entry<Module, String>() {
- @Override
- public Module getKey() {
- return mock(Module.class);
- }
-
- @Override
- public String getValue() {
- return "v";
- }
-
- @Override
- public String setValue(String value) {
- return "v";
- }
- });
-
- MockitoAnnotations.initMocks(this);
- doNothing().when(bundleContext).addBundleListener(any(BundleListener.class));
- doReturn(new Bundle[0]).when(bundleContext).getBundles();
- tested = new ExtenderYangTracker(parser, Optional.<Pattern>absent(), bundleContext);
- doReturn(yangStoreSnapshot).when(parser).parseYangFiles(
- anyCollectionOf(InputStream.class));
- doReturn(22).when(yangStoreSnapshot).countModuleMXBeanEntries();
- doReturn("mock yang store").when(yangStoreSnapshot).toString();
- doNothing().when(yangStoreSnapshot).close();
- doReturn(Collections.emptyMap()).when(yangStoreSnapshot).getModuleMXBeanEntryMap();
- doReturn(Collections.emptyMap()).when(yangStoreSnapshot).getModulesToSources();
- doReturn(Collections.emptyMap()).when(yangStoreSnapshot).getQNamesToIdentitiesToModuleMXBeanEntries();
- }
-
- @Test
- public void testCache() throws MalformedURLException, YangStoreException,
- InterruptedException {
- Bundle bundle = getMockedBundle(5, false);
- tested.addingBundle(bundle, null);
- bundle = getMockedBundle(2, false);
- tested.addingBundle(bundle, null);
- bundle = getMockedBundle(10, false);
- tested.addingBundle(bundle, null);
- YangStoreSnapshot returnedStore;
-
- returnedStore = tested.getYangStoreSnapshot();
-
-
- tested.removedBundle(bundle, null, null);
- tested.getYangStoreSnapshot();
-
- bundle = getMockedBundle(10, false);
- tested.addingBundle(bundle, null);
-
- for(int i = 0; i< 20; i++){
- tested.getYangStoreSnapshot();
- }
-
- verify(parser, times(5)).parseYangFiles(anyCollectionOf(InputStream.class));
-
- returnedStore = tested.getYangStoreSnapshot();
-
- verifyNoMoreInteractions(parser);
- }
-
- int bundleCounter = 1;
-
- private Bundle getMockedBundle(int sizeOfUrls, boolean system)
- throws MalformedURLException {
- Bundle mock = mock(Bundle.class);
- doReturn(32).when(mock).getState();//mock just for logging
-
- List<URL> urls = Lists.newArrayList();
- for (int i = 0; i < sizeOfUrls; i++) {
- urls.add(new URL("http://127.0." + bundleCounter++ + "." + i));
- }
- Enumeration<URL> abc = new TestEnumeration(urls);
-
- doReturn(abc).when(mock).findEntries("META-INF/yang", "*.yang", false);
- if (system)
- doReturn(0L).when(mock).getBundleId();
- else
- doReturn(1L).when(mock).getBundleId();
-
- doReturn("mockedBundle").when(mock).toString();
- doReturn("mockedBundle").when(mock).getSymbolicName();
-
- return mock;
- }
-
- private static final class TestEnumeration implements Enumeration<URL> {
-
- private final List<URL> urls;
- int currentPos = 0;
-
- public TestEnumeration(List<URL> urls) {
- this.urls = urls;
- }
-
- @Override
- public boolean hasMoreElements() {
- try {
- urls.get(currentPos);
- } catch (IndexOutOfBoundsException e) {
- return false;
- }
- return true;
- }
-
- @Override
- public URL nextElement() {
- URL url = urls.get(currentPos++);
- return url;
- }
-
- }
-}
<plugin>
<groupId>org.opendaylight.yangtools</groupId>
<artifactId>yang-maven-plugin</artifactId>
- <executions>
- <execution>
- <id>config</id>
- <goals>
- <goal>generate-sources</goal>
- </goals>
- <configuration>
- <yangFilesRootDir>src/main/yang</yangFilesRootDir>
- <codeGenerators>
- <generator>
- <codeGeneratorClass>
- org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
- </codeGeneratorClass>
- <outputBaseDir>${jmxGeneratorPath}</outputBaseDir>
- <additionalConfiguration>
- <namespaceToPackage1>
- urn:opendaylight:params:xml:ns:yang:controller==org.opendaylight.controller.config.yang
- </namespaceToPackage1>
- </additionalConfiguration>
- </generator>
- </codeGenerators>
- <inspectDependencies>true</inspectDependencies>
- </configuration>
- </execution>
-
- <execution>
- <id>types</id>
- <goals>
- <goal>generate-sources</goal>
- </goals>
- <configuration>
- <yangFilesRootDir>src/main/yang/types</yangFilesRootDir>
- <codeGenerators>
- <generator>
- <codeGeneratorClass>
- org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl
- </codeGeneratorClass>
- <outputBaseDir>
- ${project.build.directory}/generated-sources/sal
- </outputBaseDir>
- </generator>
- </codeGenerators>
- <inspectDependencies>true</inspectDependencies>
- </configuration>
- </execution>
- </executions>
- <dependencies>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>yang-jmx-generator-plugin</artifactId>
- <version>${config.version}</version>
- </dependency>
-
- <dependency>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>maven-sal-api-gen-plugin</artifactId>
- <version>${yangtools.version}</version>
- </dependency>
- </dependencies>
</plugin>
<plugin>
<groupId>org.opendaylight.controller</groupId>
}
public void started() {
- String schemeStr = System.getProperty("connection.scheme");
- for (ConnectionMgmtScheme scheme : ConnectionMgmtScheme.values()) {
- AbstractScheme schemeImpl = SchemeFactory.getScheme(scheme,
- clusterServices);
- if (schemeImpl != null) {
- schemes.put(scheme, schemeImpl);
- if (scheme.name().equalsIgnoreCase(schemeStr)) {
- activeScheme = scheme;
- }
- }
- }
connectionEventThread.start();
"ConnectionEvent Thread");
this.connectionEvents = new LinkedBlockingQueue<ConnectionMgmtEvent>();
schemes = new ConcurrentHashMap<ConnectionMgmtScheme, AbstractScheme>();
+
+ String schemeStr = System.getProperty("connection.scheme");
+ for (ConnectionMgmtScheme scheme : ConnectionMgmtScheme.values()) {
+ AbstractScheme schemeImpl = SchemeFactory.getScheme(scheme, clusterServices);
+ if (schemeImpl != null) {
+ schemes.put(scheme, schemeImpl);
+ if (scheme.name().equalsIgnoreCase(schemeStr)) {
+ activeScheme = scheme;
+ }
+ }
+ }
}
public void stopping() {
}
/*
- * Clustering Services' doesnt provide the existing states in the cache
+ * Clustering Services doesn't provide the existing states in the cache
* update callbacks. Hence, using a scratch local cache to maintain the
* existing state.
*/
return;
Set<InetAddress> existingControllers = existingConnections.get(node);
if (existingControllers != null) {
- logger.debug(
- "Processing Update for : {} NewControllers : {} existingControllers : {}",
- node, newControllers.toString(),
- existingControllers.toString());
+ logger.debug("Processing Update for : {} NewControllers : {} existingControllers : {}", node,
+ newControllers.toString(), existingControllers.toString());
if (newControllers.size() < existingControllers.size()) {
- Set<InetAddress> removed = new HashSet<InetAddress>(
- existingControllers);
+ Set<InetAddress> removed = new HashSet<InetAddress>(existingControllers);
if (removed.removeAll(newControllers)) {
logger.debug("notifyNodeDisconnectFromMaster({})", node);
notifyNodeDisconnectedEvent(node);
}
}
} else {
- logger.debug("Ignoring the Update for : {} NewControllers : {}",
- node, newControllers.toString());
+ logger.debug("Ignoring the Update for : {} NewControllers : {}", node, newControllers.toString());
}
existingConnections.put(node, newControllers);
}
public void entryDeleted(Node key, String cacheName, boolean originLocal) {
if (originLocal)
return;
- logger.debug("Deleted : {} cache : {}", key, cacheName);
+ logger.debug("Deleted entry {} from cache : {}", key, cacheName);
notifyNodeDisconnectedEvent(key);
}
allocateCaches();
retrieveCaches();
} else {
- log.error("Couldn't retrieve caches for scheme %s. Clustering service unavailable", name);
+ log.error("Couldn't retrieve caches for scheme {}. Clustering service unavailable", name);
}
}
log.error("An error occured",e);
}
}
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((name == null) ? 0 : name.hashCode());
+ result = prime * result + ((nodeConnections == null) ? 0 : nodeConnections.hashCode());
+ result = prime * result + ((nodeConnectionsCacheName == null) ? 0 : nodeConnectionsCacheName.hashCode());
+ return result;
+ }
+
+ /* (non-Javadoc)
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (!(obj instanceof AbstractScheme)) {
+ return false;
+ }
+ AbstractScheme other = (AbstractScheme) obj;
+ if (name == null) {
+ if (other.name != null) {
+ return false;
+ }
+ } else if (!name.equals(other.name)) {
+ return false;
+ }
+ if (nodeConnections == null) {
+ if (other.nodeConnections != null) {
+ return false;
+ }
+ } else if (!nodeConnections.equals(other.nodeConnections)) {
+ return false;
+ }
+ if (nodeConnectionsCacheName == null) {
+ if (other.nodeConnectionsCacheName != null) {
+ return false;
+ }
+ } else if (!nodeConnectionsCacheName.equals(other.nodeConnectionsCacheName)) {
+ return false;
+ }
+ return true;
+ }
}
<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <prerequisites>
- <maven>3.0</maven>
- </prerequisites>
- <scm>
- <connection>scm:git:ssh://git.opendaylight.org:29418/controller.git</connection>
- <developerConnection>scm:git:ssh://git.opendaylight.org:29418/controller.git</developerConnection>
- <url>https://wiki.opendaylight.org/view/OpenDaylight_Controller:Main</url>
- <tag>HEAD</tag>
- </scm>
- <parent>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>commons.opendaylight</artifactId>
- <version>1.4.2-SNAPSHOT</version>
- <relativePath>../../commons/opendaylight</relativePath>
- </parent>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <prerequisites>
+ <maven>3.0</maven>
+ </prerequisites>
+ <scm>
+ <connection>scm:git:ssh://git.opendaylight.org:29418/controller.git</connection>
+ <developerConnection>scm:git:ssh://git.opendaylight.org:29418/controller.git</developerConnection>
+ <url>https://wiki.opendaylight.org/view/OpenDaylight_Controller:Main</url>
+ <tag>HEAD</tag>
+ </scm>
+ <parent>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>commons.opendaylight</artifactId>
+ <version>1.4.2-SNAPSHOT</version>
+ <relativePath>../../commons/opendaylight</relativePath>
+ </parent>
+ <artifactId>distribution.opendaylight</artifactId>
+ <version>0.1.2-SNAPSHOT</version>
+ <packaging>pom</packaging>
- <profiles>
- <profile>
- <id>notduringrelease</id>
- <activation>
- <property>
- <name>!DOINGRELEASE</name>
- </property>
- </activation>
- <dependencies>
- <!-- md-sal -->
+
+ <profiles>
+ <profile>
+ <id>notduringrelease</id>
+ <activation>
+ <property>
+ <name>!DOINGRELEASE</name>
+ </property>
+ </activation>
+ <dependencies>
+ <!-- md-sal -->
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-common</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-common-util</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-netconf-connector</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-core-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-broker-impl</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-remote</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-restconf-broker</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-core-spi</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-common-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-common-impl</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-binding-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-binding-config</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-binding-broker-impl</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-compatibility</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-connector-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-rest-connector</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller.model</groupId>
+ <artifactId>model-inventory</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller.model</groupId>
+ <artifactId>model-flow-base</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller.model</groupId>
+ <artifactId>model-flow-service</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller.model</groupId>
+ <artifactId>model-flow-statistics</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller.model</groupId>
+ <artifactId>model-flow-management</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller.md</groupId>
+ <artifactId>inventory-manager</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller.md</groupId>
+ <artifactId>forwardingrules-manager</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller.md</groupId>
+ <artifactId>topology-lldp-discovery</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller.md</groupId>
+ <artifactId>topology-manager</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller.model</groupId>
+ <artifactId>model-topology</artifactId>
+ <version>1.1-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools.model</groupId>
+ <artifactId>ietf-topology</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-binding-util</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller.md</groupId>
+ <artifactId>statistics-manager</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>concepts</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>protocol-framework</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>concepts</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>restconf-client-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>restconf-client-impl</artifactId>
+ </dependency>
+
+ <!-- clustering -->
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>remoterpc-routingtable.implementation</artifactId>
+ <version>${mdsal.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal-remoterpc-connector</artifactId>
+ </dependency>
+
+ <!-- config-->
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>config-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>config-manager</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>yang-jmx-generator</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>logback-config</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>config-persister-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>config-persister-file-adapter</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>config-persister-file-xml-adapter</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>config-persister-directory-adapter</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>config-persister-directory-xml-adapter</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>config-persister-directory-autodetect-adapter</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>shutdown-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>shutdown-impl</artifactId>
+ </dependency>
+
+ <!-- Netconf -->
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>netconf-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>netconf-impl</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>netconf-util</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>netconf-client</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>netconf-mapping-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>netconf-ssh</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>config-netconf-connector</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>netconf-monitoring</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>ietf-netconf-monitoring</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>${project.groupId}</groupId>
+ <artifactId>ietf-netconf-monitoring-extension</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>config-persister-impl</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.servicemix.bundles</groupId>
+ <artifactId>org.apache.servicemix.bundles.xerces</artifactId>
+ <version>2.11.0_1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.birt.runtime.3_7_1</groupId>
+ <artifactId>org.apache.xml.resolver</artifactId>
+ <version>1.2.0</version>
+ </dependency>
+
+ <!-- threadpool -->
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>threadpool-config-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>netty-config-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>threadpool-config-impl</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>netty-threadgroup-config</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>netty-event-executor-config</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>netty-timer-config</artifactId>
+ </dependency>
+
+ <!-- toaster example I'm pretty sure we should trim -->
+ <dependency>
+ <groupId>org.opendaylight.controller.samples</groupId>
+ <artifactId>sample-toaster</artifactId>
+ <version>${mdsal.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller.samples</groupId>
+ <artifactId>sample-toaster-consumer</artifactId>
+ <version>${mdsal.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller.samples</groupId>
+ <artifactId>sample-toaster-provider</artifactId>
+ <version>${mdsal.version}</version>
+ </dependency>
+ <!-- yangtools dependencies I'm pretty sure we can trim -->
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>yang-binding</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>binding-type-provider</artifactId>
+ <version>${yangtools.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>binding-generator-spi</artifactId>
+ <version>${yangtools.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>binding-generator-api</artifactId>
+ <version>${yangtools.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>binding-generator-impl</artifactId>
+ <version>${yangtools.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>binding-generator-util</artifactId>
+ <version>${yangtools.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>binding-model-api</artifactId>
+ <version>${yangtools.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-lang</groupId>
+ <artifactId>commons-lang</artifactId>
+ <version>2.4</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.opendaylight.yangtools.thirdparty</groupId>
+ <artifactId>antlr4-runtime-osgi-nohead</artifactId>
+ <version>4.0</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools.thirdparty</groupId>
+ <artifactId>xtend-lib-osgi</artifactId>
+ <version>2.4.3</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>yang-parser-api</artifactId>
+ <version>${yangtools.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>yang-model-util</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>yang-parser-impl</artifactId>
+ <version>${yangtools.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>yang-common</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>yang-data-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>yang-data-impl</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>yang-data-util</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>yang-model-api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools.model</groupId>
+ <artifactId>yang-ext</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller.thirdparty</groupId>
+ <artifactId>ganymed</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.zeromq</groupId>
+ <artifactId>jeromq</artifactId>
+ <version>0.3.1</version>
+ </dependency>
+ <!-- yang model dependencies -->
+ <dependency>
+ <groupId>org.opendaylight.yangtools.model</groupId>
+ <artifactId>ietf-inet-types</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools.model</groupId>
+ <artifactId>ietf-yang-types</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools.model</groupId>
+ <artifactId>opendaylight-l2-types</artifactId>
+ </dependency>
+ </dependencies>
+ </profile>
+ <profile>
+ <id>integrationtests</id>
+ <activation>
+ <activeByDefault>false</activeByDefault>
+ </activation>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <version>2.8</version>
+ <dependencies>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sanitytest</artifactId>
+ <version>${controller.version}</version>
+ </dependency>
+ </dependencies>
+ <executions>
+ <execution>
+ <id>copy</id>
+ <phase>package</phase>
+ <goals>
+ <goal>copy</goal>
+ </goals>
+ </execution>
+ </executions>
+ <configuration>
+ <artifactItems>
+ <artifactItem>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sanitytest</artifactId>
+ <type>jar</type>
+ </artifactItem>
+ </artifactItems>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>exec-maven-plugin</artifactId>
+ <version>1.2.1</version>
+ <executions>
+ <execution>
+ <id>sanity-test</id>
+ <phase>package</phase>
+ <goals>
+ <goal>exec</goal>
+ </goals>
+ </execution>
+ </executions>
+ <configuration>
+ <executable>${java.home}/bin/java</executable>
+ <arguments>
+ <argument>-cp</argument>
+ <argument>./target/dependency/*</argument>
+ <argument>org.opendaylight.controller.distribution.Sanity</argument>
+ </arguments>
+ <environmentVariables>
+ <JAVA_HOME>
+ ${java.home}
+ </JAVA_HOME>
+ </environmentVariables>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+ <dependencies>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sanitytest</artifactId>
+ </dependency>
+ </dependencies>
+ </profile>
+ </profiles>
+
+
+ <dependencies>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>forwarding.staticrouting</artifactId>
+ </dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal-common</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>clustering.services</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal-common-util</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>clustering.services-implementation</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal-netconf-connector</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>configuration</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal-core-api</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>configuration.implementation</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal-broker-impl</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>routing.dijkstra_implementation</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal-remote</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>arphandler</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal-restconf-broker</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>hosttracker</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal-core-spi</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>hosttracker.implementation</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal-common-api</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>containermanager</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal-common-impl</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>containermanager.implementation</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal-binding-api</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>appauth</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal-binding-config</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>switchmanager</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal-binding-broker-impl</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>switchmanager.implementation</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal-compatibility</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>statisticsmanager</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal-connector-api</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>statisticsmanager.implementation</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal-rest-connector</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>topologymanager</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller.model</groupId>
- <artifactId>model-inventory</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>usermanager</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller.model</groupId>
- <artifactId>model-flow-base</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>usermanager.implementation</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller.model</groupId>
- <artifactId>model-flow-service</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>connectionmanager</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller.model</groupId>
- <artifactId>model-flow-statistics</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>connectionmanager.implementation</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller.model</groupId>
- <artifactId>model-flow-management</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>security</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller.md</groupId>
- <artifactId>inventory-manager</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>forwardingrulesmanager</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller.md</groupId>
- <artifactId>forwardingrules-manager</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>forwardingrulesmanager.implementation</artifactId>
+ </dependency>
+
+ <!-- SAL bundles -->
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller.md</groupId>
- <artifactId>topology-lldp-discovery</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal.implementation</artifactId>
</dependency>
+
+ <!-- SAL Extension bundles -->
+
<dependency>
- <groupId>org.opendaylight.controller.md</groupId>
- <artifactId>topology-manager</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal.connection</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller.model</groupId>
- <artifactId>model-topology</artifactId>
- <version>1.1-SNAPSHOT</version>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal.connection.implementation</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.yangtools.model</groupId>
- <artifactId>ietf-topology</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal.networkconfiguration</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal-binding-util</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal.networkconfiguration.implementation</artifactId>
</dependency>
+
+ <!-- Web bundles -->
+
<dependency>
- <groupId>org.opendaylight.controller.md</groupId>
- <artifactId>statistics-manager</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>web</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>concepts</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>flows.web</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>protocol-framework</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>devices.web</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>concepts</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>troubleshoot.web</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>restconf-client-api</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>topology.web</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>restconf-client-impl</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>osgi-brandfragment.web</artifactId>
</dependency>
- <!-- clustering -->
+ <!-- Neutron -->
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>networkconfig.neutron</artifactId>
+ </dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>remoterpc-routingtable.implementation</artifactId>
- <version>${mdsal.version}</version>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>networkconfig.neutron.implementation</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal-remoterpc-connector</artifactId>
- <version>${mdsal.version}</version>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>networkconfig.neutron.northbound</artifactId>
</dependency>
- <!-- config-->
+ <!-- Northbound bundles -->
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>config-api</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>commons.northbound</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>config-manager</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>bundlescanner</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>yang-jmx-generator</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>bundlescanner.implementation</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>yang-store-api</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>topology.northbound</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>yang-store-impl</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>forwarding.staticrouting.northbound</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>logback-config</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>statistics.northbound</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>config-persister-api</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>flowprogrammer.northbound</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>config-persister-file-adapter</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>hosttracker.northbound</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>config-persister-file-xml-adapter</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>subnets.northbound</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>config-persister-directory-adapter</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>switchmanager.northbound</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>config-persister-directory-xml-adapter</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>containermanager.northbound</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>config-persister-directory-autodetect-adapter</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>networkconfig.bridgedomain.northbound</artifactId>
</dependency>
-
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>shutdown-api</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>httpservice-bridge</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>shutdown-impl</artifactId>
+ <groupId>org.jolokia</groupId>
+ <artifactId>jolokia-osgi</artifactId>
</dependency>
-
- <!-- Netconf -->
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>netconf-api</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>jolokia-bridge</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>netconf-impl</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>connectionmanager.northbound</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>netconf-util</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>usermanager.northbound</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>netconf-client</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>controllermanager.northbound</artifactId>
</dependency>
+ <!-- Debug and logging -->
+
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>netconf-mapping-api</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>logging.bridge</artifactId>
</dependency>
+
+ <!-- Southbound bundles -->
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>netconf-ssh</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>protocol_plugins.openflow</artifactId>
</dependency>
+
+ <!-- samples -->
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>config-netconf-connector</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>samples.loadbalancer</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>netconf-monitoring</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>samples.loadbalancer.northbound</artifactId>
</dependency>
<dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>ietf-netconf-monitoring</artifactId>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>samples.simpleforwarding</artifactId>
</dependency>
+
+ <!-- Third party depedencies -->
<dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>ietf-netconf-monitoring-extension</artifactId>
+ <groupId>org.slf4j</groupId>
+ <artifactId>jcl-over-slf4j</artifactId>
</dependency>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>config-persister-impl</artifactId>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
- <groupId>org.apache.servicemix.bundles</groupId>
- <artifactId>org.apache.servicemix.bundles.xerces</artifactId>
- <version>2.11.0_1</version>
+ <groupId>org.slf4j</groupId>
+ <artifactId>log4j-over-slf4j</artifactId>
</dependency>
<dependency>
- <groupId>org.eclipse.birt.runtime.3_7_1</groupId>
- <artifactId>org.apache.xml.resolver</artifactId>
- <version>1.2.0</version>
+ <groupId>ch.qos.logback</groupId>
+ <artifactId>logback-core</artifactId>
</dependency>
-
- <!-- threadpool -->
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>threadpool-config-api</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>netty-config-api</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>threadpool-config-impl</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>netty-threadgroup-config</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>netty-event-executor-config</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>netty-timer-config</artifactId>
- </dependency>
-
- <!-- toaster example I'm pretty sure we should trim -->
- <dependency>
- <groupId>org.opendaylight.controller.samples</groupId>
- <artifactId>sample-toaster</artifactId>
- <version>${mdsal.version}</version>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller.samples</groupId>
- <artifactId>sample-toaster-consumer</artifactId>
- <version>${mdsal.version}</version>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller.samples</groupId>
- <artifactId>sample-toaster-provider</artifactId>
- <version>${mdsal.version}</version>
- </dependency>
- <!-- yangtools dependencies I'm pretty sure we can trim -->
- <dependency>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>yang-binding</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>binding-type-provider</artifactId>
- <version>${yangtools.version}</version>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>binding-generator-spi</artifactId>
- <version>${yangtools.version}</version>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>binding-generator-api</artifactId>
- <version>${yangtools.version}</version>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>binding-generator-impl</artifactId>
- <version>${yangtools.version}</version>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>binding-generator-util</artifactId>
- <version>${yangtools.version}</version>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>binding-model-api</artifactId>
- <version>${yangtools.version}</version>
- </dependency>
- <dependency>
- <groupId>commons-lang</groupId>
- <artifactId>commons-lang</artifactId>
- <version>2.4</version>
- </dependency>
-
- <dependency>
- <groupId>org.opendaylight.yangtools.thirdparty</groupId>
- <artifactId>antlr4-runtime-osgi-nohead</artifactId>
- <version>4.0</version>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.yangtools.thirdparty</groupId>
- <artifactId>xtend-lib-osgi</artifactId>
- <version>2.4.3</version>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>yang-parser-api</artifactId>
- <version>${yangtools.version}</version>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>yang-model-util</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>yang-parser-impl</artifactId>
- <version>${yangtools.version}</version>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>yang-common</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>yang-data-api</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>yang-data-impl</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>yang-data-util</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.yangtools</groupId>
- <artifactId>yang-model-api</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.yangtools.model</groupId>
- <artifactId>yang-ext</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller.thirdparty</groupId>
- <artifactId>ganymed</artifactId>
- </dependency>
- <dependency>
- <groupId>org.zeromq</groupId>
- <artifactId>jeromq</artifactId>
- <version>0.3.1</version>
- </dependency>
- <!-- yang model dependencies -->
- <dependency>
- <groupId>org.opendaylight.yangtools.model</groupId>
- <artifactId>ietf-inet-types</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.yangtools.model</groupId>
- <artifactId>ietf-yang-types</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.yangtools.model</groupId>
- <artifactId>opendaylight-l2-types</artifactId>
- </dependency>
- </dependencies>
- </profile>
- <profile>
- <id>integrationtests</id>
- <activation>
- <activeByDefault>false</activeByDefault>
- </activation>
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-dependency-plugin</artifactId>
- <version>2.8</version>
- <dependencies>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sanitytest</artifactId>
- <version>${controller.version}</version>
- </dependency>
- </dependencies>
- <executions>
- <execution>
- <id>copy</id>
- <phase>package</phase>
- <goals>
- <goal>copy</goal>
- </goals>
- </execution>
- </executions>
- <configuration>
- <artifactItems>
- <artifactItem>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sanitytest</artifactId>
- <type>jar</type>
- </artifactItem>
- </artifactItems>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>exec-maven-plugin</artifactId>
- <version>1.2.1</version>
- <executions>
- <execution>
- <id>sanity-test</id>
- <phase>package</phase>
- <goals>
- <goal>exec</goal>
- </goals>
- </execution>
- </executions>
- <configuration>
- <executable>${java.home}/bin/java</executable>
- <arguments>
- <argument>-cp</argument>
- <argument>./target/dependency/*</argument>
- <argument>org.opendaylight.controller.distribution.Sanity</argument>
- </arguments>
- <environmentVariables>
- <JAVA_HOME>
- ${java.home}
- </JAVA_HOME>
- </environmentVariables>
- </configuration>
- </plugin>
- </plugins>
- </build>
- <dependencies>
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sanitytest</artifactId>
+ <groupId>ch.qos.logback</groupId>
+ <artifactId>logback-classic</artifactId>
</dependency>
- </dependencies>
- </profile>
- </profiles>
-
- <artifactId>distribution.opendaylight</artifactId>
- <version>0.1.2-SNAPSHOT</version>
- <packaging>pom</packaging>
-
- <dependencies>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>forwarding.staticrouting</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>clustering.services</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>clustering.services-implementation</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>configuration</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>configuration.implementation</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>routing.dijkstra_implementation</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>arphandler</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>hosttracker</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>hosttracker.implementation</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>containermanager</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>containermanager.implementation</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>appauth</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>switchmanager</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>switchmanager.implementation</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>statisticsmanager</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>statisticsmanager.implementation</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>topologymanager</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>usermanager</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>usermanager.implementation</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>connectionmanager</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>connectionmanager.implementation</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>security</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>forwardingrulesmanager</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>forwardingrulesmanager.implementation</artifactId>
- </dependency>
-
- <!-- SAL bundles -->
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal.implementation</artifactId>
- </dependency>
-
- <!-- SAL Extension bundles -->
-
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal.connection</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal.connection.implementation</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal.networkconfiguration</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal.networkconfiguration.implementation</artifactId>
- </dependency>
-
- <!-- Web bundles -->
-
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>flows.web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>devices.web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>troubleshoot.web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>topology.web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>osgi-brandfragment.web</artifactId>
- </dependency>
-
- <!-- Neutron -->
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>networkconfig.neutron</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>networkconfig.neutron.implementation</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>networkconfig.neutron.northbound</artifactId>
- </dependency>
-
- <!-- Northbound bundles -->
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>commons.northbound</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>bundlescanner</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>bundlescanner.implementation</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>topology.northbound</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>forwarding.staticrouting.northbound</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>statistics.northbound</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>flowprogrammer.northbound</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>hosttracker.northbound</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>subnets.northbound</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>switchmanager.northbound</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>containermanager.northbound</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>networkconfig.bridgedomain.northbound</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>httpservice-bridge</artifactId>
- </dependency>
- <dependency>
- <groupId>org.jolokia</groupId>
- <artifactId>jolokia-osgi</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>jolokia-bridge</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>connectionmanager.northbound</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>usermanager.northbound</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>controllermanager.northbound</artifactId>
- </dependency>
- <!-- Debug and logging -->
-
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>logging.bridge</artifactId>
- </dependency>
- <!-- Southbound bundles -->
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>protocol_plugins.openflow</artifactId>
- </dependency>
-
- <!-- samples -->
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>samples.loadbalancer</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>samples.loadbalancer.northbound</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>samples.simpleforwarding</artifactId>
- </dependency>
-
- <!-- Third party depedencies -->
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>jcl-over-slf4j</artifactId>
- </dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-api</artifactId>
- </dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>log4j-over-slf4j</artifactId>
- </dependency>
- <dependency>
- <groupId>ch.qos.logback</groupId>
- <artifactId>logback-core</artifactId>
- </dependency>
- <dependency>
- <groupId>ch.qos.logback</groupId>
- <artifactId>logback-classic</artifactId>
- </dependency>
-
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-databind</artifactId>
- </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-databind</artifactId>
+ </dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-annotations</artifactId>
- </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-annotations</artifactId>
+ </dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-core</artifactId>
- </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-core</artifactId>
+ </dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.jaxrs</groupId>
- <artifactId>jackson-jaxrs-json-provider</artifactId>
- </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.jaxrs</groupId>
+ <artifactId>jackson-jaxrs-json-provider</artifactId>
+ </dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.jaxrs</groupId>
- <artifactId>jackson-jaxrs-base</artifactId>
- </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.jaxrs</groupId>
+ <artifactId>jackson-jaxrs-base</artifactId>
+ </dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.module</groupId>
- <artifactId>jackson-module-jaxb-annotations</artifactId>
- </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.module</groupId>
+ <artifactId>jackson-module-jaxb-annotations</artifactId>
+ </dependency>
- <dependency>
- <groupId>org.codehaus.jettison</groupId>
- <artifactId>jettison</artifactId>
- </dependency>
- <dependency>
- <groupId>com.google.guava</groupId>
- <artifactId>guava</artifactId>
- </dependency>
- <dependency>
- <groupId>org.javassist</groupId>
- <artifactId>javassist</artifactId>
- </dependency>
- <dependency>
- <groupId>commons-io</groupId>
- <artifactId>commons-io</artifactId>
- </dependency>
- <dependency>
- <groupId>commons-codec</groupId>
- <artifactId>commons-codec</artifactId>
- </dependency>
- <dependency>
- <groupId>commons-fileupload</groupId>
- <artifactId>commons-fileupload</artifactId>
- </dependency>
- <dependency>
- <groupId>commons-net</groupId>
- <artifactId>commons-net</artifactId>
- </dependency>
- <dependency>
- <groupId>equinoxSDK381</groupId>
- <artifactId>javax.servlet</artifactId>
- </dependency>
- <dependency>
- <groupId>equinoxSDK381</groupId>
- <artifactId>javax.servlet.jsp</artifactId>
- </dependency>
- <dependency>
- <groupId>equinoxSDK381</groupId>
- <artifactId>org.eclipse.equinox.ds</artifactId>
- </dependency>
- <dependency>
- <groupId>equinoxSDK381</groupId>
- <artifactId>org.eclipse.equinox.util</artifactId>
- </dependency>
- <dependency>
- <groupId>equinoxSDK381</groupId>
- <artifactId>org.eclipse.osgi.services</artifactId>
- </dependency>
- <dependency>
- <groupId>equinoxSDK381</groupId>
- <artifactId>org.eclipse.osgi</artifactId>
- </dependency>
- <dependency>
- <groupId>equinoxSDK381</groupId>
- <artifactId>org.apache.felix.gogo.command</artifactId>
- </dependency>
- <dependency>
- <groupId>equinoxSDK381</groupId>
- <artifactId>org.apache.felix.gogo.runtime</artifactId>
- </dependency>
- <dependency>
- <groupId>equinoxSDK381</groupId>
- <artifactId>org.apache.felix.gogo.shell</artifactId>
- </dependency>
- <dependency>
- <groupId>equinoxSDK381</groupId>
- <artifactId>org.eclipse.equinox.cm</artifactId>
- </dependency>
- <dependency>
- <groupId>equinoxSDK381</groupId>
- <artifactId>org.eclipse.equinox.console</artifactId>
- </dependency>
- <dependency>
- <groupId>equinoxSDK381</groupId>
- <artifactId>org.eclipse.equinox.launcher</artifactId>
- </dependency>
- <!-- Gemini Web -->
- <dependency>
- <groupId>geminiweb</groupId>
- <artifactId>org.eclipse.gemini.web.core</artifactId>
- </dependency>
- <dependency>
- <groupId>geminiweb</groupId>
- <artifactId>org.eclipse.gemini.web.extender</artifactId>
- </dependency>
- <dependency>
- <groupId>geminiweb</groupId>
- <artifactId>org.eclipse.gemini.web.tomcat</artifactId>
- </dependency>
- <dependency>
- <groupId>geminiweb</groupId>
- <artifactId>org.eclipse.virgo.kernel.equinox.extensions</artifactId>
- </dependency>
- <dependency>
- <groupId>geminiweb</groupId>
- <artifactId>org.eclipse.virgo.util.common</artifactId>
- </dependency>
- <dependency>
- <groupId>geminiweb</groupId>
- <artifactId>org.eclipse.virgo.util.io</artifactId>
- </dependency>
- <dependency>
- <groupId>geminiweb</groupId>
- <artifactId>org.eclipse.virgo.util.math</artifactId>
- </dependency>
- <dependency>
- <groupId>geminiweb</groupId>
- <artifactId>org.eclipse.virgo.util.osgi</artifactId>
- </dependency>
- <dependency>
- <groupId>geminiweb</groupId>
- <artifactId>org.eclipse.virgo.util.osgi.manifest</artifactId>
- </dependency>
- <dependency>
- <groupId>geminiweb</groupId>
- <artifactId>org.eclipse.virgo.util.parser.manifest</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.felix</groupId>
- <artifactId>org.apache.felix.dependencymanager</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.felix</groupId>
- <artifactId>org.apache.felix.dependencymanager.shell</artifactId>
- </dependency>
- <dependency>
- <groupId>com.google.code.gson</groupId>
- <artifactId>gson</artifactId>
- </dependency>
- <dependency>
- <groupId>org.jboss.spec.javax.transaction</groupId>
- <artifactId>jboss-transaction-api_1.1_spec</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.felix</groupId>
- <artifactId>org.apache.felix.fileinstall</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.commons</groupId>
- <artifactId>commons-lang3</artifactId>
- </dependency>
- <dependency>
- <groupId>virgomirror</groupId>
- <artifactId>org.eclipse.jdt.core.compiler.batch</artifactId>
- </dependency>
- <dependency>
- <groupId>eclipselink</groupId>
- <artifactId>javax.persistence</artifactId>
- </dependency>
- <dependency>
- <groupId>orbit</groupId>
- <artifactId>javax.activation</artifactId>
- </dependency>
- <dependency>
- <groupId>orbit</groupId>
- <artifactId>javax.annotation</artifactId>
- </dependency>
- <dependency>
- <groupId>orbit</groupId>
- <artifactId>javax.ejb</artifactId>
- </dependency>
- <dependency>
- <groupId>orbit</groupId>
- <artifactId>javax.el</artifactId>
- </dependency>
- <dependency>
- <groupId>orbit</groupId>
- <artifactId>javax.mail.glassfish</artifactId>
- </dependency>
- <dependency>
- <groupId>orbit</groupId>
- <artifactId>javax.xml.rpc</artifactId>
- </dependency>
- <dependency>
- <groupId>orbit</groupId>
- <artifactId>org.apache.catalina</artifactId>
- </dependency>
- <dependency>
- <groupId>orbit</groupId>
- <artifactId>org.apache.catalina.ha</artifactId>
- </dependency>
- <dependency>
- <groupId>orbit</groupId>
- <artifactId>org.apache.catalina.tribes</artifactId>
- </dependency>
- <dependency>
- <groupId>orbit</groupId>
- <artifactId>org.apache.coyote</artifactId>
- </dependency>
- <dependency>
- <groupId>orbit</groupId>
- <artifactId>org.apache.el</artifactId>
- </dependency>
- <dependency>
- <groupId>orbit</groupId>
- <artifactId>org.apache.jasper</artifactId>
- </dependency>
- <dependency>
- <groupId>orbit</groupId>
- <artifactId>org.apache.juli.extras</artifactId>
- </dependency>
- <dependency>
- <groupId>orbit</groupId>
- <artifactId>org.apache.tomcat.api</artifactId>
- </dependency>
- <dependency>
- <groupId>orbit</groupId>
- <artifactId>org.apache.tomcat.util</artifactId>
- </dependency>
- <dependency>
- <groupId>orbit</groupId>
- <artifactId>javax.servlet.jsp.jstl</artifactId>
- </dependency>
- <dependency>
- <groupId>orbit</groupId>
- <artifactId>javax.servlet.jsp.jstl.impl</artifactId>
- </dependency>
- <dependency>
- <groupId>eclipselink</groupId>
- <artifactId>javax.resource</artifactId>
- </dependency>
- <!-- Add Pax Exam -->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>org.springframework.asm</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>org.springframework.aop</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>org.springframework.context</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>org.springframework.context.support</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>org.springframework.core</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>org.springframework.beans</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>org.springframework.expression</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>org.springframework.web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.aopalliance</groupId>
- <artifactId>com.springsource.org.aopalliance</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>org.springframework.web.servlet</artifactId>
- </dependency>
- <!-- Spring security -->
- <dependency>
- <groupId>org.springframework.security</groupId>
- <artifactId>spring-security-config</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.security</groupId>
- <artifactId>spring-security-core</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.security</groupId>
- <artifactId>spring-security-web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.security</groupId>
- <artifactId>spring-security-taglibs</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>org.springframework.transaction</artifactId>
- </dependency>
- <!-- Visual VM hook -->
- <dependency>
- <groupId>org.ow2.chameleon.management</groupId>
- <artifactId>chameleon-mbeans</artifactId>
- </dependency>
- <!-- Jersey for JAXRS -->
- <dependency>
- <groupId>com.sun.jersey</groupId>
- <artifactId>jersey-core</artifactId>
- </dependency>
- <dependency>
- <groupId>com.sun.jersey</groupId>
- <artifactId>jersey-server</artifactId>
- </dependency>
- <dependency>
- <groupId>com.sun.jersey</groupId>
- <artifactId>jersey-client</artifactId>
- </dependency>
+ <dependency>
+ <groupId>org.codehaus.jettison</groupId>
+ <artifactId>jettison</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.javassist</groupId>
+ <artifactId>javassist</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>commons-io</groupId>
+ <artifactId>commons-io</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>commons-codec</groupId>
+ <artifactId>commons-codec</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>commons-fileupload</groupId>
+ <artifactId>commons-fileupload</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>commons-net</groupId>
+ <artifactId>commons-net</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>equinoxSDK381</groupId>
+ <artifactId>javax.servlet</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>equinoxSDK381</groupId>
+ <artifactId>javax.servlet.jsp</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>equinoxSDK381</groupId>
+ <artifactId>org.eclipse.equinox.ds</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>equinoxSDK381</groupId>
+ <artifactId>org.eclipse.equinox.util</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>equinoxSDK381</groupId>
+ <artifactId>org.eclipse.osgi.services</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>equinoxSDK381</groupId>
+ <artifactId>org.eclipse.osgi</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>equinoxSDK381</groupId>
+ <artifactId>org.apache.felix.gogo.command</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>equinoxSDK381</groupId>
+ <artifactId>org.apache.felix.gogo.runtime</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>equinoxSDK381</groupId>
+ <artifactId>org.apache.felix.gogo.shell</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>equinoxSDK381</groupId>
+ <artifactId>org.eclipse.equinox.cm</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>equinoxSDK381</groupId>
+ <artifactId>org.eclipse.equinox.console</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>equinoxSDK381</groupId>
+ <artifactId>org.eclipse.equinox.launcher</artifactId>
+ </dependency>
+ <!-- Gemini Web -->
+ <dependency>
+ <groupId>geminiweb</groupId>
+ <artifactId>org.eclipse.gemini.web.core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>geminiweb</groupId>
+ <artifactId>org.eclipse.gemini.web.extender</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>geminiweb</groupId>
+ <artifactId>org.eclipse.gemini.web.tomcat</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>geminiweb</groupId>
+ <artifactId>org.eclipse.virgo.kernel.equinox.extensions</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>geminiweb</groupId>
+ <artifactId>org.eclipse.virgo.util.common</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>geminiweb</groupId>
+ <artifactId>org.eclipse.virgo.util.io</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>geminiweb</groupId>
+ <artifactId>org.eclipse.virgo.util.math</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>geminiweb</groupId>
+ <artifactId>org.eclipse.virgo.util.osgi</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>geminiweb</groupId>
+ <artifactId>org.eclipse.virgo.util.osgi.manifest</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>geminiweb</groupId>
+ <artifactId>org.eclipse.virgo.util.parser.manifest</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.dependencymanager</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.dependencymanager.shell</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>com.google.code.gson</groupId>
+ <artifactId>gson</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.jboss.spec.javax.transaction</groupId>
+ <artifactId>jboss-transaction-api_1.1_spec</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.fileinstall</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-lang3</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>virgomirror</groupId>
+ <artifactId>org.eclipse.jdt.core.compiler.batch</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>eclipselink</groupId>
+ <artifactId>javax.persistence</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>orbit</groupId>
+ <artifactId>javax.activation</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>orbit</groupId>
+ <artifactId>javax.annotation</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>orbit</groupId>
+ <artifactId>javax.ejb</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>orbit</groupId>
+ <artifactId>javax.el</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>orbit</groupId>
+ <artifactId>javax.mail.glassfish</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>orbit</groupId>
+ <artifactId>javax.xml.rpc</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>orbit</groupId>
+ <artifactId>org.apache.catalina</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>orbit</groupId>
+ <artifactId>org.apache.catalina.ha</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>orbit</groupId>
+ <artifactId>org.apache.catalina.tribes</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>orbit</groupId>
+ <artifactId>org.apache.coyote</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>orbit</groupId>
+ <artifactId>org.apache.el</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>orbit</groupId>
+ <artifactId>org.apache.jasper</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>orbit</groupId>
+ <artifactId>org.apache.juli.extras</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>orbit</groupId>
+ <artifactId>org.apache.tomcat.api</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>orbit</groupId>
+ <artifactId>org.apache.tomcat.util</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>orbit</groupId>
+ <artifactId>javax.servlet.jsp.jstl</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>orbit</groupId>
+ <artifactId>javax.servlet.jsp.jstl.impl</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>eclipselink</groupId>
+ <artifactId>javax.resource</artifactId>
+ </dependency>
+ <!-- Add Pax Exam -->
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>org.springframework.asm</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>org.springframework.aop</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>org.springframework.context</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>org.springframework.context.support</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>org.springframework.core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>org.springframework.beans</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>org.springframework.expression</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>org.springframework.web</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.aopalliance</groupId>
+ <artifactId>com.springsource.org.aopalliance</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>org.springframework.web.servlet</artifactId>
+ </dependency>
+ <!-- Spring security -->
+ <dependency>
+ <groupId>org.springframework.security</groupId>
+ <artifactId>spring-security-config</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.security</groupId>
+ <artifactId>spring-security-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.security</groupId>
+ <artifactId>spring-security-web</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.security</groupId>
+ <artifactId>spring-security-taglibs</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>org.springframework.transaction</artifactId>
+ </dependency>
+ <!-- Visual VM hook -->
+ <dependency>
+ <groupId>org.ow2.chameleon.management</groupId>
+ <artifactId>chameleon-mbeans</artifactId>
+ </dependency>
+ <!-- Jersey for JAXRS -->
+ <dependency>
+ <groupId>com.sun.jersey</groupId>
+ <artifactId>jersey-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>com.sun.jersey</groupId>
+ <artifactId>jersey-server</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>com.sun.jersey</groupId>
+ <artifactId>jersey-client</artifactId>
+ </dependency>
- <dependency>
- <groupId>org.ow2.asm</groupId>
- <artifactId>asm-all</artifactId>
- </dependency>
- <dependency>
- <groupId>org.eclipse.persistence</groupId>
- <artifactId>org.eclipse.persistence.moxy</artifactId>
- </dependency>
- <dependency>
- <groupId>org.eclipse.persistence</groupId>
- <artifactId>org.eclipse.persistence.core</artifactId>
- </dependency>
- <dependency>
- <groupId>org.eclipse.persistence</groupId>
- <artifactId>org.eclipse.persistence.antlr</artifactId>
- </dependency>
+ <dependency>
+ <groupId>org.ow2.asm</groupId>
+ <artifactId>asm-all</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.persistence</groupId>
+ <artifactId>org.eclipse.persistence.moxy</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.persistence</groupId>
+ <artifactId>org.eclipse.persistence.core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.eclipse.persistence</groupId>
+ <artifactId>org.eclipse.persistence.antlr</artifactId>
+ </dependency>
- <dependency>
- <groupId>org.eclipse.equinox.http</groupId>
- <artifactId>servlet</artifactId>
- </dependency>
- <!-- felix webconsole -->
- <dependency>
- <groupId>org.apache.felix</groupId>
- <artifactId>org.apache.felix.webconsole</artifactId>
- <classifier>all</classifier>
- </dependency>
+ <dependency>
+ <groupId>org.eclipse.equinox.http</groupId>
+ <artifactId>servlet</artifactId>
+ </dependency>
+ <!-- felix webconsole -->
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.webconsole</artifactId>
+ <classifier>all</classifier>
+ </dependency>
- <!-- Third parties from opendaylight released -->
- <dependency>
- <groupId>org.opendaylight.controller.thirdparty</groupId>
- <artifactId>net.sf.jung2</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller.thirdparty</groupId>
- <artifactId>org.openflow.openflowj</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller.thirdparty</groupId>
- <artifactId>com.sun.jersey.jersey-servlet</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller.thirdparty</groupId>
- <artifactId>org.apache.catalina.filters.CorsFilter</artifactId>
- </dependency>
+ <!-- Third parties from opendaylight released -->
+ <dependency>
+ <groupId>org.opendaylight.controller.thirdparty</groupId>
+ <artifactId>net.sf.jung2</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller.thirdparty</groupId>
+ <artifactId>org.openflow.openflowj</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller.thirdparty</groupId>
+ <artifactId>com.sun.jersey.jersey-servlet</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller.thirdparty</groupId>
+ <artifactId>org.apache.catalina.filters.CorsFilter</artifactId>
+ </dependency>
- <!--Netty-->
- <dependency>
- <groupId>io.netty</groupId>
- <artifactId>netty-handler</artifactId>
- </dependency>
- <dependency>
- <groupId>io.netty</groupId>
- <artifactId>netty-codec</artifactId>
- </dependency>
- <dependency>
- <groupId>io.netty</groupId>
- <artifactId>netty-buffer</artifactId>
- </dependency>
- <dependency>
- <groupId>io.netty</groupId>
- <artifactId>netty-transport</artifactId>
- </dependency>
- <dependency>
- <groupId>io.netty</groupId>
- <artifactId>netty-common</artifactId>
- </dependency>
- <dependency>
- <groupId>io.netty</groupId>
- <artifactId>netty-codec-http</artifactId>
- </dependency>
+ <!--Netty-->
+ <dependency>
+ <groupId>io.netty</groupId>
+ <artifactId>netty-handler</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>io.netty</groupId>
+ <artifactId>netty-codec</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>io.netty</groupId>
+ <artifactId>netty-buffer</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>io.netty</groupId>
+ <artifactId>netty-transport</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>io.netty</groupId>
+ <artifactId>netty-common</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>io.netty</groupId>
+ <artifactId>netty-codec-http</artifactId>
+ </dependency>
- <!-- testing dependencies I'm pretty sure we should trim -->
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>clustering.test</artifactId>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>commons.httpclient</artifactId>
- </dependency>
- </dependencies>
+ <!-- testing dependencies I'm pretty sure we should trim -->
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>clustering.test</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>commons.httpclient</artifactId>
+ </dependency>
+ </dependencies>
- <build>
- <plugins>
- <plugin>
- <groupId>org.codehaus.mojo</groupId>
- <artifactId>buildnumber-maven-plugin</artifactId>
- <version>1.2</version>
- <executions>
- <execution>
- <phase>validate</phase>
- <goals>
- <goal>create</goal>
- </goals>
- </execution>
- </executions>
- <configuration>
- <doCheck>false</doCheck>
- <doUpdate>false</doUpdate>
- <revisionOnScmFailure>VersionUnknown</revisionOnScmFailure>
- </configuration>
- </plugin>
- <plugin>
- <artifactId>maven-assembly-plugin</artifactId>
- <version>2.3</version>
- <executions>
- <execution>
- <id>distro-assembly</id>
- <phase>package</phase>
- <goals>
- <goal>single</goal>
- </goals>
- <configuration>
- <descriptors>
- <descriptor>src/assemble/bin.xml</descriptor>
- </descriptors>
- <finalName>${project.artifactId}</finalName>
- </configuration>
- </execution>
- </executions>
- </plugin>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>buildnumber-maven-plugin</artifactId>
+ <version>1.2</version>
+ <executions>
+ <execution>
+ <phase>validate</phase>
+ <goals>
+ <goal>create</goal>
+ </goals>
+ </execution>
+ </executions>
+ <configuration>
+ <doCheck>false</doCheck>
+ <doUpdate>false</doUpdate>
+ <revisionOnScmFailure>VersionUnknown</revisionOnScmFailure>
+ </configuration>
+ </plugin>
+ <plugin>
+ <artifactId>maven-assembly-plugin</artifactId>
+ <version>2.3</version>
+ <executions>
+ <execution>
+ <id>distro-assembly</id>
+ <phase>package</phase>
+ <goals>
+ <goal>single</goal>
+ </goals>
+ <configuration>
+ <descriptors>
+ <descriptor>src/assemble/bin.xml</descriptor>
+ </descriptors>
+ <finalName>${project.artifactId}</finalName>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
- <!--Make checkstyle ignore initial xml configuration files by overriding its configuration from parent-->
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-checkstyle-plugin</artifactId>
- <version>${checkstyle.version}</version>
- <configuration>
- <excludes>**\/target\/,**\/bin\/,**\/target-ide\/,**\/configuration\/initial\/</excludes>
- </configuration>
- </plugin>
- </plugins>
- </build>
+ <!--Make checkstyle ignore initial xml configuration files by overriding its configuration from parent-->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-checkstyle-plugin</artifactId>
+ <version>${checkstyle.version}</version>
+ <configuration>
+ <excludes>**\/target\/,**\/bin\/,**\/target-ide\/,**\/configuration\/initial\/</excludes>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
</project>
reference\:file\:../lib/slf4j-api-1.7.2.jar@1:start,\
reference\:file\:../lib/logback-classic-1.0.9.jar@1:start,\
reference\:file\:../lib/logback-core-1.0.9.jar@1:start,\
- reference\:file\:../lib/logging.bridge-0.4.1-SNAPSHOT@1:start,\
+ reference\:file\:../lib/logging.bridge-0.4.2-SNAPSHOT@1:start,\
reference\:file\:../lib/jersey-core-1.17.jar@2:start,\
reference\:file\:../lib/jersey-server-1.17.jar@2:start
netconf.config.persister.2.properties.fileStorage=configuration/current/controller.currentconfig.xml
netconf.config.persister.2.properties.numberOfBackups=1
-yangstore.blacklist=.*controller.model.*
-
# Set Default start level for framework
osgi.bundles.defaultStartLevel=4
# Extra packages to import from the boot class loader
-org.osgi.framework.system.packages.extra=sun.reflect,sun.reflect.misc,sun.misc
+org.osgi.framework.system.packages.extra=sun.reflect,sun.reflect.misc,sun.misc,sun.nio.ch
# This is not Eclipse App
eclipse.ignoreApp=true
# Don't shutdown equinox if the eclipse App has ended,
import org.opendaylight.controller.sal.action.Drop;
import org.opendaylight.controller.sal.action.Enqueue;
import org.opendaylight.controller.sal.action.Flood;
+import org.opendaylight.controller.sal.action.FloodAll;
import org.opendaylight.controller.sal.action.HwPath;
import org.opendaylight.controller.sal.action.Loopback;
import org.opendaylight.controller.sal.action.Output;
continue;
}
+ sstr = Pattern.compile(ActionType.FLOOD_ALL.toString()).matcher(actiongrp);
+ if (sstr.matches()) {
+ actionList.add(new FloodAll());
+ continue;
+ }
+
sstr = Pattern.compile(ActionType.SW_PATH.toString()).matcher(actiongrp);
if (sstr.matches()) {
actionList.add(new SwPath());
static final String ACTIVE_HOST_CACHE = "hosttracker.ActiveHosts";
static final String INACTIVE_HOST_CACHE = "hosttracker.InactiveHosts";
private static final Logger logger = LoggerFactory.getLogger(HostTracker.class);
- protected final Set<IHostFinder> hostFinder = new CopyOnWriteArraySet<IHostFinder>();;
+ protected final Set<IHostFinder> hostFinders = new CopyOnWriteArraySet<IHostFinder>();
protected ConcurrentMap<IHostId, HostNodeConnector> hostsDB;
/*
* Following is a list of hosts which have been requested by NB APIs to be
}
public void setArpHandler(IHostFinder hostFinder) {
- if (this.hostFinder != null) {
- this.hostFinder.add(hostFinder);
- }
+ this.hostFinders.add(hostFinder);
}
public void unsetArpHandler(IHostFinder hostFinder) {
- if (this.hostFinder != null) {
- logger.debug("Arp Handler Service removed!");
- this.hostFinder.remove(hostFinder);
- }
+ logger.debug("Arp Handler Service removed!");
+ this.hostFinders.remove(hostFinder);
}
public void setTopologyManager(ITopologyManager s) {
* already handles the null return
*/
- if (hostFinder == null) {
- logger.debug("Exiting hostFind, null hostFinder");
+ if (hostFinders.isEmpty()) {
+ logger.debug("No available host finders, exiting hostFind()");
return null;
}
logger.debug("hostFind(): Host Not Found for IP: {}, Inititated Host Discovery ...", id);
/* host is not found, initiate a discovery */
- for (IHostFinder hf : hostFinder) {
+ for (IHostFinder hf : hostFinders) {
InetAddress addr = decodeIPFromId(id);
hf.find(addr);
}
for (Entry<IHostId, ARPPending> entry : failedARPReqList.entrySet()) {
ARPPending arphost;
arphost = entry.getValue();
- if (hostFinder == null) {
- logger.warn("ARPHandler Services are not available on subnet addition");
+ if (hostFinders.isEmpty()) {
+ logger.debug("ARPHandler Services are not available on subnet addition");
continue;
}
logger.debug("Sending the ARP from FailedARPReqList fors IP: {}", decodeIPFromId(arphost.getHostId()));
- for (IHostFinder hf : hostFinder) {
+ for (IHostFinder hf : hostFinders) {
hf.find(decodeIPFromId(arphost.getHostId()));
}
}
* next one. Before sending the ARP, check if ARPHandler
* is available or not
*/
- if (hostFinder == null) {
+ if (hostFinders.isEmpty()) {
logger.warn("ARPHandler Services are not available for Outstanding ARPs");
continue;
}
- for (IHostFinder hf : hostFinder) {
+ for (IHostFinder hf : hostFinders) {
hf.find(decodeIPFromId(arphost.getHostId()));
}
arphost.sent_count++;
HexEncode.bytesToHexString(host.getDataLayerAddressBytes()) });
}
host.setArpSendCountDown(arp_cntdown);
- if (hostFinder == null) {
+ if (hostFinders.isEmpty()) {
/*
* If hostfinder is not available, then can't send
* the probe. However, continue the age out the
logger.trace("ARPHandler is not avaialable, can't send the probe");
continue;
}
- for (IHostFinder hf : hostFinder) {
+ for (IHostFinder hf : hostFinders) {
hf.probe(host);
}
}
for (Entry<IHostId, ARPPending> entry : failedARPReqList.entrySet()) {
arphost = entry.getValue();
logger.trace("Sending the ARP from FailedARPReqList fors IP: {}", arphost.getHostId());
- if (hostFinder == null) {
+ if (hostFinders.isEmpty()) {
logger.warn("ARPHandler is not available at interface up");
logger.warn("Since this event is missed, host(s) connected to interface {} may not be discovered",
nodeConnector);
byte[] dataLayerAddress = NetUtils.getBroadcastMACAddr();
host = new HostNodeConnector(dataLayerAddress, decodeIPFromId(arphost.getHostId()), nodeConnector,
(short) 0);
- for (IHostFinder hf : hostFinder) {
+ for (IHostFinder hf : hostFinders) {
hf.probe(host);
}
} catch (ConstructionException e) {
<parent>
<groupId>org.opendaylight.controller</groupId>
<artifactId>sal-parent</artifactId>
- <version>1.0-SNAPSHOT</version>
+ <version>1.1-SNAPSHOT</version>
<relativePath>../..</relativePath>
</parent>
<scm>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
- <version>${bundle.plugin.version}</version>
<extensions>true</extensions>
<configuration>
<instructions>
<plugin>
<groupId>org.opendaylight.yangtools</groupId>
<artifactId>yang-maven-plugin</artifactId>
- <version>${yangtools.version}</version>
<executions>
<execution>
<goals>
<dependency>
<groupId>org.opendaylight.controller</groupId>
<artifactId>sal-core-api</artifactId>
- <version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.opendaylight.controller</groupId>
<artifactId>sal-common-util</artifactId>
- <version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.opendaylight.controller</groupId>
<artifactId>config-api</artifactId>
- <version>0.2.3-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.opendaylight.controller</groupId>
<artifactId>sal</artifactId>
- <version>0.7.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.opendaylight.controller</groupId>
<artifactId>clustering.services</artifactId>
- <version>0.5.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>junit</groupId>
</exclusion>
</exclusions>
</dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>yang-store-impl</artifactId>
- <version>${config.version}</version>
- </dependency>
<dependency>
<groupId>org.opendaylight.controller</groupId>
<artifactId>logback-config</artifactId>
<version>${netconf.version}</version>
<scope>test</scope>
</dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>yang-store-impl</artifactId>
- <version>${config.version}</version>
- </dependency>
<dependency>
<groupId>org.opendaylight.yangtools</groupId>
<groupId>org.eclipse.xtend</groupId>
<artifactId>org.eclipse.xtend.lib</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.core</artifactId>
+ <scope>provided</scope>
+ </dependency>
</dependencies>
<build>
package org.opendaylight.controller.md.inventory.manager
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnectorUpdated
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowNodeConnector
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnectorBuilder
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode
leaf-list current-capability {
type string;
}
+
+ container pass-through {
+ when "../connected = true";
+ description
+ "When the underlying node is connected, its NETCONF context
+ is available verbatim under this container through the
+ mount extension.";
+ }
}
augment /inv:nodes/inv:node {
uses netconf-node-fields;
}
-}
\ No newline at end of file
+}
org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl
</codeGeneratorClass>
<outputBaseDir>
- target/generated-sources/sal
+ ${salGeneratorPath}
</outputBaseDir>
</generator>
<generator>
<module>sal-binding-broker</module>
<module>sal-binding-util</module>
- <module>sal-binding-dom-it</module>
+
<!-- Samples -->
<module>samples</module>
</activation>
<modules>
<module>sal-binding-it</module>
+ <module>sal-binding-dom-it</module>
<!--module>clustered-data-store/integrationtest</module -->
<!--module>zeromq-routingtable/integrationtest</module -->
<!--module>sal-remoterpc-connector/integrationtest</module -->
</profiles>
<properties>
+ <salGeneratorPath>${project.build.directory}/generated-sources/sal</salGeneratorPath>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- Plugin Versions -->
</scm>
<dependencies>
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>concepts</artifactId>
+ </dependency>
<dependency>
<groupId>org.opendaylight.yangtools</groupId>
<artifactId>yang-common</artifactId>
</dependency>
<dependency>
<groupId>org.opendaylight.controller</groupId>
- <artifactId>sal-common</artifactId>
+ <artifactId>sal-common-api</artifactId>
</dependency>
-
<dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal-common-api</artifactId>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
</dependency>
<dependency>
<groupId>org.osgi</groupId>
import org.opendaylight.controller.sal.binding.api.BindingAwareProvider.ProviderFunctionality;
import org.opendaylight.controller.sal.binding.api.data.DataBrokerService;
import org.opendaylight.controller.sal.binding.api.data.DataProviderService;
-import org.opendaylight.yangtools.concepts.Registration;
+import org.opendaylight.yangtools.concepts.ObjectRegistration;
import org.opendaylight.yangtools.yang.binding.BaseIdentity;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.opendaylight.yangtools.yang.binding.RpcService;
/**
* Binding-aware core of the SAL layer responsible for wiring the SAL consumers.
- *
+ *
* The responsibility of the broker is to maintain registration of SAL
* functionality {@link Consumer}s and {@link Provider}s, store provider and
* consumer specific context and functionality registration via
* {@link ConsumerContext} and provide access to infrastructure services, which
* removes direct dependencies between providers and consumers.
- *
+ *
* The Binding-aware broker is also responsible for translation from Java
- * classes modeling the functionality and data to binding-indpenedent form which
+ * classes modeling the functionality and data to binding-independent form which
* is used in SAL Core.
- *
- *
+ *
+ *
* <h3>Infrastructure services</h3> Some examples of infrastructure services:
- *
+ *
* <ul>
* <li>YANG Module service - see {@link ConsumerContext#getRpcService(Class)},
* {@link ProviderContext}
* <li>Data Store access and modification - see {@link DataBrokerService} and
* {@link DataProviderService}
* </ul>
- *
+ *
* The services are exposed via session.
- *
+ *
* <h3>Session-based access</h3>
- *
+ *
* The providers and consumers needs to register in order to use the
* binding-independent SAL layer and to expose functionality via SAL layer.
- *
+ *
* For more information about session-based access see {@link ConsumerContext}
* and {@link ProviderContext}
- *
- *
- *
+ *
+ *
+ *
*/
public interface BindingAwareBroker {
/**
* Registers the {@link BindingAwareConsumer}, which will use the SAL layer.
- *
+ *
* <p>
* Note that consumer could register additional functionality at later point
* by using service and functionality specific APIs.
- *
+ *
* <p>
* The consumer is required to use returned session for all communication
* with broker or one of the broker services. The session is announced to
* the consumer by invoking
* {@link Consumer#onSessionInitiated(ConsumerContext)}.
- *
+ *
* @param cons
* Consumer to be registered.
* @return a session specific to consumer registration
/**
* Registers the {@link BindingAwareProvider}, which will use the SAL layer.
- *
+ *
* <p>
* During the registration, the broker obtains the initial functionality
* from consumer, using the
* {@link BindingAwareProvider#getImplementations()}, and register that
* functionality into system and concrete infrastructure services.
- *
+ *
* <p>
* Note that provider could register additional functionality at later point
* by using service and functionality specific APIs.
- *
+ *
* <p>
* The consumer is <b>required to use</b> returned session for all
* communication with broker or one of the broker services. The session is
* announced to the consumer by invoking
* {@link BindingAwareProvider#onSessionInitiated(ProviderContext)}.
- *
- *
+ *
+ *
* @param prov
* Provider to be registered.
* @return a session unique to the provider registration.
/**
* {@link BindingAwareConsumer} specific access to the SAL functionality.
- *
+ *
* <p>
* ConsumerSession is {@link BindingAwareConsumer}-specific access to the
* SAL functionality and infrastructure services.
- *
+ *
* <p>
* The session serves to store SAL context (e.g. registration of
* functionality) for the consumer and provides access to the SAL
* infrastructure services and other functionality provided by
* {@link Provider}s.
- *
- *
- *
+ *
+ *
+ *
*/
public interface ConsumerContext extends RpcConsumerRegistry {
/**
* Returns a session specific instance (implementation) of requested
* binding-aware infrastructural service
- *
+ *
* @param service
* Broker service
* @return Session specific implementation of service
/**
* {@link BindingAwareProvider} specific access to the SAL functionality.
- *
+ *
* <p>
* ProviderSession is {@link BindingAwareProvider}-specific access to the
* SAL functionality and infrastructure services, which also allows for
* exposing the provider's functionality to the other
* {@link BindingAwareConsumer}s.
- *
+ *
* <p>
* The session serves to store SAL context (e.g. registration of
* functionality) for the providers and exposes access to the SAL
* infrastructure services, dynamic functionality registration and any other
* functionality provided by other {@link BindingAwareConsumer}s.
- *
+ *
*/
public interface ProviderContext extends ConsumerContext, RpcProviderRegistry {
void unregisterFunctionality(ProviderFunctionality functionality);
}
- public interface RpcRegistration<T extends RpcService> extends Registration<T> {
+ public interface RpcRegistration<T extends RpcService> extends ObjectRegistration<T> {
Class<T> getServiceType();
}
/**
* Register particular instance identifier to be processed by this
* RpcService
- *
- * Deprecated in favor of {@link RoutedRegistration#registerPath(Object, Object)}.
- *
+ *
+ * Deprecated in favor of {@link RoutedRegistration#registerPath(Object, Object)}.
+ *
* @param context
* @param instance
*/
/**
* Unregister particular instance identifier to be processed by this
* RpcService
- *
- * Deprecated in favor of {@link RoutedRegistration#unregisterPath(Object, Object)}.
- *
+ *
+ * Deprecated in favor of {@link RoutedRegistration#unregisterPath(Object, Object)}.
+ *
* @param context
* @param instance
*/
import org.opendaylight.yangtools.yang.binding.Notification;
+/**
+ * Interface implemented by objects interested in some sort of Notification. This
+ * class acts as a base interface for specific listeners which usually are a type
+ * capture of this interface.
+ *
+ * @param <T> Notification type
+ */
public interface NotificationListener<T extends Notification> extends EventListener {
-
+ /**
+ * Invoked to deliver the notification. Note that this method may be invoked
+ * from a shared thread pool, so implementations SHOULD NOT perform CPU-intensive
+ * operations and they definitely MUST NOT invoke any potentially blocking
+ * operations.
+ *
+ * @param notification Notification being delivered.
+ */
void onNotification(T notification);
}
import org.opendaylight.yangtools.yang.binding.Notification;
public interface NotificationProviderService extends NotificationService, NotificationPublishService<Notification> {
-
-
- /**
- * Deprecated. Use {@link #publish(Notification)}.
- *
- * @param notification
- */
- @Deprecated
- void notify(Notification notification);
-
- /**
- * Deprecated. Use {@link #publish(Notification,ExecutorService)}.
- *
- * @param notification
- */
- @Deprecated
- void notify(Notification notification, ExecutorService service);
-
/**
* Publishes a notification.
*
import org.opendaylight.yangtools.yang.binding.Notification;
public interface NotificationService extends BindingAwareService {
- /**
- *
- * Deprecated: use {@link #addNotificationListener(Class, NotificationListener)} istead.
- *
- * @param listener
- */
- @Deprecated
- <T extends Notification> void addNotificationListener(Class<T> notificationType, NotificationListener<T> listener);
-
- /**
- *
- * Deprecated: use {@link #addNotificationListener(org.opendaylight.yangtools.yang.binding.NotificationListener)} istead.
- *
- * @param listener
- */
- @Deprecated
- void addNotificationListener(org.opendaylight.yangtools.yang.binding.NotificationListener listener);
-
- /**
- * Deprecated: use {@link Registration#close()} istead.
- * @param listener
- */
- @Deprecated
- void removeNotificationListener(org.opendaylight.yangtools.yang.binding.NotificationListener listener);
-
- /**
- * Deprecated: use {@link Registration#close()} istead.
- * @param listener
- */
- @Deprecated
- <T extends Notification> void removeNotificationListener(Class<T> notificationType, NotificationListener<T> listener);
-
-
/**
* Register a generic listener for specified notification type only.
*
<T extends Notification> Registration<NotificationListener<T>> registerNotificationListener(
Class<T> notificationType, NotificationListener<T> listener);
-
/**
* Register a listener which implements generated notification interfaces derived from
* {@link org.opendaylight.yangtools.yang.binding.NotificationListener}.
public interface RpcConsumerRegistry extends BindingAwareService {
/**
* Returns a session specific instance (implementation) of requested
- * YANG module implentation / service provided by consumer.
+ * YANG module implementation / service provided by consumer.
*
* @return Session specific implementation of service
*/
RpcConsumerRegistry, //
RouteChangePublisher<RpcContextIdentifier, InstanceIdentifier<?>> {
/**
- * Registers an global RpcService implementation.
+ * Registers a global RpcService implementation.
*
* @param type
* @param implementation
/**
*
- * Register an Routed RpcService where routing is determined on annotated
+ * Register a Routed RpcService where routing is determined on annotated
* (in YANG model) context-reference and value of annotated leaf.
*
* @param type
* Type of RpcService, use generated interface class, not your
- * implementation clas
+ * implementation class
* @param implementation
* Implementation of RpcService
- * @return Registration object for routed Rpc which could be used to close
- * an
+ * @return Registration object for routed Rpc which could be used to unregister
*
* @throws IllegalStateException
*/
/**
* Synchronized wrapper for DataModificationTransaction.
- *
+ *
* To get instance of synchronized wrapper use {@link #from(DataModificationTransaction)}
*
*/
public final class SynchronizedTransaction implements DataModificationTransaction,Delegator<DataModificationTransaction> {
private final DataModificationTransaction delegate;
-
+
private SynchronizedTransaction(DataModificationTransaction delegate) {
this.delegate = delegate;
}
/**
* Returns synchronized wrapper on supplied transaction.
- *
+ *
* @param transaction Transaction for which synchronized wrapper should be created.
* @return Synchronized wrapper over transaction.
*/
return delegate.getUpdatedOperationalData();
}
- @Deprecated
- public synchronized void putRuntimeData(InstanceIdentifier<? extends DataObject> path, DataObject data) {
- delegate.putRuntimeData(path, data);
- }
-
@Override
public synchronized Object getIdentifier() {
return delegate.getIdentifier();
return delegate.getUpdatedConfigurationData();
}
- @Deprecated
- public synchronized void removeRuntimeData(InstanceIdentifier<? extends DataObject> path) {
- delegate.removeRuntimeData(path);
- }
-
@Override
public synchronized void removeOperationalData(InstanceIdentifier<? extends DataObject> path) {
delegate.removeOperationalData(path);
/**
* RpcRouter is responsible for selecting RpcService based on provided routing
* context identifier {@link RpcRoutingTable#getContextIdentifier()} and path in
- * overal data tree (@link {@link InstanceIdentifier}.
+ * overall data tree (@link {@link InstanceIdentifier}.
*
*
* @author Tony Tkacik <ttkacik@cisco.com>
</namespaceToPackage1>
</additionalConfiguration>
</generator>
+
+ <generator>
+ <codeGeneratorClass>
+ org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl
+ </codeGeneratorClass>
+ <outputBaseDir>
+ ${salGeneratorPath}
+ </outputBaseDir>
+ </generator>
+
+
<generator>
<codeGeneratorClass>org.opendaylight.yangtools.yang.unified.doc.generator.maven.DocumentationGeneratorImpl</codeGeneratorClass>
<outputBaseDir>target/site/models</outputBaseDir>
org.opendaylight.controller.sal.binding.codegen.*,
<!--org.opendaylight.controller.sal.binding.dom.*,-->
org.opendaylight.controller.sal.binding.osgi.*,
+ org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.binding.impl.rev131028
</Private-Package>
</instructions>
</configuration>
this.executor = executor;\r
}\r
\r
- @Deprecated\r
- override <T extends Notification> addNotificationListener(Class<T> notificationType,\r
- NotificationListener<T> listener) {\r
- listeners.put(notificationType, listener)\r
- }\r
-\r
- @Deprecated\r
- override <T extends Notification> removeNotificationListener(Class<T> notificationType,\r
- NotificationListener<T> listener) {\r
- listeners.remove(notificationType, listener)\r
- }\r
-\r
- override notify(Notification notification) {\r
- publish(notification)\r
- }\r
-\r
def getNotificationTypes(Notification notification) {\r
notification.class.interfaces.filter[it != Notification && Notification.isAssignableFrom(it)]\r
}\r
\r
- @Deprecated\r
- override addNotificationListener(org.opendaylight.yangtools.yang.binding.NotificationListener listener) {\r
- throw new UnsupportedOperationException("Deprecated method. Use registerNotificationListener instead.");\r
-\r
- }\r
-\r
- @Deprecated\r
- override removeNotificationListener(org.opendaylight.yangtools.yang.binding.NotificationListener listener) {\r
- throw new UnsupportedOperationException(\r
- "Deprecated method. Use RegisterNotificationListener returned value to close registration.")\r
- }\r
-\r
- @Deprecated\r
- override notify(Notification notification, ExecutorService service) {\r
- publish(notification, service)\r
- }\r
-\r
override publish(Notification notification) {\r
publish(notification, executor)\r
}\r
*/
package org.opendaylight.controller.sal.binding.impl;
-import static com.google.common.base.Preconditions.checkState;
-
-import java.util.EventListener;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.WeakHashMap;
-
import org.opendaylight.controller.md.sal.common.api.routing.RouteChange;
import org.opendaylight.controller.md.sal.common.api.routing.RouteChangeListener;
import org.opendaylight.controller.md.sal.common.api.routing.RouteChangePublisher;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.util.EventListener;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.WeakHashMap;
+
+import static com.google.common.base.Preconditions.checkState;
+
public class RpcProviderRegistryImpl implements //
RpcProviderRegistry, //
RouteChangePublisher<RpcContextIdentifier, InstanceIdentifier<?>> {
private RuntimeCodeGenerator rpcFactory = SingletonHolder.RPC_GENERATOR_IMPL;
+ // publicProxies is a cache of proxy objects where each value in the map corresponds to a specific RpcService
private final Map<Class<? extends RpcService>, RpcService> publicProxies = new WeakHashMap<>();
private final Map<Class<? extends RpcService>, RpcRouter<?>> rpcRouters = new WeakHashMap<>();
private final ListenerRegistry<RouteChangeListener<RpcContextIdentifier, InstanceIdentifier<?>>> routeChangeListeners = ListenerRegistry
org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl
</codeGeneratorClass>
<outputBaseDir>
- target/generated-sources/sal
+ ${salGeneratorPath}
</outputBaseDir>
</generator>
<generator>
<groupId>org.opendaylight.controller</groupId>
<artifactId>config-netconf-connector</artifactId>
</dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>yang-store-impl</artifactId>
- </dependency>
<dependency>
<groupId>org.opendaylight.controller</groupId>
<artifactId>logback-config</artifactId>
*/
package org.opendaylight.controller.test.sal.binding.it;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.options.DefaultCompositeOption;
+import org.ops4j.pax.exam.util.PathUtils;
+
import static org.ops4j.pax.exam.CoreOptions.frameworkProperty;
import static org.ops4j.pax.exam.CoreOptions.junitBundles;
import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
import static org.ops4j.pax.exam.CoreOptions.systemProperty;
-import org.ops4j.pax.exam.Option;
-import org.ops4j.pax.exam.options.DefaultCompositeOption;
-import org.ops4j.pax.exam.util.PathUtils;
-
public class TestHelper {
public static final String CONTROLLER = "org.opendaylight.controller";
mavenBundle("commons-io", "commons-io").versionAsInProject(), //
mavenBundle(CONTROLLER, "config-manager").versionAsInProject(), //
mavenBundle(CONTROLLER, "yang-jmx-generator").versionAsInProject(), //
- mavenBundle(CONTROLLER, "yang-store-api").versionAsInProject(), //
- mavenBundle(CONTROLLER, "yang-store-impl").versionAsInProject(), //
mavenBundle(CONTROLLER, "logback-config").versionAsInProject(), //
mavenBundle(CONTROLLER, "config-persister-api").versionAsInProject(), //
mavenBundle(CONTROLLER, "netconf-api").versionAsInProject(), //
systemProperty("netconf.config.persister.1.properties.fileStorage")
.value(PathUtils.getBaseDir() + "/src/test/resources/controller.xml"), //
systemProperty("netconf.config.persister.1.properties.numberOfBackups").value("1") //
- //systemProperty("yangstore.blacklist").value(".*controller.model.*") //
);
import static org.opendaylight.controller.test.sal.binding.it.TestHelper.mdSalCoreBundles;
import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
import static org.ops4j.pax.exam.CoreOptions.options;
+import static org.ops4j.pax.exam.CoreOptions.systemPackages;
import static org.ops4j.pax.exam.CoreOptions.systemProperty;
@RunWith(PaxExam.class)
mavenBundle("ch.qos.logback", "logback-core").versionAsInProject(), //
mavenBundle("ch.qos.logback", "logback-classic").versionAsInProject(), //
systemProperty("osgi.bundles.defaultStartLevel").value("4"),
+ systemPackages("sun.nio.ch"),
mdSalCoreBundles(),
return getRpcRegistryChecked().getRpcService(module);
}
- @Override
- @Deprecated
- public <T extends Notification> void addNotificationListener(Class<T> notificationType,
- NotificationListener<T> listener) {
- getNotificationBrokerChecked().addNotificationListener(notificationType, listener);
- }
-
- @Override
- @Deprecated
- public void addNotificationListener(org.opendaylight.yangtools.yang.binding.NotificationListener listener) {
- getNotificationBrokerChecked().addNotificationListener(listener);
- }
-
- @Override
- @Deprecated
- public void removeNotificationListener(org.opendaylight.yangtools.yang.binding.NotificationListener listener) {
- getNotificationBrokerChecked().removeNotificationListener(listener);
- }
-
- @Override
- @Deprecated
- public <T extends Notification> void removeNotificationListener(Class<T> notificationType,
- NotificationListener<T> listener) {
- getNotificationBrokerChecked().removeNotificationListener(notificationType, listener);
- }
-
@Override
public <T extends Notification> Registration<NotificationListener<T>> registerNotificationListener(
Class<T> notificationType, NotificationListener<T> listener) {
return getRpcRegistryChecked().addRoutedRpcImplementation(type, implementation);
}
- @Override
- @Deprecated
- public void notify(Notification notification) {
- getNotificationBrokerChecked().notify(notification);
- }
-
- @Override
- @Deprecated
- public void notify(Notification notification, ExecutorService service) {
- getNotificationBrokerChecked().notify(notification, service);
- }
-
@Override
public void publish(Notification notification) {
getNotificationBrokerChecked().publish(notification);
</scm>
<dependencies>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>sal-common</artifactId>
- </dependency>
<dependency>
<groupId>org.opendaylight.yangtools</groupId>
<artifactId>yang-common</artifactId>
<groupId>org.opendaylight.yangtools</groupId>
<artifactId>concepts</artifactId>
</dependency>
- <dependency>
- <groupId>org.osgi</groupId>
- <artifactId>org.osgi.core</artifactId>
- </dependency>
</dependencies>
<packaging>bundle</packaging>
</project>
*/
package org.opendaylight.controller.md.sal.common.api.data;
-import org.opendaylight.controller.sal.common.DataStoreIdentifier;
import org.opendaylight.yangtools.concepts.Path;
import org.opendaylight.yangtools.yang.common.RpcResult;
/**
import org.opendaylight.yangtools.yang.common.RpcResult;
public interface DataModification<P extends Path<P>, D> extends DataChange<P, D>, DataReader<P, D> {
-
/**
* Returns transaction identifier
*
TransactionStatus getStatus();
- /**
- *
- * @deprecated Use {@link #putOperationalData(Object, Object)} instead.
- *
- * @param path
- * @param data
- */
- @Deprecated
- void putRuntimeData(P path, D data);
-
/**
* Store a piece of data at specified path. This acts as a merge operation,
* which is to say that any pre-existing data which is not explicitly
*/
void putConfigurationData(P path, D data);
- /**
- * @deprecated Use {@link #removeOperationalData(Object)}
- *
- * @param path
- */
- @Deprecated
- void removeRuntimeData(P path);
-
void removeOperationalData(P path);
void removeConfigurationData(P path);
* {@link TransactionStatus#FAILED} is reached.
*/
Future<RpcResult<TransactionStatus>> commit();
-
}
private final Map<P, D> unmodifiable_operationalUpdate;
private final Set<P> unmodifiable_configurationRemove;
private final Set<P> unmodifiable_OperationalRemove;
- private DataReader<P, D> reader;
+ private final DataReader<P, D> reader;
public AbstractDataModification(DataReader<P, D> reader) {
this.reader = reader;
operationalUpdate.put(path, mergeOperationalData(path,original,data));
}
- @Override
- public final void putRuntimeData(P path, D data) {
- putOperationalData(path, data);
- }
-
@Override
public final void removeOperationalData(P path) {
checkMutable();
operationalRemove.put(path, path);
}
- @Override
- public final void removeRuntimeData(P path) {
- removeOperationalData(path);
- }
-
@Override
public final void removeConfigurationData(P path) {
checkMutable();
}
return null;
}
-
+
protected D mergeOperationalData(P path,D stored, D modified) {
return modified;
}
-
+
protected D mergeConfigurationData(P path,D stored, D modified) {
return modified;
}
+++ /dev/null
-/*
- * Copyright (c) 2014 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.controller.md.sal.common.impl;
-
-import org.opendaylight.yangtools.concepts.Registration;
-
-public abstract class AbstractRegistration<T> implements Registration<T> {
-
-
- private final T instance;
-
- public AbstractRegistration(T instance) {
- super();
- this.instance = instance;
- }
-
- @Override
- public final T getInstance() {
- return instance;
- }
-
-}
package org.opendaylight.controller.md.sal.common.impl;
import org.opendaylight.controller.md.sal.common.api.routing.RoutedRegistration;
+import org.opendaylight.yangtools.concepts.AbstractObjectRegistration;
import org.opendaylight.yangtools.concepts.Path;
-public abstract class AbstractRoutedRegistration<C, P extends Path<P>, S> extends AbstractRegistration<S> implements
+public abstract class AbstractRoutedRegistration<C, P extends Path<P>, S> extends AbstractObjectRegistration<S> implements
RoutedRegistration<C, P, S> {
public AbstractRoutedRegistration(S instance) {
final Future<RpcResult<TransactionStatus>> commit(final AbstractDataTransaction<P, D> transaction) {
Preconditions.checkNotNull(transaction);
- transaction.changeStatus(TransactionStatus.SUBMITED);
final TwoPhaseCommit<P, D, DCL> task = new TwoPhaseCommit<P, D, DCL>(transaction, this);
this.getSubmittedTransactionsCount().getAndIncrement();
package org.opendaylight.controller.md.sal.common.impl.service;
import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
import org.opendaylight.controller.md.sal.common.api.TransactionStatus;
import org.opendaylight.controller.md.sal.common.impl.AbstractDataModification;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-@SuppressWarnings("all")
+import com.google.common.base.Preconditions;
+
public abstract class AbstractDataTransaction<P extends Path<P>, D extends Object> extends
AbstractDataModification<P, D> {
private final static Logger LOG = LoggerFactory.getLogger(AbstractDataTransaction.class);
private final Object identifier;
+ private final long allocationTime;
+ private long readyTime = 0;
+ private long completeTime = 0;
- @Override
- public Object getIdentifier() {
- return this.identifier;
- }
-
- private TransactionStatus status;
+ private TransactionStatus status = TransactionStatus.NEW;
private final AbstractDataBroker<P, D, ? extends Object> broker;
protected AbstractDataTransaction(final Object identifier,
final AbstractDataBroker<P, D, ? extends Object> dataBroker) {
super(dataBroker);
- this.identifier = identifier;
- this.broker = dataBroker;
- this.status = TransactionStatus.NEW;
- AbstractDataTransaction.LOG.debug("Transaction {} Allocated.", identifier);
+ this.identifier = Preconditions.checkNotNull(identifier);
+ this.broker = Preconditions.checkNotNull(dataBroker);
+ this.allocationTime = System.nanoTime();
+ LOG.debug("Transaction {} Allocated.", identifier);
+ }
+
+ @Override
+ public Object getIdentifier() {
+ return this.identifier;
}
@Override
public Future<RpcResult<TransactionStatus>> commit() {
+ readyTime = System.nanoTime();
+ LOG.debug("Transaction {} Ready after {}ms.", identifier, TimeUnit.NANOSECONDS.toMillis(readyTime - allocationTime));
+ changeStatus(TransactionStatus.SUBMITED);
+
return this.broker.commit(this);
}
return this.broker.readOperationalData(path);
}
-
-
@Override
public int hashCode() {
final int prime = 31;
return false;
if (getClass() != obj.getClass())
return false;
- AbstractDataTransaction other = (AbstractDataTransaction) obj;
+ AbstractDataTransaction<?, ?> other = (AbstractDataTransaction<?, ?>) obj;
if (identifier == null) {
if (other.identifier != null)
return false;
protected abstract void onStatusChange(final TransactionStatus status);
- public void changeStatus(final TransactionStatus status) {
- Object _identifier = this.getIdentifier();
- AbstractDataTransaction.LOG
- .debug("Transaction {} transitioned from {} to {}", _identifier, this.status, status);
+ public void succeeded() {
+ this.completeTime = System.nanoTime();
+ LOG.debug("Transaction {} Committed after {}ms.", identifier, TimeUnit.NANOSECONDS.toMillis(completeTime - readyTime));
+ changeStatus(TransactionStatus.COMMITED);
+ }
+
+ public void failed() {
+ this.completeTime = System.nanoTime();
+ LOG.debug("Transaction {} Failed after {}ms.", identifier, TimeUnit.NANOSECONDS.toMillis(completeTime - readyTime));
+ changeStatus(TransactionStatus.FAILED);
+ }
+
+ private void changeStatus(final TransactionStatus status) {
+ LOG.debug("Transaction {} transitioned from {} to {}", getIdentifier(), this.status, status);
this.status = status;
this.onStatusChange(status);
}
// The transaction has no effects, let's just shortcut it
if (changedPaths.isEmpty()) {
dataBroker.getFinishedTransactionsCount().getAndIncrement();
- transaction.changeStatus(TransactionStatus.COMMITED);
+ transaction.succeeded();
log.trace("Transaction: {} Finished successfully (no effects).", transactionId);
} catch (Exception e) {
log.error("Transaction: {} Request Commit failed", transactionId, e);
dataBroker.getFailedTransactionsCount().getAndIncrement();
- this.transaction.changeStatus(TransactionStatus.FAILED);
+ this.transaction.failed();
return this.rollback(handlerTransactions, e);
}
} catch (Exception e) {
log.error("Transaction: {} Finish Commit failed", transactionId, e);
dataBroker.getFailedTransactionsCount().getAndIncrement();
- transaction.changeStatus(TransactionStatus.FAILED);
+ transaction.failed();
return this.rollback(handlerTransactions, e);
}
dataBroker.getFinishedTransactionsCount().getAndIncrement();
- transaction.changeStatus(TransactionStatus.COMMITED);
+ transaction.succeeded();
log.trace("Transaction: {} Finished successfully.", transactionId);
</namespaceToPackage1>
</additionalConfiguration>
</generator>
+ <generator>
+ <codeGeneratorClass>
+ org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl
+ </codeGeneratorClass>
+ <outputBaseDir>
+ ${salGeneratorPath}
+ </outputBaseDir>
+ </generator>
+ <generator>
+ <codeGeneratorClass>
+ org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl
+ </codeGeneratorClass>
+ <outputBaseDir>
+ ${salGeneratorPath}
+ </outputBaseDir>
+ </generator>
<generator>
<codeGeneratorClass>org.opendaylight.yangtools.yang.unified.doc.generator.maven.DocumentationGeneratorImpl</codeGeneratorClass>
<outputBaseDir>target/site/models</outputBaseDir>
import org.opendaylight.controller.sal.core.api.notify.NotificationPublishService;
import org.opendaylight.controller.sal.core.api.notify.NotificationService;
import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.concepts.Registration;
+import org.opendaylight.yangtools.concepts.ObjectRegistration;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.common.RpcResult;
import org.opendaylight.yangtools.yang.data.api.CompositeNode;
ListenerRegistration<RpcRegistrationListener> addRpcRegistrationListener(RpcRegistrationListener listener);
}
- public interface RpcRegistration extends Registration<RpcImplementation> {
+ public interface RpcRegistration extends ObjectRegistration<RpcImplementation> {
QName getType();
@Override
package org.opendaylight.controller.sal.core.api.mount;
-import java.util.concurrent.Future;
-
import org.opendaylight.controller.sal.core.api.data.DataBrokerService;
import org.opendaylight.controller.sal.core.api.notify.NotificationService;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.data.api.CompositeNode;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import com.google.common.util.concurrent.ListenableFuture;
+
+/**
+ * Interface representing a single mount instance and represents a way for
+ * clients to access underlying data, RPCs and notifications.
+ */
public interface MountInstance extends //
NotificationService, //
DataBrokerService {
- Future<RpcResult<CompositeNode>> rpc(QName type, CompositeNode input);
+ /**
+ * Invoke an RPC on the system underlying the mount instance.
+ *
+ * @param type RPC type
+ * @param input RPC input arguments
+ * @return Future representing execution of the RPC.
+ */
+ ListenableFuture<RpcResult<CompositeNode>> rpc(QName type, CompositeNode input);
+ /**
+ * Get {@link SchemaContext} of the system underlying the mount instance.
+ *
+ * @return A schema context.
+ */
SchemaContext getSchemaContext();
}
@Override
public MountProvisionInstance getMountPoint(InstanceIdentifier path);
-
+
MountProvisionInstance createMountPoint(InstanceIdentifier path);
-
+
MountProvisionInstance createOrGetMountPoint(InstanceIdentifier path);
-
+
ListenerRegistration<MountProvisionListener> registerProvisionListener(MountProvisionListener listener);
-
- public interface MountProvisionListener extends EventListener {
-
+
+ public interface MountProvisionListener extends EventListener {
+
void onMountPointCreated(InstanceIdentifier path);
-
+
void onMountPointRemoved(InstanceIdentifier path);
-
+
}
}
import org.opendaylight.controller.sal.core.api.BrokerService;
import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
-
+/**
+ * Client-level interface for interacting with mount points. It provides access
+ * to {@link MountInstance} instances based on their path.
+ */
public interface MountService extends BrokerService {
-
+ /**
+ * Obtain access to a mount instance registered at the specified path.
+ *
+ * @param path Path at which the instance is registered
+ * @return Reference to the instance, or null if no such instance exists.
+ */
MountInstance getMountPoint(InstanceIdentifier path);
}
import org.opendaylight.controller.sal.core.api.Provider;
import org.opendaylight.yangtools.yang.data.api.CompositeNode;
-
/**
* Notification Publishing Service
*
* <li>For each subscriber {@link Broker} invokes
* {@link NotificationListener#onNotification(CompositeNode)}
* </ol>
- *
- *
- *
*/
public interface NotificationPublishService extends NotificationService {
-
/**
* Publishes a notification.
*
* @param notification
* Notification to publish
*/
- @Deprecated
- void sendNotification(CompositeNode notification);
-
void publish(CompositeNode notification);
}
</namespaceToPackage1>
</additionalConfiguration>
</generator>
+ <generator>
+ <codeGeneratorClass>
+ org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl
+ </codeGeneratorClass>
+ <outputBaseDir>
+ ${salGeneratorPath}
+ </outputBaseDir>
+ </generator>
<generator>
<codeGeneratorClass>org.opendaylight.yangtools.yang.unified.doc.generator.maven.DocumentationGeneratorImpl</codeGeneratorClass>
<outputBaseDir>target/site/models</outputBaseDir>
org.opendaylight.controller.sal.dom.broker.util,
org.opendaylight.controller.config.yang.md.sal.dom.impl,
org.opendaylight.controller.config.yang.md.sal.dom.statistics,
- org.opendaylight.yangtools.yang.util
+ org.opendaylight.yangtools.yang.util,
+ org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.dom.impl.rev131028.*
</Private-Package>
<Import-Package>
*
import java.util.List;
import java.util.Set;
-import java.util.concurrent.Future;
import org.opendaylight.controller.md.sal.common.api.RegistrationListener;
import org.opendaylight.controller.md.sal.common.api.data.DataCommitHandler;
import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier.PathArgument;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import com.google.common.util.concurrent.ListenableFuture;
+
public class MountPointImpl implements MountProvisionInstance, SchemaContextProvider {
private final SchemaAwareRpcBroker rpcs;
private final DataBrokerImpl dataReader;
private final NotificationRouter notificationRouter;
private final DataReader<InstanceIdentifier,CompositeNode> readWrapper;
-
-
+
+
private final InstanceIdentifier mountPath;
private SchemaContext schemaContext;
return dataReader.readOperationalData(path);
}
+ @Override
public Registration<DataReader<InstanceIdentifier, CompositeNode>> registerOperationalReader(
InstanceIdentifier path, DataReader<InstanceIdentifier, CompositeNode> reader) {
return dataReader.registerOperationalReader(path, reader);
}
+ @Override
public Registration<DataReader<InstanceIdentifier, CompositeNode>> registerConfigurationReader(
InstanceIdentifier path, DataReader<InstanceIdentifier, CompositeNode> reader) {
return dataReader.registerConfigurationReader(path, reader);
return rpcs.addRpcImplementation(rpcType, implementation);
}
+ @Override
public Set<QName> getSupportedRpcs() {
return rpcs.getSupportedRpcs();
}
-
+
+ @Override
public RpcResult<CompositeNode> invokeRpc(QName rpc, CompositeNode input) {
return rpcs.invokeRpc(rpc, input);
}
+ @Override
public ListenerRegistration<RpcRegistrationListener> addRpcRegistrationListener(RpcRegistrationListener listener) {
return rpcs.addRpcRegistrationListener(listener);
}
@Override
- public Future<RpcResult<CompositeNode>> rpc(QName type, CompositeNode input) {
+ public ListenableFuture<RpcResult<CompositeNode>> rpc(QName type, CompositeNode input) {
return null;
}
return dataReader.registerDataChangeListener(path, listener);
}
- @Override
- public void sendNotification(CompositeNode notification) {
- publish(notification);
- }
-
@Override
public Registration<DataCommitHandler<InstanceIdentifier, CompositeNode>> registerCommitHandler(
InstanceIdentifier path, DataCommitHandler<InstanceIdentifier, CompositeNode> commitHandler) {
return dataReader.registerCommitHandler(path, commitHandler);
}
-
+
@Override
public void removeRefresher(DataStoreIdentifier store, DataRefresher refresher) {
// NOOP
}
-
+
@Override
public void addRefresher(DataStoreIdentifier store, DataRefresher refresher) {
// NOOP
}
-
+
@Override
public void addValidator(DataStoreIdentifier store, DataValidator validator) {
// NOOP
public void removeValidator(DataStoreIdentifier store, DataValidator validator) {
// NOOP
}
-
+
+ @Override
public SchemaContext getSchemaContext() {
return schemaContext;
}
+ @Override
public void setSchemaContext(SchemaContext schemaContext) {
this.schemaContext = schemaContext;
}
class ReadWrapper implements DataReader<InstanceIdentifier, CompositeNode> {
-
-
+
+
private InstanceIdentifier shortenPath(InstanceIdentifier path) {
InstanceIdentifier ret = null;
if(mountPath.contains(path)) {
}
return ret;
}
-
+
@Override
public CompositeNode readConfigurationData(InstanceIdentifier path) {
InstanceIdentifier newPath = shortenPath(path);
}
return MountPointImpl.this.readConfigurationData(newPath);
}
-
+
@Override
public CompositeNode readOperationalData(InstanceIdentifier path) {
InstanceIdentifier newPath = shortenPath(path);
NotificationPublishService {
@Override
- public void sendNotification(CompositeNode notification) {
+ public void publish(CompositeNode notification) {
checkSessionState();
if (notification == null)
throw new IllegalArgumentException(
"Notification must not be null.");
NotificationModule.this.sendNotification(notification);
}
-
- @Override
- public void publish(CompositeNode notification) {
- sendNotification(notification);
- }
}
@Override
import org.opendaylight.controller.sal.core.api.notify.NotificationListener;
import org.opendaylight.controller.sal.dom.broker.spi.NotificationRouter;
-import org.opendaylight.yangtools.concepts.AbstractObjectRegistration;
+import org.opendaylight.yangtools.concepts.AbstractListenerRegistration;
import org.opendaylight.yangtools.concepts.Registration;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.data.api.CompositeNode;
public class NotificationRouterImpl implements NotificationRouter {
private static Logger log = LoggerFactory.getLogger(NotificationRouterImpl.class);
- private final Multimap<QName, Registration<NotificationListener>> listeners = Multimaps.synchronizedSetMultimap(HashMultimap.<QName, Registration<NotificationListener>>create());
+ private final Multimap<QName, ListenerRegistration> listeners = Multimaps.synchronizedSetMultimap(HashMultimap.<QName, ListenerRegistration>create());
// private Registration<NotificationListener> defaultListener;
private void sendNotification(CompositeNode notification) {
final QName type = notification.getNodeType();
- final Collection<Registration<NotificationListener>> toNotify = listeners.get(type);
+ final Collection<ListenerRegistration> toNotify = listeners.get(type);
log.trace("Publishing notification " + type);
if ((toNotify == null) || toNotify.isEmpty()) {
return;
}
- for (Registration<NotificationListener> listener : toNotify) {
+ for (ListenerRegistration listener : toNotify) {
try {
// FIXME: ensure that notification is immutable
listener.getInstance().onNotification(notification);
return ret;
}
- private class ListenerRegistration extends AbstractObjectRegistration<NotificationListener> {
+ private class ListenerRegistration extends AbstractListenerRegistration<NotificationListener> {
final QName type;
*/
package org.opendaylight.controller.sal.dom.broker.impl;
-import org.opendaylight.yangtools.yang.model.api.SchemaContext;
-
-public interface SchemaContextProvider {
-
- SchemaContext getSchemaContext();
+/**
+ * @deprecated Use org.opendaylight.yangtools.yang.model.api.SchemaContextProvider instead
+ */
+@Deprecated
+public interface SchemaContextProvider extends org.opendaylight.yangtools.yang.model.api.SchemaContextProvider{
}
super(ref, delegate);
}
- public void sendNotification(CompositeNode notification) {
- getDelegate().sendNotification(notification);
- }
-
+ @Override
public Registration<NotificationListener> addNotificationListener(QName notification, NotificationListener listener) {
return addRegistration(getDelegate().addNotificationListener(notification, listener));
}
+ @Override
public void publish(CompositeNode notification) {
getDelegate().publish(notification);
}
<version>${netconf.version}</version>
<scope>test</scope>
</dependency>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>yang-store-api</artifactId>
- <version>${netconf.version}</version>
- <scope>test</scope>
- </dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>netconf-client</artifactId>
<type>test-jar</type>
<version>${netconf.version}</version>
</dependency>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>yang-store-impl</artifactId>
- <scope>test</scope>
- <version>${netconf.version}</version>
- </dependency>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>yang-store-impl</artifactId>
- <scope>test</scope>
- <type>test-jar</type>
- <version>${netconf.version}</version>
- </dependency>
<dependency>
<groupId>org.opendaylight.controller</groupId>
<artifactId>logback-config</artifactId>
</instructions>
</configuration>
</plugin>
+
<plugin>
<groupId>org.opendaylight.yangtools</groupId>
<artifactId>yang-maven-plugin</artifactId>
</goals>
<configuration>
<codeGenerators>
+ <generator>
+ <codeGeneratorClass>
+ org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl
+ </codeGeneratorClass>
+ <outputBaseDir>
+ ${salGeneratorPath}
+ </outputBaseDir>
+ </generator>
<generator>
<codeGeneratorClass>
org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
</dependency>
</dependencies>
</plugin>
+
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl
</codeGeneratorClass>
<outputBaseDir>
- target/generated-sources/
+ ${salGeneratorPath}
</outputBaseDir>
</generator>
<generator>
<dependency>
<groupId> ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
- <version>1.0.9</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
- <version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
- <version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
- <version>${jackson.version}</version>
</dependency>
<dependency>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
- <version>${bundle.plugin.version}</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Import-Package>
*,
- com.google.common.collect,
!org.codehaus.enunciate.jaxrs
</Import-Package>
<Export-Package>
<plugin>
<groupId>org.opendaylight.yangtools</groupId>
<artifactId>yang-maven-plugin</artifactId>
- <version>${yangtools.version}</version>
<executions>
<execution>
<goals>
</namespaceToPackage1>
</additionalConfiguration>
</generator>
+ <generator>
+ <codeGeneratorClass>
+ org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl
+ </codeGeneratorClass>
+ <outputBaseDir>
+ ${salGeneratorPath}
+ </outputBaseDir>
+ </generator>
+ <generator>
+ <codeGeneratorClass>
+ org.opendaylight.yangtools.yang.unified.doc.generator.maven.DocumentationGeneratorImpl
+ </codeGeneratorClass>
+ <outputBaseDir>target/site/models</outputBaseDir>
+ </generator>
+
<generator>
<codeGeneratorClass>org.opendaylight.yangtools.yang.unified.doc.generator.maven.DocumentationGeneratorImpl</codeGeneratorClass>
<outputBaseDir>target/site/models</outputBaseDir>
<version>${netconf.version}</version>
<scope>test</scope>
</dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>yang-store-impl</artifactId>
- <version>${config.version}</version>
- </dependency>
<dependency>
<groupId>org.opendaylight.controller</groupId>
<artifactId>logback-config</artifactId>
@Path("/streams/stream/{identifier:.+}")
public Response subscribeToStream(@Encoded @PathParam("identifier") String identifier, @Context UriInfo uriInfo);
+ @GET
+ @Path("/streams")
+ @Produces({Draft02.MediaTypes.API+XML, Draft02.MediaTypes.API+JSON,
+ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, MediaType.TEXT_XML})
+ public StructuredData getAvailableStreams();
+
+
}
val static RESTCONF_MODULE_DRAFT02_RESTCONF_CONTAINER_SCHEMA_NODE = "restconf"
val static RESTCONF_MODULE_DRAFT02_MODULES_CONTAINER_SCHEMA_NODE = "modules"
val static RESTCONF_MODULE_DRAFT02_MODULE_LIST_SCHEMA_NODE = "module"
+ val static RESTCONF_MODULE_DRAFT02_STREAMS_CONTAINER_SCHEMA_NODE = "streams"
+ val static RESTCONF_MODULE_DRAFT02_STREAM_LIST_SCHEMA_NODE = "stream"
val static RESTCONF_MODULE_DRAFT02_OPERATIONS_CONTAINER_SCHEMA_NODE = "operations"
val static SAL_REMOTE_NAMESPACE = "urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote"
val static SAL_REMOTE_RPC_SUBSRCIBE = "create-data-change-event-subscription"
return new StructuredData(modulesNode, modulesSchemaNode, null)
}
+ override getAvailableStreams(){
+ var Set<String> availableStreams = Notificator.getStreamNames();
+ val List<Node<?>> streamsAsData = new ArrayList
+ val streamSchemaNode = restconfModule.getSchemaNode(RESTCONF_MODULE_DRAFT02_STREAM_LIST_SCHEMA_NODE)
+ for (String streamName:availableStreams){
+ streamsAsData.add(streamName.toStreamCompositeNode(streamSchemaNode))
+ }
+ val streamsSchemaNode = restconfModule.getSchemaNode(RESTCONF_MODULE_DRAFT02_STREAMS_CONTAINER_SCHEMA_NODE)
+ val streamsNode = NodeFactory.createImmutableCompositeNode(streamsSchemaNode.QName, null, streamsAsData)
+ return new StructuredData(streamsNode, streamsSchemaNode, null)
+ }
override getModules(String identifier) {
var Set<Module> modules = null
var MountInstance mountPoint = null
}
}
+ private def CompositeNode toStreamCompositeNode(String streamName, DataSchemaNode streamSchemaNode) {
+ val List<Node<?>> streamNodeValues = new ArrayList
+ val nameSchemaNode = (streamSchemaNode as DataNodeContainer).findInstanceDataChildrenByName("name").head
+ streamNodeValues.add(NodeFactory.createImmutableSimpleNode(nameSchemaNode.QName, null, streamName))
+
+ val descriptionSchemaNode = (streamSchemaNode as DataNodeContainer).findInstanceDataChildrenByName("description").head
+ streamNodeValues.add(NodeFactory.createImmutableSimpleNode(descriptionSchemaNode.QName, null, "DESCRIPTION_PLACEHOLDER"))
+
+ val replaySupportSchemaNode = (streamSchemaNode as DataNodeContainer).findInstanceDataChildrenByName("replay-support").head
+ streamNodeValues.add(NodeFactory.createImmutableSimpleNode(replaySupportSchemaNode.QName, null, true))
+
+ val replayLogCreationTimeSchemaNode = (streamSchemaNode as DataNodeContainer).findInstanceDataChildrenByName("replay-log-creation-time").head
+ streamNodeValues.add(NodeFactory.createImmutableSimpleNode(replayLogCreationTimeSchemaNode.QName, null, ""))
+
+ val eventsSchemaNode = (streamSchemaNode as DataNodeContainer).findInstanceDataChildrenByName("events").head
+ streamNodeValues.add(NodeFactory.createImmutableSimpleNode(eventsSchemaNode.QName, null, ""))
+
+ return NodeFactory.createImmutableCompositeNode(streamSchemaNode.QName, null, streamNodeValues)
+ }
private def CompositeNode toModuleCompositeNode(Module module, DataSchemaNode moduleSchemaNode) {
val List<Node<?>> moduleNodeValues = new ArrayList
val nameSchemaNode = (moduleSchemaNode as DataNodeContainer).findInstanceDataChildrenByName("name").head
val restconfContainer = restconfGrouping.findInstanceDataChildrenByName(RESTCONF_MODULE_DRAFT02_RESTCONF_CONTAINER_SCHEMA_NODE).head
if (schemaNodeName == RESTCONF_MODULE_DRAFT02_OPERATIONS_CONTAINER_SCHEMA_NODE) {
return (restconfContainer as DataNodeContainer).findInstanceDataChildrenByName(RESTCONF_MODULE_DRAFT02_OPERATIONS_CONTAINER_SCHEMA_NODE).head
- } else if (schemaNodeName == RESTCONF_MODULE_DRAFT02_MODULES_CONTAINER_SCHEMA_NODE) {
+ } else if (schemaNodeName == RESTCONF_MODULE_DRAFT02_STREAMS_CONTAINER_SCHEMA_NODE) {
+ return (restconfContainer as DataNodeContainer).findInstanceDataChildrenByName(RESTCONF_MODULE_DRAFT02_STREAMS_CONTAINER_SCHEMA_NODE).head
+ } else if (schemaNodeName == RESTCONF_MODULE_DRAFT02_STREAM_LIST_SCHEMA_NODE) {
+ val modules = (restconfContainer as DataNodeContainer).findInstanceDataChildrenByName(RESTCONF_MODULE_DRAFT02_STREAMS_CONTAINER_SCHEMA_NODE).head
+ return (modules as DataNodeContainer).findInstanceDataChildrenByName(RESTCONF_MODULE_DRAFT02_STREAM_LIST_SCHEMA_NODE).head
+ }else if (schemaNodeName == RESTCONF_MODULE_DRAFT02_MODULES_CONTAINER_SCHEMA_NODE) {
return (restconfContainer as DataNodeContainer).findInstanceDataChildrenByName(RESTCONF_MODULE_DRAFT02_MODULES_CONTAINER_SCHEMA_NODE).head
} else if (schemaNodeName == RESTCONF_MODULE_DRAFT02_MODULE_LIST_SCHEMA_NODE) {
val modules = (restconfContainer as DataNodeContainer).findInstanceDataChildrenByName(RESTCONF_MODULE_DRAFT02_MODULES_CONTAINER_SCHEMA_NODE).head
package org.opendaylight.controller.sal.streams.listeners;
import java.util.Map;
+import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
*/
public class Notificator {
- private static Map<String, ListenerAdapter> listenersByStreamName = new ConcurrentHashMap<>();
+ private static Map<String, ListenerAdapter> listenersByStreamName = new ConcurrentHashMap<>();
private static Map<InstanceIdentifier, ListenerAdapter> listenersByInstanceIdentifier = new ConcurrentHashMap<>();
private static final Lock lock = new ReentrantLock();
private Notificator() {
}
+ /**
+ * Returns list of all stream names
+ */
+ public static Set<String> getStreamNames() {
+ return listenersByStreamName.keySet();
+ }
+
+
/**
* Gets {@link ListenerAdapter} specified by stream name.
*
}
/**
- * Checks if listener has at least one subscriber. In case it has any, delete
+ * Checks if listener has at least one subscriber. In case it doesn't have any, delete
* listener.
*
* @param listener
package org.opendaylight.controller.sal.streams.websockets;
-import org.opendaylight.controller.sal.streams.listeners.Notificator;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.Channel;
-import io.netty.channel.ChannelPipeline;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
+import org.opendaylight.controller.sal.streams.listeners.Notificator;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
/**
* {@link WebSocketServer} is responsible to start and stop web socket server at
* {@link #PORT}.
if (nextEvent.isStartElement()) {
StartElement startElement = (StartElement) nextEvent;
if (startElement.getName().getLocalPart().equals("lf111")) {
- Iterator prefixes = startElement.getNamespaceContext().getPrefixes("augment:augment:module");
+ Iterator<?> prefixes = startElement.getNamespaceContext().getPrefixes("augment:augment:module");
while (prefixes.hasNext() && aaModulePrefix == null) {
String prefix = (String) prefixes.next();
if (nextEvent.isStartElement()) {
StartElement startElement = (StartElement) nextEvent;
if (startElement.getName().getLocalPart().equals("lf111")) {
- Iterator prefixes = startElement.getNamespaceContext().getPrefixes("augment:module:leaf:list");
+ Iterator<?> prefixes = startElement.getNamespaceContext().getPrefixes("augment:module:leaf:list");
while (prefixes.hasNext() && aModuleLfLstPrefix == null) {
String prefix = (String) prefixes.next();
MutableSimpleNode<?> lf111 = NodeFactory.createMutableSimpleNode(TestUtils.buildQName("lf111", "augment:augment:module", "2014-01-17"),
lst11, instanceIdentifier,null,null);
-
-
+
+
lst11.getChildren().add(lf111);
lst11.init();
cont1.getChildren().add(lst11);
cont1.init();
-
+
cont.getChildren().add(cont1);
cont.init();
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.UriInfo;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
import org.opendaylight.yangtools.yang.data.api.CompositeNode;
public class MediaTypesTest extends JerseyTest {
-
+
private static RestconfService restconfService;
private static String jsonData;
private static String xmlData;
-
+
@BeforeClass
public static void init() throws IOException {
restconfService = mock(RestconfService.class);
InputStream xmlStream = RestconfImplTest.class.getResourceAsStream("/parts/ietf-interfaces_interfaces.xml");
xmlData = TestUtils.getDocumentInPrintableForm(TestUtils.loadDocumentFrom(xmlStream));
}
-
+
@Override
protected Application configure() {
/* enable/disable Jersey logs to console */
JsonToCompositeNodeProvider.INSTANCE);
return resourceConfig;
}
-
+
@Test
public void testPostOperationsWithInputDataMediaTypes() throws UnsupportedEncodingException {
String uriPrefix = "/operations/";
verify(restconfService, times(5)).invokeRpc(eq(uriPath), any(CompositeNode.class));
post(uri, null, MediaType.TEXT_XML, xmlData);
verify(restconfService, times(6)).invokeRpc(eq(uriPath), any(CompositeNode.class));
-
+
// negative tests
post(uri, MediaType.TEXT_PLAIN, MediaType.TEXT_XML, xmlData);
verify(restconfService, times(6)).invokeRpc(eq(uriPath), any(CompositeNode.class));
post(uri, MediaType.TEXT_XML, MediaType.TEXT_PLAIN, xmlData);
verify(restconfService, times(6)).invokeRpc(eq(uriPath), any(CompositeNode.class));
}
-
+
@Test
public void testGetConfigMediaTypes() throws UnsupportedEncodingException {
String uriPrefix = "/config/";
verify(restconfService, times(4)).readConfigurationData(uriPath);
get(uri, MediaType.TEXT_XML);
verify(restconfService, times(5)).readConfigurationData(uriPath);
-
+
// negative tests
get(uri, MediaType.TEXT_PLAIN);
verify(restconfService, times(5)).readConfigurationData(uriPath);
}
-
+
@Test
public void testGetOperationalMediaTypes() throws UnsupportedEncodingException {
String uriPrefix = "/operational/";
verify(restconfService, times(4)).readOperationalData(uriPath);
get(uri, MediaType.TEXT_XML);
verify(restconfService, times(5)).readOperationalData(uriPath);
-
+
// negative tests
get(uri, MediaType.TEXT_PLAIN);
verify(restconfService, times(5)).readOperationalData(uriPath);
}
-
+
@Test
public void testPutConfigMediaTypes() throws UnsupportedEncodingException {
String uriPrefix = "/config/";
put(uri, "fooMediaType", MediaType.TEXT_XML, xmlData);
verify(restconfService, times(6)).updateConfigurationData(eq(uriPath), any(CompositeNode.class));
}
-
+
@Test
public void testPostConfigWithPathMediaTypes() throws UnsupportedEncodingException {
String uriPrefix = "/config/";
post(uri, "fooMediaType", MediaType.TEXT_XML, xmlData);
verify(restconfService, times(6)).createConfigurationData(eq(uriPath), any(CompositeNode.class));
}
-
+
@Test
public void testPostConfigMediaTypes() throws UnsupportedEncodingException {
String uriPrefix = "/config/";
post(uri, "fooMediaType", MediaType.TEXT_XML, xmlData);
verify(restconfService, times(6)).createConfigurationData(any(CompositeNode.class));
}
-
+
@Test
public void testDeleteConfigMediaTypes() throws UnsupportedEncodingException {
String uriPrefix = "/config/";
target(uri).request("fooMediaType").delete();
verify(restconfService, times(1)).deleteConfigurationData(uriPath);
}
-
+
private int get(String uri, String acceptMediaType) {
return target(uri).request(acceptMediaType).get().getStatus();
}
-
+
private int put(String uri, String acceptMediaType, String contentTypeMediaType, String data) {
if (acceptMediaType == null) {
return target(uri).request().put(Entity.entity(data, contentTypeMediaType)).getStatus();
}
return target(uri).request(acceptMediaType).put(Entity.entity(data, contentTypeMediaType)).getStatus();
}
-
+
private int post(String uri, String acceptMediaType, String contentTypeMediaType, String data) {
if (acceptMediaType == null) {
if (contentTypeMediaType == null || data == null) {
*/
package org.opendaylight.controller.sal.restconf.impl.test;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
import java.io.FileNotFoundException;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-
import javax.ws.rs.core.Application;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
-
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
import org.junit.BeforeClass;
import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
import org.opendaylight.yangtools.yang.data.api.Node;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import static junit.framework.Assert.assertNotNull;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
public class RestGetOperationTest extends JerseyTest {
response = target(uri).request("application/yang.api+xml").get();
validateModulesResponseXml(response);
}
+ // /streams/
+ @Test
+ public void getStreamsTest() throws UnsupportedEncodingException, FileNotFoundException {
+ ControllerContext.getInstance().setGlobalSchema(schemaContextModules);
+
+ String uri = "/streams";
+
+ Response response = target(uri).request("application/yang.api+json").get();
+ String responseBody = response.readEntity(String.class);
+ assertNotNull(responseBody);
+ assertTrue(responseBody.contains("streams"));
+
+ response = target(uri).request("application/yang.api+xml").get();
+ responseBody = response.readEntity(String.class);
+ assertNotNull(responseBody);
+ assertTrue(responseBody.contains("<streams xmlns=\"urn:ietf:params:xml:ns:yang:ietf-restconf\"/>"));
+ }
// /modules/module
@Test
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URISyntaxException;
-import java.net.URLEncoder;
import java.text.ParseException;
import java.util.Set;
import java.util.concurrent.Future;
import org.opendaylight.yangtools.yang.model.api.Module;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
-import com.google.common.base.Charsets;
-
public class RestPostOperationTest extends JerseyTest {
private static String xmlDataAbsolutePath;
*/
package org.opendaylight.controller.sal.restconf.impl.test;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
import java.io.FileNotFoundException;
import java.util.Set;
-
import org.junit.BeforeClass;
import org.junit.Test;
import org.opendaylight.controller.sal.rest.impl.XmlToCompositeNodeProvider;
import org.opendaylight.yangtools.yang.data.api.InstanceIdentifier;
import org.opendaylight.yangtools.yang.model.api.Module;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
public class RestconfImplTest {
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
-import java.util.concurrent.ExecutorService;
import org.opendaylight.controller.sal.binding.api.NotificationListener;
import org.opendaylight.controller.sal.binding.api.NotificationService;
import org.opendaylight.controller.sal.restconf.broker.tools.RemoteStreamTools;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.remote.rev140114.QName;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.remote.rev140114.SalRemoteService;
+import org.opendaylight.yangtools.concepts.AbstractListenerRegistration;
import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.concepts.Registration;
import org.opendaylight.yangtools.restconf.client.api.RestconfClientContext;
import org.opendaylight.yangtools.restconf.client.api.event.EventStreamInfo;
import org.opendaylight.yangtools.yang.binding.Notification;
-import com.google.common.collect.HashMultimap;
-import com.google.common.collect.Multimap;
-import com.google.common.collect.Multimaps;
-import com.google.common.collect.SetMultimap;
-
public class NotificationServiceImpl implements NotificationService {
private final SalRemoteService salRemoteService;
private final RestconfClientContext restconfClientContext;
- private final Multimap<Class<? extends Notification>,NotificationListener<? extends Object>> listeners;
- private ExecutorService _executor;
-
public NotificationServiceImpl(RestconfClientContext restconfClienetContext){
this.restconfClientContext = restconfClienetContext;
this.salRemoteService = this.restconfClientContext.getRpcServiceContext(SalRemoteService.class).getRpcService();
-
- HashMultimap<Class<? extends Notification>,NotificationListener<? extends Object>> _create = HashMultimap.<Class<? extends Notification>, NotificationListener<? extends Object>>create();
- SetMultimap<Class<? extends Notification>,NotificationListener<? extends Object>> _synchronizedSetMultimap = Multimaps.<Class<? extends Notification>, NotificationListener<? extends Object>>synchronizedSetMultimap(_create);
- this.listeners = _synchronizedSetMultimap;
-
- }
- public ExecutorService getExecutor() {
- return this._executor;
- }
-
- public void setExecutor(final ExecutorService executor) {
- this._executor = executor;
- }
-
- @Override
- public <T extends Notification> void addNotificationListener(Class<T> notificationType, NotificationListener<T> listener) {
- this.listeners.put(notificationType, listener);
- }
-
- @Override
- public void addNotificationListener(org.opendaylight.yangtools.yang.binding.NotificationListener listener) {
- UnsupportedOperationException _unsupportedOperationException = new UnsupportedOperationException("Deprecated method. Use registerNotificationListener instead.");
- throw _unsupportedOperationException;
- }
-
- @Override
- public void removeNotificationListener(org.opendaylight.yangtools.yang.binding.NotificationListener listener) {
- UnsupportedOperationException _unsupportedOperationException = new UnsupportedOperationException(
- "Deprecated method. Use RegisterNotificationListener returned value to close registration.");
- throw _unsupportedOperationException;
}
@Override
- public <T extends Notification> void removeNotificationListener(Class<T> notificationType, NotificationListener<T> listener) {
- this.listeners.remove(notificationType, listener);
- }
-
- @Override
- public <T extends Notification> Registration<NotificationListener<T>> registerNotificationListener(Class<T> notificationType, NotificationListener<T> listener) {
+ public <T extends Notification> ListenerRegistration<NotificationListener<T>> registerNotificationListener(Class<T> notificationType, NotificationListener<T> listener) {
//TODO implementation using sal-remote
List<QName> notifications = new ArrayList<QName>();
notifications.add(new QName(notificationType.toString()));
String notificationStreamName = RemoteStreamTools.createNotificationStream(salRemoteService, notifications);
final Map<String,EventStreamInfo> desiredEventStream = RemoteStreamTools.createEventStream(restconfClientContext, notificationStreamName);
RemoteNotificationListener remoteNotificationListener = new RemoteNotificationListener(listener);
- ListenerRegistration<?> listenerRegistration = restconfClientContext.getEventStreamContext(desiredEventStream.get(desiredEventStream.get(notificationStreamName))).registerNotificationListener(remoteNotificationListener);
- return new SalNotificationRegistration<T>(listenerRegistration);
+
+ final ListenerRegistration<?> listenerRegistration = restconfClientContext.getEventStreamContext(desiredEventStream.get(desiredEventStream.get(notificationStreamName)))
+ .registerNotificationListener(remoteNotificationListener);
+
+ return new AbstractListenerRegistration<NotificationListener<T>>(listener) {
+ @Override
+ protected void removeRegistration() {
+ listenerRegistration.close();
+ }
+ };
}
@Override
- public Registration<org.opendaylight.yangtools.yang.binding.NotificationListener> registerNotificationListener(org.opendaylight.yangtools.yang.binding.NotificationListener listener) {
+ public ListenerRegistration<org.opendaylight.yangtools.yang.binding.NotificationListener> registerNotificationListener(org.opendaylight.yangtools.yang.binding.NotificationListener listener) {
//TODO implementation using sal-remote
String notificationStreamName = RemoteStreamTools.createNotificationStream(salRemoteService, null);
final Map<String,EventStreamInfo> desiredEventStream = RemoteStreamTools.createEventStream(restconfClientContext, notificationStreamName);
return restconfClientContext.getEventStreamContext(desiredEventStream.get(desiredEventStream.get(notificationStreamName))).registerNotificationListener(listener);
}
-
- private class SalNotificationRegistration<T extends Notification> implements Registration<NotificationListener<T>>{
- private final Registration<?> registration;
-
- public SalNotificationRegistration(ListenerRegistration<?> listenerRegistration){
- this.registration = listenerRegistration;
- }
-
- @Override
- public NotificationListener<T> getInstance() {
- return this.getInstance();
- }
-
- @Override
- public void close() throws Exception {
- this.registration.close();
- }
- }
-
-
}
import java.util.Map;
import java.util.Set;
import java.util.concurrent.Future;
+
import org.opendaylight.controller.md.sal.common.api.TransactionStatus;
import org.opendaylight.controller.sal.binding.api.data.DataModificationTransaction;
import org.opendaylight.yangtools.concepts.ListenerRegistration;
return null;
}
- @Override
- public void putRuntimeData(InstanceIdentifier<? extends DataObject> path, DataObject data) {
-
- }
-
@Override
public void putOperationalData(InstanceIdentifier<? extends DataObject> path, DataObject data) {
}
- @Override
- public void removeRuntimeData(InstanceIdentifier<? extends DataObject> path) {
-
- }
-
@Override
public void removeOperationalData(InstanceIdentifier<? extends DataObject> path) {
</namespaceToPackage1>
</additionalConfiguration>
</generator>
+ <generator>
+ <codeGeneratorClass>
+ org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl
+ </codeGeneratorClass>
+ <outputBaseDir>
+ ${salGeneratorPath}
+ </outputBaseDir>
+ </generator>
</codeGenerators>
<inspectDependencies>true</inspectDependencies>
</configuration>
<artifactId>yang-jmx-generator-plugin</artifactId>
<version>${config.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>maven-sal-api-gen-plugin</artifactId>
+ <version>${yangtools.version}</version>
+ </dependency>
</dependencies>
</plugin>
mavenBundle("ch.qos.logback", "logback-core").versionAsInProject(), //
mavenBundle("ch.qos.logback", "logback-classic").versionAsInProject(), //
systemProperty("osgi.bundles.defaultStartLevel").value("4"),
+ systemPackages("sun.nio.ch"),
toasterBundles(),
mdSalCoreBundles(),
</namespaceToPackage1>
</additionalConfiguration>
</generator>
+ <generator>
+ <codeGeneratorClass>
+ org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl
+ </codeGeneratorClass>
+ <outputBaseDir>
+ ${salGeneratorPath}
+ </outputBaseDir>
+ </generator>
</codeGenerators>
<inspectDependencies>true</inspectDependencies>
</configuration>
<artifactId>yang-jmx-generator-plugin</artifactId>
<version>${config.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>maven-sal-api-gen-plugin</artifactId>
+ <version>${yangtools.version}</version>
+ </dependency>
</dependencies>
</plugin>
<plugin>
package org.opendaylight.controller.sample.toaster.provider;
import java.util.Collections;
-
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.opendaylight.controller.config.yang.config.toaster_provider.impl.ToasterProviderRuntimeMXBean;
import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
-import org.opendaylight.controller.sal.common.util.Futures;
import org.opendaylight.controller.sal.common.util.Rpcs;
import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.DisplayString;
import org.opendaylight.yang.gen.v1.http.netconfcentral.org.ns.toaster.rev091120.MakeToastInput;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.google.common.util.concurrent.Futures;
+
public class OpendaylightToaster implements ToasterData, ToasterService, ToasterProviderRuntimeMXBean {
private static final Logger log = LoggerFactory.getLogger(OpendaylightToaster.class);
private static final DisplayString toasterManufacturer = new DisplayString("Opendaylight");
private static final DisplayString toasterModelNumber = new DisplayString("Model 1 - Binding Aware");
- private ToasterStatus toasterStatus;
+ private final ToasterStatus toasterStatus;
private NotificationProviderService notificationProvider;
private final ExecutorService executor;
currentTask.cancel(true);
ToastDoneBuilder toastDone = new ToastDoneBuilder();
toastDone.setToastStatus(ToastStatus.Cancelled);
- notificationProvider.notify(toastDone.build());
+ notificationProvider.publish(toastDone.build());
}
public void setNotificationProvider(NotificationProviderService salService) {
ToastDoneBuilder notifyBuilder = new ToastDoneBuilder();
notifyBuilder.setToastStatus(ToastStatus.Done);
- notificationProvider.notify(notifyBuilder.build());
+ notificationProvider.publish(notifyBuilder.build());
log.trace("Toast Done");
logToastInput(toastRequest);
currentTask = null;
org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl
</codeGeneratorClass>
<outputBaseDir>
- target/generated-sources/sal
+ ${salGeneratorPath}
</outputBaseDir>
</generator>
</codeGenerators>
<groupId>org.eclipse.xtend</groupId>
<artifactId>org.eclipse.xtend.lib</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.core</artifactId>
+ <scope>provided</scope>
+ </dependency>
<dependency>
<groupId>junit</groupId>
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103.MultipartTransactionAware;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103.TransactionAware;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103.TransactionId;
txIdTotableIdMap.put(new TxIdEntry(id), Preconditions.checkNotNull(tableId));
}
- public Short isExpectedTableTransaction(TransactionAware transaction, Boolean more) {
+ public Short isExpectedTableTransaction(TransactionAware transaction) {
+ Boolean more = null;
+ if (transaction instanceof MultipartTransactionAware) {
+ more = ((MultipartTransactionAware)transaction).isMoreReplies();
+ }
+
if (!isExpectedTransaction(transaction, more)) {
return null;
}
txIdToRequestTypeMap.put(entry, getExpiryTime());
}
- public boolean isExpectedTransaction(TransactionAware transaction, Boolean more) {
- TxIdEntry entry = new TxIdEntry(transaction.getTransactionId());
+ private boolean isExpectedTransaction(TransactionAware transaction, Boolean more) {
+ final TxIdEntry entry = new TxIdEntry(transaction.getTransactionId());
if (more != null && more.booleanValue()) {
return txIdToRequestTypeMap.containsKey(entry);
} else {
}
}
+ public boolean isExpectedTransaction(TransactionAware transaction) {
+ Boolean more = null;
+ if (transaction instanceof MultipartTransactionAware) {
+ more = ((MultipartTransactionAware)transaction).isMoreReplies();
+ }
+
+ return isExpectedTransaction(transaction, more);
+ }
+
private Long getExpiryTime() {
return System.nanoTime() + lifetimeNanos;
}
return dps.beginTransaction();
}
- public synchronized void updateGroupDescStats(TransactionAware transaction, Boolean more, List<GroupDescStats> list) {
- if (msgManager.isExpectedTransaction(transaction, more)) {
+ public synchronized void updateGroupDescStats(TransactionAware transaction, List<GroupDescStats> list) {
+ if (msgManager.isExpectedTransaction(transaction)) {
groupDescStats.updateStats(list);
}
}
- public synchronized void updateGroupStats(TransactionAware transaction, Boolean more, List<GroupStats> list) {
- if (msgManager.isExpectedTransaction(transaction, more)) {
+ public synchronized void updateGroupStats(TransactionAware transaction, List<GroupStats> list) {
+ if (msgManager.isExpectedTransaction(transaction)) {
groupStats.updateStats(list);
}
}
- public synchronized void updateMeterConfigStats(TransactionAware transaction, Boolean more, List<MeterConfigStats> list) {
- if (msgManager.isExpectedTransaction(transaction, more)) {
+ public synchronized void updateMeterConfigStats(TransactionAware transaction, List<MeterConfigStats> list) {
+ if (msgManager.isExpectedTransaction(transaction)) {
meterConfigStats.updateStats(list);
}
}
- public synchronized void updateMeterStats(TransactionAware transaction, Boolean more, List<MeterStats> list) {
- if (msgManager.isExpectedTransaction(transaction, more)) {
+ public synchronized void updateMeterStats(TransactionAware transaction, List<MeterStats> list) {
+ if (msgManager.isExpectedTransaction(transaction)) {
meterStats.updateStats(list);
}
}
- public synchronized void updateQueueStats(TransactionAware transaction, Boolean more, List<QueueIdAndStatisticsMap> list) {
- if (msgManager.isExpectedTransaction(transaction, more)) {
+ public synchronized void updateQueueStats(TransactionAware transaction, List<QueueIdAndStatisticsMap> list) {
+ if (msgManager.isExpectedTransaction(transaction)) {
queueStats.updateStats(list);
}
}
- public synchronized void updateFlowTableStats(TransactionAware transaction, Boolean more, List<FlowTableAndStatisticsMap> list) {
- if (msgManager.isExpectedTransaction(transaction, more)) {
+ public synchronized void updateFlowTableStats(TransactionAware transaction, List<FlowTableAndStatisticsMap> list) {
+ if (msgManager.isExpectedTransaction(transaction)) {
flowTableStats.updateStats(list);
}
}
- public synchronized void updateNodeConnectorStats(TransactionAware transaction, Boolean more, List<NodeConnectorStatisticsAndPortNumberMap> list) {
- if (msgManager.isExpectedTransaction(transaction, more)) {
+ public synchronized void updateNodeConnectorStats(TransactionAware transaction, List<NodeConnectorStatisticsAndPortNumberMap> list) {
+ if (msgManager.isExpectedTransaction(transaction)) {
nodeConnectorStats.updateStats(list);
}
}
- public synchronized void updateAggregateFlowStats(TransactionAware transaction, Boolean more, AggregateFlowStatistics flowStats) {
- final Short tableId = msgManager.isExpectedTableTransaction(transaction, more);
+ public synchronized void updateAggregateFlowStats(TransactionAware transaction, AggregateFlowStatistics flowStats) {
+ final Short tableId = msgManager.isExpectedTableTransaction(transaction);
if (tableId != null) {
final DataModificationTransaction trans = dps.beginTransaction();
InstanceIdentifier<Table> tableRef = InstanceIdentifier.builder(Nodes.class).child(Node.class, targetNodeKey)
}
}
- public synchronized void updateFlowStats(TransactionAware transaction, Boolean more, List<FlowAndStatisticsMapList> list) {
- if (msgManager.isExpectedTransaction(transaction, more)) {
+ public synchronized void updateFlowStats(TransactionAware transaction, List<FlowAndStatisticsMapList> list) {
+ if (msgManager.isExpectedTransaction(transaction)) {
flowStats.updateStats(list);
}
}
public void onMeterConfigStatsUpdated(final MeterConfigStatsUpdated notification) {
final NodeStatisticsHandler handler = this.statisticsManager.getStatisticsHandler(notification.getId());
if (handler != null) {
- handler.updateMeterConfigStats(notification, notification.isMoreReplies(), notification.getMeterConfigStats());
+ handler.updateMeterConfigStats(notification, notification.getMeterConfigStats());
}
}
public void onMeterStatisticsUpdated(MeterStatisticsUpdated notification) {
final NodeStatisticsHandler handler = this.statisticsManager.getStatisticsHandler(notification.getId());
if (handler != null) {
- handler.updateMeterStats(notification, notification.isMoreReplies(), notification.getMeterStats());
+ handler.updateMeterStats(notification, notification.getMeterStats());
}
}
public void onGroupDescStatsUpdated(GroupDescStatsUpdated notification) {
final NodeStatisticsHandler handler = statisticsManager.getStatisticsHandler(notification.getId());
if (handler != null) {
- handler.updateGroupDescStats(notification, notification.isMoreReplies(), notification.getGroupDescStats());
+ handler.updateGroupDescStats(notification, notification.getGroupDescStats());
}
}
public void onGroupStatisticsUpdated(GroupStatisticsUpdated notification) {
final NodeStatisticsHandler handler = statisticsManager.getStatisticsHandler(notification.getId());
if (handler != null) {
- handler.updateGroupStats(notification, notification.isMoreReplies(), notification.getGroupStats());
+ handler.updateGroupStats(notification, notification.getGroupStats());
}
}
sucLogger.debug("Received flow stats update : {}",notification.toString());
final NodeStatisticsHandler sna = this.statisticsManager.getStatisticsHandler(notification.getId());
if (sna != null) {
- sna.updateFlowStats(notification, notification.isMoreReplies(), notification.getFlowAndStatisticsMapList());
+ sna.updateFlowStats(notification, notification.getFlowAndStatisticsMapList());
}
}
public void onAggregateFlowStatisticsUpdate(AggregateFlowStatisticsUpdate notification) {
final NodeStatisticsHandler handler = this.statisticsManager.getStatisticsHandler(notification.getId());
if (handler != null) {
- handler.updateAggregateFlowStats(notification, notification.isMoreReplies(), notification);
+ handler.updateAggregateFlowStats(notification, notification);
}
}
public void onNodeConnectorStatisticsUpdate(NodeConnectorStatisticsUpdate notification) {
final NodeStatisticsHandler handler = this.statisticsManager.getStatisticsHandler(notification.getId());
if (handler != null) {
- handler.updateNodeConnectorStats(notification, notification.isMoreReplies(), notification.getNodeConnectorStatisticsAndPortNumberMap());
+ handler.updateNodeConnectorStats(notification, notification.getNodeConnectorStatisticsAndPortNumberMap());
}
}
public void onFlowTableStatisticsUpdate(FlowTableStatisticsUpdate notification) {
final NodeStatisticsHandler handler = this.statisticsManager.getStatisticsHandler(notification.getId());
if (handler != null) {
- handler.updateFlowTableStats(notification, notification.isMoreReplies(), notification.getFlowTableAndStatisticsMap());
+ handler.updateFlowTableStats(notification, notification.getFlowTableAndStatisticsMap());
}
}
public void onQueueStatisticsUpdate(QueueStatisticsUpdate notification) {
final NodeStatisticsHandler handler = this.statisticsManager.getStatisticsHandler(notification.getId());
if (handler != null) {
- handler.updateQueueStats(notification, notification.isMoreReplies(), notification.getQueueIdAndStatisticsMap());
+ handler.updateQueueStats(notification, notification.getQueueIdAndStatisticsMap());
}
}
}
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
- <version>4.0.10.Final</version>
+ <version>${netty.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<artifactId>yang-jmx-generator</artifactId>
<version>${config.version}</version>
</dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>yang-store-api</artifactId>
- <version>${config.version}</version>
- </dependency>
- <dependency>
- <groupId>org.opendaylight.controller</groupId>
- <artifactId>yang-store-impl</artifactId>
- <version>${config.version}</version>
- </dependency>
<dependency>
<groupId>org.opendaylight.controller</groupId>
<artifactId>logback-config</artifactId>
mavenBundle(ODL, "config-manager").versionAsInProject(),
mavenBundle(ODL, "config-util").versionAsInProject(),
mavenBundle(ODL, "yang-jmx-generator").versionAsInProject(),
- mavenBundle(ODL, "yang-store-api").versionAsInProject(),
- mavenBundle(ODL, "yang-store-impl").versionAsInProject(),
mavenBundle(ODL, "logback-config").versionAsInProject(),
mavenBundle(ODL, "config-persister-api").versionAsInProject(),
// mavenBundle(ODL,"config-persister-file-adapter").versionAsInProject(),
<groupId>org.eclipse.xtend</groupId>
<artifactId>org.eclipse.xtend.lib</artifactId>
</dependency>
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.core</artifactId>
+ <scope>provided</scope>
+ </dependency>
</dependencies>
<build>
<groupId>${project.groupId}</groupId>
<artifactId>netconf-util</artifactId>
</dependency>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>yang-store-api</artifactId>
- </dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>netconf-mapping-api</artifactId>
<artifactId>netconf-impl</artifactId>
<scope>test</scope>
</dependency>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>yang-store-impl</artifactId>
- <scope>test</scope>
- </dependency>
<dependency>
<groupId>org.opendaylight.yangtools</groupId>
<artifactId>mockito-configuration</artifactId>
javax.management.openmbean,
org.opendaylight.controller.config.api,
org.opendaylight.controller.config.api.jmx,
- org.opendaylight.controller.config.yang.store.api,
org.opendaylight.controller.config.yangjmxgenerator,
org.opendaylight.controller.config.yangjmxgenerator.attribute,
org.opendaylight.controller.netconf.api,
org.slf4j,
org.w3c.dom,
com.google.common.io,
- org.opendaylight.yangtools.yang.model.api.type
+ org.opendaylight.yangtools.yang.model.api.type,
+ org.opendaylight.yangtools.sal.binding.generator.spi,
+ org.opendaylight.yangtools.sal.binding.yang.types
</Import-Package>
<Export-Package>
</Export-Package>
import org.opendaylight.controller.config.api.ValidationException;
import org.opendaylight.controller.config.util.ConfigRegistryClient;
import org.opendaylight.controller.config.util.ConfigTransactionClient;
-import org.opendaylight.controller.config.yang.store.api.YangStoreSnapshot;
+import org.opendaylight.controller.netconf.confignetconfconnector.osgi.YangStoreSnapshot;
import org.opendaylight.controller.config.yangjmxgenerator.ModuleMXBeanEntry;
import org.opendaylight.controller.netconf.api.NetconfDocumentedException;
import org.opendaylight.controller.netconf.api.NetconfDocumentedException.ErrorSeverity;
import org.opendaylight.controller.config.util.ConfigRegistryClient;
import org.opendaylight.controller.config.util.ConfigTransactionClient;
-import org.opendaylight.controller.config.yang.store.api.YangStoreSnapshot;
+import org.opendaylight.controller.netconf.confignetconfconnector.osgi.YangStoreSnapshot;
import org.opendaylight.controller.config.yangjmxgenerator.ModuleMXBeanEntry;
import org.opendaylight.controller.config.yangjmxgenerator.RuntimeBeanEntry;
import org.opendaylight.controller.netconf.api.NetconfDocumentedException;
import org.opendaylight.controller.config.util.ConfigRegistryClient;
import org.opendaylight.controller.config.util.ConfigTransactionClient;
-import org.opendaylight.controller.config.yang.store.api.YangStoreSnapshot;
+import org.opendaylight.controller.netconf.confignetconfconnector.osgi.YangStoreSnapshot;
import org.opendaylight.controller.netconf.api.NetconfDocumentedException;
import org.opendaylight.controller.netconf.api.NetconfDocumentedException.ErrorSeverity;
import org.opendaylight.controller.netconf.api.NetconfDocumentedException.ErrorTag;
import javax.management.openmbean.OpenType;
import org.opendaylight.controller.config.util.ConfigRegistryClient;
-import org.opendaylight.controller.config.yang.store.api.YangStoreSnapshot;
+import org.opendaylight.controller.netconf.confignetconfconnector.osgi.YangStoreSnapshot;
import org.opendaylight.controller.config.yangjmxgenerator.ModuleMXBeanEntry;
import org.opendaylight.controller.config.yangjmxgenerator.RuntimeBeanEntry;
import org.opendaylight.controller.config.yangjmxgenerator.RuntimeBeanEntry.Rpc;
package org.opendaylight.controller.netconf.confignetconfconnector.osgi;
-import org.opendaylight.controller.config.yang.store.api.YangStoreService;
import org.opendaylight.controller.netconf.mapping.api.NetconfOperationServiceFactory;
+import org.opendaylight.yangtools.yang.model.api.SchemaContextProvider;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
import org.osgi.framework.ServiceRegistration;
+import org.osgi.util.tracker.ServiceTracker;
+import org.osgi.util.tracker.ServiceTrackerCustomizer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.util.Hashtable;
-
import static com.google.common.base.Preconditions.checkState;
-public class Activator implements BundleActivator, YangStoreServiceTracker.YangStoreTrackerListener {
+public class Activator implements BundleActivator {
private static final Logger logger = LoggerFactory.getLogger(Activator.class);
private ConfigRegistryLookupThread configRegistryLookup = null;
@Override
- public void start(BundleContext context) throws Exception {
+ public void start(final BundleContext context) throws Exception {
this.context = context;
- YangStoreServiceTracker tracker = new YangStoreServiceTracker(context, this);
- tracker.open();
+
+ ServiceTrackerCustomizer<SchemaContextProvider, ConfigRegistryLookupThread> customizer = new ServiceTrackerCustomizer<SchemaContextProvider, ConfigRegistryLookupThread>() {
+ @Override
+ public ConfigRegistryLookupThread addingService(ServiceReference<SchemaContextProvider> reference) {
+ logger.debug("Got addingService(SchemaContextProvider) event, starting ConfigRegistryLookupThread");
+ checkState(configRegistryLookup == null, "More than one onYangStoreAdded received");
+
+ SchemaContextProvider schemaContextProvider = reference.getBundle().getBundleContext().getService(reference);
+
+ YangStoreServiceImpl yangStoreService = new YangStoreServiceImpl(schemaContextProvider);
+ configRegistryLookup = new ConfigRegistryLookupThread(yangStoreService);
+ configRegistryLookup.start();
+ return configRegistryLookup;
+ }
+
+ @Override
+ public void modifiedService(ServiceReference<SchemaContextProvider> reference, ConfigRegistryLookupThread configRegistryLookup) {
+ logger.debug("Got modifiedService(SchemaContextProvider) event");
+ configRegistryLookup.yangStoreService.refresh();
+
+ }
+
+ @Override
+ public void removedService(ServiceReference<SchemaContextProvider> reference, ConfigRegistryLookupThread configRegistryLookup) {
+ configRegistryLookup.interrupt();
+ if (osgiRegistration != null) {
+ osgiRegistration.unregister();
+ }
+ osgiRegistration = null;
+ Activator.this.configRegistryLookup = null;
+ }
+ };
+
+ ServiceTracker<SchemaContextProvider, ConfigRegistryLookupThread> listenerTracker = new ServiceTracker<>(context, SchemaContextProvider.class, customizer);
+ listenerTracker.open();
}
@Override
}
}
- @Override
- public synchronized void onYangStoreAdded(YangStoreService yangStoreService) {
- checkState(configRegistryLookup == null, "More than one onYangStoreAdded received");
- configRegistryLookup = new ConfigRegistryLookupThread(yangStoreService);
- configRegistryLookup.start();
- }
-
- @Override
- public synchronized void onYangStoreRemoved() {
- configRegistryLookup.interrupt();
- if (osgiRegistration != null) {
- osgiRegistration.unregister();
- }
- osgiRegistration = null;
- configRegistryLookup = null;
- }
-
private class ConfigRegistryLookupThread extends Thread {
- private final YangStoreService yangStoreService;
+ private final YangStoreServiceImpl yangStoreService;
- private ConfigRegistryLookupThread(YangStoreService yangStoreService) {
+ private ConfigRegistryLookupThread(YangStoreServiceImpl yangStoreService) {
super("config-registry-lookup");
this.yangStoreService = yangStoreService;
}
public void run() {
NetconfOperationServiceFactoryImpl factory = new NetconfOperationServiceFactoryImpl(yangStoreService);
logger.debug("Registering into OSGi");
- osgiRegistration = context.registerService(new String[]{NetconfOperationServiceFactory.class.getName()}, factory,
- new Hashtable<String, Object>());
+ osgiRegistration = context.registerService(NetconfOperationServiceFactory.class, factory, null);
}
}
}
import com.google.common.base.Optional;
import com.google.common.collect.Sets;
import org.opendaylight.controller.config.util.ConfigRegistryClient;
-import org.opendaylight.controller.config.yang.store.api.YangStoreSnapshot;
import org.opendaylight.controller.netconf.confignetconfconnector.operations.Commit;
import org.opendaylight.controller.netconf.confignetconfconnector.operations.DiscardChanges;
import org.opendaylight.controller.netconf.confignetconfconnector.operations.Validate;
package org.opendaylight.controller.netconf.confignetconfconnector.osgi;
import org.opendaylight.controller.config.util.ConfigRegistryJMXClient;
-import org.opendaylight.controller.config.yang.store.api.YangStoreException;
-import org.opendaylight.controller.config.yang.store.api.YangStoreService;
import org.opendaylight.controller.netconf.mapping.api.NetconfOperationServiceFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
package org.opendaylight.controller.netconf.confignetconfconnector.osgi;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Sets;
import org.opendaylight.controller.config.api.LookupRegistry;
import org.opendaylight.controller.config.util.ConfigRegistryJMXClient;
-import org.opendaylight.controller.config.yang.store.api.YangStoreException;
-import org.opendaylight.controller.config.yang.store.api.YangStoreService;
-import org.opendaylight.controller.config.yang.store.api.YangStoreSnapshot;
import org.opendaylight.controller.config.yangjmxgenerator.ModuleMXBeanEntry;
import org.opendaylight.controller.netconf.confignetconfconnector.transactions.TransactionProvider;
import org.opendaylight.controller.netconf.confignetconfconnector.util.Util;
import org.opendaylight.controller.netconf.mapping.api.NetconfOperationService;
import org.opendaylight.yangtools.yang.model.api.Module;
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Optional;
-import com.google.common.base.Preconditions;
-import com.google.common.collect.Sets;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
/**
* Manages life cycle of {@link YangStoreSnapshot}.
private final String moduleNamespace;
public YangStoreCapability(Module module, String moduleContent) {
- super(getAsString(module));
+ super(toCapabilityURI(module));
this.content = moduleContent;
this.moduleName = module.getName();
this.moduleNamespace = module.getNamespace().toString();
return Optional.of(content);
}
- private static String getAsString(Module module) {
- final StringBuffer capabilityContent = new StringBuffer();
- capabilityContent.append(module.getNamespace());
- capabilityContent.append("?module=");
- capabilityContent.append(module.getName());
- capabilityContent.append("&revision=");
- capabilityContent.append(Util.writeDate(module.getRevision()));
- return capabilityContent.toString();
+ private static String toCapabilityURI(Module module) {
+ return String.valueOf(module.getNamespace()) + "?module="
+ + module.getName() + "&revision=" + Util.writeDate(module.getRevision());
}
@Override
* 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.controller.config.yang.store.api;
+package org.opendaylight.controller.netconf.confignetconfconnector.osgi;
public class YangStoreException extends Exception {
* 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.controller.config.yang.store.api;
+package org.opendaylight.controller.netconf.confignetconfconnector.osgi;
/**
* Yang store OSGi service
--- /dev/null
+/*
+ * Copyright (c) 2013 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.controller.netconf.confignetconfconnector.osgi;
+
+import org.opendaylight.yangtools.yang.model.api.SchemaContextProvider;
+
+import javax.annotation.concurrent.GuardedBy;
+
+public class YangStoreServiceImpl implements YangStoreService {
+ private final SchemaContextProvider service;
+ @GuardedBy("this")
+ private YangStoreSnapshotImpl cache = null;
+
+ public YangStoreServiceImpl(SchemaContextProvider service) {
+ this.service = service;
+ }
+
+ @Override
+ public synchronized YangStoreSnapshotImpl getYangStoreSnapshot() throws YangStoreException {
+ if (cache == null) {
+ cache = new YangStoreSnapshotImpl(service.getSchemaContext());
+ }
+ return cache;
+ }
+
+ /**
+ * Called when schema context changes, invalidates cache.
+ */
+ public synchronized void refresh() {
+ cache = null;
+ }
+}
+++ /dev/null
-/*
- * Copyright (c) 2013 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.controller.netconf.confignetconfconnector.osgi;
-
-import org.opendaylight.controller.config.yang.store.api.YangStoreService;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
-import org.osgi.util.tracker.ServiceTracker;
-
-class YangStoreServiceTracker extends ServiceTracker<YangStoreService, YangStoreService> {
- private final YangStoreTrackerListener listener;
-
- YangStoreServiceTracker(BundleContext context, final YangStoreTrackerListener listener) {
- super(context, YangStoreService.class, null);
- this.listener = listener;
- }
-
- @Override
- public synchronized YangStoreService addingService(final ServiceReference<YangStoreService> reference) {
- final YangStoreService yangStoreService = super.addingService(reference);
- listener.onYangStoreAdded(yangStoreService);
- return yangStoreService;
- }
-
- @Override
- public synchronized void removedService(final ServiceReference<YangStoreService> reference,
- final YangStoreService service) {
- listener.onYangStoreRemoved();
- }
-
- static interface YangStoreTrackerListener {
- void onYangStoreAdded(YangStoreService yangStoreService);
- void onYangStoreRemoved();
- }
-}
* 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.controller.config.yang.store.api;
+package org.opendaylight.controller.netconf.confignetconfconnector.osgi;
import org.opendaylight.controller.config.yangjmxgenerator.ModuleMXBeanEntry;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.model.api.Module;
+import org.opendaylight.yangtools.yang.model.api.ModuleIdentifier;
import java.util.Map;
import java.util.Set;
Map<QName, Map<String /* identity local name */, ModuleMXBeanEntry>> getQNamesToIdentitiesToModuleMXBeanEntries();
- /**
- * Get number of parsed ModuleMXBeanEntry instances.
- */
- int countModuleMXBeanEntries();
-
/**
* Get all modules discovered when this snapshot was created.
* @return all modules discovered. If one module exists with two different revisions, return both.
*/
Set<Module> getModules();
- /**
- * Get all modules together with their yang sources.
- */
- Map<Module, String> getModulesToSources();
-
- /**
- * Retrieve source of module as it appeared during creation of this snapshot.
- * @param module
- * @return yang source of given module
- * @throws java.lang.IllegalArgumentException if module does not belong to this snapshot
- */
- String getModuleSource(Module module);
+ String getModuleSource(ModuleIdentifier moduleIdentifier);
@Override
void close();
* 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.controller.config.yang.store.impl;
-import com.google.common.collect.Lists;
+package org.opendaylight.controller.netconf.confignetconfconnector.osgi;
+
import com.google.common.collect.Maps;
-import org.apache.commons.io.IOUtils;
-import org.opendaylight.controller.config.yang.store.api.YangStoreException;
import org.opendaylight.controller.config.yangjmxgenerator.ModuleMXBeanEntry;
import org.opendaylight.controller.config.yangjmxgenerator.PackageTranslator;
import org.opendaylight.controller.config.yangjmxgenerator.ServiceInterfaceEntry;
import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode;
import org.opendaylight.yangtools.yang.model.api.Module;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
-import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
+import java.util.Set;
+
+public class YangStoreSnapshotImpl implements YangStoreSnapshot {
+ private static final Logger logger = LoggerFactory.getLogger(YangStoreSnapshotImpl.class);
+
+
+ private final Map<String /* Namespace from yang file */,
+ Map<String /* Name of module entry from yang file */, ModuleMXBeanEntry>> moduleMXBeanEntryMap;
+
-public class MbeParser {
- private static final Logger logger = LoggerFactory.getLogger(MbeParser.class);
+ private final Map<QName, Map<String, ModuleMXBeanEntry>> qNamesToIdentitiesToModuleMXBeanEntries;
- public YangStoreSnapshotImpl parseYangFiles(Collection<? extends InputStream> allInput) throws YangStoreException {
- YangParserImpl parser = YangParserWrapper.getYangParserInstance();
+ private final SchemaContext schemaContext;
- Map<InputStream, Module> allYangModules = YangParserWrapper.parseYangFiles(parser, allInput);
- SchemaContext resolveSchemaContext = YangParserWrapper.getSchemaContextFromModules(parser, allYangModules);
+ public YangStoreSnapshotImpl(SchemaContext resolveSchemaContext) {
logger.trace("Resolved modules:{}", resolveSchemaContext.getModules());
+ this.schemaContext = resolveSchemaContext;
// JMX generator
Map<String, String> namespaceToPackageMapping = Maps.newHashMap();
- PackageTranslator packageTranslator = new PackageTranslator(
- namespaceToPackageMapping);
-
+ PackageTranslator packageTranslator = new PackageTranslator(namespaceToPackageMapping);
Map<QName, ServiceInterfaceEntry> qNamesToSIEs = new HashMap<>();
-
Map<IdentitySchemaNode, ServiceInterfaceEntry> knownSEITracker = new HashMap<>();
// create SIE structure qNamesToSIEs
for (Module module : resolveSchemaContext.getModules()) {
String packageName = packageTranslator.getPackageName(module);
Map<QName, ServiceInterfaceEntry> namesToSIEntries = ServiceInterfaceEntry
- .create(module, packageName,knownSEITracker);
-
- for (Entry<QName, ServiceInterfaceEntry> sieEntry : namesToSIEntries
- .entrySet()) {
-
+ .create(module, packageName, knownSEITracker);
+ for (Entry<QName, ServiceInterfaceEntry> sieEntry : namesToSIEntries.entrySet()) {
// merge value into qNamesToSIEs
if (qNamesToSIEs.containsKey(sieEntry.getKey()) == false) {
qNamesToSIEs.put(sieEntry.getKey(), sieEntry.getValue());
} else {
- throw new IllegalStateException(
- "Cannot add two SIE with same qname "
+ throw new IllegalStateException("Cannot add two SIE with same qname "
+ sieEntry.getValue());
}
}
}
Map<String, Map<String, ModuleMXBeanEntry>> moduleMXBeanEntryMap = Maps.newHashMap();
- Map<Module, String> modulesToSources = new HashMap<>();
- Map<QName, Map<String /* identity local name */, ModuleMXBeanEntry>>
- qNamesToIdentitiesToModuleMXBeanEntries = new HashMap<>();
+
+ Map<QName, Map<String /* identity local name */, ModuleMXBeanEntry>> qNamesToIdentitiesToModuleMXBeanEntries = new HashMap<>();
- for (Entry<InputStream, Module> moduleEntry : allYangModules.entrySet()) {
- Module module = moduleEntry.getValue();
+ for (Module module : schemaContext.getModules()) {
String packageName = packageTranslator.getPackageName(module);
TypeProviderWrapper typeProviderWrapper = new TypeProviderWrapper(
new TypeProviderImpl(resolveSchemaContext));
- String yangAsString = reReadInputStream(moduleEntry);
QName qName = new QName(module.getNamespace(), module.getRevision(), module.getName());
Collections.unmodifiableMap(ModuleMXBeanEntry.create(module, qNamesToSIEs, resolveSchemaContext,
typeProviderWrapper, packageName));
moduleMXBeanEntryMap.put(module.getNamespace().toString(), namesToMBEs);
- modulesToSources.put(module, yangAsString);
+
qNamesToIdentitiesToModuleMXBeanEntries.put(qName, namesToMBEs);
}
+ this.moduleMXBeanEntryMap = Collections.unmodifiableMap(moduleMXBeanEntryMap);
+ this.qNamesToIdentitiesToModuleMXBeanEntries = Collections.unmodifiableMap(qNamesToIdentitiesToModuleMXBeanEntries);
- return new YangStoreSnapshotImpl(moduleMXBeanEntryMap, modulesToSources, qNamesToIdentitiesToModuleMXBeanEntries);
}
- private String reReadInputStream(Entry<InputStream, Module> moduleEntry) {
- String yangAsString;
- try {
- moduleEntry.getKey().reset();
- yangAsString = IOUtils.toString(moduleEntry.getKey());
- } catch (IOException e) {
- throw new IllegalStateException("Cannot reread " + moduleEntry.getValue(), e);
- }
- return yangAsString;
+ @Override
+ public Map<String, Map<String, ModuleMXBeanEntry>> getModuleMXBeanEntryMap() {
+ return moduleMXBeanEntryMap;
}
- @Deprecated
- public Map<Module, String> parseYangFilesToString(Collection<? extends InputStream> allYangs) {
-
- logger.error("Using deprecated method that will be removed soon", new UnsupportedOperationException("Deprecated"));
- YangParserImpl parser = YangParserWrapper.getYangParserInstance();
+ @Override
+ public Map<QName, Map<String, ModuleMXBeanEntry>> getQNamesToIdentitiesToModuleMXBeanEntries() {
+ return qNamesToIdentitiesToModuleMXBeanEntries;
+ }
- Map<InputStream, Module> allYangModules = parser
- .parseYangModelsFromStreamsMapped(Lists.newArrayList(allYangs));
- Map<Module, String> retVal = new HashMap<>();
+ @Override
+ public Set<Module> getModules() {
+ return schemaContext.getModules();
+ }
- for (Entry<InputStream, Module> entry : allYangModules.entrySet()) {
- try {
- retVal.put(entry.getValue(), IOUtils.toString(entry.getKey()));
- } catch (IOException e) {
- throw new IllegalStateException(
- "Can not create string from yang file.");
- }
- }
- return retVal;
+ @Override
+ public String getModuleSource(org.opendaylight.yangtools.yang.model.api.ModuleIdentifier moduleIdentifier) {
+ return schemaContext.getModuleSource(moduleIdentifier).get();
}
+ @Override
+ public void close() {
+
+ }
}
import com.google.common.base.Preconditions;
import java.text.ParseException;
-import java.text.SimpleDateFormat;
import java.util.Date;
-public final class Util {
+import static org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil.getRevisionFormat;
- /**
- * Used for date <-> xml serialization
- */
- private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+public final class Util {
public static String writeDate(final Date date) {
- return dateFormat.format(date);
+ return getRevisionFormat().format(date);
}
public static Date readDate(final String s) throws ParseException {
- return dateFormat.parse(s);
+ return getRevisionFormat().parse(s);
}
public static void checkType(final Object value, final Class<?> clazz) {
package org.opendaylight.controller.netconf.confignetconfconnector;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.math.BigInteger;
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.management.InstanceAlreadyExistsException;
-import javax.management.InstanceNotFoundException;
-import javax.management.ObjectName;
-import javax.xml.parsers.ParserConfigurationException;
-
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
import org.apache.commons.lang3.StringUtils;
import org.junit.Before;
import org.junit.Ignore;
import org.opendaylight.controller.config.manager.impl.AbstractConfigTest;
import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver;
import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
-import org.opendaylight.controller.config.yang.store.api.YangStoreSnapshot;
-import org.opendaylight.controller.config.yang.store.impl.MbeParser;
import org.opendaylight.controller.config.yang.test.impl.ComplexDtoBInner;
import org.opendaylight.controller.config.yang.test.impl.ComplexList;
import org.opendaylight.controller.config.yang.test.impl.Deep;
import org.opendaylight.controller.netconf.confignetconfconnector.operations.get.Get;
import org.opendaylight.controller.netconf.confignetconfconnector.operations.getconfig.GetConfig;
import org.opendaylight.controller.netconf.confignetconfconnector.operations.runtimerpc.RuntimeRpc;
+import org.opendaylight.controller.netconf.confignetconfconnector.osgi.YangStoreServiceImpl;
+import org.opendaylight.controller.netconf.confignetconfconnector.osgi.YangStoreSnapshot;
import org.opendaylight.controller.netconf.confignetconfconnector.transactions.TransactionProvider;
import org.opendaylight.controller.netconf.impl.mapping.operations.DefaultCloseSession;
import org.opendaylight.controller.netconf.impl.osgi.NetconfOperationRouterImpl;
import org.opendaylight.yangtools.yang.data.impl.codec.IdentityCodec;
import org.opendaylight.yangtools.yang.model.api.Module;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.model.api.SchemaContextProvider;
import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
-import com.google.common.base.Optional;
-import com.google.common.base.Preconditions;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
+import javax.management.InstanceAlreadyExistsException;
+import javax.management.InstanceNotFoundException;
+import javax.management.ObjectName;
+import javax.xml.parsers.ParserConfigurationException;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.math.BigInteger;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
public class NetconfMappingTest extends AbstractConfigTest {
final List<InputStream> yangDependencies = getYangs();
final Map<String, Map<String, ModuleMXBeanEntry>> mBeanEntries = Maps.newHashMap();
- mBeanEntries.putAll(new MbeParser().parseYangFiles(yangDependencies).getModuleMXBeanEntryMap());
+
+ YangParserImpl yangParser = new YangParserImpl();
+ final SchemaContext schemaContext = yangParser.resolveSchemaContext(new HashSet<>(yangParser.parseYangModelsFromStreamsMapped(yangDependencies).values()));
+ YangStoreServiceImpl yangStoreService = new YangStoreServiceImpl(new SchemaContextProvider() {
+ @Override
+ public SchemaContext getSchemaContext() {
+ return schemaContext ;
+ }
+ });
+ mBeanEntries.putAll(yangStoreService.getYangStoreSnapshot().getModuleMXBeanEntryMap());
return mBeanEntries;
}
import org.opendaylight.controller.config.api.ValidationException;
import org.opendaylight.controller.config.util.ConfigRegistryClient;
import org.opendaylight.controller.config.util.ConfigTransactionClient;
-import org.opendaylight.controller.config.yang.store.api.YangStoreSnapshot;
+import org.opendaylight.controller.netconf.confignetconfconnector.osgi.YangStoreSnapshot;
import org.opendaylight.controller.netconf.api.NetconfDocumentedException;
import org.opendaylight.controller.netconf.confignetconfconnector.mapping.attributes.fromxml.AttributeConfigElement;
import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.InstanceConfigElementResolved;
import org.junit.Test;
import org.junit.matchers.JUnitMatchers;
import org.opendaylight.controller.config.api.LookupRegistry;
-import org.opendaylight.controller.config.yang.store.api.YangStoreSnapshot;
import org.opendaylight.controller.config.yangjmxgenerator.ModuleMXBeanEntry;
import org.opendaylight.yangtools.yang.common.QName;
<scope>test</scope>
</dependency>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>yang-store-api</artifactId>
- <scope>test</scope>
- </dependency>
<dependency>
<groupId>xmlunit</groupId>
<artifactId>xmlunit</artifactId>
package org.opendaylight.controller.netconf.impl.mapping.operations;
-import java.util.HashMap;
-import java.util.Map;
-
+import com.google.common.base.Optional;
+import com.google.common.collect.Maps;
import org.opendaylight.controller.netconf.api.NetconfDocumentedException;
import org.opendaylight.controller.netconf.impl.mapping.CapabilityProvider;
import org.opendaylight.controller.netconf.util.mapping.AbstractLastNetconfOperation;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
-import com.google.common.base.Optional;
-import com.google.common.collect.Maps;
+import java.util.HashMap;
+import java.util.Map;
public final class DefaultGetSchema extends AbstractLastNetconfOperation {
public static final String GET_SCHEMA = "get-schema";
package org.opendaylight.controller.netconf.impl;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.junit.Assert.fail;
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-
-import java.io.DataOutputStream;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.lang.management.ManagementFactory;
-import java.net.InetSocketAddress;
-import java.net.Socket;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-
-import javax.management.ObjectName;
-
+import com.google.common.base.Optional;
+import com.google.common.collect.Sets;
+import io.netty.channel.ChannelFuture;
+import io.netty.channel.EventLoopGroup;
+import io.netty.channel.nio.NioEventLoopGroup;
+import io.netty.util.HashedWheelTimer;
import org.apache.commons.io.IOUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.opendaylight.controller.config.util.ConfigRegistryJMXClient;
-import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
-import org.opendaylight.controller.config.yang.store.api.YangStoreService;
-import org.opendaylight.controller.config.yang.store.api.YangStoreSnapshot;
import org.opendaylight.controller.netconf.api.NetconfDocumentedException;
import org.opendaylight.controller.netconf.api.NetconfMessage;
import org.opendaylight.controller.netconf.client.NetconfClient;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
-import com.google.common.base.Optional;
-import com.google.common.collect.Sets;
+import java.io.DataOutputStream;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.lang.management.ManagementFactory;
+import java.net.InetSocketAddress;
+import java.net.Socket;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.EventLoopGroup;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.util.HashedWheelTimer;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.junit.Assert.fail;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.MockitoAnnotations.initMocks;
public class ConcurrentClientsTest {
private EventLoopGroup nettyGroup;
private NetconfClientDispatcher netconfClientDispatcher;
- @Mock
- private YangStoreService yangStoreService;
- @Mock
- private ConfigRegistryJMXClient jmxClient;
-
private final InetSocketAddress netconfAddress = new InetSocketAddress("127.0.0.1", 8303);
static final Logger logger = LoggerFactory.getLogger(ConcurrentClientsTest.class);
@Before
public void setUp() throws Exception {
- { // init mocks
- MockitoAnnotations.initMocks(this);
- final YangStoreSnapshot yStore = mock(YangStoreSnapshot.class);
- doReturn(yStore).when(this.yangStoreService).getYangStoreSnapshot();
- doReturn(Collections.emptyMap()).when(yStore).getModuleMXBeanEntryMap();
-
- final ConfigTransactionJMXClient mockedTCl = mock(ConfigTransactionJMXClient.class);
- doReturn(mockedTCl).when(this.jmxClient).getConfigTransactionClient(any(ObjectName.class));
-
- doReturn(Collections.emptySet()).when(jmxClient).lookupConfigBeans();
- }
-
+ initMocks(this);
nettyGroup = new NioEventLoopGroup();
NetconfHelloMessageAdditionalHeader additionalHeader = new NetconfHelloMessageAdditionalHeader("uname", "10.10.10.1", "830", "tcp", "client");
netconfClientDispatcher = new NetconfClientDispatcher( nettyGroup, nettyGroup, additionalHeader, 5000);
<artifactId>config-util</artifactId>
<scope>test</scope>
</dependency>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>yang-store-api</artifactId>
- <scope>test</scope>
- </dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>netconf-api</artifactId>
<version>${config.version}</version>
<scope>test</scope>
</dependency>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>yang-store-impl</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>yang-store-impl</artifactId>
- <scope>test</scope>
- <type>test-jar</type>
- </dependency>
<dependency>
<groupId>org.opendaylight.controller</groupId>
<artifactId>logback-config</artifactId>
* 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.controller.config.yang.store.impl;
+package org.opendaylight.controller.netconf.it;
import org.apache.commons.io.IOUtils;
-import org.opendaylight.controller.config.yang.store.api.YangStoreException;
-import org.opendaylight.controller.config.yang.store.api.YangStoreService;
-import org.opendaylight.controller.config.yang.store.api.YangStoreSnapshot;
+import org.opendaylight.controller.netconf.confignetconfconnector.osgi.YangStoreException;
+import org.opendaylight.controller.netconf.confignetconfconnector.osgi.YangStoreService;
+import org.opendaylight.controller.netconf.confignetconfconnector.osgi.YangStoreServiceImpl;
+import org.opendaylight.controller.netconf.confignetconfconnector.osgi.YangStoreSnapshot;
+import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+import org.opendaylight.yangtools.yang.model.api.SchemaContextProvider;
+import org.opendaylight.yangtools.yang.parser.impl.YangParserImpl;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
import static org.junit.Assert.assertNotNull;
public class HardcodedYangStoreService implements YangStoreService {
- private final Collection<ByteArrayInputStream> byteArrayInputStreams;
+ private final List<InputStream> byteArrayInputStreams;
public HardcodedYangStoreService(
Collection<? extends InputStream> inputStreams)
throw new RuntimeException(e);
}
}
- return new MbeParser().parseYangFiles(byteArrayInputStreams);
+
+ YangParserImpl yangParser = new YangParserImpl();
+ final SchemaContext schemaContext = yangParser.resolveSchemaContext(new HashSet<>(yangParser.parseYangModelsFromStreamsMapped(byteArrayInputStreams).values()));
+ YangStoreServiceImpl yangStoreService = new YangStoreServiceImpl(new SchemaContextProvider() {
+ @Override
+ public SchemaContext getSchemaContext() {
+ return schemaContext ;
+ }
+ });
+ return yangStoreService.getYangStoreSnapshot();
}
}
*/
package org.opendaylight.controller.netconf.it;
-import static junit.framework.Assert.assertEquals;
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyLong;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
import io.netty.channel.ChannelFuture;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.InetSocketAddress;
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-import java.util.regex.Pattern;
-
-import javax.management.InstanceNotFoundException;
-import javax.management.Notification;
-import javax.management.NotificationListener;
-
import org.apache.commons.lang3.StringUtils;
import org.junit.After;
import org.junit.Assert;
import org.opendaylight.controller.config.persist.api.ConfigSnapshotHolder;
import org.opendaylight.controller.config.persist.api.Persister;
import org.opendaylight.controller.config.spi.ModuleFactory;
-import org.opendaylight.controller.config.yang.store.api.YangStoreException;
-import org.opendaylight.controller.config.yang.store.impl.HardcodedYangStoreService;
+import org.opendaylight.controller.netconf.confignetconfconnector.osgi.YangStoreException;
import org.opendaylight.controller.netconf.api.NetconfMessage;
import org.opendaylight.controller.netconf.api.jmx.CommitJMXNotification;
import org.opendaylight.controller.netconf.api.monitoring.NetconfManagementSession;
import org.opendaylight.controller.netconf.util.xml.XmlUtil;
import org.w3c.dom.Element;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
+import javax.management.InstanceNotFoundException;
+import javax.management.Notification;
+import javax.management.NotificationListener;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.InetSocketAddress;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+import java.util.regex.Pattern;
+
+import static junit.framework.Assert.assertEquals;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyLong;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
public class NetconfConfigPersisterITTest extends AbstractNetconfConfigTest {
import org.junit.Test;
import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver;
import org.opendaylight.controller.config.spi.ModuleFactory;
-import org.opendaylight.controller.config.yang.store.api.YangStoreException;
-import org.opendaylight.controller.config.yang.store.impl.HardcodedYangStoreService;
+import org.opendaylight.controller.netconf.confignetconfconnector.osgi.YangStoreException;
import org.opendaylight.controller.netconf.client.NetconfClient;
import org.opendaylight.controller.netconf.client.NetconfClientDispatcher;
import org.opendaylight.controller.netconf.confignetconfconnector.osgi.NetconfOperationServiceFactoryImpl;
import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver;
import org.opendaylight.controller.config.spi.ModuleFactory;
import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
-import org.opendaylight.controller.config.yang.store.api.YangStoreException;
-import org.opendaylight.controller.config.yang.store.impl.HardcodedYangStoreService;
+import org.opendaylight.controller.netconf.confignetconfconnector.osgi.YangStoreException;
import org.opendaylight.controller.config.yang.test.impl.DepTestImplModuleFactory;
import org.opendaylight.controller.config.yang.test.impl.NetconfTestImplModuleFactory;
import org.opendaylight.controller.config.yang.test.impl.NetconfTestImplModuleMXBean;
import org.mockito.Mock;
import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver;
import org.opendaylight.controller.config.spi.ModuleFactory;
-import org.opendaylight.controller.config.yang.store.api.YangStoreException;
-import org.opendaylight.controller.config.yang.store.impl.HardcodedYangStoreService;
+import org.opendaylight.controller.netconf.confignetconfconnector.osgi.YangStoreException;
import org.opendaylight.controller.netconf.api.NetconfMessage;
import org.opendaylight.controller.netconf.api.monitoring.NetconfManagementSession;
import org.opendaylight.controller.netconf.client.NetconfClient;
*/
package org.opendaylight.controller.netconf.it.pax;
-import static org.opendaylight.controller.test.sal.binding.it.TestHelper.baseModelBundles;
-import static org.opendaylight.controller.test.sal.binding.it.TestHelper.bindingAwareSalBundles;
-import static org.opendaylight.controller.test.sal.binding.it.TestHelper.configMinumumBundles;
-import static org.opendaylight.controller.test.sal.binding.it.TestHelper.flowCapableModelBundles;
-import static org.opendaylight.controller.test.sal.binding.it.TestHelper.junitAndMockitoBundles;
-import static org.opendaylight.controller.test.sal.binding.it.TestHelper.mdSalCoreBundles;
-import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
-import static org.ops4j.pax.exam.CoreOptions.options;
-import static org.ops4j.pax.exam.CoreOptions.systemProperty;
-
-import javax.inject.Inject;
-import javax.xml.parsers.ParserConfigurationException;
-
import com.google.common.base.Preconditions;
+import com.google.common.base.Throwables;
import io.netty.channel.nio.NioEventLoopGroup;
import org.junit.Assert;
import org.junit.Test;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
+import javax.inject.Inject;
+import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetSocketAddress;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeoutException;
+import static org.junit.Assert.fail;
+import static org.opendaylight.controller.test.sal.binding.it.TestHelper.baseModelBundles;
+import static org.opendaylight.controller.test.sal.binding.it.TestHelper.bindingAwareSalBundles;
+import static org.opendaylight.controller.test.sal.binding.it.TestHelper.configMinumumBundles;
+import static org.opendaylight.controller.test.sal.binding.it.TestHelper.flowCapableModelBundles;
+import static org.opendaylight.controller.test.sal.binding.it.TestHelper.junitAndMockitoBundles;
+import static org.opendaylight.controller.test.sal.binding.it.TestHelper.mdSalCoreBundles;
+import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
+import static org.ops4j.pax.exam.CoreOptions.options;
+import static org.ops4j.pax.exam.CoreOptions.systemPackages;
+import static org.ops4j.pax.exam.CoreOptions.systemProperty;
+
@RunWith(PaxExam.class)
public class IdentityRefNetconfTest {
- public static final int CLIENT_CONNECTION_TIMEOUT_MILLIS = 5000;
+ public static final int CLIENT_CONNECTION_TIMEOUT_MILLIS = 15000;
// Wait for controller to start
@Inject
systemProperty("osgi.console").value("2401"),
systemProperty("osgi.bundles.defaultStartLevel").value("4"),
systemProperty("pax.exam.osgi.unresolved.fail").value("true"),
+ systemPackages("sun.nio.ch"),
testingModules(),
loggingModules(),
private static final InetSocketAddress tcpAddress = new InetSocketAddress("127.0.0.1", 18383);
+
@Test
public void testIdRef() throws Exception {
- Preconditions.checkNotNull(broker, "Controller not initialized");
-
- NioEventLoopGroup nettyThreadgroup = new NioEventLoopGroup();
- NetconfClientDispatcher clientDispatcher = new NetconfClientDispatcher(nettyThreadgroup, nettyThreadgroup,
- CLIENT_CONNECTION_TIMEOUT_MILLIS);
-
- NetconfMessage edit = xmlFileToNetconfMessage("netconfMessages/editConfig_identities.xml");
- NetconfMessage commit = xmlFileToNetconfMessage("netconfMessages/commit.xml");
- NetconfMessage getConfig = xmlFileToNetconfMessage("netconfMessages/getConfig.xml");
-
- try (NetconfClient netconfClient = new NetconfClient("client", tcpAddress, CLIENT_CONNECTION_TIMEOUT_MILLIS, clientDispatcher)) {
- sendMessage(edit, netconfClient);
- sendMessage(commit, netconfClient);
- sendMessage(getConfig, netconfClient, "id-test",
- "<afi xmlns:prefix=\"urn:opendaylight:params:xml:ns:yang:controller:config:test:types\">prefix:test-identity1</afi>",
- "<afi xmlns:prefix=\"urn:opendaylight:params:xml:ns:yang:controller:config:test:types\">prefix:test-identity2</afi>",
- "<safi xmlns:prefix=\"urn:opendaylight:params:xml:ns:yang:controller:config:test:types\">prefix:test-identity2</safi>",
- "<safi xmlns:prefix=\"urn:opendaylight:params:xml:ns:yang:controller:config:test:types\">prefix:test-identity1</safi>");
- }
+ try {
+ Preconditions.checkNotNull(broker, "Controller not initialized");
+
+ NioEventLoopGroup nettyThreadgroup = new NioEventLoopGroup();
+ NetconfClientDispatcher clientDispatcher = new NetconfClientDispatcher(nettyThreadgroup, nettyThreadgroup,
+ CLIENT_CONNECTION_TIMEOUT_MILLIS);
+
+ NetconfMessage edit = xmlFileToNetconfMessage("netconfMessages/editConfig_identities.xml");
+ NetconfMessage commit = xmlFileToNetconfMessage("netconfMessages/commit.xml");
+ NetconfMessage getConfig = xmlFileToNetconfMessage("netconfMessages/getConfig.xml");
+
+ try (NetconfClient netconfClient = new NetconfClient("client", tcpAddress, CLIENT_CONNECTION_TIMEOUT_MILLIS, clientDispatcher)) {
+ sendMessage(edit, netconfClient);
+ sendMessage(commit, netconfClient);
+ sendMessage(getConfig, netconfClient, "id-test",
+ "<afi xmlns:prefix=\"urn:opendaylight:params:xml:ns:yang:controller:config:test:types\">prefix:test-identity1</afi>",
+ "<afi xmlns:prefix=\"urn:opendaylight:params:xml:ns:yang:controller:config:test:types\">prefix:test-identity2</afi>",
+ "<safi xmlns:prefix=\"urn:opendaylight:params:xml:ns:yang:controller:config:test:types\">prefix:test-identity2</safi>",
+ "<safi xmlns:prefix=\"urn:opendaylight:params:xml:ns:yang:controller:config:test:types\">prefix:test-identity1</safi>");
+ }
- clientDispatcher.close();
+ clientDispatcher.close();
+ } catch (Exception e) {
+ fail(Throwables.getStackTraceAsString(e));
+ }
}
+
private void sendMessage(NetconfMessage edit, NetconfClient netconfClient, String... containingResponse)
throws ExecutionException, InterruptedException, TimeoutException {
NetconfMessage response = netconfClient.sendRequest(edit).get();
netconf_ssh_output.setDaemon(false);
netconf_ssh_output.start();
- } catch (Throwable t){
- logger.error("SSH bridge couldn't create echo socket",t.getMessage(),t);
+ } catch (Exception t) {
+ logger.error("SSH bridge could not create echo socket: {}", t.getMessage(), t);
try {
if (netconf_ssh_input!=null){
Thread.currentThread().interrupt();
logger.error("netconf_ssh_output join error ",e);
}
-
}
} else {
try {
<osgi.version>5.0.0</osgi.version>
<maven.bundle.version>2.4.0</maven.bundle.version>
<slf4j.version>1.7.2</slf4j.version>
- <netconf.netty.version>4.0.10.Final</netconf.netty.version>
<salGeneratorPath>${project.build.directory}/generated-sources/sal</salGeneratorPath>
</properties>
<artifactId>config-util</artifactId>
<version>${config.version}</version>
</dependency>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>yang-store-api</artifactId>
- <version>${config.version}</version>
- </dependency>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>yang-store-impl</artifactId>
- <version>${config.version}</version>
- </dependency>
- <dependency>
- <groupId>${project.groupId}</groupId>
- <artifactId>yang-store-impl</artifactId>
- <version>${config.version}</version>
- <type>test-jar</type>
- </dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>yang-test</artifactId>
<relativePath>../../../commons/opendaylight</relativePath>
</parent>
<properties>
- <nexusproxy>http://nexus.opendaylight.org/content</nexusproxy>
<enunciate.version>1.26.2</enunciate.version>
</properties>
<scm>
<!-- OpenDayLight Released artifact -->
<repository>
<id>opendaylight-release</id>
- <url>${nexusproxy}/repositories/opendaylight.release/</url>
+ <url>${nexusproxy}/repositories/${nexus.repository.release}/</url>
</repository>
<!-- OpenDayLight Snapshot artifact -->
<snapshotRepository>
<id>opendaylight-snapshot</id>
- <url>${nexusproxy}/repositories/opendaylight.snapshot/</url>
+ <url>${nexusproxy}/repositories/${nexus.repository.snapshot}/</url>
</snapshotRepository>
<!-- Site deployment -->
<site>
<relativePath>../../commons/opendaylight</relativePath>
</parent>
<properties>
- <nexusproxy>http://nexus.opendaylight.org/content</nexusproxy>
<enunciate.version>1.26.2</enunciate.version>
</properties>
<scm>
<!-- OpenDayLight Released artifact -->
<repository>
<id>opendaylight-release</id>
- <url>${nexusproxy}/repositories/opendaylight.release/</url>
+ <url>${nexusproxy}/repositories/${nexus.repository.release}/</url>
</repository>
<!-- OpenDayLight Snapshot artifact -->
<snapshotRepository>
<id>opendaylight-snapshot</id>
- <url>${nexusproxy}/repositories/opendaylight.snapshot/</url>
+ <url>${nexusproxy}/repositories/${nexus.repository.snapshot}/</url>
</snapshotRepository>
<!-- Site deployment -->
<site>
if (i != gIP) {
p.setPoolStart(poolStart);
poolStarted = true;
+ } else {
+ //FIX for bug 533
+ p.setPoolStart(NeutronSubnet_IPAllocationPool.longtoIP(i+1));
}
}
if (i == eIP) {
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>app-northbound</artifactId>
+ <version>0.0.1-SNAPSHOT</version>
+ <packaging>maven-archetype</packaging>
+
+ <name>app-northbound</name>
+
+ <build>
+ <extensions>
+ <extension>
+ <groupId>org.apache.maven.archetype</groupId>
+ <artifactId>archetype-packaging</artifactId>
+ <version>2.2</version>
+ </extension>
+ </extensions>
+
+ <pluginManagement>
+ <plugins>
+ <plugin>
+ <artifactId>maven-archetype-plugin</artifactId>
+ <version>2.2</version>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ </build>
+</project>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<archetype-descriptor xsi:schemaLocation="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0 http://maven.apache.org/xsd/archetype-descriptor-1.0.0.xsd" name="app"
+ xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <fileSets>
+ <fileSet filtered="true" packaged="true" encoding="UTF-8">
+ <directory>src/main/java</directory>
+ <includes>
+ <include>**/*.java</include>
+ </includes>
+ </fileSet>
+ <fileSet filtered="true" encoding="UTF-8">
+ <directory>src/main/resources</directory>
+ <includes>
+ <include>**/*.xml</include>
+ </includes>
+ </fileSet>
+ <fileSet encoding="UTF-8">
+ <directory>.settings</directory>
+ <includes>
+ <include>**/*.prefs</include>
+ </includes>
+ </fileSet>
+ <fileSet filtered="true" encoding="UTF-8">
+ <directory></directory>
+ <includes>
+ <include>.classpath</include>
+ <include>.project</include>
+ </includes>
+ </fileSet>
+ </fileSets>
+</archetype-descriptor>
--- /dev/null
+#set( $dollar = '$' )
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>commons.opendaylight</artifactId>
+ <version>1.4.1-SNAPSHOT</version>
+ <relativePath>../../commons/opendaylight</relativePath>
+ </parent>
+
+ <artifactId>${artifactId}</artifactId>
+
+ <groupId>${groupId}</groupId>
+ <packaging>bundle</packaging>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <version>${bundle.plugin.version}</version>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Export-Package></Export-Package>
+ <Import-Package>org.opendaylight.controller.northbound.commons,
+ com.sun.jersey.spi.container.servlet,
+ com.fasterxml.jackson.annotation,
+ javax.ws.rs,
+ javax.ws.rs.core,
+ javax.xml.bind,
+ javax.xml.bind.annotation,
+ org.slf4j,
+ org.apache.catalina.filters,
+ com.fasterxml.jackson.jaxrs.base,
+ com.fasterxml.jackson.jaxrs.json,
+ !org.codehaus.enunciate.jaxrs</Import-Package>
+ <Web-ContextPath>/northbound/${artifactId}</Web-ContextPath>
+ <Jaxrs-Resources>,${dollar}{classes;ANNOTATION;javax.ws.rs.Path}</Jaxrs-Resources>
+ </instructions>
+ <manifestLocation>${project.basedir}/src/main/resources/META-INF</manifestLocation>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+ <version>${version}</version>
+ <dependencies>
+ <dependency>
+ <groupId>org.codehaus.enunciate</groupId>
+ <artifactId>enunciate-core-annotations</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>commons.northbound</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ </dependency>
+ </dependencies>
+</project>
--- /dev/null
+#set( $symbol_pound = '#' )
+#set( $symbol_dollar = '$' )
+#set( $symbol_escape = '\' )
+package ${package};
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.SecurityContext;
+
+import org.codehaus.enunciate.jaxrs.StatusCodes;
+import org.codehaus.enunciate.jaxrs.TypeHint;
+
+/**
+ * Northbound REST API
+ *
+ * <br>
+ * <br>
+ * Authentication scheme : <b>HTTP Basic</b><br>
+ * Authentication realm : <b>opendaylight</b><br>
+ * Transport : <b>HTTP and HTTPS</b><br>
+ * <br>
+ * HTTPS Authentication is disabled by default.
+ */
+
+@Path("/")
+public class Northbound {
+
+ private String username;
+
+ @Context
+ public void setSecurityContext(SecurityContext context) {
+ if (context != null && context.getUserPrincipal() != null) {
+ username = context.getUserPrincipal().getName();
+ }
+ }
+
+ /**
+ *
+ * Sample REST API call
+ *
+ * @return A response string
+ *
+ * <pre>
+ * Example:
+ *
+ * Request URL:
+ * http://localhost:8080/northbound/${artifactId}/api
+ *
+ * Response body in XML:
+ * <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+ * Sample Northbound API
+ *
+ * Response body in JSON:
+ * Sample Northbound API
+ * </pre>
+ */
+ @Path("/api")
+ @GET
+ @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
+ @TypeHint(String.class)
+ @StatusCodes()
+ public String getWidget() {
+ String result = "Sample Northbound API - ${artifactId}";
+ return result;
+ }
+
+}
--- /dev/null
+#set( $symbol_pound = '#' )
+#set( $symbol_dollar = '$' )
+#set( $symbol_escape = '\' )
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
+ version="3.0">
+ <servlet>
+ <servlet-name>JAXRS${artifactId}</servlet-name>
+ <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
+ <init-param>
+ <param-name>javax.ws.rs.Application</param-name>
+ <param-value>org.opendaylight.controller.northbound.commons.NorthboundApplication</param-value>
+ </init-param>
+ <load-on-startup>1</load-on-startup>
+ </servlet>
+
+ <servlet-mapping>
+ <servlet-name>JAXRS${artifactId}</servlet-name>
+ <url-pattern>/*</url-pattern>
+ </servlet-mapping>
+
+ <filter>
+ <filter-name>CorsFilter</filter-name>
+ <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
+ <init-param>
+ <param-name>cors.allowed.origins</param-name>
+ <param-value>*</param-value>
+ </init-param>
+ <init-param>
+ <param-name>cors.allowed.methods</param-name>
+ <param-value>GET,POST,HEAD,OPTIONS,PUT,DELETE</param-value>
+ </init-param>
+ <init-param>
+ <param-name>cors.allowed.headers</param-name>
+ <param-value>Content-Type,X-Requested-With,accept,authorization, origin,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
+ </init-param>
+ <init-param>
+ <param-name>cors.exposed.headers</param-name>
+ <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
+ </init-param>
+ <init-param>
+ <param-name>cors.support.credentials</param-name>
+ <param-value>true</param-value>
+ </init-param>
+ <init-param>
+ <param-name>cors.preflight.maxage</param-name>
+ <param-value>10</param-value>
+ </init-param>
+ </filter>
+ <filter-mapping>
+ <filter-name>CorsFilter</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+
+ <security-constraint>
+ <web-resource-collection>
+ <web-resource-name>${artifactId}</web-resource-name>
+ <url-pattern>/*</url-pattern>
+ <http-method>POST</http-method>
+ <http-method>GET</http-method>
+ <http-method>PUT</http-method>
+ <http-method>PATCH</http-method>
+ <http-method>DELETE</http-method>
+ <http-method>HEAD</http-method>
+ </web-resource-collection>
+ <auth-constraint>
+ <role-name>System-Admin</role-name>
+ <role-name>Network-Admin</role-name>
+ <role-name>Network-Operator</role-name>
+ <role-name>Container-User</role-name>
+ </auth-constraint>
+ </security-constraint>
+
+ <security-role>
+ <role-name>System-Admin</role-name>
+ </security-role>
+ <security-role>
+ <role-name>Network-Admin</role-name>
+ </security-role>
+ <security-role>
+ <role-name>Network-Operator</role-name>
+ </security-role>
+ <security-role>
+ <role-name>Container-User</role-name>
+ </security-role>
+
+ <login-config>
+ <auth-method>BASIC</auth-method>
+ <realm-name>opendaylight</realm-name>
+ </login-config>
+</web-app>
--- /dev/null
+#Fri Mar 07 21:17:20 CST 2014
+package=it.pkg
+version=0.1-SNAPSHOT
+groupId=archetype.it
+artifactId=basic
import java.util.HashSet;
import java.util.List;
import java.util.Set;
+
import javax.ws.rs.core.Application;
import javax.ws.rs.ext.ContextResolver;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.annotation.XmlRootElement;
-import com.fasterxml.jackson.databind.DeserializationFeature;
-import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider;
import org.opendaylight.controller.northbound.bundlescanner.IBundleScanService;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider;
+
/**
* Instance of javax.ws.rs.core.Application used to return the classes
* that will be instantiated for JAXRS processing. This hooks onto the
* bundle scanner service to provide JAXB classes to JAX-RS for prorcessing.
*/
-@SuppressWarnings("unchecked")
public class NorthboundApplication extends Application {
public static final String JAXRS_RESOURCES_MANIFEST_NAME = "Jaxrs-Resources";
public static final String JAXRS_EXCLUDES_MANIFEST_NAME = "Jaxrs-Exclude-Types";
}
private static final IBundleScanService lookupBundleScanner(BundleContext ctx) {
- ServiceReference svcRef = ctx.getServiceReference(IBundleScanService.class);
+ ServiceReference<?> svcRef = ctx.getServiceReference(IBundleScanService.class);
if (svcRef == null) {
throw new ServiceException("Unable to lookup IBundleScanService");
}
if (status.getCode().equals(StatusCode.SUCCESS)) {
return Response.status(Response.Status.CREATED).build();
}
+ } catch (Error e) {
+ throw e;
} catch (Throwable t) {
return Response.status(Response.Status.PRECONDITION_FAILED).build();
}
if (status.getCode().equals(StatusCode.SUCCESS)) {
return Response.status(Response.Status.OK).build();
}
- } catch (Throwable t) {
+ } catch (Exception t) {
return Response.status(Response.Status.PRECONDITION_FAILED).build();
}
throw new ResourceNotFoundException(status.getDescription());
if (status.getCode().equals(StatusCode.SUCCESS)) {
return Response.status(Response.Status.CREATED).build();
}
- } catch (Throwable t) {
+ } catch (Exception t) {
return Response.status(Response.Status.PRECONDITION_FAILED).build();
}
throw new ResourceNotFoundException(status.getDescription());
if (status.getCode().equals(StatusCode.SUCCESS)) {
return Response.status(Response.Status.OK).build();
}
- } catch (Throwable t) {
+ } catch (Exception t) {
return Response.status(Response.Status.PRECONDITION_FAILED).build();
}
throw new ResourceNotFoundException(status.getDescription());
<relativePath>../../../commons/opendaylight</relativePath>
</parent>
<properties>
- <nexusproxy>http://nexus.opendaylight.org/content</nexusproxy>
<enunciate.version>1.26.2</enunciate.version>
</properties>
<scm>
<!-- OpenDayLight Released artifact -->
<repository>
<id>opendaylight-release</id>
- <url>${nexusproxy}/repositories/opendaylight.release/</url>
+ <url>${nexusproxy}/repositories/${nexus.repository.release}/</url>
</repository>
<!-- OpenDayLight Snapshot artifact -->
<snapshotRepository>
<id>opendaylight-snapshot</id>
- <url>${nexusproxy}/repositories/opendaylight.snapshot/</url>
+ <url>${nexusproxy}/repositories/${nexus.repository.snapshot}/</url>
</snapshotRepository>
<!-- Site deployment -->
<site>
// switch
private ByteBuffer peerNetData; // encrypted message from the switch
private FileInputStream kfd = null, tfd = null;
+ private final String keyStoreFileDefault = "./configuration/tlsKeyStore";
+ private final String trustStoreFileDefault = "./configuration/tlsTrustStore";
+ private final String keyStorePasswordPropName = "controllerKeyStorePassword";
+ private final String trustStorePasswordPropName = "controllerTrustStorePassword";
+ private static String keyStorePassword = null;
+ private static String trustStorePassword = null;
public SecureMessageReadWriteService(SocketChannel socket, Selector selector)
throws Exception {
*/
private void createSecureChannel(SocketChannel socket) throws Exception {
String keyStoreFile = System.getProperty("controllerKeyStore");
- String keyStorePassword = System
- .getProperty("controllerKeyStorePassword");
String trustStoreFile = System.getProperty("controllerTrustStore");
- String trustStorePassword = System
- .getProperty("controllerTrustStorePassword");
+ String keyStorePasswordProp = System.getProperty(keyStorePasswordPropName);
+ String trustStorePasswordProp = System.getProperty(trustStorePasswordPropName);
if (keyStoreFile != null) {
keyStoreFile = keyStoreFile.trim();
+ } else {
+ keyStoreFile = keyStoreFileDefault;
}
if ((keyStoreFile == null) || keyStoreFile.isEmpty()) {
throw new FileNotFoundException("TLS KeyStore file not found.");
}
+
+ if ((keyStorePassword == null) || ((keyStorePasswordProp != null) && !keyStorePasswordProp.isEmpty())) {
+ keyStorePassword = keyStorePasswordProp;
+ }
if (keyStorePassword != null) {
keyStorePassword = keyStorePassword.trim();
+ System.setProperty(keyStorePasswordPropName, "");
}
if ((keyStorePassword == null) || keyStorePassword.isEmpty()) {
throw new FileNotFoundException("TLS KeyStore Password not provided.");
}
if (trustStoreFile != null) {
trustStoreFile = trustStoreFile.trim();
+ } else {
+ trustStoreFile = trustStoreFileDefault;
}
if ((trustStoreFile == null) || trustStoreFile.isEmpty()) {
throw new FileNotFoundException("TLS TrustStore file not found");
}
+
+ if ((trustStorePassword == null) || ((trustStorePasswordProp != null) && !trustStorePasswordProp.isEmpty())) {
+ trustStorePassword = trustStorePasswordProp;
+ }
if (trustStorePassword != null) {
trustStorePassword = trustStorePassword.trim();
+ System.setProperty(trustStorePasswordPropName, "");
}
if ((trustStorePassword == null) || trustStorePassword.isEmpty()) {
throw new FileNotFoundException("TLS TrustStore Password not provided.");
moveToReadyListHi(dst);
}
+ //checking only OF map, since production edge discovery always overwrites any existing edge
+ UpdateType ut = edgeMap.containsKey(dst) ? UpdateType.CHANGED : UpdateType.ADDED;
// notify
- updateEdge(edge, UpdateType.ADDED, props);
+ updateEdge(edge, ut, props);
logger.trace("Add edge {}", edge);
}
return;
}
+
this.discoveryListener.notifyEdge(edge, type, props);
NodeConnector src = edge.getTailNodeConnector(), dst = edge.getHeadNodeConnector();
/**
* The class represents an Edge, the Edge's Property Set and its UpdateType.
+ * If update is on new properties added to an existing edge, appropriate type is CHANGED.
*/
public class TopoEdgeUpdate {
private Edge edge;
*/
public static boolean isMulticastMACAddr(byte[] MACAddress) {
if (MACAddress.length == MACAddrLengthInBytes && !isBroadcastMACAddr(MACAddress)) {
- if (MACAddress[0] % 2 == 1) {
- return true;
- }
+ return (MACAddress[0] & 1) != 0;
}
return false;
}
Assert.assertEquals(32768, NetUtils.getUnsignedShort((short) 0x8000));
Assert.assertEquals(65535, NetUtils.getUnsignedShort((short) 0xffff));
}
+
+ @Test
+ public void testMulticastMACAddr() {
+ byte[] empty = new byte[0];
+ Assert.assertFalse(NetUtils.isUnicastMACAddr(empty));
+ Assert.assertFalse(NetUtils.isMulticastMACAddr(empty));
+
+ byte[] bcast = {
+ (byte)0xff, (byte)0xff, (byte)0xff,
+ (byte)0xff, (byte)0xff, (byte)0xff,
+ };
+ Assert.assertFalse(NetUtils.isUnicastMACAddr(bcast));
+ Assert.assertFalse(NetUtils.isMulticastMACAddr(bcast));
+
+ byte[] firstOctet = {
+ (byte)0x00, (byte)0x20, (byte)0x80, (byte)0xfe,
+ };
+ for (int len = 1; len <= 10; len++) {
+ byte[] ba = new byte[len];
+ boolean valid = (len == 6);
+ for (byte first: firstOctet) {
+ ba[0] = first;
+ Assert.assertFalse(NetUtils.isMulticastMACAddr(ba));
+ Assert.assertEquals(valid, NetUtils.isUnicastMACAddr(ba));
+
+ ba[0] |= (byte)0x01;
+ Assert.assertEquals(valid, NetUtils.isMulticastMACAddr(ba));
+ Assert.assertFalse(NetUtils.isUnicastMACAddr(ba));
+ }
+ }
+ }
}
import java.util.Hashtable;
import org.apache.felix.dm.Component;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import org.opendaylight.controller.clustering.services.IClusterContainerServices;
import org.opendaylight.controller.forwardingrulesmanager.IForwardingRulesManager;
import org.opendaylight.controller.hosttracker.IfIptoHost;
import org.opendaylight.controller.switchmanager.IInventoryListener;
import org.opendaylight.controller.switchmanager.ISwitchManager;
import org.opendaylight.controller.topologymanager.ITopologyManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public class Activator extends ComponentActivatorAbstractBase {
protected static final Logger logger = LoggerFactory
* instantiated in order to get an fully working implementation
* Object
*/
+ @Override
public Object[] getImplementations() {
Object[] res = { SimpleForwardingImpl.class,
SimpleBroadcastHandlerImpl.class };
* also optional per-container different behavior if needed, usually
* should not be the case though.
*/
+ @Override
public void configureInstance(Component c, Object imp, String containerName) {
if (imp.equals(SimpleForwardingImpl.class)) {
+ Dictionary<String, Object> props = new Hashtable<String, Object>();
+ props.put("salListenerName", "simpleforwarding");
+
// export the service
c.setInterface(new String[] { IInventoryListener.class.getName(),
IfNewHostNotify.class.getName(),
- IListenRoutingUpdates.class.getName() }, null);
+ IListenRoutingUpdates.class.getName(),
+ IListenDataPacket.class.getName() }, props);
c.add(createContainerServiceDependency(containerName).setService(
IClusterContainerServices.class).setCallbacks(
c.add(createContainerServiceDependency(containerName).setService(
IRouting.class).setCallbacks("setRouting", "unsetRouting")
.setRequired(false));
- }else if (imp.equals(SimpleBroadcastHandlerImpl.class)) {
+ c.add(createContainerServiceDependency(containerName).setService(
+ IDataPacketService.class).setCallbacks("setDataPacketService",
+ "unsetDataPacketService").setRequired(false));
+
+ } else if (imp.equals(SimpleBroadcastHandlerImpl.class)) {
Dictionary<String, String> props = new Hashtable<String, String>();
props.put("salListenerName", "simplebroadcasthandler");
import java.util.Set;
import java.util.concurrent.locks.ReentrantReadWriteLock;
-import org.opendaylight.controller.sal.packet.Ethernet;
-import org.opendaylight.controller.sal.packet.IDataPacketService;
-import org.opendaylight.controller.sal.packet.IListenDataPacket;
import org.opendaylight.controller.sal.core.ConstructionException;
import org.opendaylight.controller.sal.core.Node;
import org.opendaylight.controller.sal.core.NodeConnector;
+import org.opendaylight.controller.sal.packet.Ethernet;
+import org.opendaylight.controller.sal.packet.IDataPacketService;
+import org.opendaylight.controller.sal.packet.IListenDataPacket;
import org.opendaylight.controller.sal.packet.Packet;
import org.opendaylight.controller.sal.packet.PacketResult;
import org.opendaylight.controller.sal.packet.RawPacket;
public PacketResult receiveDataPacket(RawPacket inPkt) {
/*
* note that this assumes that the protocol plugin will do appropriate
- * filtering to ensure that this only receives packets for it's
+ * filtering to ensure that this only receives packets for its
* container.
*/
lock.writeLock().unlock();
}
+ @Override
public void setMode(BroadcastMode m) {
lock.writeLock().lock();
mode = m;
package org.opendaylight.controller.samples.simpleforwarding.internal;
+import java.net.InetAddress;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.HashMap;
import org.opendaylight.controller.sal.flowprogrammer.Flow;
import org.opendaylight.controller.sal.match.Match;
import org.opendaylight.controller.sal.match.MatchType;
+import org.opendaylight.controller.sal.packet.Ethernet;
+import org.opendaylight.controller.sal.packet.IDataPacketService;
+import org.opendaylight.controller.sal.packet.IListenDataPacket;
+import org.opendaylight.controller.sal.packet.IPv4;
+import org.opendaylight.controller.sal.packet.Packet;
+import org.opendaylight.controller.sal.packet.PacketResult;
+import org.opendaylight.controller.sal.packet.RawPacket;
import org.opendaylight.controller.sal.routing.IListenRoutingUpdates;
import org.opendaylight.controller.sal.routing.IRouting;
import org.opendaylight.controller.sal.utils.EtherTypes;
+import org.opendaylight.controller.sal.utils.NetUtils;
import org.opendaylight.controller.sal.utils.NodeConnectorCreator;
import org.opendaylight.controller.sal.utils.Status;
import org.opendaylight.controller.samples.simpleforwarding.HostNodePair;
* installs those rules using <tt>installPerHostRules()</tt>.
*/
public class SimpleForwardingImpl implements IfNewHostNotify,
- IListenRoutingUpdates, IInventoryListener {
- private static Logger log = LoggerFactory
- .getLogger(SimpleForwardingImpl.class);
+ IListenRoutingUpdates, IInventoryListener, IListenDataPacket {
+ private static Logger log = LoggerFactory.getLogger(SimpleForwardingImpl.class);
private static short DEFAULT_IPSWITCH_PRIORITY = 1;
- private static String FORWARDING_RULES_CACHE_NAME = "forwarding.ipswitch.rules";
+ static final String FORWARDING_RULES_CACHE_NAME = "forwarding.ipswitch.rules";
private IfIptoHost hostTracker;
private IForwardingRulesManager frm;
private ITopologyManager topologyManager;
private Map<Node, List<FlowEntry>> tobePrunedPos = new HashMap<Node, List<FlowEntry>>();
private IClusterContainerServices clusterContainerService = null;
private ISwitchManager switchManager;
+ private IDataPacketService dataPacketService;
/**
* Return codes from the programming of the perHost rules in HW
public enum RulesProgrammingReturnCode {
SUCCESS, FAILED_FEW_SWITCHES, FAILED_ALL_SWITCHES, FAILED_WRONG_PARAMS
}
+ public void setDataPacketService(IDataPacketService s) {
+ log.debug("Setting dataPacketService");
+ this.dataPacketService = s;
+ }
+
+ public void unsetDataPacketService(IDataPacketService s) {
+ if (this.dataPacketService == s) {
+ this.dataPacketService = null;
+ }
+ }
public void setRouting(IRouting routing) {
+ log.debug("Setting routing");
this.routing = routing;
}
}
}
- public ITopologyManager getTopologyManager() {
- return topologyManager;
- }
-
public void setTopologyManager(ITopologyManager topologyManager) {
log.debug("Setting topologyManager");
this.topologyManager = topologyManager;
*
* @return a return code that convey the programming status of the HW
*/
- private RulesProgrammingReturnCode uninstallPerHostRules(
- HostNodeConnector host) {
+ private RulesProgrammingReturnCode uninstallPerHostRules(HostNodeConnector host) {
RulesProgrammingReturnCode retCode = RulesProgrammingReturnCode.SUCCESS;
Map<NodeConnector, FlowEntry> pos;
FlowEntry po;
for (Node swId : switches) {
List<FlowEntry> pl = tobePrunedPos.get(swId);
if (pl != null) {
- log
- .debug(
- "Policies for Switch: {} in the list to be deleted: {}",
- swId, pl);
+ log.debug("Policies for Switch: {} in the list to be deleted: {}", swId, pl);
Iterator<FlowEntry> plIter = pl.iterator();
//for (Policy po: pl) {
while (plIter.hasNext()) {
FlowEntry po = plIter.next();
- log.error("Removing Policy, Switch: {} Policy: {}", swId,
- po);
+ log.error("Removing Policy, Switch: {} Policy: {}", swId, po);
this.frm.uninstallFlowEntry(po);
plIter.remove();
}
this.switchManager = null;
}
}
+
+ @Override
+ public PacketResult receiveDataPacket(RawPacket inPkt) {
+ if (inPkt == null) {
+ return PacketResult.IGNORED;
+ }
+ log.trace("Received a frame of size: {}", inPkt.getPacketData().length);
+ Packet formattedPak = this.dataPacketService.decodeDataPacket(inPkt);
+ if (formattedPak instanceof Ethernet) {
+ Object nextPak = formattedPak.getPayload();
+ if (nextPak instanceof IPv4) {
+ log.trace("Handle punted IP packet: {}", formattedPak);
+ handlePuntedIPPacket((IPv4) nextPak, inPkt.getIncomingNodeConnector());
+ }
+ }
+ return PacketResult.IGNORED;
+
+ }
+
+ private void handlePuntedIPPacket(IPv4 pkt, NodeConnector incomingNodeConnector) {
+ InetAddress dIP = NetUtils.getInetAddress(pkt.getDestinationAddress());
+ if (dIP == null || hostTracker == null) {
+ log.debug("Invalid param(s) in handlePuntedIPPacket.. DestIP: {}. hostTracker: {}", dIP, hostTracker);
+ return;
+ }
+ HostNodeConnector destHost = hostTracker.hostFind(dIP);
+ if (destHost != null
+ && (routing == null ||
+ routing.getRoute(incomingNodeConnector.getNode(), destHost.getnodeconnectorNode()) != null)) {
+
+ log.trace("Host {} is at {}", dIP, destHost.getnodeConnector());
+ HostNodePair key = new HostNodePair(destHost, incomingNodeConnector.getNode());
+
+ // If SimpleForwarding is aware of this host, it will try to install
+ // a path. Forward packet until it's done.
+ if (dataPacketService != null && this.rulesDB.containsKey(key)) {
+
+
+ /*
+ * if we know where the host is and there's a path from where this
+ * packet was punted to where the host is, then attempt best effort delivery to the host
+ */
+ NodeConnector nc = destHost.getnodeConnector();
+ log.trace("Forwarding punted IP received at {} to {}", incomingNodeConnector, nc);
+ // re-encode the Ethernet packet (the parent of the IPv4 packet)
+ RawPacket rp = this.dataPacketService.encodeDataPacket(pkt.getParent());
+ rp.setOutgoingNodeConnector(nc);
+ this.dataPacketService.transmitDataPacket(rp);
+ }
+
+ }
+ }
}
import org.apache.felix.dm.Component;
import org.opendaylight.controller.clustering.services.IClusterContainerServices;
+import org.opendaylight.controller.clustering.services.IClusterGlobalServices;
import org.opendaylight.controller.configuration.IConfigurationContainerAware;
import org.opendaylight.controller.configuration.IConfigurationContainerService;
import org.opendaylight.controller.sal.core.ComponentActivatorAbstractBase;
IConfigurationContainerService.class).setCallbacks(
"setConfigurationContainerService",
"unsetConfigurationContainerService").setRequired(true));
+ c.add(createServiceDependency()
+ .setService(IControllerProperties.class)
+ .setCallbacks("setControllerProperties", "unsetControllerProperties")
+ .setRequired(true));
}
}
+ /**
+ * {@inheritDoc}
+ */
@Override
protected Object[] getGlobalImplementations() {
- final Object[] res = { SwitchManagerCLI.class };
+ final Object[] res = { ControllerProperties.class, SwitchManagerCLI.class };
return res;
}
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void configureGlobalInstance(Component c, Object imp) {
+ if (imp.equals(ControllerProperties.class)) {
+ c.setInterface(new String[] { IControllerProperties.class.getName() }, null);
+
+ c.add(createServiceDependency()
+ .setService(IClusterGlobalServices.class)
+ .setCallbacks("setClusterService", "unsetClusterService")
+ .setRequired(true));
+ }
+ }
}
--- /dev/null
+/*
+ * Copyright (c) 2013 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.controller.switchmanager.internal;
+
+import java.net.NetworkInterface;
+import java.net.SocketException;
+import java.util.EnumSet;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import org.apache.felix.dm.Component;
+import org.opendaylight.controller.clustering.services.CacheConfigException;
+import org.opendaylight.controller.clustering.services.CacheExistException;
+import org.opendaylight.controller.clustering.services.IClusterGlobalServices;
+import org.opendaylight.controller.clustering.services.IClusterServices;
+import org.opendaylight.controller.sal.core.MacAddress;
+import org.opendaylight.controller.sal.core.Property;
+import org.opendaylight.controller.sal.utils.HexEncode;
+import org.opendaylight.controller.sal.utils.Status;
+import org.opendaylight.controller.sal.utils.StatusCode;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * The class ControllerProperties
+ * provides implementation for the ControllerProperties API
+ */
+public class ControllerProperties implements IControllerProperties {
+
+ private IClusterGlobalServices clusterService = null;
+ private final Logger log = LoggerFactory
+ .getLogger(ControllerProperties.class);
+ private static final String controllerGlobalPropertiesCacheName = "switchmanager.controllerGlobalProperties";
+
+ private ConcurrentMap<String, Property> controllerGlobalProperties;
+
+ private void allocateCaches() {
+ if (this.clusterService == null) {
+ this.nonClusterObjectCreate();
+ log.warn("un-initialized clusterService, can't create cache");
+ return;
+ }
+ try {
+ this.clusterService.createCache(controllerGlobalPropertiesCacheName,
+ EnumSet.of(IClusterServices.cacheMode.TRANSACTIONAL));
+ } catch (CacheConfigException cce) {
+ log.error("\nCache configuration invalid - check cache mode");
+ } catch (CacheExistException ce) {
+ log.error("\nCache already exits - destroy and recreate if needed");
+ }
+ }
+
+ private void nonClusterObjectCreate() {
+ controllerGlobalProperties = new ConcurrentHashMap<String, Property>();
+ }
+
+ @SuppressWarnings({ "unchecked" })
+ private void retrieveCaches() {
+ if (this.clusterService == null) {
+ log.warn("un-initialized clusterService, can't create cache");
+ return;
+ }
+ controllerGlobalProperties = (ConcurrentMap<String, Property>) this.clusterService
+ .getCache(controllerGlobalPropertiesCacheName);
+ if (controllerGlobalProperties == null) {
+ log.error("\nFailed to get cache for controllerGlobalProperties");
+ }
+ }
+
+ /**
+ * Function called by the dependency manager when all the required
+ * dependencies are satisfied
+ *
+ * @param c Component
+ */
+ void init(Component c) {
+ // Instantiate cluster synced variables
+ allocateCaches();
+ retrieveCaches();
+ }
+
+ private void initializeProperties() {
+ byte controllerMac[] = getHardwareMAC();
+ if (controllerMac != null) {
+ Property existing = controllerGlobalProperties.putIfAbsent(MacAddress.name, new MacAddress(controllerMac));
+ if (existing == null && log.isTraceEnabled()) {
+ log.trace("Setting controller MAC address in the cluster: {}", HexEncode.bytesToHexStringFormat(controllerMac));
+ }
+ }
+ }
+
+ private byte[] getHardwareMAC() {
+ Enumeration<NetworkInterface> nis;
+ byte[] macAddress = null;
+
+ try {
+ nis = NetworkInterface.getNetworkInterfaces();
+ } catch (SocketException e) {
+ log.error("Failed to acquire controller MAC: ", e);
+ return macAddress;
+ }
+
+ while (nis.hasMoreElements()) {
+ NetworkInterface ni = nis.nextElement();
+ try {
+ macAddress = ni.getHardwareAddress();
+ } catch (SocketException e) {
+ log.error("Failed to acquire controller MAC: ", e);
+ }
+ if (macAddress != null && macAddress.length != 0) {
+ break;
+ }
+ }
+ if (macAddress == null) {
+ log.warn("Failed to acquire controller MAC: No physical interface found");
+ // This happens when running controller on windows VM, for example
+ // TODO: Try parsing the OS command output
+ // For now provide a quick fix for the release
+ macAddress = new byte[] { (byte) 0x00, (byte) 0x00, (byte) 0x0c, (byte) 0x60, (byte) 0x0D, (byte) 0x10 };
+ log.debug("Assigning custom MAC address to controller");
+ }
+ return macAddress;
+ }
+
+ /**
+ * Function called by dependency manager after "init ()" is called and after
+ * the services provided by the class are registered in the service registry
+ *
+ */
+ void start() {
+ // initialize required properties if first node in the cluster
+ if(this.clusterService.amICoordinator()) {
+ initializeProperties();
+ }
+ }
+
+ /**
+ * Function called after registered the service in OSGi service registry.
+ */
+ void started() {
+ // nothing to do
+ }
+
+ /**
+ * Function called before services of the component are removed
+ * from OSGi service registry.
+ */
+ void stopping() {
+ // nothing to do
+ }
+
+ /**
+ * Function called by the dependency manager before the services exported by
+ * the component are unregistered, this will be followed by a "destroy ()"
+ * calls
+ *
+ */
+ void stop() {
+ // nothing to do
+ }
+
+ /**
+ * Function called by the dependency manager when at least one dependency
+ * become unsatisfied or when the component is shutting down because for
+ * example bundle is being stopped.
+ *
+ */
+ void destroy() {
+ // nothing to do
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Map<String, Property> getControllerProperties() {
+ return new HashMap<String, Property>(this.controllerGlobalProperties);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Property getControllerProperty(String propertyName) {
+ if (propertyName != null) {
+ return this.controllerGlobalProperties.get(propertyName);
+ }
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Status setControllerProperty(Property property) {
+ if (property != null) {
+ this.controllerGlobalProperties.put(property.getName(), property);
+ return new Status(StatusCode.SUCCESS);
+ }
+ return new Status(StatusCode.BADREQUEST, "Invalid property provided when setting property");
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public Status removeControllerProperty(String propertyName) {
+ if (propertyName != null) {
+ this.controllerGlobalProperties.remove(propertyName);
+ return new Status(StatusCode.SUCCESS);
+ }
+ return new Status(StatusCode.BADREQUEST, "Invalid property provided when removing property");
+ }
+
+ /**
+ * setClusterService
+ * @param s
+ */
+ public void setClusterService(IClusterGlobalServices s) {
+ this.clusterService = s;
+ }
+
+ /**
+ * unsetClusterServices
+ * @param s
+ */
+ public void unsetClusterServices(IClusterGlobalServices s) {
+ if (this.clusterService == s) {
+ this.clusterService = null;
+ }
+ }
+
+}
--- /dev/null
+/*
+ * Copyright (c) 2013 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.controller.switchmanager.internal;
+
+import java.util.Map;
+
+import org.opendaylight.controller.sal.core.Property;
+import org.opendaylight.controller.sal.utils.Status;
+
+/**
+ * The class ControllerProperties is a global store
+ * for controller properties. Use this api to store/retrieve properties
+ * that are container independent.
+ *
+ * This is visible only to switch manager. Hence its a part of
+ * switch manager internal bundle.
+ */
+public interface IControllerProperties {
+
+ /**
+ * Return all the global properties of the controller
+ *
+ * @return map of {@link org.opendaylight.controller.sal.core.Property} such
+ * as {@link org.opendaylight.controller.sal.core.Description}
+ * and/or {@link org.opendaylight.controller.sal.core.Tier} etc.
+ */
+ public Map<String, Property> getControllerProperties();
+
+ /**
+ * Return a specific property of the controller given the property name
+ *
+ * @param propertyName
+ * the property name specified by
+ * {@link org.opendaylight.controller.sal.core.Property} and its
+ * extended classes
+ * @return {@link org.opendaylight.controller.sal.core.Property}
+ */
+ public Property getControllerProperty(String propertyName);
+
+ /**
+ * Set a specific property of the controller
+ *
+ * @param property
+ * {@link org.opendaylight.controller.sal.core.Property}
+ * @return Status
+ */
+ public Status setControllerProperty(Property property);
+
+ /**
+ * Remove a property of a node
+ *
+ * @param propertyName
+ * the property name specified by
+ * {@link org.opendaylight.controller.sal.core.Property} and its
+ * extended classes
+ * @return success or failed reason
+ */
+ public Status removeControllerProperty(String propertyName);
+
+}
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.InetAddress;
-import java.net.NetworkInterface;
-import java.net.SocketException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Dictionary;
import java.util.EnumSet;
-import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import org.opendaylight.controller.sal.inventory.IListenInventoryUpdates;
import org.opendaylight.controller.sal.reader.NodeDescription;
import org.opendaylight.controller.sal.utils.GlobalConstants;
-import org.opendaylight.controller.sal.utils.HexEncode;
import org.opendaylight.controller.sal.utils.IObjectReader;
import org.opendaylight.controller.sal.utils.Status;
import org.opendaylight.controller.sal.utils.StatusCode;
private ConcurrentMap<String, Property> controllerProps;
private IInventoryService inventoryService;
private IStatisticsManager statisticsManager;
+ private IControllerProperties controllerProperties;
private IConfigurationContainerService configurationService;
private final Set<ISwitchManagerAware> switchManagerAware = Collections
.synchronizedSet(new HashSet<ISwitchManagerAware>());
retrieveCaches();
// Add controller MAC, if first node in the cluster
- if (!controllerProps.containsKey(MacAddress.name)) {
- byte controllerMac[] = getHardwareMAC();
+ if ((!controllerProps.containsKey(MacAddress.name)) && (controllerProperties != null)) {
+ Property controllerMac = controllerProperties.getControllerProperty(MacAddress.name);
if (controllerMac != null) {
- Property existing = controllerProps.putIfAbsent(MacAddress.name, new MacAddress(controllerMac));
+ Property existing = controllerProps.putIfAbsent(MacAddress.name, controllerMac);
if (existing == null && log.isTraceEnabled()) {
log.trace("Container {}: Setting controller MAC address in the cluster: {}", getContainerName(),
- HexEncode.bytesToHexStringFormat(controllerMac));
+ controllerMac);
}
}
}
return (propMap != null) ? propMap.get(propName) : null;
}
- private byte[] getHardwareMAC() {
- Enumeration<NetworkInterface> nis;
- byte[] macAddress = null;
-
- try {
- nis = NetworkInterface.getNetworkInterfaces();
- } catch (SocketException e) {
- log.error("Failed to acquire controller MAC: ", e);
- return macAddress;
- }
-
- while (nis.hasMoreElements()) {
- NetworkInterface ni = nis.nextElement();
- try {
- macAddress = ni.getHardwareAddress();
- } catch (SocketException e) {
- log.error("Failed to acquire controller MAC: ", e);
- }
- if (macAddress != null && macAddress.length != 0) {
- break;
- }
- }
- if (macAddress == null) {
- log.warn("Failed to acquire controller MAC: No physical interface found");
- // This happens when running controller on windows VM, for example
- // Try parsing the OS command output
- }
- return macAddress;
- }
-
@Override
public byte[] getControllerMAC() {
MacAddress macProperty = (MacAddress)controllerProps.get(MacAddress.name);
}
}
+ public void setControllerProperties(IControllerProperties controllerProperties) {
+ log.trace("Got controller properties set request {}", controllerProperties);
+ this.controllerProperties = controllerProperties;
+ }
+
+ public void unsetControllerProperties(IControllerProperties controllerProperties) {
+ log.trace("Got controller properties UNset request");
+ this.controllerProperties = null;
+ }
+
private void getInventories() {
if (inventoryService == null) {
log.trace("inventory service not avaiable");
switch (type) {
case ADDED:
+
+ if (this.edgesDB.containsKey(e)) {
+ // Avoid redundant updates (e.g. cluster switch-over) as notifications trigger expensive tasks
+ log.trace("Skipping redundant edge addition: {}", e);
+ return null;
+ }
+
// Make sure the props are non-null or create a copy
if (props == null) {
props = new HashSet<Property>();
props = new HashSet<Property>(props);
}
- Set<Property> currentProps = this.edgesDB.get(e);
- if (currentProps != null) {
-
- if (currentProps.equals(props)) {
- // Avoid redundant updates as notifications trigger expensive tasks
- log.trace("Skipping redundant edge addition: {}", e);
- return null;
- }
-
- // In case of node switch-over to a different cluster controller,
- // let's retain edge props (e.g. creation time)
- props.addAll(currentProps);
- }
// Ensure that head node connector exists
if (!headNodeConnectorExist(e)) {
case CHANGED:
Set<Property> oldProps = this.edgesDB.get(e);
- // When property changes lets make sure we can change it
+ // When property(s) changes lets make sure we can change it
// all except the creation time stamp because that should
- // be changed only when the edge is destroyed and created
- // again
+ // be set only when the edge is created
TimeStamp timeStamp = null;
for (Property prop : oldProps) {
if (prop instanceof TimeStamp) {
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import com.fasterxml.jackson.databind.ObjectMapper;
import org.opendaylight.controller.connectionmanager.IConnectionManager;
import org.opendaylight.controller.forwarding.staticrouting.IForwardingStaticRouting;
import org.opendaylight.controller.forwarding.staticrouting.StaticRouteConfig;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
+import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
for (NodeConnector nodeConnector : nodeConnectorSet) {
String nodeConnectorNumberToStr = nodeConnector.getID().toString();
Name ncName = ((Name) switchManager.getNodeConnectorProp(nodeConnector, Name.NamePropName));
- Config portStatus = ((Config) switchManager.getNodeConnectorProp(nodeConnector,
+ Config portConfig = ((Config) switchManager.getNodeConnectorProp(nodeConnector,
Config.ConfigPropName));
State portState = ((State) switchManager.getNodeConnectorProp(nodeConnector,
State.StatePropName));
String nodeConnectorName = (ncName != null) ? ncName.getValue() : "";
nodeConnectorName += " (" + nodeConnector.getID() + ")";
- if (portStatus != null) {
- if (portStatus.getValue() == Config.ADMIN_UP) {
- if (portState.getValue() == State.EDGE_UP) {
+ if (portConfig != null) {
+ if (portConfig.getValue() == Config.ADMIN_UP) {
+ if (portState != null && portState.getValue() == State.EDGE_UP) {
nodeConnectorName = "<span class='admin-up'>" + nodeConnectorName + "</span>";
- } else if (portState.getValue() == State.EDGE_DOWN) {
+ } else if (portState == null || portState.getValue() == State.EDGE_DOWN) {
nodeConnectorName = "<span class='edge-down'>" + nodeConnectorName + "</span>";
}
- } else if (portStatus.getValue() == Config.ADMIN_DOWN) {
+ } else if (portConfig.getValue() == Config.ADMIN_DOWN) {
nodeConnectorName = "<span class='admin-down'>" + nodeConnectorName + "</span>";
}
}
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.TreeMap;
import javax.servlet.http.HttpServletRequest;
import org.opendaylight.controller.forwardingrulesmanager.FlowConfig;
import org.opendaylight.controller.forwardingrulesmanager.IForwardingRulesManager;
+import org.opendaylight.controller.sal.action.Action;
+import org.opendaylight.controller.sal.action.ActionType;
+import org.opendaylight.controller.sal.action.SupportedFlowActions;
import org.opendaylight.controller.sal.authorization.Privilege;
import org.opendaylight.controller.sal.authorization.UserLevel;
import org.opendaylight.controller.sal.core.Description;
return nodes;
}
-
@RequestMapping(value = "/flow", method = RequestMethod.POST)
@ResponseBody
public String actionFlow(@RequestParam(required = true) String action, @RequestParam(required = false) String body,
}
}
+ @RequestMapping(value = "/valid-flows/{nodeId}")
+ @ResponseBody
+ public Object getValidActions(HttpServletRequest request, @RequestParam(required = false) String container,
+ @PathVariable("nodeId") String nodeId) {
+ String containerName = (container == null) ? GlobalConstants.DEFAULT.toString() : container;
+
+ // Authorization check
+ String userName = request.getUserPrincipal().getName();
+ if (DaylightWebUtil.getContainerPrivilege(userName, containerName, this) != Privilege.WRITE) {
+ return "Operation not authorized";
+ }
+
+ ISwitchManager switchManager = (ISwitchManager) ServiceHelper.getInstance(ISwitchManager.class, containerName, this);
+ if (switchManager == null) {
+ return null;
+ }
+
+ Map<String, String> result = new TreeMap<String, String>();
+
+ Node node = Node.fromString(nodeId);
+ SupportedFlowActions supportedFlows = (SupportedFlowActions) switchManager.getNodeProp(node, "supportedFlowActions");
+ List<Class<? extends Action>> actions = supportedFlows.getActions();
+ for (Class<? extends Action> action : actions) {
+ String actionName = action.getSimpleName().toLowerCase();
+ if (action.isAssignableFrom(org.opendaylight.controller.sal.action.Drop.class)) {
+ result.put(ActionType.DROP.toString(), "Drop");
+ } else if (action.isAssignableFrom(org.opendaylight.controller.sal.action.Loopback.class)) {
+ result.put(ActionType.LOOPBACK.toString(), "Loopback");
+ } else if (action.isAssignableFrom(org.opendaylight.controller.sal.action.Flood.class)) {
+ result.put(ActionType.FLOOD.toString(), "Flood");
+ } else if (action.isAssignableFrom(org.opendaylight.controller.sal.action.FloodAll.class)) {
+ result.put(ActionType.FLOOD_ALL.toString(), "Flood All");
+ } else if (action.isAssignableFrom(org.opendaylight.controller.sal.action.Controller.class)) {
+ result.put(ActionType.CONTROLLER.toString(), "Controller");
+ } else if (action.isAssignableFrom(org.opendaylight.controller.sal.action.SwPath.class)) {
+ result.put(ActionType.SW_PATH.toString(), "Software Path");
+ } else if (action.isAssignableFrom(org.opendaylight.controller.sal.action.HwPath.class)) {
+ result.put(ActionType.HW_PATH.toString(), "Hardware Path");
+ } else if (action.isAssignableFrom(org.opendaylight.controller.sal.action.Output.class)) {
+ result.put(ActionType.OUTPUT.toString(), "Output");
+ } else if (action.isAssignableFrom(org.opendaylight.controller.sal.action.Enqueue.class)) {
+ result.put(ActionType.ENQUEUE.toString(), "Enqueue");
+ } else if (action.isAssignableFrom(org.opendaylight.controller.sal.action.SetDlSrc.class)) {
+ result.put(ActionType.SET_DL_SRC.toString(), "Set Datalayer Source Address");
+ } else if (action.isAssignableFrom(org.opendaylight.controller.sal.action.SetDlDst.class)) {
+ result.put(ActionType.SET_DL_DST.toString(), "Set Datalayer Destination Address");
+ } else if (action.isAssignableFrom(org.opendaylight.controller.sal.action.SetVlanId.class)) {
+ result.put(ActionType.SET_VLAN_ID.toString(), "Set VLAN ID");
+ } else if (action.isAssignableFrom(org.opendaylight.controller.sal.action.SetVlanPcp.class)) {
+ result.put(ActionType.SET_VLAN_PCP.toString(), "Set VLAN Priority");
+ } else if (action.isAssignableFrom(org.opendaylight.controller.sal.action.SetVlanCfi.class)) {
+ result.put(ActionType.SET_VLAN_CFI.toString(), "Set VLAN CFI");
+ } else if (action.isAssignableFrom(org.opendaylight.controller.sal.action.PopVlan.class)) {
+ result.put(ActionType.POP_VLAN.toString(), "Pop VLAN");
+ } else if (action.isAssignableFrom(org.opendaylight.controller.sal.action.PushVlan.class)) {
+ result.put(ActionType.PUSH_VLAN.toString(), "Push VLAN");
+ } else if (action.isAssignableFrom(org.opendaylight.controller.sal.action.SetDlType.class)) {
+ result.put(ActionType.SET_DL_TYPE.toString(), "Set EtherType");
+ } else if (action.isAssignableFrom(org.opendaylight.controller.sal.action.SetNwSrc.class)) {
+ result.put(ActionType.SET_NW_SRC.toString(), "Set Network Source Address");
+ } else if (action.isAssignableFrom(org.opendaylight.controller.sal.action.SetNwDst.class)) {
+ result.put(ActionType.SET_NW_DST.toString(), "Set Network Destination Address");
+ } else if (action.isAssignableFrom(org.opendaylight.controller.sal.action.SetNwTos.class)) {
+ result.put(ActionType.SET_NW_TOS.toString(), "Modify ToS Bits");
+ } else if (action.isAssignableFrom(org.opendaylight.controller.sal.action.SetTpSrc.class)) {
+ result.put(ActionType.SET_TP_SRC.toString(), "Modify Transport Source Port");
+ } else if (action.isAssignableFrom(org.opendaylight.controller.sal.action.SetTpDst.class)) {
+ result.put(ActionType.SET_TP_DST.toString(), "Modify Transport Destination Port");
+ }
+ }
+
+ return result;
+ }
+
+ private boolean actionCompare(String name, ActionType type) {
+ return name.equals(type.getId().toLowerCase());
+ }
+
private String getNodeDesc(Node node, ISwitchManager switchManager) {
Description desc = (Description) switchManager.getNodeProp(node, Description.propertyName);
String description = (desc == null) ? "" : desc.getValue();
// specify dashlets and layouts
one.f.dashlet = {
- flows : {
- id : 'flows',
- name : 'Flow Entries'
- },
- nodes : {
- id : 'nodes',
- name : 'Nodes'
- },
- detail : {
- id : 'detail',
- name : 'Flow Detail'
- }
+ flows : {
+ id : 'flows',
+ name : 'Flow Entries'
+ },
+ nodes : {
+ id : 'nodes',
+ name : 'Nodes'
+ },
+ detail : {
+ id : 'detail',
+ name : 'Flow Detail'
+ }
};
one.f.menu = {
- left : {
- top : [
- one.f.dashlet.flows
- ],
- bottom : [
- one.f.dashlet.nodes
- ]
- },
- right : {
- top : [],
- bottom : [
- one.f.dashlet.detail
- ]
- }
+ left : {
+ top : [
+ one.f.dashlet.flows
+ ],
+ bottom : [
+ one.f.dashlet.nodes
+ ]
+ },
+ right : {
+ top : [],
+ bottom : [
+ one.f.dashlet.detail
+ ]
+ }
};
one.f.address = {
- root : "/controller/web/flows",
- flows : {
- main : "/main",
- flows : "/node-flows",
- nodes : "/node-ports",
- flow : "/flow",
- modifyFlow : "/modifyFlow",
- deleteFlows:"/flow/deleteFlows"
- }
+ root : "/controller/web/flows",
+ flows : {
+ main : "/main",
+ flows : "/node-flows",
+ nodes : "/node-ports",
+ flow : "/flow",
+ modifyFlow : "/modifyFlow",
+ deleteFlows:"/flow/deleteFlows"
+ }
}
/** NODES **/
one.f.nodes = {
- id : {
- dashlet: {
- datagrid: "one_f_nodes_id_dashlet_datagrid"
- }
- },
- registry : {},
- dashlet : function($dashlet) {
- var $h4 = one.lib.dashlet.header("Nodes");
- $dashlet.append($h4);
-
- one.f.nodes.ajax.dashlet(function(data) {
- var $gridHTML = one.lib.dashlet.datagrid.init(one.f.nodes.id.dashlet.datagrid, {
- searchable: true,
- filterable: false,
- pagination: true,
- flexibleRowsPerPage: true
- }, "table-striped table-condensed");
- $dashlet.append($gridHTML);
- var dataSource = one.f.nodes.data.nodesDataGrid(data);
- $("#" + one.f.nodes.id.dashlet.datagrid).datagrid({dataSource: dataSource});
- });
- },
- ajax : {
- dashlet : function(callback) {
- $.getJSON(one.f.address.root+one.f.address.flows.flows, function(data) {
- callback(data);
- });
- }
- },
- data : {
- nodesDataGrid: function(data) {
- var gridData = [];
- $.each(data, function(nodeName, flow) {
- var nodeFlowObject = {};
- nodeFlowObject["nodeName"] = nodeName;
- nodeFlowObject["flows"] = flow;
- nodeFlowObject["rowData"] = nodeName + flow + "-foobar";
- gridData.push(nodeFlowObject);
- });
+ id : {
+ dashlet: {
+ datagrid: "one_f_nodes_id_dashlet_datagrid"
+ }
+ },
+ registry : {},
+ dashlet : function($dashlet) {
+ var $h4 = one.lib.dashlet.header("Nodes");
+ $dashlet.append($h4);
- var source = new StaticDataSource({
- columns: [
- {
- property: 'nodeName',
- label: 'Node',
- sortable: true
- },
- {
- property: 'flows',
- label: 'Flows',
- sortable: true
- }
- ],
- data: gridData,
- delay: 0
- });
- return source;
- }
- },
- body : {
- dashlet : function(body, callback) {
- var attributes = ['table-striped', 'table-bordered', 'table-hover', 'table-condensed'];
- var $table = one.lib.dashlet.table.table(attributes);
+ one.f.nodes.ajax.dashlet(function(data) {
+ var $gridHTML = one.lib.dashlet.datagrid.init(one.f.nodes.id.dashlet.datagrid, {
+ searchable: true,
+ filterable: false,
+ pagination: true,
+ flexibleRowsPerPage: true
+ }, "table-striped table-condensed");
+ $dashlet.append($gridHTML);
+ var dataSource = one.f.nodes.data.nodesDataGrid(data);
+ $("#" + one.f.nodes.id.dashlet.datagrid).datagrid({dataSource: dataSource});
+ });
+ },
+ ajax : {
+ dashlet : function(callback) {
+ $.getJSON(one.f.address.root+one.f.address.flows.flows, function(data) {
+ callback(data);
+ });
+ }
+ },
+ data : {
+ nodesDataGrid: function(data) {
+ var gridData = [];
+ $.each(data, function(nodeName, flow) {
+ var nodeFlowObject = {};
+ nodeFlowObject["nodeName"] = nodeName;
+ nodeFlowObject["flows"] = flow;
+ nodeFlowObject["rowData"] = nodeName + flow + "-foobar";
+ gridData.push(nodeFlowObject);
+ });
+
+ var source = new StaticDataSource({
+ columns: [
+ {
+ property: 'nodeName',
+ label: 'Node',
+ sortable: true
+ },
+ {
+ property: 'flows',
+ label: 'Flows',
+ sortable: true
+ }
+ ],
+ data: gridData,
+ delay: 0
+ });
+ return source;
+ }
+ },
+ body : {
+ dashlet : function(body, callback) {
+ var attributes = ['table-striped', 'table-bordered', 'table-hover', 'table-condensed'];
+ var $table = one.lib.dashlet.table.table(attributes);
- var headers = ['Node', 'Flows'];
- var $thead = one.lib.dashlet.table.header(headers);
- $table.append($thead);
+ var headers = ['Node', 'Flows'];
+ var $thead = one.lib.dashlet.table.header(headers);
+ $table.append($thead);
- var $tbody = one.lib.dashlet.table.body(body);
- $table.append($tbody);
+ var $tbody = one.lib.dashlet.table.body(body);
+ $table.append($tbody);
- return $table;
- }
+ return $table;
}
+ }
}
/** FLOW DETAIL **/
one.f.detail = {
- id : {},
- registry : {},
- dashlet : function($dashlet, details) {
- var $h4 = one.lib.dashlet.header("Flow Details");
- $dashlet.append($h4);
-
- // details
- if (details == undefined) {
- var $none = $(document.createElement('div'));
- $none.addClass('none');
- var $p = $(document.createElement('p'));
- $p.text('Please select a flow');
- $p.addClass('text-center').addClass('text-info');
+ id : {},
+ registry : {},
+ dashlet : function($dashlet, details) {
+ var $h4 = one.lib.dashlet.header("Flow Details");
+ $dashlet.append($h4);
- $dashlet.append($none)
- .append($p);
- }
- },
- data : {
- dashlet : function(data) {
- var body = [];
- var tr = {};
- var entry = [];
-
- entry.push(data['name']);
- entry.push(data['node']);
- entry.push(data['flow']['priority']);
- entry.push(data['flow']['hardTimeout']);
- entry.push(data['flow']['idleTimeout']);
-
- tr.entry = entry;
- body.push(tr);
- return body;
- },
- description : function(data) {
- var body = [];
- var tr = {};
- var entry = [];
- entry.push(data['flow']['ingressPort']);
- entry.push(data['flow']['etherType']);
- entry.push(data['flow']['vlanId']);
- entry.push(data['flow']['vlanPriority']);
- entry.push(data['flow']['srcMac']);
- entry.push(data['flow']['dstMac']);
- entry.push(data['flow']['srcIp']);
- entry.push(data['flow']['dstIp']);
- entry.push(data['flow']['tosBits']);
- entry.push(data['flow']['srcPort']);
- entry.push(data['flow']['dstPort']);
- entry.push(data['flow']['protocol']);
- entry.push(data['flow']['cookie']);
-
- tr.entry = entry;
- body.push(tr);
- return body;
- },
- actions : function(data) {
- var body = [];
- var tr = {};
- var entry = [];
- var actions = '';
-
- $(data['flow']['actions']).each(function(index, value) {
- var locEqualTo = value.indexOf("=");
- if ( locEqualTo == -1 ) {
- actions += value + ', ';
- } else {
- var action = value.substr(0,locEqualTo);
- if( action == "OUTPUT") {
- var portIds = value.substr(locEqualTo+1).split(",");
- actions += action + "=";
- var allPorts = one.f.flows.registry.nodeports[one.f.flows.registry.selectedNode]['ports'];
- for(var i =0; i < portIds.length ; i++) {
- var portName = allPorts[portIds[i]];
- actions += portName + ", ";
- }
- } else {
- actions += value + ', ';
- }
- }
- });
- actions = actions.slice(0,-2);
- entry.push(actions);
+ // details
+ if (details == undefined) {
+ var $none = $(document.createElement('div'));
+ $none.addClass('none');
+ var $p = $(document.createElement('p'));
+ $p.text('Please select a flow');
+ $p.addClass('text-center').addClass('text-info');
- tr.entry = entry;
- body.push(tr);
- return body;
+ $dashlet.append($none)
+ .append($p);
+ }
+ },
+ data : {
+ dashlet : function(data) {
+ var body = [];
+ var tr = {};
+ var entry = [];
+
+ entry.push(data['name']);
+ entry.push(data['node']);
+ entry.push(data['flow']['priority']);
+ entry.push(data['flow']['hardTimeout']);
+ entry.push(data['flow']['idleTimeout']);
+
+ tr.entry = entry;
+ body.push(tr);
+ return body;
+ },
+ description : function(data) {
+ var body = [];
+ var tr = {};
+ var entry = [];
+ entry.push(data['flow']['ingressPort']);
+ entry.push(data['flow']['etherType']);
+ entry.push(data['flow']['vlanId']);
+ entry.push(data['flow']['vlanPriority']);
+ entry.push(data['flow']['srcMac']);
+ entry.push(data['flow']['dstMac']);
+ entry.push(data['flow']['srcIp']);
+ entry.push(data['flow']['dstIp']);
+ entry.push(data['flow']['tosBits']);
+ entry.push(data['flow']['srcPort']);
+ entry.push(data['flow']['dstPort']);
+ entry.push(data['flow']['protocol']);
+ entry.push(data['flow']['cookie']);
+
+ tr.entry = entry;
+ body.push(tr);
+ return body;
+ },
+ actions : function(data) {
+ var body = [];
+ var tr = {};
+ var entry = [];
+ var actions = '';
+
+ $(data['flow']['actions']).each(function(index, value) {
+ var locEqualTo = value.indexOf("=");
+ if ( locEqualTo == -1 ) {
+ actions += value + ', ';
+ } else {
+ var action = value.substr(0,locEqualTo);
+ if( action == "OUTPUT") {
+ var portIds = value.substr(locEqualTo+1).split(",");
+ actions += action + "=";
+ var allPorts = one.f.flows.registry.nodeports[one.f.flows.registry.selectedNode]['ports'];
+ for(var i =0; i < portIds.length ; i++) {
+ var portName = allPorts[portIds[i]];
+ actions += portName + ", ";
+ }
+ } else {
+ actions += value + ', ';
+ }
}
+ });
+ actions = actions.slice(0,-2);
+ entry.push(actions);
+
+ tr.entry = entry;
+ body.push(tr);
+ return body;
+ }
+ },
+ body : {
+ dashlet : function(body) {
+ // create table
+ var header = ['Flow Name', 'Node', 'Priority', 'Hard Timeout', 'Idle Timeout'];
+ var $thead = one.lib.dashlet.table.header(header);
+ var attributes = ['table-striped', 'table-bordered', 'table-condensed'];
+ var $table = one.lib.dashlet.table.table(attributes);
+ $table.append($thead);
+
+ var $tbody = one.lib.dashlet.table.body(body);
+ $table.append($tbody);
+
+ return $table;
},
- body : {
- dashlet : function(body) {
- // create table
- var header = ['Flow Name', 'Node', 'Priority', 'Hard Timeout', 'Idle Timeout'];
- var $thead = one.lib.dashlet.table.header(header);
- var attributes = ['table-striped', 'table-bordered', 'table-condensed'];
- var $table = one.lib.dashlet.table.table(attributes);
- $table.append($thead);
-
- var $tbody = one.lib.dashlet.table.body(body);
- $table.append($tbody);
-
- return $table;
- },
- description : function(body) {
- var header = ['Input Port', 'Ethernet Type', 'VLAN ID', 'VLAN Priority', 'Source MAC', 'Dest MAC', 'Source IP', 'Dest IP', 'ToS', 'Source Port', 'Dest Port', 'Protocol', 'Cookie'];
- var $thead = one.lib.dashlet.table.header(header);
- var attributes = ['table-striped', 'table-bordered', 'table-condensed'];
- var $table = one.lib.dashlet.table.table(attributes);
- $table.append($thead);
+ description : function(body) {
+ var header = ['Input Port', 'Ethernet Type', 'VLAN ID', 'VLAN Priority', 'Source MAC', 'Dest MAC', 'Source IP', 'Dest IP', 'ToS', 'Source Port', 'Dest Port', 'Protocol', 'Cookie'];
+ var $thead = one.lib.dashlet.table.header(header);
+ var attributes = ['table-striped', 'table-bordered', 'table-condensed'];
+ var $table = one.lib.dashlet.table.table(attributes);
+ $table.append($thead);
- var $tbody = one.lib.dashlet.table.body(body);
- $table.append($tbody);
+ var $tbody = one.lib.dashlet.table.body(body);
+ $table.append($tbody);
- return $table;
- },
- actions : function(body) {
- var header = ['Actions'];
- var $thead = one.lib.dashlet.table.header(header);
- var attributes = ['table-striped', 'table-bordered', 'table-condensed'];
- var $table = one.lib.dashlet.table.table(attributes);
- $table.append($thead);
+ return $table;
+ },
+ actions : function(body) {
+ var header = ['Actions'];
+ var $thead = one.lib.dashlet.table.header(header);
+ var attributes = ['table-striped', 'table-bordered', 'table-condensed'];
+ var $table = one.lib.dashlet.table.table(attributes);
+ $table.append($thead);
- var $tbody = one.lib.dashlet.table.body(body);
- $table.append($tbody);
+ var $tbody = one.lib.dashlet.table.body(body);
+ $table.append($tbody);
- return $table;
- }
+ return $table;
}
+ }
}
/** FLOW ENTRIES **/
one.f.flows = {
- id : {
- dashlet : {
- add : "one_f_flows_id_dashlet_add",
- removeMultiple : "one_f_flows_id_dashlet_removeMultiple",
- remove : "one_f_flows_id_dashlet_remove",
- toggle : "one_f_flows_id_dashlet_toggle",
- edit : "one_f_flows_id_dashlet_edit",
- datagrid : "one_f_flows_id_dashlet_datagrid",
- selectAllFlows : "one_f_flows_id_dashlet_selectAllFlows"
- },
+ id : {
+ dashlet : {
+ add : "one_f_flows_id_dashlet_add",
+ removeMultiple : "one_f_flows_id_dashlet_removeMultiple",
+ remove : "one_f_flows_id_dashlet_remove",
+ toggle : "one_f_flows_id_dashlet_toggle",
+ edit : "one_f_flows_id_dashlet_edit",
+ datagrid : "one_f_flows_id_dashlet_datagrid",
+ selectAllFlows : "one_f_flows_id_dashlet_selectAllFlows"
+ },
+ modal : {
+ install : "one_f_flows_id_modal_install",
+ edit : "one_f_flows_id_modal_edit",
+ add : "one_f_flows_id_modal_add",
+ close : "one_f_flows_id_modal_close",
+ modal : "one_f_flows_id_modal_modal",
+ dialog : {
+ modal : "one_f_flows_id_modal_dialog_modal",
+ remove : "one_f_flows_id_modal_dialog_remove",
+ close : "one_f_flows_id_modal_dialog_close"
+ },
+ action : {
+ button : "one_f_flows_id_modal_action_button",
+ modal : "one_f_flows_id_modal_action_modal",
+ add : "one_f_flows_id_modal_action_add",
+ close : "one_f_flows_id_modal_action_close",
+ table : "one_f_flows_id_modal_action_table",
+ addOutputPorts : "one_f_flows_id_modal_action_addOutputPorts",
+ setVlanId : "one_f_flows_id_modal_action_setVlanId",
+ setVlanPriority : "one_f_flows_id_modal_action_setVlanPriority",
+ modifyDatalayerSourceAddress : "one_f_flows_id_modal_action_modifyDatalayerSourceAddress",
+ modifyDatalayerDestinationAddress : "one_f_flows_id_modal_action_modifyDatalayerDestinationAddress",
+ modifyNetworkSourceAddress : "one_f_flows_modal_action_modifyNetworkSourceAddress",
+ modifyNetworkDestinationAddress : "one_f_flows_modal_action_modifyNetworkDestinationAddress",
+ modifyTosBits : "one_f_flows_modal_action_modifyTosBits",
+ modifyTransportSourcePort : "one_f_flows_modal_action_modifyTransportSourcePort",
+ modifyTransportDestinationPort : "one_f_flows_modal_action_modifyTransportDestinationPort",
modal : {
- install : "one_f_flows_id_modal_install",
- edit : "one_f_flows_id_modal_edit",
- add : "one_f_flows_id_modal_add",
- close : "one_f_flows_id_modal_close",
- modal : "one_f_flows_id_modal_modal",
- dialog : {
- modal : "one_f_flows_id_modal_dialog_modal",
- remove : "one_f_flows_id_modal_dialog_remove",
- close : "one_f_flows_id_modal_dialog_close"
- },
- action : {
- button : "one_f_flows_id_modal_action_button",
- modal : "one_f_flows_id_modal_action_modal",
- add : "one_f_flows_id_modal_action_add",
- close : "one_f_flows_id_modal_action_close",
- table : "one_f_flows_id_modal_action_table",
- addOutputPorts : "one_f_flows_id_modal_action_addOutputPorts",
- setVlanId : "one_f_flows_id_modal_action_setVlanId",
- setVlanPriority : "one_f_flows_id_modal_action_setVlanPriority",
- modifyDatalayerSourceAddress : "one_f_flows_id_modal_action_modifyDatalayerSourceAddress",
- modifyDatalayerDestinationAddress : "one_f_flows_id_modal_action_modifyDatalayerDestinationAddress",
- modifyNetworkSourceAddress : "one_f_flows_modal_action_modifyNetworkSourceAddress",
- modifyNetworkDestinationAddress : "one_f_flows_modal_action_modifyNetworkDestinationAddress",
- modifyTosBits : "one_f_flows_modal_action_modifyTosBits",
- modifyTransportSourcePort : "one_f_flows_modal_action_modifyTransportSourcePort",
- modifyTransportDestinationPort : "one_f_flows_modal_action_modifyTransportDestinationPort",
- modal : {
- modal : "one_f_flows_modal_action_modal_modal",
- remove : "one_f_flows_modal_action_modal_remove",
- cancel : "one_f_flows_modal_action_modal_cancel"
- }
- },
- form : {
- name : "one_f_flows_id_modal_form_name",
- nodes : "one_f_flows_id_modal_form_nodes",
- port : "one_f_flows_id_modal_form_port",
- priority : "one_f_flows_id_modal_form_priority",
- hardTimeout : "one_f_flows_id_modal_form_hardTimeout",
- idleTimeout : "one_f_flows_id_modal_form_idleTimeout",
- cookie : "one_f_flows_id_modal_form_cookie",
- etherType : "one_f_flows_id_modal_form_etherType",
- vlanId : "one_f_flows_id_modal_form_vlanId",
- vlanPriority : "one_f_flows_id_modal_form_vlanPriority",
- srcMac : "one_f_flows_id_modal_form_srcMac",
- dstMac : "one_f_flows_id_modal_form_dstMac",
- srcIp : "one_f_flows_id_modal_form_srcIp",
- dstIp : "one_f_flows_id_modal_form_dstIp",
- tosBits : "one_f_flows_id_modal_form_tosBits",
- srcPort : "one_f_flows_id_modal_form_srcPort",
- dstPort : "one_f_flows_id_modal_form_dstPort",
- protocol : "one_f_flows_id_modal_form_protocol"
- }
+ modal : "one_f_flows_modal_action_modal_modal",
+ remove : "one_f_flows_modal_action_modal_remove",
+ cancel : "one_f_flows_modal_action_modal_cancel"
}
- },
- registry : {},
- dashlet : function($dashlet, callback) {
-
- // load body
- one.f.flows.ajax.dashlet(function(data) {
-
- var $h4 = one.lib.dashlet.header("Flow Entries");
-
- $dashlet.append($h4);
- if (one.f.flows.registry.privilege === 'WRITE') {
- var button = one.lib.dashlet.button.single("Add Flow Entry", one.f.flows.id.dashlet.add, "btn-primary", "btn-mini");
- var $button = one.lib.dashlet.button.button(button);
-
- $button.click(function() {
- var $modal = one.f.flows.modal.initialize();
- $modal.modal();
- });
- $dashlet.append($button);
- var button = one.lib.dashlet.button.single("Remove Flow Entry", one.f.flows.id.dashlet.removeMultiple, "btn-danger", "btn-mini");
- var $button = one.lib.dashlet.button.button(button);
-
- $button.click(function() {
- var checkedCheckBoxes = $('.flowEntry[type=checkbox]:checked');
- if (checkedCheckBoxes.size() === 0) {
- return false;
- }
-
- var requestData = [];
-
- checkedCheckBoxes.each(function(index, value) {
- var flowEntry = {};
- flowEntry['name'] = checkedCheckBoxes[index].name;
- flowEntry['node'] = checkedCheckBoxes[index].getAttribute("node");
- requestData.push(flowEntry);
- });
- one.f.flows.modal.removeMultiple.dialog(requestData);
- });
- $dashlet.append($button);
+ },
+ form : {
+ name : "one_f_flows_id_modal_form_name",
+ nodes : "one_f_flows_id_modal_form_nodes",
+ port : "one_f_flows_id_modal_form_port",
+ priority : "one_f_flows_id_modal_form_priority",
+ hardTimeout : "one_f_flows_id_modal_form_hardTimeout",
+ idleTimeout : "one_f_flows_id_modal_form_idleTimeout",
+ cookie : "one_f_flows_id_modal_form_cookie",
+ etherType : "one_f_flows_id_modal_form_etherType",
+ vlanId : "one_f_flows_id_modal_form_vlanId",
+ vlanPriority : "one_f_flows_id_modal_form_vlanPriority",
+ srcMac : "one_f_flows_id_modal_form_srcMac",
+ dstMac : "one_f_flows_id_modal_form_dstMac",
+ srcIp : "one_f_flows_id_modal_form_srcIp",
+ dstIp : "one_f_flows_id_modal_form_dstIp",
+ tosBits : "one_f_flows_id_modal_form_tosBits",
+ srcPort : "one_f_flows_id_modal_form_srcPort",
+ dstPort : "one_f_flows_id_modal_form_dstPort",
+ protocol : "one_f_flows_id_modal_form_protocol",
+ action : 'one-f-flows-id-modal-form-action'
+ }
+ }
+ },
+ registry : {},
+ dashlet : function($dashlet, callback) {
+ // load body
+ one.f.flows.ajax.dashlet(function(data) {
+ var $h4 = one.lib.dashlet.header("Flow Entries");
+ $dashlet.append($h4);
+ if (one.f.flows.registry.privilege === 'WRITE') {
+ var button = one.lib.dashlet.button.single("Add Flow Entry", one.f.flows.id.dashlet.add, "btn-primary", "btn-mini");
+ var $button = one.lib.dashlet.button.button(button);
+
+ $button.click(function() {
+ var $modal = one.f.flows.modal.initialize();
+ $modal.modal();
+ });
+ $dashlet.append($button);
+ var button = one.lib.dashlet.button.single("Remove Flow Entry", one.f.flows.id.dashlet.removeMultiple, "btn-danger", "btn-mini");
+ var $button = one.lib.dashlet.button.button(button);
+
+ $button.click(function() {
+ var checkedCheckBoxes = $('.flowEntry[type=checkbox]:checked');
+ if (checkedCheckBoxes.size() === 0) {
+ return false;
+ }
- }
+ var requestData = [];
- var $gridHTML = one.lib.dashlet.datagrid.init(one.f.flows.id.dashlet.datagrid, {
- searchable: true,
- filterable: false,
- pagination: true,
- flexibleRowsPerPage: true
- }, "table-striped table-condensed");
- $dashlet.append($gridHTML);
- var dataSource = one.f.flows.data.flowsDataGrid(data);
- $("#" + one.f.flows.id.dashlet.datagrid).datagrid({dataSource: dataSource}).on("loaded", function() {
- $("#"+one.f.flows.id.dashlet.datagrid.selectAllFlows).click(function() {
- $("#" + one.f.flows.id.dashlet.datagrid).find(':checkbox').prop('checked',
- $("#"+one.f.flows.id.dashlet.datagrid.selectAllFlows).is(':checked'));
- });
-
- $("#" + one.f.flows.id.dashlet.datagrid).find("tbody tr").each(function(index, tr) {
- $tr = $(tr);
- $span = $("td span", $tr);
- var flowstatus = $span.data("flowstatus");
- if($span.data("installinhw") != null) {
- var installInHw = $span.data("installinhw").toString();
- if(installInHw == "true" && flowstatus == "Success") {
- $tr.addClass("success");
- } else {
- $tr.addClass("warning");
- }
- }
- // attach mouseover to show pointer cursor
- $tr.mouseover(function() {
- $(this).css("cursor", "pointer");
- });
- // attach click event
- $tr.click(function() {
- var $td = $($(this).find("td")[1]);
- var id = $td.text();
- var node = $td.find("span").data("nodeid");
- one.f.flows.detail(id, node);
- });
- $(".flowEntry").click(function(e){
- if (!$('.flowEntry[type=checkbox]:not(:checked)').length) {
- $("#"+one.f.flows.id.dashlet.datagrid.selectAllFlows)
- .prop("checked",
- true);
- } else {
- $("#"+one.f.flows.id.dashlet.datagrid.selectAllFlows)
- .prop("checked",
- false);
- }
- e.stopPropagation();
- });
- });
- });
-
- // details callback
- if(callback != undefined) callback();
+ checkedCheckBoxes.each(function(index, value) {
+ var flowEntry = {};
+ flowEntry['name'] = checkedCheckBoxes[index].name;
+ flowEntry['node'] = checkedCheckBoxes[index].getAttribute("node");
+ requestData.push(flowEntry);
+ });
+ one.f.flows.modal.removeMultiple.dialog(requestData);
});
- },
- detail : function(id, node) {
- // clear flow details
- var $detailDashlet = one.main.dashlet.right.bottom;
- $detailDashlet.empty();
- var $h4 = one.lib.dashlet.header("Flow Overview");
- $detailDashlet.append($h4);
-
- // details
- var flows = one.f.flows.registry.flows;
- one.f.flows.registry['selectedId'] = id;
- one.f.flows.registry['selectedNode'] = node;
- var flow;
- $(flows).each(function(index, value) {
- if (value.name == id && value.nodeId == node) {
- flow = value;
- }
+ $dashlet.append($button);
+
+ }
+ var $gridHTML = one.lib.dashlet.datagrid.init(one.f.flows.id.dashlet.datagrid, {
+ searchable: true,
+ filterable: false,
+ pagination: true,
+ flexibleRowsPerPage: true
+ }, "table-striped table-condensed");
+ $dashlet.append($gridHTML);
+ var dataSource = one.f.flows.data.flowsDataGrid(data);
+ $("#" + one.f.flows.id.dashlet.datagrid).datagrid({dataSource: dataSource}).on("loaded", function() {
+ $("#"+one.f.flows.id.dashlet.datagrid.selectAllFlows).click(function() {
+ $("#" + one.f.flows.id.dashlet.datagrid).find(':checkbox').prop('checked',
+ $("#"+one.f.flows.id.dashlet.datagrid.selectAllFlows).is(':checked'));
});
- if (one.f.flows.registry.privilege === 'WRITE') {
- // remove button
- var button = one.lib.dashlet.button.single("Remove Flow", one.f.flows.id.dashlet.remove, "btn-danger", "btn-mini");
- var $button = one.lib.dashlet.button.button(button);
- $button.click(function() {
- var $modal = one.f.flows.modal.dialog.initialize(id, node);
- $modal.modal();
- });
- // edit button
- var editButton = one.lib.dashlet.button.single("Edit Flow", one.f.flows.id.dashlet.edit, "btn-primary", "btn-mini");
- var $editButton = one.lib.dashlet.button.button(editButton);
- $editButton.click(function() {
- var install = flow['flow']['installInHw'];
- var $modal = one.f.flows.modal.initialize(true,install);
- $modal.modal().on('shown',function(){
- var $port = $('#'+one.f.flows.id.modal.form.port);
- $('#'+one.f.flows.id.modal.form.nodes).trigger("change");
- });
- });
- // toggle button
- var toggle;
- if (flow['flow']['installInHw'] == 'true' && flow['flow']['status'] == 'Success') {
- toggle = one.lib.dashlet.button.single("Uninstall Flow", one.f.flows.id.dashlet.toggle, "btn-warning", "btn-mini");
- } else {
- toggle = one.lib.dashlet.button.single("Install Flow", one.f.flows.id.dashlet.toggle, "btn-success", "btn-mini");
- }
- var $toggle = one.lib.dashlet.button.button(toggle);
- $toggle.click(function() {
- one.f.flows.modal.ajax.toggleflow(id, node, function(data) {
- if(data == "Success") {
- one.main.dashlet.right.bottom.empty();
- one.f.detail.dashlet(one.main.dashlet.right.bottom);
- one.main.dashlet.left.top.empty();
- one.f.flows.dashlet(one.main.dashlet.left.top, function() {
- // checks are backwards due to stale registry
- if(flow['flow']['installInHw'] == 'true') {
- one.lib.alert('Uninstalled Flow');
- } else {
- one.lib.alert('Installed Flow');
- }
- one.f.flows.detail(id, node)
- });
- } else {
- one.lib.alert('Cannot toggle flow: '+data);
- }
- });
- });
- $detailDashlet.append($button).append($editButton).append($toggle);
- }
- // append details
- var body = one.f.detail.data.dashlet(flow);
- var $body = one.f.detail.body.dashlet(body);
- $detailDashlet.append($body);
- var body = one.f.detail.data.description(flow);
- var $body = one.f.detail.body.description(body);
- $detailDashlet.append($body);
- var body = one.f.detail.data.actions(flow);
- var $body = one.f.detail.body.actions(body);
- $detailDashlet.append($body);
- },
- modal : {
- dialog : {
- initialize : function(id, node) {
- var h3 = "Remove Flow";
- var $p = one.f.flows.modal.dialog.body(id);
- var footer = one.f.flows.modal.dialog.footer();
- var $modal = one.lib.modal.spawn(one.f.flows.id.modal.dialog.modal, h3, $p, footer);
- $('#'+one.f.flows.id.modal.dialog.close, $modal).click(function() {
- $modal.modal('hide');
- });
- $('#'+one.f.flows.id.modal.dialog.remove, $modal).click(function() {
- one.f.flows.modal.ajax.removeflow(id, node, function(data) {
- if (data == "Success") {
- $modal.modal('hide');
- one.main.dashlet.right.bottom.empty();
- one.f.detail.dashlet(one.main.dashlet.right.bottom);
- one.main.dashlet.left.top.empty();
- one.f.flows.dashlet(one.main.dashlet.left.top);
- one.lib.alert('Flow removed');
- } else {
- one.lib.alert('Cannot remove flow: '+data);
- }
- });
- });
- return $modal;
- },
- footer : function() {
- var footer = [];
-
- var removeButton = one.lib.dashlet.button.single("Remove Flow", one.f.flows.id.modal.dialog.remove, "btn-danger", "");
- var $removeButton = one.lib.dashlet.button.button(removeButton);
- footer.push($removeButton);
-
- var closeButton = one.lib.dashlet.button.single("Cancel", one.f.flows.id.modal.dialog.close, "", "");
- var $closeButton = one.lib.dashlet.button.button(closeButton);
- footer.push($closeButton);
-
- return footer;
- },
- body : function(id) {
- var $p = $(document.createElement('p'));
- $p.append('Remove flow '+id+'?');
- return $p;
+ $("#" + one.f.flows.id.dashlet.datagrid).find("tbody tr").each(function(index, tr) {
+ $tr = $(tr);
+ $span = $("td span", $tr);
+ var flowstatus = $span.data("flowstatus");
+ if($span.data("installinhw") != null) {
+ var installInHw = $span.data("installinhw").toString();
+ if(installInHw == "true" && flowstatus == "Success") {
+ $tr.addClass("success");
+ } else {
+ $tr.addClass("warning");
}
- },
- initialize : function(edit,install) {
- var h3;
- if(edit) {
- h3 = "Edit Flow Entry";
- var footer = one.f.flows.modal.footerEdit();
-
+ }
+ // attach mouseover to show pointer cursor
+ $tr.mouseover(function() {
+ $(this).css("cursor", "pointer");
+ });
+ // attach click event
+ $tr.click(function() {
+ var $td = $($(this).find("td")[1]);
+ var id = $td.text();
+ var node = $td.find("span").data("nodeid");
+ one.f.flows.detail(id, node);
+ });
+ $(".flowEntry").click(function(e){
+ if (!$('.flowEntry[type=checkbox]:not(:checked)').length) {
+ $("#"+one.f.flows.id.dashlet.datagrid.selectAllFlows)
+ .prop("checked",
+ true);
} else {
- h3 = "Add Flow Entry";
- var footer = one.f.flows.modal.footer();
+ $("#"+one.f.flows.id.dashlet.datagrid.selectAllFlows)
+ .prop("checked",
+ false);
}
-
- var $modal = one.lib.modal.spawn(one.f.flows.id.modal.modal, h3, "", footer);
-
- // bind close button
- $('#'+one.f.flows.id.modal.close, $modal).click(function() {
- $modal.modal('hide');
+ e.stopPropagation();
+ });
+ });
+ });
+
+ // details callback
+ if(callback != undefined) callback();
+ });
+ },
+ detail : function(id, node) {
+ // clear flow details
+ var $detailDashlet = one.main.dashlet.right.bottom;
+ $detailDashlet.empty();
+ var $h4 = one.lib.dashlet.header("Flow Overview");
+ $detailDashlet.append($h4);
+
+ // details
+ var flows = one.f.flows.registry.flows;
+ one.f.flows.registry['selectedId'] = id;
+ one.f.flows.registry['selectedNode'] = node;
+ var flow;
+ $(flows).each(function(index, value) {
+ if (value.name == id && value.nodeId == node) {
+ flow = value;
+ }
+ });
+ if (one.f.flows.registry.privilege === 'WRITE') {
+ // remove button
+ var button = one.lib.dashlet.button.single("Remove Flow", one.f.flows.id.dashlet.remove, "btn-danger", "btn-mini");
+ var $button = one.lib.dashlet.button.button(button);
+ $button.click(function() {
+ var $modal = one.f.flows.modal.dialog.initialize(id, node);
+ $modal.modal();
+ });
+ // edit button
+ var editButton = one.lib.dashlet.button.single("Edit Flow", one.f.flows.id.dashlet.edit, "btn-primary", "btn-mini");
+ var $editButton = one.lib.dashlet.button.button(editButton);
+ $editButton.click(function() {
+ var install = flow['flow']['installInHw'];
+ var $modal = one.f.flows.modal.initialize(true,install);
+ $modal.modal().on('shown',function(){
+ var $port = $('#'+one.f.flows.id.modal.form.port);
+ $('#'+one.f.flows.id.modal.form.nodes).trigger("change");
+ });
+ });
+ // toggle button
+ var toggle;
+ if (flow['flow']['installInHw'] == 'true' && flow['flow']['status'] == 'Success') {
+ toggle = one.lib.dashlet.button.single("Uninstall Flow", one.f.flows.id.dashlet.toggle, "btn-warning", "btn-mini");
+ } else {
+ toggle = one.lib.dashlet.button.single("Install Flow", one.f.flows.id.dashlet.toggle, "btn-success", "btn-mini");
+ }
+ var $toggle = one.lib.dashlet.button.button(toggle);
+ $toggle.click(function() {
+ one.f.flows.modal.ajax.toggleflow(id, node, function(data) {
+ if(data == "Success") {
+ one.main.dashlet.right.bottom.empty();
+ one.f.detail.dashlet(one.main.dashlet.right.bottom);
+ one.main.dashlet.left.top.empty();
+ one.f.flows.dashlet(one.main.dashlet.left.top, function() {
+ // checks are backwards due to stale registry
+ if(flow['flow']['installInHw'] == 'true') {
+ one.lib.alert('Uninstalled Flow');
+ } else {
+ one.lib.alert('Installed Flow');
+ }
+ one.f.flows.detail(id, node)
});
+ } else {
+ one.lib.alert('Cannot toggle flow: '+data);
+ }
+ });
+ });
- if (edit) {
- // bind edit flow button
- $('#'+one.f.flows.id.modal.edit, $modal).click(function() {
- one.f.flows.modal.save($modal, install, true);
- });
+ $detailDashlet.append($button).append($editButton).append($toggle);
+ }
+ // append details
+ var body = one.f.detail.data.dashlet(flow);
+ var $body = one.f.detail.body.dashlet(body);
+ $detailDashlet.append($body);
+ var body = one.f.detail.data.description(flow);
+ var $body = one.f.detail.body.description(body);
+ $detailDashlet.append($body);
+ var body = one.f.detail.data.actions(flow);
+ var $body = one.f.detail.body.actions(body);
+ $detailDashlet.append($body);
+ },
+ modal : {
+ dialog : {
+ initialize : function(id, node) {
+ var h3 = "Remove Flow";
+ var $p = one.f.flows.modal.dialog.body(id);
+ var footer = one.f.flows.modal.dialog.footer();
+ var $modal = one.lib.modal.spawn(one.f.flows.id.modal.dialog.modal, h3, $p, footer);
+ $('#'+one.f.flows.id.modal.dialog.close, $modal).click(function() {
+ $modal.modal('hide');
+ });
+ $('#'+one.f.flows.id.modal.dialog.remove, $modal).click(function() {
+ one.f.flows.modal.ajax.removeflow(id, node, function(data) {
+ if (data == "Success") {
+ $modal.modal('hide');
+ one.main.dashlet.right.bottom.empty();
+ one.f.detail.dashlet(one.main.dashlet.right.bottom);
+ one.main.dashlet.left.top.empty();
+ one.f.flows.dashlet(one.main.dashlet.left.top);
+ one.lib.alert('Flow removed');
} else {
- // bind add flow button
- $('#'+one.f.flows.id.modal.add, $modal).click(function() {
- one.f.flows.modal.save($modal, 'false');
- });
-
- // bind install flow button
- $('#'+one.f.flows.id.modal.install, $modal).click(function() {
- one.f.flows.modal.save($modal, 'true');
- });
+ one.lib.alert('Cannot remove flow: '+data);
}
+ });
+ });
+ return $modal;
+ },
+ footer : function() {
+ var footer = [];
+
+ var removeButton = one.lib.dashlet.button.single("Remove Flow", one.f.flows.id.modal.dialog.remove, "btn-danger", "");
+ var $removeButton = one.lib.dashlet.button.button(removeButton);
+ footer.push($removeButton);
+
+ var closeButton = one.lib.dashlet.button.single("Cancel", one.f.flows.id.modal.dialog.close, "", "");
+ var $closeButton = one.lib.dashlet.button.button(closeButton);
+ footer.push($closeButton);
+
+ return footer;
+ },
+ body : function(id) {
+ var $p = $(document.createElement('p'));
+ $p.append('Remove flow '+id+'?');
+ return $p;
+ }
+ },
+ initialize : function(edit,install) {
+ var h3;
+ if(edit) {
+ h3 = "Edit Flow Entry";
+ var footer = one.f.flows.modal.footerEdit();
+
+ } else {
+ h3 = "Add Flow Entry";
+ var footer = one.f.flows.modal.footer();
+ }
+
+ var $modal = one.lib.modal.spawn(one.f.flows.id.modal.modal, h3, "", footer);
+
+ // bind close button
+ $('#'+one.f.flows.id.modal.close, $modal).click(function() {
+ $modal.modal('hide');
+ });
+
+ if (edit) {
+ // bind edit flow button
+ $('#'+one.f.flows.id.modal.edit, $modal).click(function() {
+ one.f.flows.modal.save($modal, install, true);
+ });
+ } else {
+ // bind add flow button
+ $('#'+one.f.flows.id.modal.add, $modal).click(function() {
+ one.f.flows.modal.save($modal, 'false');
+ });
+ // bind install flow button
+ $('#'+one.f.flows.id.modal.install, $modal).click(function() {
+ one.f.flows.modal.save($modal, 'true');
+ });
+ }
- var nodes = one.f.flows.registry.nodes;
- var nodeports = one.f.flows.registry.nodeports;
- var $body = one.f.flows.modal.body(nodes, nodeports, edit);
- one.lib.modal.inject.body($modal, $body,edit);
-
- return $modal;
- },
- save : function($modal, install, edit) {
- var result = {};
-
- result['name'] = $('#'+one.f.flows.id.modal.form.name, $modal).val();
- result['ingressPort'] = $('#'+one.f.flows.id.modal.form.port, $modal).val();
- result['priority'] = $('#'+one.f.flows.id.modal.form.priority, $modal).val();
- result['hardTimeout'] = $('#'+one.f.flows.id.modal.form.hardTimeout, $modal).val();
- result['idleTimeout'] = $('#'+one.f.flows.id.modal.form.idleTimeout, $modal).val();
- result['cookie'] = $('#'+one.f.flows.id.modal.form.cookie, $modal).val();
- result['etherType'] = $('#'+one.f.flows.id.modal.form.etherType, $modal).val();
- result['vlanId'] = $('#'+one.f.flows.id.modal.form.vlanId, $modal).val();
- result['vlanPriority'] = $('#'+one.f.flows.id.modal.form.vlanPriority, $modal).val();
- result['dlSrc'] = $('#'+one.f.flows.id.modal.form.srcMac, $modal).val();
- result['dlDst'] = $('#'+one.f.flows.id.modal.form.dstMac, $modal).val();
- result['nwSrc'] = $('#'+one.f.flows.id.modal.form.srcIp, $modal).val();
- result['nwDst'] = $('#'+one.f.flows.id.modal.form.dstIp, $modal).val();
- result['tosBits'] = $('#'+one.f.flows.id.modal.form.tosBits, $modal).val();
- result['tpSrc'] = $('#'+one.f.flows.id.modal.form.srcPort, $modal).val();
- result['tpDst'] = $('#'+one.f.flows.id.modal.form.dstPort, $modal).val();
- result['protocol'] = $('#'+one.f.flows.id.modal.form.protocol, $modal).val();
- result['installInHw'] = install;
-
- var nodeId = $('#'+one.f.flows.id.modal.form.nodes, $modal).val();
-
- $.each(result, function(key, value) {
- if (value == "") delete result[key];
- });
+ var nodes = one.f.flows.registry.nodes;
+ var nodeports = one.f.flows.registry.nodeports;
+ var $body = one.f.flows.modal.body(nodes, nodeports, edit);
+ one.lib.modal.inject.body($modal, $body,edit);
- var action = [];
- var $table = $('#'+one.f.flows.id.modal.action.table, $modal);
- $($table.find('tbody').find('tr')).each(function(index, value) {
- if (!$(this).find('td').hasClass('empty')) {
- action.push($(value).data('action'));
- }
+ return $modal;
+ },
+ save : function($modal, install, edit) {
+ var result = {};
+
+ result['name'] = $('#'+one.f.flows.id.modal.form.name, $modal).val();
+ result['ingressPort'] = $('#'+one.f.flows.id.modal.form.port, $modal).val();
+ result['priority'] = $('#'+one.f.flows.id.modal.form.priority, $modal).val();
+ result['hardTimeout'] = $('#'+one.f.flows.id.modal.form.hardTimeout, $modal).val();
+ result['idleTimeout'] = $('#'+one.f.flows.id.modal.form.idleTimeout, $modal).val();
+ result['cookie'] = $('#'+one.f.flows.id.modal.form.cookie, $modal).val();
+ result['etherType'] = $('#'+one.f.flows.id.modal.form.etherType, $modal).val();
+ result['vlanId'] = $('#'+one.f.flows.id.modal.form.vlanId, $modal).val();
+ result['vlanPriority'] = $('#'+one.f.flows.id.modal.form.vlanPriority, $modal).val();
+ result['dlSrc'] = $('#'+one.f.flows.id.modal.form.srcMac, $modal).val();
+ result['dlDst'] = $('#'+one.f.flows.id.modal.form.dstMac, $modal).val();
+ result['nwSrc'] = $('#'+one.f.flows.id.modal.form.srcIp, $modal).val();
+ result['nwDst'] = $('#'+one.f.flows.id.modal.form.dstIp, $modal).val();
+ result['tosBits'] = $('#'+one.f.flows.id.modal.form.tosBits, $modal).val();
+ result['tpSrc'] = $('#'+one.f.flows.id.modal.form.srcPort, $modal).val();
+ result['tpDst'] = $('#'+one.f.flows.id.modal.form.dstPort, $modal).val();
+ result['protocol'] = $('#'+one.f.flows.id.modal.form.protocol, $modal).val();
+ result['installInHw'] = install;
+
+ var nodeId = $('#'+one.f.flows.id.modal.form.nodes, $modal).val();
+
+ $.each(result, function(key, value) {
+ if (value == "") delete result[key];
+ });
+
+ var action = [];
+ var $table = $('#'+one.f.flows.id.modal.action.table, $modal);
+ $($table.find('tbody').find('tr')).each(function(index, value) {
+ if (!$(this).find('td').hasClass('empty')) {
+ action.push($(value).data('action'));
+ }
+ });
+ result['actions'] = action;
+
+ // frontend validation
+ if (result['name'] == undefined) {
+ alert('Need flow name');
+ return;
+ }
+ if (nodeId == '') {
+ alert('Select node');
+ return;
+ }
+ if (action.length == 0) {
+ alert('Please specify an action');
+ return;
+ }
+
+ // package for ajax call
+ var resource = {};
+ resource['body'] = JSON.stringify(result);
+ if(edit){
+ resource['action'] = 'edit';
+ } else {
+ resource['action'] = 'add';
+ }
+
+ resource['nodeId'] = nodeId;
+
+ if (edit) {
+ one.f.flows.modal.ajax.saveflow(resource, function(data) {
+ if (data == "Success") {
+ $modal.modal('hide').on('hidden', function () {
+ one.f.flows.detail(result['name'], nodeId);
});
- result['actions'] = action;
-
- // frontend validation
- if (result['name'] == undefined) {
- alert('Need flow name');
- return;
- }
- if (nodeId == '') {
- alert('Select node');
- return;
- }
- if (action.length == 0) {
- alert('Please specify an action');
- return;
- }
-
- // package for ajax call
- var resource = {};
- resource['body'] = JSON.stringify(result);
- if(edit){
- resource['action'] = 'edit';
+ one.lib.alert('Flow Entry edited');
+ one.main.dashlet.left.top.empty();
+ one.f.flows.dashlet(one.main.dashlet.left.top);
+ } else {
+ alert('Could not edit flow: '+data);
+ }
+ });
+ } else {
+ one.f.flows.modal.ajax.saveflow(resource, function(data) {
+ if (data == "Success") {
+ $modal.modal('hide');
+ one.lib.alert('Flow Entry added');
+ one.main.dashlet.left.top.empty();
+ one.f.flows.dashlet(one.main.dashlet.left.top);
+ } else {
+ alert('Could not add flow: '+data);
+ }
+ });
+ }
+ },
+ ajax : {
+ nodes : function(successCallback) {
+ $.getJSON(one.f.address.root+one.f.address.flows.nodes, function(data) {
+ var nodes = one.f.flows.modal.data.nodes(data);
+ var nodeports = data;
+ one.f.flows.registry['nodes'] = nodes;
+ one.f.flows.registry['nodeports'] = nodeports;
+
+ successCallback(nodes, nodeports);
+ });
+ },
+ saveflow : function(resource, callback) {
+ $.post(one.f.address.root+one.f.address.flows.flow, resource, function(data) {
+ callback(data);
+ });
+ },
+ removeflow : function(id, node, callback) {
+ resource = {};
+ resource['action'] = 'remove';
+ $.post(one.f.address.root+one.f.address.flows.flow+'/'+node+'/'+id, resource, function(data) {
+ callback(data);
+ });
+ },
+ toggleflow : function(id, node, callback) {
+ resource = {};
+ resource['action'] = 'toggle';
+ $.post(one.f.address.root+one.f.address.flows.flow+'/'+node+'/'+id, resource, function(data) {
+ callback(data);
+ });
+ }
+ },
+ data : {
+ nodes : function(data) {
+ result = {};
+ $.each(data, function(key, value) {
+ result[key] = value['name'];
+ });
+ return result;
+ }
+ },
+ body : function(nodes, nodeports, edit) {
+ var $form = $(document.createElement('form'));
+ var $fieldset = $(document.createElement('fieldset'));
+ var existingFlow;
+ // flow description
+ var $legend = one.lib.form.legend("");
+ $legend.css('visibility', 'hidden');
+ $fieldset.append($legend);
+ // name
+ var $label = one.lib.form.label("Name");
+ var $input = one.lib.form.input("Flow Name");
+ $input.attr('id', one.f.flows.id.modal.form.name);
+ if(edit) {
+ $input.attr('disabled', 'disabled');
+ var flows = one.f.flows.registry.flows;
+ $(flows).each(function(index, value) {
+ if (value.name == one.f.flows.registry.selectedId && value.nodeId == one.f.flows.registry.selectedNode) {
+ existingFlow = value.flow;
+ }
+ });
+ $input.val(existingFlow.name);
+ }
+
+ $fieldset.append($label).append($input);
+ // node
+ var $label = one.lib.form.label("Node");
+ var $select = one.lib.form.select.create(nodes);
+ one.lib.form.select.prepend($select, { '' : 'Please Select a Node' });
+ $select.val($select.find("option:first").val());
+ $select.attr('id', one.f.flows.id.modal.form.nodes);
+ if(edit) {
+ $select.attr('disabled', 'disabled');
+ $select.val(existingFlow.node.type + "|"+ existingFlow.node.nodeIDString);
+ }
+
+ // bind onchange
+ $select.change(function() {
+ // retrieve port value
+ var node = $(this).find('option:selected').attr('value');
+ var $ports = $('#'+one.f.flows.id.modal.form.port);
+ if (node == '') {
+ one.lib.form.select.inject($ports, {});
+ return;
+ }
+ one.f.flows.registry['currentNode'] = node;
+ var ports = nodeports[node]['ports'];
+ one.lib.form.select.inject($ports, ports);
+ one.lib.form.select.prepend($ports, { '' : 'Please Select a Port' });
+ $ports.val($ports.find("option:first").val());
+ if(edit) {
+ $ports.val( existingFlow.ingressPort );
+ }
+ $.getJSON(one.f.address.root+'/valid-flows/'+node, function(response) {
+ var $select = $('#'+one.f.flows.id.modal.form.action, $fieldset);
+ one.lib.form.select.inject($select, response);
+ one.lib.form.select.prepend($select, {'' : 'Please Select an Action'});
+ // when selecting an action
+ $select.change(function() {
+ var action = $(this).find('option:selected');
+ one.f.flows.modal.action.parse(action.attr('value'));
+ $select[0].selectedIndex = 0;
+ });
+ });
+ });
+
+ $fieldset.append($label).append($select);
+ // input port
+ var $label = one.lib.form.label("Input Port");
+ var $select = one.lib.form.select.create();
+
+ $select.attr('id', one.f.flows.id.modal.form.port);
+ $fieldset.append($label).append($select);
+ // priority
+ var $label = one.lib.form.label("Priority");
+ var $input = one.lib.form.input("Priority");
+ $input.attr('id', one.f.flows.id.modal.form.priority);
+ $input.val('500');
+ $fieldset.append($label).append($input);
+ if(edit) {
+ $input.val(existingFlow.priority);
+ }
+ // hardTimeout
+ var $label = one.lib.form.label("Hard Timeout");
+ var $input = one.lib.form.input("Hard Timeout");
+ $input.attr('id', one.f.flows.id.modal.form.hardTimeout);
+ if(edit) {
+ $input.val(existingFlow.hardTimeout);
+ }
+ $fieldset.append($label).append($input);
+
+ // idleTimeout
+ var $label = one.lib.form.label("Idle Timeout");
+ var $input = one.lib.form.input("Idle Timeout");
+ $input.attr('id', one.f.flows.id.modal.form.idleTimeout);
+ $fieldset.append($label).append($input);
+ if(edit) {
+ $input.val(existingFlow.idleTimeout);
+ }
+ // cookie
+ var $label = one.lib.form.label("Cookie");
+ var $input = one.lib.form.input("Cookie");
+ $input.attr('id', one.f.flows.id.modal.form.cookie);
+ $fieldset.append($label).append($input);
+ if(edit) {
+ $input.val(existingFlow.cookie);
+ }
+
+ // layer 2
+ var $legend = one.lib.form.legend("Layer 2");
+ $fieldset.append($legend);
+ // etherType
+ var $label = one.lib.form.label("Ethernet Type");
+ var $input = one.lib.form.input("Ethernet Type");
+ $input.attr('id', one.f.flows.id.modal.form.etherType);
+ $input.val('0x800');
+ $fieldset.append($label).append($input);
+ if(edit) {
+ $input.val(existingFlow.etherType);
+ }
+ // vlanId
+ var $label = one.lib.form.label("VLAN Identification Number");
+ var $input = one.lib.form.input("VLAN Identification Number");
+ $input.attr('id', one.f.flows.id.modal.form.vlanId);
+ var $help = one.lib.form.help("Range: 0 - 4095");
+ $fieldset.append($label).append($input).append($help);
+ if(edit) {
+ $input.val(existingFlow.vlanId);
+ }
+
+ // vlanPriority
+ var $label = one.lib.form.label("VLAN Priority");
+ var $input = one.lib.form.input("VLAN Priority");
+ $input.attr('id', one.f.flows.id.modal.form.vlanPriority);
+ var $help = one.lib.form.help("Range: 0 - 7");
+ $fieldset.append($label).append($input).append($help);
+ if(edit) {
+ $input.val(existingFlow.vlanPriority);
+ }
+
+ // srcMac
+ var $label = one.lib.form.label("Source MAC Address");
+ var $input = one.lib.form.input("3c:97:0e:75:c3:f7");
+ $input.attr('id', one.f.flows.id.modal.form.srcMac);
+ $fieldset.append($label).append($input);
+ if(edit) {
+ $input.val(existingFlow.srcMac);
+ }
+ // dstMac
+ var $label = one.lib.form.label("Destination MAC Address");
+ var $input = one.lib.form.input("7c:d1:c3:e8:e6:99");
+ $input.attr('id', one.f.flows.id.modal.form.dstMac);
+ $fieldset.append($label).append($input);
+ if(edit) {
+ $input.val(existingFlow.dstMac);
+ }
+ // layer 3
+ var $legend = one.lib.form.legend("Layer 3");
+ $fieldset.append($legend);
+
+ // srcIp
+ var $label = one.lib.form.label("Source IP Address");
+ var $input = one.lib.form.input("192.168.3.128");
+ $input.attr('id', one.f.flows.id.modal.form.srcIp);
+ $fieldset.append($label).append($input);
+ if(edit) {
+ $input.val(existingFlow.srcIp);
+ }
+ // dstIp
+ var $label = one.lib.form.label("Destination IP Address");
+ var $input = one.lib.form.input("2001:2334::0/32");
+ $input.attr('id', one.f.flows.id.modal.form.dstIp);
+ $fieldset.append($label).append($input);
+ if(edit) {
+ $input.val(existingFlow.dstIp);
+ }
+ // tosBits
+ var $label = one.lib.form.label("ToS Bits");
+ var $input = one.lib.form.input("ToS Bits");
+ $input.attr('id', one.f.flows.id.modal.form.tosBits);
+ var $help = one.lib.form.help("Range: 0 - 63");
+ $fieldset.append($label).append($input).append($help);
+ if(edit) {
+ $input.val(existingFlow.tosBits);
+ }
+
+ // layer 4
+ var $legend = one.lib.form.legend("Layer 4");
+ $fieldset.append($legend);
+ // srcPort
+ var $label = one.lib.form.label("Source Port");
+ var $input = one.lib.form.input("Source Port");
+ $input.attr('id', one.f.flows.id.modal.form.srcPort);
+ var $help = one.lib.form.help("Range: 0 - 65535");
+ $fieldset.append($label).append($input).append($help);
+ if(edit) {
+ $input.val(existingFlow.srcPort);
+ }
+ // dstPort
+ var $label = one.lib.form.label("Destination Port");
+ var $input = one.lib.form.input("Destination Port");
+ $input.attr('id', one.f.flows.id.modal.form.dstPort);
+ var $help = one.lib.form.help("Range: 0 - 65535");
+ $fieldset.append($label).append($input).append($help);
+ if(edit) {
+ $input.val(existingFlow.dstPort);
+ }
+ // protocol
+ var $label = one.lib.form.label("Protocol");
+ var $input = one.lib.form.input("Protocol");
+ $input.attr('id', one.f.flows.id.modal.form.protocol);
+ $fieldset.append($label).append($input);
+ if(edit) {
+ $input.val(existingFlow.protocol);
+ }
+ // actions
+ var $legend = one.lib.form.label("Actions");
+ $fieldset.append($legend);
+ // actions table
+ var tableAttributes = ["table-striped", "table-bordered", "table-condensed", "table-hover", "table-cursor"];
+ var $table = one.lib.dashlet.table.table(tableAttributes);
+ $table.attr('id', one.f.flows.id.modal.action.table);
+ var tableHeaders = ["Action", "Data"];
+ var $thead = one.lib.dashlet.table.header(tableHeaders);
+ var $tbody = one.lib.dashlet.table.body("", tableHeaders);
+ $table.append($thead).append($tbody);
+ // actions
+ var actions = {
+ "" : "Please Select an Action",
+ "DROP" : "Drop",
+ "LOOPBACK" : "Loopback",
+ "FLOOD" : "Flood",
+ "FLOOD_ALL" : "Flood All",
+ "CONTROLLER" : "Controller",
+ "SW_PATH" : "Software Path",
+ "HW_PATH" : "Hardware Path",
+ "OUTPUT" : "Add Output Ports",
+ "ENQUEUE" : "Enqueue",
+ "SET_VLAN_ID" : "Set VLAN ID",
+ "SET_VLAN_PCP" : "Set VLAN Priority",
+ "SET_VLAN_CFI" : "Set VLAN CFI",
+ "POP_VLAN" : "Strip VLAN Header",
+ "PUSH_VLAN" : "Push VLAN",
+ "SET_DL_SRC" : "Modify Datalayer Source Address",
+ "SET_DL_DST" : "Modify Datalayer Destination Address",
+ "SET_DL_TYPE" : "Set Ethertype",
+ "SET_NW_SRC" : "Modify Network Source Address",
+ "SET_NW_DST" :"Modify Network Destination Address",
+ "SET_NW_TOS" : "Modify ToS Bits",
+ "SET_TP_SRC" : "Modify Transport Source Port",
+ "SET_TP_DST" : "Modify Transport Destination Port"
+ };
+ var $select = one.lib.form.select.create(actions);
+ $select.attr('id', one.f.flows.id.modal.form.action);
+ // when selecting an action
+ $select.change(function() {
+ var action = $(this).find('option:selected');
+ one.f.flows.modal.action.parse(action.attr('value'));
+ $select[0].selectedIndex = 0;
+ });
+
+ if(edit) {
+ $(existingFlow.actions).each(function(index, value){
+ setTimeout(function(){
+ var locEqualTo = value.indexOf("=");
+ if ( locEqualTo == -1 ) {
+ one.f.flows.modal.action.add.add(actions[value], value);
} else {
- resource['action'] = 'add';
+ var action = value.substr(0,locEqualTo);
+ if( action == "OUTPUT") {
+ var portIds = value.substr(locEqualTo+1).split(",");
+ var ports = [];
+ var allPorts = one.f.flows.registry.nodeports[one.f.flows.registry.currentNode]['ports'];
+ for(var i =0; i < portIds.length ; i++) {
+ var portName = allPorts[portIds[i]];
+ ports.push(portName);
+ }
+ one.f.flows.modal.action.add.addPortsToTable(ports.join(", "), portIds.join(","));
+ } else {
+ var val = value.substr(locEqualTo+1);
+ one.f.flows.modal.action.add.addDataToTable(actions[action], val, action)
+ }
}
+ }, 1000)
+ });
+ }
+ $fieldset.append($select).append($table);
- resource['nodeId'] = nodeId;
-
- if (edit) {
- one.f.flows.modal.ajax.saveflow(resource, function(data) {
- if (data == "Success") {
- $modal.modal('hide').on('hidden', function () {
- one.f.flows.detail(result['name'], nodeId);
- });
- one.lib.alert('Flow Entry edited');
- one.main.dashlet.left.top.empty();
- one.f.flows.dashlet(one.main.dashlet.left.top);
- } else {
- alert('Could not edit flow: '+data);
- }
- });
- } else {
- one.f.flows.modal.ajax.saveflow(resource, function(data) {
- if (data == "Success") {
- $modal.modal('hide');
- one.lib.alert('Flow Entry added');
- one.main.dashlet.left.top.empty();
- one.f.flows.dashlet(one.main.dashlet.left.top);
- } else {
- alert('Could not add flow: '+data);
- }
- });
- }
+ // return
+ $form.append($fieldset);
+ return $form;
+ },
+ action : {
+ parse : function(option) {
+ switch (option) {
+ case "OUTPUT" :
+ var h3 = "Add Output Port";
+ var $modal = one.f.flows.modal.action.initialize(h3, one.f.flows.modal.action.body.addOutputPorts, one.f.flows.modal.action.add.addOutputPorts);
+ $modal.modal();
+ break;
+ case "SET_VLAN_ID" :
+ var h3 = "Set VLAN ID";
+ var placeholder = "VLAN Identification Number";
+ var id = one.f.flows.id.modal.action.setVlanId;
+ var help = "Range: 0 - 4095";
+ var action = 'SET_VLAN_ID';
+ var name = "VLAN ID";
+ var body = function() {
+ return one.f.flows.modal.action.body.set(h3, placeholder, id, help);
+ };
+ var add = function($modal) {
+ one.f.flows.modal.action.add.set(name, id, action, $modal);
+ };
+ var $modal = one.f.flows.modal.action.initialize(h3, body, add);
+ $modal.modal();
+ break;
+ case "SET_VLAN_PCP" :
+ var h3 = "Set VLAN Priority";
+ var placeholder = "VLAN Priority";
+ var id = one.f.flows.id.modal.action.setVlanPriority;
+ var help = "Range: 0 - 7";
+ var action = 'SET_VLAN_PCP';
+ var name = "VLAN Priority";
+ var body = function() {
+ return one.f.flows.modal.action.body.set(h3, placeholder, id, help);
+ };
+ var add = function($modal) {
+ one.f.flows.modal.action.add.set(name, id, action, $modal);
+ };
+ var $modal = one.f.flows.modal.action.initialize(h3, body, add);
+ $modal.modal();
+ break;
+ case "SET_VLAN_CFI" :
+ var h3 = "Set VLAN CFI";
+ var placeholder = "VLAN CFI";
+ var id = one.f.flows.id.modal.action.setVlanPriority;
+ var help = "Range: 0 - 1";
+ var action = 'SET_VLAN_CFI';
+ var name = "VLAN CFI";
+ var body = function() {
+ return one.f.flows.modal.action.body.set(h3, placeholder, id, help);
+ };
+ var add = function($modal) {
+ one.f.flows.modal.action.add.set(name, id, action, $modal);
+ };
+ var $modal = one.f.flows.modal.action.initialize(h3, body, add);
+ $modal.modal();
+ break;
+ case "POP_VLAN" :
+ var name = "Strip VLAN Header";
+ var action = 'POP_VLAN';
+ one.f.flows.modal.action.add.add(name, action);
+ break;
+ case "PUSH_VLAN" :
+ var h3 = "Push VLAN";
+ var placeholder = "VLAN";
+ var id = one.f.flows.id.modal.action.setVlanPriority;
+ var help = "Range: 0 - 4095";
+ var action = 'PUSH_VLAN';
+ var name = "VLAN";
+ var body = function() {
+ return one.f.flows.modal.action.body.set(h3, placeholder, id, help);
+ };
+ var add = function($modal) {
+ one.f.flows.modal.action.add.set(name, id, action, $modal);
+ };
+ var $modal = one.f.flows.modal.action.initialize(h3, body, add);
+ $modal.modal();
+ break;
+ case "SET_DL_SRC" :
+ var h3 = "Set Source MAC Address";
+ var placeholder = "Source MAC Address";
+ var id = one.f.flows.id.modal.action.modifyDatalayerSourceAddress;
+ var help = "Example: 00:11:22:aa:bb:cc";
+ var action = 'SET_DL_SRC';
+ var name = "Source MAC";
+ var body = function() {
+ return one.f.flows.modal.action.body.set(h3, placeholder, id, help);
+ };
+ var add = function($modal) {
+ one.f.flows.modal.action.add.set(name, id, action, $modal);
+ };
+ var $modal = one.f.flows.modal.action.initialize(h3, body, add);
+ $modal.modal();
+ break;
+ case "SET_DL_DST" :
+ var h3 = "Set Destination MAC Address";
+ var placeholder = "Destination MAC Address";
+ var id = one.f.flows.id.modal.action.modifyDatalayerDestinationAddress;
+ var help = "Example: 00:11:22:aa:bb:cc";
+ var action = 'SET_DL_DST';
+ var name = "Destination MAC";
+ var body = function() {
+ return one.f.flows.modal.action.body.set(h3, placeholder, id, help);
+ };
+ var add = function($modal) {
+ one.f.flows.modal.action.add.set(name, id, action, $modal);
+ };
+ var $modal = one.f.flows.modal.action.initialize(h3, body, add);
+ $modal.modal();
+ break;
+ case "SET_DL_TYPE" :
+ var h3 = "Set Ethertype";
+ var placeholder = "Ethertype";
+ var id = one.f.flows.id.modal.action.setVlanPriority;
+ var help = "Range: 0 - 65535";
+ var action = 'SET_DL_TYPE';
+ var name = "Ethertype";
+ var body = function() {
+ return one.f.flows.modal.action.body.set(h3, placeholder, id, help);
+ };
+ var add = function($modal) {
+ one.f.flows.modal.action.add.set(name, id, action, $modal);
+ };
+ var $modal = one.f.flows.modal.action.initialize(h3, body, add);
+ $modal.modal();
+ break;
+ case "SET_NW_SRC" :
+ var h3 = "Set IP Source Address";
+ var placeholder = "Source IP Address";
+ var id = one.f.flows.id.modal.action.modifyNetworkSourceAddress;
+ var help = "Example: 127.0.0.1";
+ var action = 'SET_NW_SRC';
+ var name = "Source IP";
+ var body = function() {
+ return one.f.flows.modal.action.body.set(h3, placeholder, id, help);
+ };
+ var add = function($modal) {
+ one.f.flows.modal.action.add.set(name, id, action, $modal);
+ };
+ var $modal = one.f.flows.modal.action.initialize(h3, body, add);
+ $modal.modal();
+ break;
+ case "SET_NW_DST" :
+ var h3 = "Set IP Destination Address";
+ var placeholder = "Destination IP Address";
+ var id = one.f.flows.id.modal.action.modifyNetworkDestinationAddress;
+ var help = "Example: 127.0.0.1";
+ var action = 'SET_NW_DST';
+ var name = "Destination IP";
+ var body = function() {
+ return one.f.flows.modal.action.body.set(h3, placeholder, id, help);
+ };
+ var add = function($modal) {
+ one.f.flows.modal.action.add.set(name, id, action, $modal);
+ };
+ var $modal = one.f.flows.modal.action.initialize(h3, body, add);
+ $modal.modal();
+ break;
+ case "SET_NW_TOS" :
+ var h3 = "Set IPv4 ToS";
+ var placeholder = "IPv4 ToS";
+ var id = one.f.flows.id.modal.action.modifyTosBits;
+ var help = "Range: 0 - 63";
+ var action = 'SET_NW_TOS';
+ var name = "ToS Bits";
+ var body = function() {
+ return one.f.flows.modal.action.body.set(h3, placeholder, id, help);
+ };
+ var add = function($modal) {
+ one.f.flows.modal.action.add.set(name, id, action, $modal);
+ };
+ var $modal = one.f.flows.modal.action.initialize(h3, body, add);
+ $modal.modal();
+ break;
+ case "SET_TP_SRC" :
+ var h3 = "Set Transport Source Port";
+ var placeholder = "Transport Source Port";
+ var id = one.f.flows.id.modal.action.modifyTransportSourcePort;
+ var help = "Range: 1 - 65535";
+ var action = 'SET_TP_SRC';
+ var name = "Source Port";
+ var body = function() {
+ return one.f.flows.modal.action.body.set(h3, placeholder, id, help);
+ };
+ var add = function($modal) {
+ one.f.flows.modal.action.add.set(name, id, action, $modal);
+ };
+ var $modal = one.f.flows.modal.action.initialize(h3, body, add);
+ $modal.modal();
+ break;
+ case "SET_TP_DST" :
+ var h3 = "Set Transport Destination Port";
+ var placeholder = "Transport Destination Port";
+ var id = one.f.flows.id.modal.action.modifyTransportDestinationPort;
+ var help = "Range: 1 - 65535";
+ var action = 'SET_TP_DST';
+ var name = "Destination Port";
+ var body = function() {
+ return one.f.flows.modal.action.body.set(h3, placeholder, id, help);
+ };
+ var add = function($modal) {
+ one.f.flows.modal.action.add.set(name, id, action, $modal);
+ };
+ var $modal = one.f.flows.modal.action.initialize(h3, body, add);
+ $modal.modal();
+ break;
+ case "DROP" :
+ var name = "Drop";
+ var action = 'DROP';
+ one.f.flows.modal.action.add.add(name, action);
+ break;
+ case "LOOPBACK" :
+ var name = "Loopback";
+ var action = 'LOOPBACK';
+ one.f.flows.modal.action.add.add(name, action);
+ break;
+ case "FLOOD" :
+ var name = "Flood";
+ var action = 'FLOOD';
+ one.f.flows.modal.action.add.add(name, action);
+ break;
+ case "FLOOD_ALL" :
+ var name = "Flood All";
+ var action = 'FLOOD_ALL';
+ one.f.flows.modal.action.add.add(name, action);
+ break;
+ case "SW_PATH" :
+ var name = "Software Path";
+ var action = 'SW_PATH';
+ one.f.flows.modal.action.add.add(name, action);
+ break;
+ case "HW_PATH" :
+ var name = "Hardware Path";
+ var action = 'HW_PATH';
+ one.f.flows.modal.action.add.add(name, action);
+ break;
+ case "CONTROLLER" :
+ var name = "Controller";
+ var action = 'CONTROLLER';
+ one.f.flows.modal.action.add.add(name, action);
+ break;
+ case "ENQUEUE" :
+ var name = "Enqueue";
+ var action = 'ENQUEUE';
+ one.f.flows.modal.action.add.add(name, action);
+ break;
+ }
+ },
+ initialize : function(h3, bodyCallback, addCallback) {
+ var footer = one.f.flows.modal.action.footer();
+ var $body = bodyCallback();
+ var $modal = one.lib.modal.spawn(one.f.flows.id.modal.action.modal, h3, $body, footer);
+ // bind close button
+ $('#'+one.f.flows.id.modal.action.close, $modal).click(function() {
+ $modal.modal('hide');
+ });
+ // bind add flow button
+ $('#'+one.f.flows.id.modal.action.add, $modal).click(function() {
+ addCallback($modal);
+ });
+ return $modal;
+ },
+ add : {
+ addOutputPorts : function($modal) {
+ var $options = $('#'+one.f.flows.id.modal.action.addOutputPorts).find('option:selected');
+ var ports = '';
+ var pid = '';
+ $options.each(function(index, value) {
+ ports = ports+$(value).text()+", ";
+ pid = pid+$(value).attr('value')+",";
+ });
+ ports = ports.slice(0,-2);
+ pid = pid.slice(0,-1);
+ one.f.flows.modal.action.add.addPortsToTable(ports, pid);
+ $modal.modal('hide');
},
- ajax : {
- nodes : function(successCallback) {
- $.getJSON(one.f.address.root+one.f.address.flows.nodes, function(data) {
- var nodes = one.f.flows.modal.data.nodes(data);
- var nodeports = data;
- one.f.flows.registry['nodes'] = nodes;
- one.f.flows.registry['nodeports'] = nodeports;
-
- successCallback(nodes, nodeports);
- });
- },
- saveflow : function(resource, callback) {
- $.post(one.f.address.root+one.f.address.flows.flow, resource, function(data) {
- callback(data);
- });
- },
- removeflow : function(id, node, callback) {
- resource = {};
- resource['action'] = 'remove';
- $.post(one.f.address.root+one.f.address.flows.flow+'/'+node+'/'+id, resource, function(data) {
- callback(data);
- });
- },
- toggleflow : function(id, node, callback) {
- resource = {};
- resource['action'] = 'toggle';
- $.post(one.f.address.root+one.f.address.flows.flow+'/'+node+'/'+id, resource, function(data) {
- callback(data);
- });
- }
+ addPortsToTable : function(ports, pid){
+ var $tr = one.f.flows.modal.action.table.add("Add Output Ports", ports);
+ $tr.attr('id', 'OUTPUT');
+ $tr.data('action', 'OUTPUT='+pid);
+ $tr.click(function() {
+ one.f.flows.modal.action.add.modal.initialize(this);
+ });
+ one.f.flows.modal.action.table.append($tr);
},
- data : {
- nodes : function(data) {
- result = {};
- $.each(data, function(key, value) {
- result[key] = value['name'];
- });
- return result;
- }
+ add : function(name, action) {
+ var $tr = one.f.flows.modal.action.table.add(name);
+ $tr.attr('id', action);
+ $tr.data('action', action);
+ $tr.click(function() {
+ one.f.flows.modal.action.add.modal.initialize(this);
+ });
+ one.f.flows.modal.action.table.append($tr);
},
- body : function(nodes, nodeports, edit) {
- var $form = $(document.createElement('form'));
- var $fieldset = $(document.createElement('fieldset'));
- var existingFlow;
- // flow description
- var $legend = one.lib.form.legend("");
- $legend.css('visibility', 'hidden');
- $fieldset.append($legend);
- // name
- var $label = one.lib.form.label("Name");
- var $input = one.lib.form.input("Flow Name");
- $input.attr('id', one.f.flows.id.modal.form.name);
- if(edit) {
- $input.attr('disabled', 'disabled');
- var flows = one.f.flows.registry.flows;
- $(flows).each(function(index, value) {
- if (value.name == one.f.flows.registry.selectedId && value.nodeId == one.f.flows.registry.selectedNode) {
- existingFlow = value.flow;
- }
- });
- $input.val(existingFlow.name);
- }
-
- $fieldset.append($label).append($input);
- // node
- var $label = one.lib.form.label("Node");
- var $select = one.lib.form.select.create(nodes);
- one.lib.form.select.prepend($select, { '' : 'Please Select a Node' });
- $select.val($select.find("option:first").val());
- $select.attr('id', one.f.flows.id.modal.form.nodes);
- if(edit) {
- $select.attr('disabled', 'disabled');
- $select.val(existingFlow.node.type + "|"+ existingFlow.node.nodeIDString);
- }
+ set : function(name, id, action, $modal) {
+ var $input = $('#'+id);
+ var value = $input.val();
+ one.f.flows.modal.action.add.addDataToTable(name,value,action)
+ $modal.modal('hide');
+ },
+ addDataToTable : function(name,value,action) {
+ var $tr = one.f.flows.modal.action.table.add(name, value);
+ $tr.attr('id', action);
+ $tr.data('action', action+'='+value);
+ $tr.click(function() {
+ one.f.flows.modal.action.add.modal.initialize(this);
+ });
+ one.f.flows.modal.action.table.append($tr);
+ },
+ remove : function(that) {
+ $(that).remove();
+ var $table = $('#'+one.f.flows.id.modal.action.table);
+ if ($table.find('tbody').find('tr').size() == 0) {
+ var $tr = $(document.createElement('tr'));
+ var $td = $(document.createElement('td'));
+ $td.attr('colspan', '3');
+ $tr.addClass('empty');
+ $td.text('No data available');
+ $tr.append($td);
+ $table.find('tbody').append($tr);
+ }
+ },
+ modal : {
+ initialize : function(that) {
+ var h3 = "Remove Action";
+ var footer = one.f.flows.modal.action.add.modal.footer();
+ var $body = one.f.flows.modal.action.add.modal.body();
+ var $modal = one.lib.modal.spawn(one.f.flows.id.modal.action.modal.modal, h3, $body, footer);
+
+ // bind cancel button
+ $('#'+one.f.flows.id.modal.action.modal.cancel, $modal).click(function() {
+ $modal.modal('hide');
+ });
- // bind onchange
- $select.change(function() {
- // retrieve port value
- var node = $(this).find('option:selected').attr('value');
- var $ports = $('#'+one.f.flows.id.modal.form.port);
- if (node == '') {
- one.lib.form.select.inject($ports, {});
- return;
- }
- one.f.flows.registry['currentNode'] = node;
- var ports = nodeports[node]['ports'];
- one.lib.form.select.inject($ports, ports);
- one.lib.form.select.prepend($ports, { '' : 'Please Select a Port' });
- $ports.val($ports.find("option:first").val());
- if(edit) {
- $ports.val( existingFlow.ingressPort );
- }
+ // bind remove button
+ $('#'+one.f.flows.id.modal.action.modal.remove, $modal).click(function() {
+ one.f.flows.modal.action.add.remove(that);
+ $modal.modal('hide');
});
- $fieldset.append($label).append($select);
- // input port
- var $label = one.lib.form.label("Input Port");
- var $select = one.lib.form.select.create();
-
- $select.attr('id', one.f.flows.id.modal.form.port);
- $fieldset.append($label).append($select);
- // priority
- var $label = one.lib.form.label("Priority");
- var $input = one.lib.form.input("Priority");
- $input.attr('id', one.f.flows.id.modal.form.priority);
- $input.val('500');
- $fieldset.append($label).append($input);
- if(edit) {
- $input.val(existingFlow.priority);
- }
- // hardTimeout
- var $label = one.lib.form.label("Hard Timeout");
- var $input = one.lib.form.input("Hard Timeout");
- $input.attr('id', one.f.flows.id.modal.form.hardTimeout);
- if(edit) {
- $input.val(existingFlow.hardTimeout);
- }
- $fieldset.append($label).append($input);
-
- // idleTimeout
- var $label = one.lib.form.label("Idle Timeout");
- var $input = one.lib.form.input("Idle Timeout");
- $input.attr('id', one.f.flows.id.modal.form.idleTimeout);
- $fieldset.append($label).append($input);
- if(edit) {
- $input.val(existingFlow.idleTimeout);
- }
- // cookie
- var $label = one.lib.form.label("Cookie");
- var $input = one.lib.form.input("Cookie");
- $input.attr('id', one.f.flows.id.modal.form.cookie);
- $fieldset.append($label).append($input);
- if(edit) {
- $input.val(existingFlow.cookie);
- }
+ $modal.modal();
+ },
+ body : function() {
+ var $p = $(document.createElement('p'));
+ $p.append("Remove this action?");
+ return $p;
+ },
+ footer : function() {
+ var footer = [];
- // layer 2
- var $legend = one.lib.form.legend("Layer 2");
- $fieldset.append($legend);
- // etherType
- var $label = one.lib.form.label("Ethernet Type");
- var $input = one.lib.form.input("Ethernet Type");
- $input.attr('id', one.f.flows.id.modal.form.etherType);
- $input.val('0x800');
- $fieldset.append($label).append($input);
- if(edit) {
- $input.val(existingFlow.etherType);
- }
- // vlanId
- var $label = one.lib.form.label("VLAN Identification Number");
- var $input = one.lib.form.input("VLAN Identification Number");
- $input.attr('id', one.f.flows.id.modal.form.vlanId);
- var $help = one.lib.form.help("Range: 0 - 4095");
- $fieldset.append($label).append($input).append($help);
- if(edit) {
- $input.val(existingFlow.vlanId);
- }
+ var removeButton = one.lib.dashlet.button.single("Remove Action", one.f.flows.id.modal.action.modal.remove, "btn-danger", "");
+ var $removeButton = one.lib.dashlet.button.button(removeButton);
+ footer.push($removeButton);
- // vlanPriority
- var $label = one.lib.form.label("VLAN Priority");
- var $input = one.lib.form.input("VLAN Priority");
- $input.attr('id', one.f.flows.id.modal.form.vlanPriority);
- var $help = one.lib.form.help("Range: 0 - 7");
- $fieldset.append($label).append($input).append($help);
- if(edit) {
- $input.val(existingFlow.vlanPriority);
- }
+ var cancelButton = one.lib.dashlet.button.single("Cancel", one.f.flows.id.modal.action.modal.cancel, "", "");
+ var $cancelButton = one.lib.dashlet.button.button(cancelButton);
+ footer.push($cancelButton);
- // srcMac
- var $label = one.lib.form.label("Source MAC Address");
- var $input = one.lib.form.input("3c:97:0e:75:c3:f7");
- $input.attr('id', one.f.flows.id.modal.form.srcMac);
- $fieldset.append($label).append($input);
- if(edit) {
- $input.val(existingFlow.srcMac);
- }
- // dstMac
- var $label = one.lib.form.label("Destination MAC Address");
- var $input = one.lib.form.input("7c:d1:c3:e8:e6:99");
- $input.attr('id', one.f.flows.id.modal.form.dstMac);
- $fieldset.append($label).append($input);
- if(edit) {
- $input.val(existingFlow.dstMac);
- }
- // layer 3
- var $legend = one.lib.form.legend("Layer 3");
- $fieldset.append($legend);
-
- // srcIp
- var $label = one.lib.form.label("Source IP Address");
- var $input = one.lib.form.input("192.168.3.128");
- $input.attr('id', one.f.flows.id.modal.form.srcIp);
- $fieldset.append($label).append($input);
- if(edit) {
- $input.val(existingFlow.srcIp);
- }
- // dstIp
- var $label = one.lib.form.label("Destination IP Address");
- var $input = one.lib.form.input("2001:2334::0/32");
- $input.attr('id', one.f.flows.id.modal.form.dstIp);
- $fieldset.append($label).append($input);
- if(edit) {
- $input.val(existingFlow.dstIp);
- }
- // tosBits
- var $label = one.lib.form.label("ToS Bits");
- var $input = one.lib.form.input("ToS Bits");
- $input.attr('id', one.f.flows.id.modal.form.tosBits);
- var $help = one.lib.form.help("Range: 0 - 63");
- $fieldset.append($label).append($input).append($help);
- if(edit) {
- $input.val(existingFlow.tosBits);
- }
+ return footer;
+ }
+ }
+ },
+ table : {
+ add : function(action, data) {
+ var $tr = $(document.createElement('tr'));
+ var $td = $(document.createElement('td'));
+ $td.append(action);
+ $tr.append($td);
+ var $td = $(document.createElement('td'));
+ if (data != undefined) $td.append(data);
+ $tr.append($td);
+ return $tr;
+ },
+ append : function($tr) {
+ var $table = $('#'+one.f.flows.id.modal.action.table);
+ var $empty = $table.find('.empty').parent();
+ if ($empty.size() > 0) $empty.remove();
+ $table.append($tr);
+ }
+ },
+ body : {
+ common : function() {
+ var $form = $(document.createElement('form'));
+ var $fieldset = $(document.createElement('fieldset'));
+ return [$form, $fieldset];
+ },
+ addOutputPorts : function() {
+ var common = one.f.flows.modal.action.body.common();
+ var $form = common[0];
+ var $fieldset = common[1];
+ // output port
+ $label = one.lib.form.label("Select Output Ports");
+ if (one.f.flows.registry.currentNode == undefined){
+ return; //Selecting Output ports without selecting node throws an exception
+ }
+ var ports = one.f.flows.registry.nodeports[one.f.flows.registry.currentNode]['ports'];
+ $select = one.lib.form.select.create(ports, true);
+ $select.attr('id', one.f.flows.id.modal.action.addOutputPorts);
+ $fieldset.append($label).append($select);
+ $form.append($fieldset);
+ return $form;
+ },
+ set : function(label, placeholder, id, help) {
+ var common = one.f.flows.modal.action.body.common();
+ var $form = common[0];
+ var $fieldset = common[1];
+ // input
+ $label = one.lib.form.label(label);
+ $input = one.lib.form.input(placeholder);
+ $input.attr('id', id);
+ $help = one.lib.form.help(help);
+ // append
+ $fieldset.append($label).append($input).append($help);
+ $form.append($fieldset);
+ return $form;
+ }
+ },
+ footer : function() {
+ var footer = [];
+ var addButton = one.lib.dashlet.button.single("Add Action", one.f.flows.id.modal.action.add, "btn-primary", "");
+ var $addButton = one.lib.dashlet.button.button(addButton);
+ footer.push($addButton);
+
+ var closeButton = one.lib.dashlet.button.single("Close", one.f.flows.id.modal.action.close, "", "");
+ var $closeButton = one.lib.dashlet.button.button(closeButton);
+ footer.push($closeButton);
+
+ return footer;
+ }
+ },
+ footer : function() {
+ var footer = [];
- // layer 4
- var $legend = one.lib.form.legend("Layer 4");
- $fieldset.append($legend);
- // srcPort
- var $label = one.lib.form.label("Source Port");
- var $input = one.lib.form.input("Source Port");
- $input.attr('id', one.f.flows.id.modal.form.srcPort);
- var $help = one.lib.form.help("Range: 0 - 65535");
- $fieldset.append($label).append($input).append($help);
- if(edit) {
- $input.val(existingFlow.srcPort);
- }
- // dstPort
- var $label = one.lib.form.label("Destination Port");
- var $input = one.lib.form.input("Destination Port");
- $input.attr('id', one.f.flows.id.modal.form.dstPort);
- var $help = one.lib.form.help("Range: 0 - 65535");
- $fieldset.append($label).append($input).append($help);
- if(edit) {
- $input.val(existingFlow.dstPort);
- }
- // protocol
- var $label = one.lib.form.label("Protocol");
- var $input = one.lib.form.input("Protocol");
- $input.attr('id', one.f.flows.id.modal.form.protocol);
- $fieldset.append($label).append($input);
- if(edit) {
- $input.val(existingFlow.protocol);
- }
- // actions
- var $legend = one.lib.form.label("Actions");
- $fieldset.append($legend);
- // actions table
- var tableAttributes = ["table-striped", "table-bordered", "table-condensed", "table-hover", "table-cursor"];
- var $table = one.lib.dashlet.table.table(tableAttributes);
- $table.attr('id', one.f.flows.id.modal.action.table);
- var tableHeaders = ["Action", "Data"];
- var $thead = one.lib.dashlet.table.header(tableHeaders);
- var $tbody = one.lib.dashlet.table.body("", tableHeaders);
- $table.append($thead).append($tbody);
- // actions
- var actions = {
- "" : "Please Select an Action",
- "DROP" : "Drop",
- "LOOPBACK" : "Loopback",
- "FLOOD" : "Flood",
- "SW_PATH" : "Software Path",
- "HW_PATH" : "Hardware Path",
- "CONTROLLER" : "Controller",
- "OUTPUT" : "Add Output Ports",
- "SET_VLAN_ID" : "Set VLAN ID",
- "SET_VLAN_PCP" : "Set VLAN Priority",
- "POP_VLAN" : "Strip VLAN Header",
- "SET_DL_SRC" : "Modify Datalayer Source Address",
- "SET_DL_DST" : "Modify Datalayer Destination Address",
- "SET_NW_SRC" : "Modify Network Source Address",
- "SET_NW_DST" :"Modify Network Destination Address",
- "SET_NW_TOS" : "Modify ToS Bits",
- "SET_TP_SRC" : "Modify Transport Source Port",
- "SET_TP_DST" : "Modify Transport Destination Port"
- };
- var $select = one.lib.form.select.create(actions);
- // when selecting an action
- $select.change(function() {
- var action = $(this).find('option:selected');
- one.f.flows.modal.action.parse(action.attr('value'));
- $select[0].selectedIndex = 0;
- });
+ var installButton = one.lib.dashlet.button.single("Install Flow", one.f.flows.id.modal.install, "btn-success", "");
+ var $installButton = one.lib.dashlet.button.button(installButton);
+ footer.push($installButton);
- if(edit) {
- $(existingFlow.actions).each(function(index, value){
- setTimeout(function(){
- var locEqualTo = value.indexOf("=");
- if ( locEqualTo == -1 ) {
- one.f.flows.modal.action.add.add(actions[value], value);
- } else {
- var action = value.substr(0,locEqualTo);
- if( action == "OUTPUT") {
- var portIds = value.substr(locEqualTo+1).split(",");
- var ports = [];
- var allPorts = one.f.flows.registry.nodeports[one.f.flows.registry.currentNode]['ports'];
- for(var i =0; i < portIds.length ; i++) {
- var portName = allPorts[portIds[i]];
- ports.push(portName);
- }
- one.f.flows.modal.action.add.addPortsToTable(ports.join(", "), portIds.join(","));
- } else {
- var val = value.substr(locEqualTo+1);
- one.f.flows.modal.action.add.addDataToTable(actions[action], val, action)
- }
- }
- }, 1000)
- });
- }
- $fieldset.append($select).append($table);
+ var addButton = one.lib.dashlet.button.single("Save Flow", one.f.flows.id.modal.add, "btn-primary", "");
+ var $addButton = one.lib.dashlet.button.button(addButton);
+ footer.push($addButton);
- // return
- $form.append($fieldset);
- return $form;
- },
- action : {
- parse : function(option) {
- switch (option) {
- case "OUTPUT" :
- var h3 = "Add Output Port";
- var $modal = one.f.flows.modal.action.initialize(h3, one.f.flows.modal.action.body.addOutputPorts, one.f.flows.modal.action.add.addOutputPorts);
- $modal.modal();
- break;
- case "SET_VLAN_ID" :
- var h3 = "Set VLAN ID";
- var placeholder = "VLAN Identification Number";
- var id = one.f.flows.id.modal.action.setVlanId;
- var help = "Range: 0 - 4095";
- var action = 'SET_VLAN_ID';
- var name = "VLAN ID";
- var body = function() {
- return one.f.flows.modal.action.body.set(h3, placeholder, id, help);
- };
- var add = function($modal) {
- one.f.flows.modal.action.add.set(name, id, action, $modal);
- };
- var $modal = one.f.flows.modal.action.initialize(h3, body, add);
- $modal.modal();
- break;
- case "SET_VLAN_PCP" :
- var h3 = "Set VLAN Priority";
- var placeholder = "VLAN Priority";
- var id = one.f.flows.id.modal.action.setVlanPriority;
- var help = "Range: 0 - 7";
- var action = 'SET_VLAN_PCP';
- var name = "VLAN Priority";
- var body = function() {
- return one.f.flows.modal.action.body.set(h3, placeholder, id, help);
- };
- var add = function($modal) {
- one.f.flows.modal.action.add.set(name, id, action, $modal);
- };
- var $modal = one.f.flows.modal.action.initialize(h3, body, add);
- $modal.modal();
- break;
- case "POP_VLAN" :
- var name = "Strip VLAN Header";
- var action = 'POP_VLAN';
- one.f.flows.modal.action.add.add(name, action);
- break;
- case "SET_DL_SRC" :
- var h3 = "Set Source MAC Address";
- var placeholder = "Source MAC Address";
- var id = one.f.flows.id.modal.action.modifyDatalayerSourceAddress;
- var help = "Example: 00:11:22:aa:bb:cc";
- var action = 'SET_DL_SRC';
- var name = "Source MAC";
- var body = function() {
- return one.f.flows.modal.action.body.set(h3, placeholder, id, help);
- };
- var add = function($modal) {
- one.f.flows.modal.action.add.set(name, id, action, $modal);
- };
- var $modal = one.f.flows.modal.action.initialize(h3, body, add);
- $modal.modal();
- break;
- case "SET_DL_DST" :
- var h3 = "Set Destination MAC Address";
- var placeholder = "Destination MAC Address";
- var id = one.f.flows.id.modal.action.modifyDatalayerDestinationAddress;
- var help = "Example: 00:11:22:aa:bb:cc";
- var action = 'SET_DL_DST';
- var name = "Destination MAC";
- var body = function() {
- return one.f.flows.modal.action.body.set(h3, placeholder, id, help);
- };
- var add = function($modal) {
- one.f.flows.modal.action.add.set(name, id, action, $modal);
- };
- var $modal = one.f.flows.modal.action.initialize(h3, body, add);
- $modal.modal();
- break;
- case "SET_NW_SRC" :
- var h3 = "Set IP Source Address";
- var placeholder = "Source IP Address";
- var id = one.f.flows.id.modal.action.modifyNetworkSourceAddress;
- var help = "Example: 127.0.0.1";
- var action = 'SET_NW_SRC';
- var name = "Source IP";
- var body = function() {
- return one.f.flows.modal.action.body.set(h3, placeholder, id, help);
- };
- var add = function($modal) {
- one.f.flows.modal.action.add.set(name, id, action, $modal);
- };
- var $modal = one.f.flows.modal.action.initialize(h3, body, add);
- $modal.modal();
- break;
- case "SET_NW_DST" :
- var h3 = "Set IP Destination Address";
- var placeholder = "Destination IP Address";
- var id = one.f.flows.id.modal.action.modifyNetworkDestinationAddress;
- var help = "Example: 127.0.0.1";
- var action = 'SET_NW_DST';
- var name = "Destination IP";
- var body = function() {
- return one.f.flows.modal.action.body.set(h3, placeholder, id, help);
- };
- var add = function($modal) {
- one.f.flows.modal.action.add.set(name, id, action, $modal);
- };
- var $modal = one.f.flows.modal.action.initialize(h3, body, add);
- $modal.modal();
- break;
- case "SET_NW_TOS" :
- var h3 = "Set IPv4 ToS";
- var placeholder = "IPv4 ToS";
- var id = one.f.flows.id.modal.action.modifyTosBits;
- var help = "Range: 0 - 63";
- var action = 'SET_NW_TOS';
- var name = "ToS Bits";
- var body = function() {
- return one.f.flows.modal.action.body.set(h3, placeholder, id, help);
- };
- var add = function($modal) {
- one.f.flows.modal.action.add.set(name, id, action, $modal);
- };
- var $modal = one.f.flows.modal.action.initialize(h3, body, add);
- $modal.modal();
- break;
- case "SET_TP_SRC" :
- var h3 = "Set Transport Source Port";
- var placeholder = "Transport Source Port";
- var id = one.f.flows.id.modal.action.modifyTransportSourcePort;
- var help = "Range: 1 - 65535";
- var action = 'SET_TP_SRC';
- var name = "Source Port";
- var body = function() {
- return one.f.flows.modal.action.body.set(h3, placeholder, id, help);
- };
- var add = function($modal) {
- one.f.flows.modal.action.add.set(name, id, action, $modal);
- };
- var $modal = one.f.flows.modal.action.initialize(h3, body, add);
- $modal.modal();
- break;
- case "SET_TP_DST" :
- var h3 = "Set Transport Destination Port";
- var placeholder = "Transport Destination Port";
- var id = one.f.flows.id.modal.action.modifyTransportDestinationPort;
- var help = "Range: 1 - 65535";
- var action = 'SET_TP_DST';
- var name = "Destination Port";
- var body = function() {
- return one.f.flows.modal.action.body.set(h3, placeholder, id, help);
- };
- var add = function($modal) {
- one.f.flows.modal.action.add.set(name, id, action, $modal);
- };
- var $modal = one.f.flows.modal.action.initialize(h3, body, add);
- $modal.modal();
- break;
- case "DROP" :
- var name = "Drop";
- var action = 'DROP';
- one.f.flows.modal.action.add.add(name, action);
- break;
- case "LOOPBACK" :
- var name = "Loopback";
- var action = 'LOOPBACK';
- one.f.flows.modal.action.add.add(name, action);
- break;
- case "FLOOD" :
- var name = "Flood";
- var action = 'FLOOD';
- one.f.flows.modal.action.add.add(name, action);
- break;
- case "SW_PATH" :
- var name = "Software Path";
- var action = 'SW_PATH';
- one.f.flows.modal.action.add.add(name, action);
- break;
- case "HW_PATH" :
- var name = "Hardware Path";
- var action = 'HW_PATH';
- one.f.flows.modal.action.add.add(name, action);
- break;
- case "CONTROLLER" :
- var name = "Controller";
- var action = 'CONTROLLER';
- one.f.flows.modal.action.add.add(name, action);
- break;
- }
- },
- initialize : function(h3, bodyCallback, addCallback) {
- var footer = one.f.flows.modal.action.footer();
- var $body = bodyCallback();
- var $modal = one.lib.modal.spawn(one.f.flows.id.modal.action.modal, h3, $body, footer);
- // bind close button
- $('#'+one.f.flows.id.modal.action.close, $modal).click(function() {
- $modal.modal('hide');
- });
- // bind add flow button
- $('#'+one.f.flows.id.modal.action.add, $modal).click(function() {
- addCallback($modal);
- });
- return $modal;
- },
- add : {
- addOutputPorts : function($modal) {
- var $options = $('#'+one.f.flows.id.modal.action.addOutputPorts).find('option:selected');
- var ports = '';
- var pid = '';
- $options.each(function(index, value) {
- ports = ports+$(value).text()+", ";
- pid = pid+$(value).attr('value')+",";
- });
- ports = ports.slice(0,-2);
- pid = pid.slice(0,-1);
- one.f.flows.modal.action.add.addPortsToTable(ports, pid);
- $modal.modal('hide');
- },
- addPortsToTable : function(ports, pid){
- var $tr = one.f.flows.modal.action.table.add("Add Output Ports", ports);
- $tr.attr('id', 'OUTPUT');
- $tr.data('action', 'OUTPUT='+pid);
- $tr.click(function() {
- one.f.flows.modal.action.add.modal.initialize(this);
- });
- one.f.flows.modal.action.table.append($tr);
- },
- add : function(name, action) {
- var $tr = one.f.flows.modal.action.table.add(name);
- $tr.attr('id', action);
- $tr.data('action', action);
- $tr.click(function() {
- one.f.flows.modal.action.add.modal.initialize(this);
- });
- one.f.flows.modal.action.table.append($tr);
- },
- set : function(name, id, action, $modal) {
- var $input = $('#'+id);
- var value = $input.val();
- one.f.flows.modal.action.add.addDataToTable(name,value,action)
- $modal.modal('hide');
- },
- addDataToTable : function(name,value,action) {
- var $tr = one.f.flows.modal.action.table.add(name, value);
- $tr.attr('id', action);
- $tr.data('action', action+'='+value);
- $tr.click(function() {
- one.f.flows.modal.action.add.modal.initialize(this);
- });
- one.f.flows.modal.action.table.append($tr);
- },
- remove : function(that) {
- $(that).remove();
- var $table = $('#'+one.f.flows.id.modal.action.table);
- if ($table.find('tbody').find('tr').size() == 0) {
- var $tr = $(document.createElement('tr'));
- var $td = $(document.createElement('td'));
- $td.attr('colspan', '3');
- $tr.addClass('empty');
- $td.text('No data available');
- $tr.append($td);
- $table.find('tbody').append($tr);
- }
- },
- modal : {
- initialize : function(that) {
- var h3 = "Remove Action";
- var footer = one.f.flows.modal.action.add.modal.footer();
- var $body = one.f.flows.modal.action.add.modal.body();
- var $modal = one.lib.modal.spawn(one.f.flows.id.modal.action.modal.modal, h3, $body, footer);
-
- // bind cancel button
- $('#'+one.f.flows.id.modal.action.modal.cancel, $modal).click(function() {
- $modal.modal('hide');
- });
-
- // bind remove button
- $('#'+one.f.flows.id.modal.action.modal.remove, $modal).click(function() {
- one.f.flows.modal.action.add.remove(that);
- $modal.modal('hide');
- });
-
- $modal.modal();
- },
- body : function() {
- var $p = $(document.createElement('p'));
- $p.append("Remove this action?");
- return $p;
- },
- footer : function() {
- var footer = [];
-
- var removeButton = one.lib.dashlet.button.single("Remove Action", one.f.flows.id.modal.action.modal.remove, "btn-danger", "");
- var $removeButton = one.lib.dashlet.button.button(removeButton);
- footer.push($removeButton);
-
- var cancelButton = one.lib.dashlet.button.single("Cancel", one.f.flows.id.modal.action.modal.cancel, "", "");
- var $cancelButton = one.lib.dashlet.button.button(cancelButton);
- footer.push($cancelButton);
-
- return footer;
- }
- }
- },
- table : {
- add : function(action, data) {
- var $tr = $(document.createElement('tr'));
- var $td = $(document.createElement('td'));
- $td.append(action);
- $tr.append($td);
- var $td = $(document.createElement('td'));
- if (data != undefined) $td.append(data);
- $tr.append($td);
- return $tr;
- },
- append : function($tr) {
- var $table = $('#'+one.f.flows.id.modal.action.table);
- var $empty = $table.find('.empty').parent();
- if ($empty.size() > 0) $empty.remove();
- $table.append($tr);
- }
- },
- body : {
- common : function() {
- var $form = $(document.createElement('form'));
- var $fieldset = $(document.createElement('fieldset'));
- return [$form, $fieldset];
- },
- addOutputPorts : function() {
- var common = one.f.flows.modal.action.body.common();
- var $form = common[0];
- var $fieldset = common[1];
- // output port
- $label = one.lib.form.label("Select Output Ports");
- if (one.f.flows.registry.currentNode == undefined){
- return; //Selecting Output ports without selecting node throws an exception
- }
- var ports = one.f.flows.registry.nodeports[one.f.flows.registry.currentNode]['ports'];
- $select = one.lib.form.select.create(ports, true);
- $select.attr('id', one.f.flows.id.modal.action.addOutputPorts);
- $fieldset.append($label).append($select);
- $form.append($fieldset);
- return $form;
- },
- set : function(label, placeholder, id, help) {
- var common = one.f.flows.modal.action.body.common();
- var $form = common[0];
- var $fieldset = common[1];
- // input
- $label = one.lib.form.label(label);
- $input = one.lib.form.input(placeholder);
- $input.attr('id', id);
- $help = one.lib.form.help(help);
- // append
- $fieldset.append($label).append($input).append($help);
- $form.append($fieldset);
- return $form;
- }
- },
- footer : function() {
- var footer = [];
- var addButton = one.lib.dashlet.button.single("Add Action", one.f.flows.id.modal.action.add, "btn-primary", "");
- var $addButton = one.lib.dashlet.button.button(addButton);
- footer.push($addButton);
-
- var closeButton = one.lib.dashlet.button.single("Close", one.f.flows.id.modal.action.close, "", "");
- var $closeButton = one.lib.dashlet.button.button(closeButton);
- footer.push($closeButton);
-
- return footer;
- }
- },
- footer : function() {
- var footer = [];
+ var closeButton = one.lib.dashlet.button.single("Close", one.f.flows.id.modal.close, "", "");
+ var $closeButton = one.lib.dashlet.button.button(closeButton);
+ footer.push($closeButton);
- var installButton = one.lib.dashlet.button.single("Install Flow", one.f.flows.id.modal.install, "btn-success", "");
- var $installButton = one.lib.dashlet.button.button(installButton);
- footer.push($installButton);
+ return footer;
+ },
+ footerEdit : function() {
+ var footer = [];
- var addButton = one.lib.dashlet.button.single("Save Flow", one.f.flows.id.modal.add, "btn-primary", "");
- var $addButton = one.lib.dashlet.button.button(addButton);
- footer.push($addButton);
+ var editButton = one.lib.dashlet.button.single("Save Flow", one.f.flows.id.modal.edit, "btn-success", "");
+ var $editButton = one.lib.dashlet.button.button(editButton);
+ footer.push($editButton);
- var closeButton = one.lib.dashlet.button.single("Close", one.f.flows.id.modal.close, "", "");
- var $closeButton = one.lib.dashlet.button.button(closeButton);
- footer.push($closeButton);
+ var closeButton = one.lib.dashlet.button.single("Close", one.f.flows.id.modal.close, "", "");
+ var $closeButton = one.lib.dashlet.button.button(closeButton);
+ footer.push($closeButton);
- return footer;
- },
- footerEdit : function() {
- var footer = [];
+ return footer;
+ },
+ removeMultiple: {
+ dialog: function(flows) {
+ var h3 = 'Remove Flow Entry';
+ var flowList = [];
+ for (var i = 0; i < flows.length; i++) {
+ flowList.push(flows[i]["name"]);
+ }
+ var footer = one.f.flows.modal.removeMultiple.footer();
+ var $body = one.f.flows.modal.removeMultiple.body(flowList);
+ var $modal = one.lib.modal.spawn(one.f.flows.id.modal.dialog.modal, h3, $body, footer);
- var editButton = one.lib.dashlet.button.single("Save Flow", one.f.flows.id.modal.edit, "btn-success", "");
- var $editButton = one.lib.dashlet.button.button(editButton);
- footer.push($editButton);
+ // bind close button
+ $('#'+one.f.flows.id.modal.dialog.close, $modal).click(function() {
+ $modal.modal('hide');
+ });
- var closeButton = one.lib.dashlet.button.single("Close", one.f.flows.id.modal.close, "", "");
- var $closeButton = one.lib.dashlet.button.button(closeButton);
- footer.push($closeButton);
+ // bind remove rule button
+ $('#'+one.f.flows.id.modal.dialog.remove, $modal).click(this, function(e) {
+ var resource = {};
+ resource['body'] = JSON.stringify(flows);
- return footer;
- },
- removeMultiple: {
- dialog: function(flows) {
- var h3 = 'Remove Flow Entry';
- var flowList = [];
- for (var i = 0; i < flows.length; i++) {
- flowList.push(flows[i]["name"]);
- }
- var footer = one.f.flows.modal.removeMultiple.footer();
- var $body = one.f.flows.modal.removeMultiple.body(flowList);
- var $modal = one.lib.modal.spawn(one.f.flows.id.modal.dialog.modal, h3, $body, footer);
-
- // bind close button
- $('#'+one.f.flows.id.modal.dialog.close, $modal).click(function() {
- $modal.modal('hide');
- });
-
- // bind remove rule button
- $('#'+one.f.flows.id.modal.dialog.remove, $modal).click(this, function(e) {
- var resource = {};
- resource['body'] = JSON.stringify(flows);
-
- $.post(one.f.address.root+one.f.address.flows.deleteFlows, resource, function(response) {
- $modal.modal('hide');
- if(response == "Success") {
- one.lib.alert("Flow Entry(s) successfully removed");
- } else {
- one.lib.alert(response);
- }
- one.main.dashlet.right.bottom.empty();
- one.f.detail.dashlet(one.main.dashlet.right.bottom);
- one.main.dashlet.left.top.empty();
- one.f.flows.dashlet(one.main.dashlet.left.top);
- });
- });
- $modal.modal();
- },
- footer : function() {
- var footer = [];
- var remove = one.lib.dashlet.button.single('Remove Flow Entry',one.f.flows.id.modal.dialog.remove, 'btn-danger', '');
- var $remove = one.lib.dashlet.button.button(remove);
- footer.push($remove);
-
- var cancel = one.lib.dashlet.button.single('Cancel', one.f.flows.id.modal.dialog.close, '', '');
- var $cancel = one.lib.dashlet.button.button(cancel);
- footer.push($cancel);
-
- return footer;
- },
- body : function (flows) {
- var $p = $(document.createElement('p'));
- var p = 'Remove the following Flow Entry(s)?';
- //creata a BS label for each rule and append to list
- $(flows).each(function(){
- var $span = $(document.createElement('span'));
- $span.append(this);
- p += '<br/>' + $span[0].outerHTML;
- });
- $p.append(p);
- return $p;
+ $.post(one.f.address.root+one.f.address.flows.deleteFlows, resource, function(response) {
+ $modal.modal('hide');
+ if(response == "Success") {
+ one.lib.alert("Flow Entry(s) successfully removed");
+ } else {
+ one.lib.alert(response);
}
- }
- },
- ajax : {
- dashlet : function(callback) {
- $.getJSON(one.f.address.root+one.f.address.flows.main, function(data) {
- one.f.flows.registry['flows'] = data.flows;
- one.f.flows.registry['privilege'] = data.privilege;
- one.f.flows.modal.ajax.nodes(function(){/*Empty function. Do nothing. */})
+ one.main.dashlet.right.bottom.empty();
+ one.f.detail.dashlet(one.main.dashlet.right.bottom);
+ one.main.dashlet.left.top.empty();
+ one.f.flows.dashlet(one.main.dashlet.left.top);
+ });
+ });
+ $modal.modal();
+ },
+ footer : function() {
+ var footer = [];
+ var remove = one.lib.dashlet.button.single('Remove Flow Entry',one.f.flows.id.modal.dialog.remove, 'btn-danger', '');
+ var $remove = one.lib.dashlet.button.button(remove);
+ footer.push($remove);
+
+ var cancel = one.lib.dashlet.button.single('Cancel', one.f.flows.id.modal.dialog.close, '', '');
+ var $cancel = one.lib.dashlet.button.button(cancel);
+ footer.push($cancel);
+
+ return footer;
+ },
+ body : function (flows) {
+ var $p = $(document.createElement('p'));
+ var p = 'Remove the following Flow Entry(s)?';
+ //creata a BS label for each rule and append to list
+ $(flows).each(function(){
+ var $span = $(document.createElement('span'));
+ $span.append(this);
+ p += '<br/>' + $span[0].outerHTML;
+ });
+ $p.append(p);
+ return $p;
+ }
+ }
+ },
+ ajax : {
+ dashlet : function(callback) {
+ $.getJSON(one.f.address.root+one.f.address.flows.main, function(data) {
+ one.f.flows.registry['flows'] = data.flows;
+ one.f.flows.registry['privilege'] = data.privilege;
+ one.f.flows.modal.ajax.nodes(function(){/*Empty function. Do nothing. */})
+
+ callback(data);
+ });
+ }
+ },
+ data : {
+ flowsDataGrid: function(data) {
+ var source = new StaticDataSource({
+ columns: [
+ {
+ property: 'selector',
+ label: "<input type='checkbox' id='"+one.f.flows.id.dashlet.datagrid.selectAllFlows+"'/>",
+ sortable: false
+ },
+ {
+ property: 'name',
+ label: 'Flow Name',
+ sortable: true
+ },
+ {
+ property: 'node',
+ label: 'Node',
+ sortable: true
+ }
+ ],
+ data: data.flows,
+ formatter: function(items) {
+ $.each(items, function(index, item) {
+ var $checkbox = document.createElement("input");
+ $checkbox.setAttribute("type", "checkbox");
+ $checkbox.setAttribute("name", item.name);
+ $checkbox.setAttribute("node", item.nodeId);
+ $checkbox.setAttribute('class','flowEntry')
+ item.selector = $checkbox.outerHTML;
+ item["name"] = '<span data-installInHw=' + item["flow"]["installInHw"] +
+ ' data-flowstatus=' + item["flow"]["status"] +
+ ' data-nodeId=' + item["nodeId"] + '>' + item["name"] + '</span>';
+ });
- callback(data);
- });
- }
- },
- data : {
- flowsDataGrid: function(data) {
- var source = new StaticDataSource({
- columns: [
- {
- property: 'selector',
- label: "<input type='checkbox' id='"+one.f.flows.id.dashlet.datagrid.selectAllFlows+"'/>",
- sortable: false
- },
- {
- property: 'name',
- label: 'Flow Name',
- sortable: true
- },
- {
- property: 'node',
- label: 'Node',
- sortable: true
- }
- ],
- data: data.flows,
- formatter: function(items) {
- $.each(items, function(index, item) {
- var $checkbox = document.createElement("input");
- $checkbox.setAttribute("type", "checkbox");
- $checkbox.setAttribute("name", item.name);
- $checkbox.setAttribute("node", item.nodeId);
- $checkbox.setAttribute('class','flowEntry')
- item.selector = $checkbox.outerHTML;
- item["name"] = '<span data-installInHw=' + item["flow"]["installInHw"] +
- ' data-flowstatus=' + item["flow"]["status"] +
- ' data-nodeId=' + item["nodeId"] + '>' + item["name"] + '</span>';
- });
-
- },
- delay: 0
- });
- return source;
- },
- dashlet : function(data) {
- var body = [];
- $(data).each(function(index, value) {
- var tr = {};
- var entry = [];
-
-
- entry.push(value['name']);
- entry.push(value['node']);
- if (value['flow']['installInHw'] == 'true' && value['flow']['status'] == 'Success')
- tr['type'] = ['success'];
- else if (value['flow']['installInHw'] == 'false' && value['flow']['status'] == 'Success')
- tr['type'] = ['warning'];
- else
- tr['type'] = ['warning'];
- tr['entry'] = entry;
- tr['id'] = value['nodeId'];
-
- body.push(tr);
- });
- return body;
- }
+ },
+ delay: 0
+ });
+ return source;
},
- body : {
- dashlet : function(body, callback) {
- var attributes = ['table-striped', 'table-bordered', 'table-hover', 'table-condensed', 'table-cursor'];
- var $table = one.lib.dashlet.table.table(attributes);
-
- var headers = ['Flow Name', 'Node'];
-
- var $thead = one.lib.dashlet.table.header(headers);
- $table.append($thead);
-
- var $tbody = one.lib.dashlet.table.body(body);
- $table.append($tbody);
- return $table;
- }
+ dashlet : function(data) {
+ var body = [];
+ $(data).each(function(index, value) {
+ var tr = {};
+ var entry = [];
+
+
+ entry.push(value['name']);
+ entry.push(value['node']);
+ if (value['flow']['installInHw'] == 'true' && value['flow']['status'] == 'Success')
+ tr['type'] = ['success'];
+ else if (value['flow']['installInHw'] == 'false' && value['flow']['status'] == 'Success')
+ tr['type'] = ['warning'];
+ else
+ tr['type'] = ['warning'];
+ tr['entry'] = entry;
+ tr['id'] = value['nodeId'];
+
+ body.push(tr);
+ });
+ return body;
}
+ },
+ body : {
+ dashlet : function(body, callback) {
+ var attributes = ['table-striped', 'table-bordered', 'table-hover', 'table-condensed', 'table-cursor'];
+ var $table = one.lib.dashlet.table.table(attributes);
+
+ var headers = ['Flow Name', 'Node'];
+
+ var $thead = one.lib.dashlet.table.header(headers);
+ $table.append($thead);
+
+ var $tbody = one.lib.dashlet.table.body(body);
+ $table.append($tbody);
+ return $table;
+ }
+ }
}
/** INIT **/
// populate nav tabs
$(one.f.menu.left.top).each(function(index, value) {
- var $nav = $(".nav", "#left-top");
- one.main.page.dashlet($nav, value);
+ var $nav = $(".nav", "#left-top");
+ one.main.page.dashlet($nav, value);
});
$(one.f.menu.left.bottom).each(function(index, value) {
- var $nav = $(".nav", "#left-bottom");
- one.main.page.dashlet($nav, value);
+ var $nav = $(".nav", "#left-bottom");
+ one.main.page.dashlet($nav, value);
});
$(one.f.menu.right.bottom).each(function(index, value) {
- var $nav = $(".nav", "#right-bottom");
- one.main.page.dashlet($nav, value);
+ var $nav = $(".nav", "#right-bottom");
+ one.main.page.dashlet($nav, value);
});
one.f.populate = function($dashlet, header) {
- var $h4 = one.lib.dashlet.header(header);
- $dashlet.append($h4);
+ var $h4 = one.lib.dashlet.header(header);
+ $dashlet.append($h4);
};
// bind dashlet nav
$('.dash .nav a', '#main').click(function() {
- // de/activation
- var $li = $(this).parent();
- var $ul = $li.parent();
- one.lib.nav.unfocus($ul);
- $li.addClass('active');
- // clear respective dashlet
- var $dashlet = $ul.parent().find('.dashlet');
- one.lib.dashlet.empty($dashlet);
- // callback based on menu
- var id = $(this).attr('id');
- var menu = one.f.dashlet;
- switch (id) {
- case menu.flows.id:
- one.f.flows.dashlet($dashlet);
- break;
- case menu.nodes.id:
- one.f.nodes.dashlet($dashlet);
- break;
- case menu.detail.id:
- one.f.detail.dashlet($dashlet);
- break;
- };
+ // de/activation
+ var $li = $(this).parent();
+ var $ul = $li.parent();
+ one.lib.nav.unfocus($ul);
+ $li.addClass('active');
+ // clear respective dashlet
+ var $dashlet = $ul.parent().find('.dashlet');
+ one.lib.dashlet.empty($dashlet);
+ // callback based on menu
+ var id = $(this).attr('id');
+ var menu = one.f.dashlet;
+ switch (id) {
+ case menu.flows.id:
+ one.f.flows.dashlet($dashlet);
+ break;
+ case menu.nodes.id:
+ one.f.nodes.dashlet($dashlet);
+ break;
+ case menu.detail.id:
+ one.f.detail.dashlet($dashlet);
+ break;
+ };
});
// activate first tab on each dashlet
$('.dash .nav').each(function(index, value) {
- $($(value).find('li')[0]).find('a').click();
+ $($(value).find('li')[0]).find('a').click();
});
<properties>
<sonar.host.url>https://sonar.opendaylight.org/</sonar.host.url>
<nexusproxy>http://nexus.opendaylight.org/content</nexusproxy>
+ <nexus.repository.release>opendaylight.release</nexus.repository.release>
+ <nexus.repository.snapshot>opendaylight.snapshot</nexus.repository.snapshot>
<sitedeploy>dav:http://nexus.opendaylight.org/content/sites/site</sitedeploy>
<siteplugin>3.2</siteplugin>
<projectinfo>2.6</projectinfo>
</properties>
<pluginRepositories>
- <pluginRepository>
+ <pluginRepository>
<id>central2</id>
<name>central2</name>
<url>http://repo2.maven.org/maven2</url>
<!-- OpenDayLight Released artifact -->
<repository>
<id>opendaylight-release</id>
- <url>${nexusproxy}/repositories/opendaylight.release/</url>
+ <url>${nexusproxy}/repositories/${nexus.repository.release}/</url>
</repository>
<!-- OpenDayLight Snapshot artifact -->
<snapshotRepository>
<id>opendaylight-snapshot</id>
- <url>${nexusproxy}/repositories/opendaylight.snapshot/</url>
+ <url>${nexusproxy}/repositories/${nexus.repository.snapshot}/</url>
</snapshotRepository>
<!-- Site deployment -->
<site>