--- /dev/null
+/*
+ * 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);
+
+}
--- /dev/null
+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);
+ }
+
+ }
+
+}