Initial commit of nfchain. 05/2105/1
authorSuchi Raman <suchi.raman@plexxi.com>
Wed, 23 Oct 2013 14:32:10 +0000 (10:32 -0400)
committerSuchi Raman <suchi.raman@plexxi.com>
Wed, 23 Oct 2013 14:32:10 +0000 (10:32 -0400)
Signed-off-by: Suchi Raman <suchi.raman@plexxi.com>
nfchain/api/pom.xml [new file with mode: 0644]
nfchain/api/src/main/yang/nfchain.yang [new file with mode: 0644]
nfchain/impl/pom.xml [new file with mode: 0644]
nfchain/impl/src/main/java/org/opendaylight/affinity/nfchain/provider/Activator.java [new file with mode: 0644]
nfchain/impl/src/main/java/org/opendaylight/affinity/nfchain/provider/NfchainManager.java [new file with mode: 0644]
nfchain/pom.xml [new file with mode: 0644]
pom.xml

diff --git a/nfchain/api/pom.xml b/nfchain/api/pom.xml
new file mode 100644 (file)
index 0000000..5d04b89
--- /dev/null
@@ -0,0 +1,175 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+      <groupId>org.opendaylight.affinity</groupId>
+      <artifactId>affinityParent</artifactId>
+      <version>0.4.1-SNAPSHOT</version>
+      <relativePath>../..</relativePath>
+    </parent>
+    
+    <groupId>org.opendaylight.affinity</groupId>
+    <artifactId>nfchain</artifactId>
+    <version>0.4.0-SNAPSHOT</version>
+    <packaging>bundle</packaging>
+  
+    <scm>
+      <connection>scm:git:ssh://git.opendaylight.org:29418/affinity.git</connection>
+      <developerConnection>scm:git:ssh://git.opendaylight.org:29418/affinity.git</developerConnection>
+    </scm>
+    
+    <properties>
+        <yang.version>0.5.9-SNAPSHOT</yang.version>
+        <yang.codegen.version>0.5.8-SNAPSHOT</yang.codegen.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <maven.compiler.source>1.7</maven.compiler.source>
+        <maven.compiler.target>1.7</maven.compiler.target>
+        <maven.bundle.version>2.4.0</maven.bundle.version>
+        <nexusproxy>http://nexus.opendaylight.org/content</nexusproxy>
+    </properties>
+
+
+    <build>
+      <plugins>
+       <plugin>
+         <groupId>org.apache.felix</groupId>
+         <artifactId>maven-bundle-plugin</artifactId>
+         <version>2.3.6</version>
+         <extensions>true</extensions>
+      </plugin>
+      <plugin>
+       <groupId>org.opendaylight.yangtools</groupId>
+       <artifactId>yang-maven-plugin</artifactId>
+        <version>${yang.version}</version>
+       <executions>
+         <execution>
+           <goals>
+             <goal>generate-sources</goal>
+           </goals>
+           <configuration>
+             <yangFilesRootDir>src/main/yang</yangFilesRootDir>
+             <codeGenerators>
+               <generator>
+                 <codeGeneratorClass>
+                   org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl
+                 </codeGeneratorClass>
+                 <outputBaseDir>
+                   target/generated-sources/sal
+                 </outputBaseDir>
+               </generator>
+             </codeGenerators>
+             <inspectDependencies>true</inspectDependencies>
+           </configuration>
+         </execution>
+       </executions>
+       <dependencies>
+         <dependency>
+           <groupId>org.opendaylight.yangtools</groupId>
+           <artifactId>maven-sal-api-gen-plugin</artifactId>
+            <version>${yang.codegen.version}</version>
+           <type>jar</type>
+         </dependency>
+       </dependencies>
+      </plugin>
+      <plugin>
+       <groupId>org.codehaus.mojo</groupId>
+       <artifactId>build-helper-maven-plugin</artifactId>
+       <version>1.7</version>
+       <executions>
+         <execution>
+           <phase>generate-sources</phase>
+           <goals>
+             <goal>add-source</goal>
+           </goals>
+           <configuration>
+             <sources>
+               <source>target/generated-sources/sal</source>
+             </sources>
+           </configuration>
+         </execution>
+       </executions>
+      </plugin>
+       </plugins>
+       <pluginManagement>
+         <plugins>
+               <!--This plugin's configuration is used to store Eclipse 
+                   m2e settings only. It has no influence on the Maven build itself. -->
+               <plugin>
+                   <groupId>org.eclipse.m2e</groupId>
+                   <artifactId>lifecycle-mapping</artifactId>
+                   <version>1.0.0</version>
+                   <configuration>
+                       <lifecycleMappingMetadata>
+                           <pluginExecutions>
+                               <pluginExecution>
+                                   <pluginExecutionFilter>
+                                       <groupId>
+                                           org.opendaylight.yangtools
+                                       </groupId>
+                                       <artifactId>
+                                           yang-maven-plugin
+                                       </artifactId>
+                                       <versionRange>
+                                           [0.5,)
+                                       </versionRange>
+                                       <goals>
+                                           <goal>
+                                               generate-sources
+                                           </goal>
+                                       </goals>
+                                   </pluginExecutionFilter>
+                                   <action>
+                                       <ignore></ignore>
+                                   </action>
+                               </pluginExecution>
+                           </pluginExecutions>
+                       </lifecycleMappingMetadata>
+                   </configuration>
+               </plugin>
+           </plugins>
+       </pluginManagement>
+    </build>
+
+
+
+    <dependencies>
+      <dependency>
+        <groupId>org.opendaylight.controller.model</groupId>
+        <artifactId>model-inventory</artifactId>
+        <version>1.0-SNAPSHOT</version> 
+      </dependency>
+      
+      <dependency>
+        <groupId>org.opendaylight.yangtools</groupId>
+        <artifactId>yang-binding</artifactId>
+        <version>${yang.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.opendaylight.yangtools</groupId>
+        <artifactId>yang-common</artifactId>
+        <version>${yang.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.opendaylight.yangtools.model</groupId>
+        <artifactId>ietf-inet-types</artifactId>
+        <version>2010.09.24-SNAPSHOT</version>
+      </dependency>
+      <dependency>
+        <groupId>org.opendaylight.yangtools.model</groupId>
+        <artifactId>ietf-yang-types</artifactId>
+        <version>2010.09.24-SNAPSHOT</version>
+      </dependency>
+<!--      <dependency>
+        <groupId>org.opendaylight.yangtools</groupId>
+        <artifactId>yang-ext</artifactId>
+        <version>2013.09.07.1-SNAPSHOT</version>
+      </dependency> -->
+      <dependency>
+        <groupId>org.opendaylight.yangtools.model</groupId>
+        <artifactId>opendaylight-l2-types</artifactId>
+        <version>2013.08.27.1-SNAPSHOT</version>
+      </dependency>
+    </dependencies>
+
+</project>
diff --git a/nfchain/api/src/main/yang/nfchain.yang b/nfchain/api/src/main/yang/nfchain.yang
new file mode 100644 (file)
index 0000000..19cb591
--- /dev/null
@@ -0,0 +1,87 @@
+module nfchain { 
+    namespace "urn:opendaylight:affinity:nfchain";
+    prefix nfchain;
+
+    import ietf-inet-types { prefix inet; }
+    import ietf-yang-types { prefix yang; }
+    import yang-ext { prefix ext; }
+    import opendaylight-inventory {prefix inv;}
+    import opendaylight-l2-types { prefix l2types; }
+
+    revision "2013-10-20" {
+        description "Initial revision of affinity model to be reviewed";
+    }
+
+   //**************************************************
+    // Gateway hosting the network function. 
+    //**************************************************
+    grouping gateway {
+        leaf id {
+            type string;
+        }
+        // Address is either an IP address, MAC address, or switch/port. 
+        leaf location {
+            description "Mac or Inet address";
+            type union {
+                type inv:node-connector-id;
+                type inet:ip-address;
+            }
+        }
+    }
+
+    // Each nf chain has an id, a flowspec and a list of gateways. 
+    grouping chain {
+        leaf id {
+            type chain-id;
+        }   
+        leaf flowSpec {
+            type uint32; // tbd
+        }
+        list gateway {
+            key id;
+            ext:context-instance "gateway-context";
+            uses gateway;
+        }
+    }   
+
+    // Container for all nf_chain objects
+    container nfdb {
+        list chain {
+            key id;
+            ext:context-instance "chain";
+            uses chain;
+        }
+    }
+
+    typedef chain-id {
+        type inet:uri;
+    }
+
+    typedef gateway-ref {
+        type instance-identifier;
+    }
+
+    identity gateway-context;
+
+    // nf chain reference.
+    typedef chain-ref {
+        type instance-identifier;
+    }
+    identity chain-context;
+
+    //**************************************************
+    // Gateway chain. 
+    //**************************************************
+    rpc add {
+        input {
+              leaf chain {
+                  type chain-id;
+              }
+              container gateway {
+                  uses gateway;
+              }
+        }
+    }
+    rpc list {
+    }
+}
diff --git a/nfchain/impl/pom.xml b/nfchain/impl/pom.xml
new file mode 100644 (file)
index 0000000..955609f
--- /dev/null
@@ -0,0 +1,63 @@
+<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.affinity</groupId>
+      <artifactId>affinityParent</artifactId>
+      <version>0.4.1-SNAPSHOT</version>
+      <relativePath>../..</relativePath>
+    </parent>
+    
+    <groupId>org.opendaylight.affinity</groupId>
+    <artifactId>nfchain-impl</artifactId>
+    <version>0.4.0-SNAPSHOT</version>
+    <packaging>bundle</packaging>
+  
+    <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:MD-SAL</url>
+    </scm>
+
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+               <version>2.3.6</version>                
+               <extensions>true</extensions>
+                <configuration>
+                    <instructions>
+                        <Bundle-Activator>org.opendaylight.affinity.nfchain.provider.Activator</Bundle-Activator>
+                    </instructions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+    <dependencies>
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>nfchain</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+          <groupId>org.opendaylight.controller</groupId>
+          <artifactId>hosttracker</artifactId>
+          <version>0.4.1-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.controller</groupId>
+            <artifactId>sal-binding-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>
+    </dependencies>
+</project>
diff --git a/nfchain/impl/src/main/java/org/opendaylight/affinity/nfchain/provider/Activator.java b/nfchain/impl/src/main/java/org/opendaylight/affinity/nfchain/provider/Activator.java
new file mode 100644 (file)
index 0000000..8cd2801
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * 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
+ */
+
+/*
+ * Copyright (c) 2013 Plexxi, Inc. and others.  All rights reserved.
+ */
+
+package org.opendaylight.affinity.nfchain.provider;
+
+import java.util.Dictionary;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.Set;
+import java.util.Collection;
+import java.util.Collections;
+
+import org.opendaylight.controller.sal.binding.api.AbstractBindingAwareProvider;
+import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
+import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
+import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
+import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ConsumerContext;
+import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
+
+import org.opendaylight.yangtools.yang.binding.RpcService;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.opendaylight.controller.hosttracker.IfIptoHost;
+import org.opendaylight.controller.hosttracker.IfNewHostNotify;
+
+import org.opendaylight.yang.gen.v1.urn.opendaylight.affinity.nfchain.rev131020.NfchainService;
+
+public class Activator extends AbstractBindingAwareProvider {
+    protected static final Logger log = LoggerFactory
+        .getLogger(Activator.class);
+    
+    private ProviderContext providerContext;
+    private NfchainManager nfcmgr;
+
+    public Activator() {
+        nfcmgr = new NfchainManager();
+    }
+
+    @Override
+    public void onSessionInitiated(ProviderContext session) {
+        log.info("Provider session initialized");
+
+        this.providerContext = session;
+        nfcmgr.setNotificationProvider(session.getSALService(NotificationProviderService.class));
+        providerContext.addRpcImplementation(NfchainService.class, nfcmgr);
+    }
+
+    @Override
+    public Collection<? extends RpcService> getImplementations() {
+        return Collections.emptySet();
+    }
+
+    @Override
+    public Collection<? extends ProviderFunctionality> getFunctionality() {
+        return Collections.emptySet();
+    }
+}
diff --git a/nfchain/impl/src/main/java/org/opendaylight/affinity/nfchain/provider/NfchainManager.java b/nfchain/impl/src/main/java/org/opendaylight/affinity/nfchain/provider/NfchainManager.java
new file mode 100644 (file)
index 0000000..a9085a0
--- /dev/null
@@ -0,0 +1,114 @@
+
+/*
+ * 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.affinity.nfchain.provider;
+
+import java.util.Collections;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+
+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.yangtools.yang.common.RpcError;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+
+import org.opendaylight.yang.gen.v1.urn.opendaylight.affinity.nfchain.rev131020.NfchainService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.affinity.nfchain.rev131020.NfchainData;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.affinity.nfchain.rev131020.NfdbBuilder;
+
+import org.opendaylight.yang.gen.v1.urn.opendaylight.affinity.nfchain.rev131020.ChainId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.affinity.nfchain.rev131020.Gateway;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.affinity.nfchain.rev131020.Nfdb;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.affinity.nfchain.rev131020.NfdbBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.affinity.nfchain.rev131020.AddInput;
+
+import org.opendaylight.controller.hosttracker.hostAware.HostNodeConnector;
+import org.opendaylight.controller.sal.core.Node;
+import org.opendaylight.controller.sal.core.NodeConnector;
+import org.opendaylight.controller.sal.packet.BitBufferHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.opendaylight.controller.hosttracker.IfIptoHost;
+import org.opendaylight.controller.hosttracker.IfNewHostNotify;
+
+/**
+ * NfchainManager -- sends flow programming rules to flow programming service. 
+ */
+public class NfchainManager implements NfchainService, NfchainData {
+    private static final long serialVersionUID = 1L;
+    protected static final Logger log = LoggerFactory.getLogger(NfchainManager.class);
+    
+    private NotificationProviderService notificationProvider; 
+    private final ExecutorService executor;
+    private Future<RpcResult<Void>> currentTask;
+
+    public NfchainManager() {
+        executor = Executors.newFixedThreadPool(1);
+    }
+
+    @Override
+    public Nfdb getNfdb() {
+        NfdbBuilder builder = new NfdbBuilder();
+        return builder.build();
+    }
+
+    @Override
+    public Future<RpcResult<Void>> add(AddInput input) {
+        // TODO Auto-generated method stub
+        log.info("add gateway - Received input chain = {}, gateway = {}.", input.getChain(), input.getGateway());
+        if (currentTask != null) {
+            return inProgressError();
+        }
+        currentTask = executor.submit(new addGatewayTask(input));
+        return currentTask;
+    }
+
+    @Override
+    public Future<RpcResult<Void>> list() {
+        log.info("List command received");
+        RpcResult<Void> result = Rpcs.<Void> getRpcResult(false, null, Collections.<RpcError> emptySet());
+        return Futures.immediateFuture(result);
+    }
+
+    private Future<RpcResult<Void>> inProgressError() {
+        RpcResult<Void> result = Rpcs.<Void> getRpcResult(false, null, Collections.<RpcError> emptySet());
+        return Futures.immediateFuture(result);
+    }
+
+    private void cancel() {
+        currentTask.cancel(true);
+    }
+
+    public void setNotificationProvider(NotificationProviderService salService) {
+        this.notificationProvider = salService;
+    }
+
+    private class addGatewayTask implements Callable<RpcResult<Void>> {
+
+        final AddInput input;
+
+        public addGatewayTask(AddInput input) {
+            this.input = input;
+        }
+
+        @Override
+        public RpcResult<Void> call() throws Exception {
+            Thread.sleep(1000);
+            log.info("add gateway returning");
+            currentTask = null;
+            return Rpcs.<Void> getRpcResult(true, null, Collections.<RpcError> emptySet());
+        }
+    }
+}
diff --git a/nfchain/pom.xml b/nfchain/pom.xml
new file mode 100644 (file)
index 0000000..fe28724
--- /dev/null
@@ -0,0 +1,24 @@
+<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.affinity</groupId>
+    <artifactId>affinityParent</artifactId>
+    <version>0.4.1-SNAPSHOT</version>
+  </parent>
+  
+  <packaging>pom</packaging>
+  <groupId>org.opendaylight.affinity</groupId>
+  <artifactId>nfchain</artifactId>
+  <version>0.4.1-SNAPSHOT</version>
+
+  <scm>
+    <connection>scm:git:ssh://git.opendaylight.org:29418/affinity.git</connection>
+    <developerConnection>scm:git:ssh://git.opendaylight.org:29418/affinity.git</developerConnection>
+  </scm>
+  
+  <modules>
+    <module>api</module>
+    <module>impl</module>
+  </modules>
+</project>
diff --git a/pom.xml b/pom.xml
index 78297e296eaaca77ffac70cda02ebdf02f78e569..127e28f6f16f6eeb2496a5a31b84094fd4aca2f4 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -58,6 +58,7 @@
       <module>analytics/integrationtest</module>
       <module>analytics/northbound</module>
       <module>l2agent</module>
+      <module>nfchain</module>
     </modules>
 
     <repositories>