Merge "WIP: Initial Commit of Pipeline Orchestrator"
authorMadhu Venugopal <mavenugo@gmail.com>
Sun, 31 Aug 2014 21:32:41 +0000 (21:32 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Sun, 31 Aug 2014 21:32:41 +0000 (21:32 +0000)
openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/PipelineOrchestrator.java [new file with mode: 0644]
openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/PipelineOrchestratorImpl.java [new file with mode: 0644]

diff --git a/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/PipelineOrchestrator.java b/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/PipelineOrchestrator.java
new file mode 100644 (file)
index 0000000..47639dd
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2014 Red Hat, Inc.
+ *
+ * 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
+ *
+ * Authors : Dave Tucker
+ */
+
+package org.opendaylight.ovsdb.openstack.netvirt.providers;
+
+import java.util.UUID;
+
+/**
+ * A PipelineOrchestrator provides the necessary orchestration logic to allow multiple network services
+ * to share a common OpenFlow 1.3 based multi-table pipeline.
+ */
+public interface PipelineOrchestrator {
+
+  enum ServiceDirection {
+    UNDEFINED,
+    INGRESS,
+    EGRESS
+  }
+
+  static final Integer PRE_NAT = 2;
+  static final Integer PRE_ACL = 7;
+  //ToDo: Add some sensible altitude constants
+
+  /**
+   * Register a new service in the pipeline
+   * @param altitude an integer representing the desired placement in the pipeline where 0 = lowest.
+   * @param direction whether the service is ingress, egress
+   * @return a unique service identifier
+   */
+  UUID registerService(Integer altitude, ServiceDirection direction);
+
+  /**
+   * Unregister a service from the pipeline
+   * This clears any assigned table IDs and registers
+   */
+  void unregisterService(UUID serviceID);
+
+  /**
+   * Get the OpenFlow Table ID
+   * @param serviceID unique service identifier
+   */
+  Integer getTableId(UUID serviceID);
+
+  /**
+   * Assign an OVS Register to a service
+   * @return the integer value of the assigned register
+   */
+  Integer assignRegister(UUID serviceID);
+
+}
diff --git a/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/PipelineOrchestratorImpl.java b/openstack/net-virt-providers/src/main/java/org/opendaylight/ovsdb/openstack/netvirt/providers/PipelineOrchestratorImpl.java
new file mode 100644 (file)
index 0000000..a538e66
--- /dev/null
@@ -0,0 +1,111 @@
+package org.opendaylight.ovsdb.openstack.netvirt.providers;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Queues;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Queue;
+import java.util.UUID;
+
+/**
+ * Created by dave on 27/08/14.
+ */
+public class PipelineOrchestratorImpl implements PipelineOrchestrator {
+
+  private Map<UUID, ServiceProperties> serviceRegistry = Maps.newHashMap();
+  private Queue<Integer> registerQueue = Queues.newArrayBlockingQueue(16);
+  private List<Integer> tableIdList = Lists.newArrayList(255);
+
+  public UUID registerService(Integer altitude, ServiceDirection direction) {
+    return UUID.randomUUID();
+  }
+
+  @Override
+  public void unregisterService(UUID serviceID) {
+    ServiceProperties sp = serviceRegistry.get(serviceID);
+    List<Integer> registers = sp.getRegisters();
+    if (registers != null) {
+      for (Integer register : registers) {
+        registerQueue.add(register);
+      }
+    }
+    // Add Table ID allocation back
+
+  }
+
+  @Override
+  public Integer getTableId(UUID serviceID) {
+    ServiceProperties sp = serviceRegistry.get(serviceID);
+    return sp.tableId;
+  }
+
+  @Override
+  public Integer assignRegister(UUID serviceID) {
+    Integer register = registerQueue.poll();
+    if (register == null) {
+      throw new RuntimeException("No registers remaining");
+    }
+    return register;
+  }
+
+  private Integer assignTableId(Integer altitude) {
+    return null;
+  }
+
+  private class ServiceProperties {
+    Integer altitude;
+    ServiceDirection direction;
+    Integer tableId;
+    List<Integer> registers;
+
+    public ServiceProperties(Integer altitude,
+                             ServiceDirection direction,
+                             Integer tableId,
+                             List<Integer> registers) {
+      this.altitude = altitude;
+      this.direction = direction;
+      this.tableId = tableId;
+      this.registers = registers;
+    }
+
+    public Integer getAltitude() {
+      return altitude;
+    }
+
+    public void setAltitude(Integer altitude) {
+      this.altitude = altitude;
+    }
+
+    public ServiceDirection getDirection() {
+      return direction;
+    }
+
+    public void setDirection(ServiceDirection direction) {
+      this.direction = direction;
+    }
+
+    public Integer getTableId() {
+      return tableId;
+    }
+
+    public void setTableId(Integer tableId) {
+      this.tableId = tableId;
+    }
+
+    public List<Integer> getRegisters() {
+      return registers;
+    }
+
+    public void setRegisters(List<Integer> registers) {
+      this.registers = registers;
+    }
+
+    public void addRegister(Integer register) {
+      this.registers.add(register);
+    }
+
+  }
+
+}