[ONOS-7731] Add a set of interfaces for openstack vTap app

Change-Id: Ic44030a996bb6c3d5883acfdb3ac310a290682f6
This commit is contained in:
Jian Li 2018-07-03 22:19:16 +09:00
parent e2e03a52a6
commit 38e4d94786
11 changed files with 797 additions and 5 deletions

View File

@ -0,0 +1,160 @@
/*
* Copyright 2018-present Open Networking Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.openstackvtap.api;
import org.onosproject.net.Annotated;
import org.onosproject.net.DeviceId;
import org.onosproject.net.SparseAnnotations;
import java.util.Set;
/**
* Abstraction of an OpenstackVtap.
*/
public interface OpenstackVtap extends Annotated {
/**
* Openstack vTap type.
*/
enum Type {
/**
* Indicates mirroring both TX and RX traffic.
*/
VTAP_ALL(0x3),
/**
* Indicates only mirroring RX traffic.
*/
VTAP_RX(0x2),
/**
* Indicates only mirroring TX traffic.
*/
VTAP_TX(0x1),
/**
* Indicates do not mirroring any traffic.
*/
VTAP_NONE(0);
private final int type;
Type(int type) {
this.type = type;
}
public boolean isValid(Type comp) {
return (this.type & comp.type) == comp.type;
}
}
/**
* OpenstackVtap identifier.
*
* @return OpenstackVtap id
*/
OpenstackVtapId id();
/**
* Returns OpenstackVtap type.
*
* @return type
*/
Type type();
/**
* Returns the vTap criterion.
*
* @return vTap criterion
*/
OpenstackVtapCriterion vTapCriterion();
/**
* Returns a collection of TX device identifiers.
*
* @return device identifiers
*/
Set<DeviceId> txDeviceIds();
/**
* Returns a collection of RX device identifiers.
*
* @return device identifiers
*/
Set<DeviceId> rxDeviceIds();
/**
* Builder of new openstack vTap instance.
*/
interface Builder {
/**
* Returns openstack vTap builder with supplied vTap identifier.
*
* @param id vTap identifier
* @return openstack vTap builder
*/
Builder id(OpenstackVtapId id);
/**
* Returns openstack vTap builder with supplied vTap type.
*
* @param type vTap type
* @return openstack vTap builder
*/
Builder type(OpenstackVtap.Type type);
/**
* Returns openstack vTap builder with supplied vTap criterion.
*
* @param vTapCriterion vTap criterion
* @return openstack vTap builder
*/
Builder vTapCriterion(OpenstackVtapCriterion vTapCriterion);
/**
* Returns openstack vTap builder with supplied TX device identifiers.
*
* @param txDeviceIds TX device identifiers
* @return openstack vTap builder
*/
Builder txDeviceIds(Set<DeviceId> txDeviceIds);
/**
* Returns openstack vTap builder with supplied RX device identifiers.
*
* @param rxDeviceIds RX device identifiers
* @return openstack vTap builder
*/
Builder rxDeviceIds(Set<DeviceId> rxDeviceIds);
/**
* Returns openstack vTap builder with supplied annotations.
*
* @param annotations a set of annotations
* @return openstack vTap builder
*/
Builder annotations(SparseAnnotations... annotations);
/**
* Builds an immutable openstack vTap instance.
*
* @return openstack vTap instance
*/
OpenstackVtap build();
}
}

View File

@ -0,0 +1,74 @@
/*
* Copyright 2018-present Open Networking Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.openstackvtap.api;
import org.onlab.packet.VlanId;
import org.onosproject.net.DeviceId;
import org.onosproject.net.PortNumber;
/**
* Service for administering the inventory of vTap.
*/
public interface OpenstackVtapAdminService extends OpenstackVtapService {
/**
* Creates a new vTap based on the specified description.
*
* @param type vTap type
* @param vTapCriterion criterion of a vTap
* @return created vTap object or null if error occurred
*/
OpenstackVtap createVtap(OpenstackVtap.Type type, OpenstackVtapCriterion vTapCriterion);
/**
* Updates the existing vTap based on the given vTap instance.
*
* @param vTapId vTap identifier
* @param vTap vTap instance to be modified
* @return updated vTap object or null if error occurred
*/
OpenstackVtap updateVtap(OpenstackVtapId vTapId, OpenstackVtap vTap);
/**
* Removes the specified vTap with given vTap identifier.
*
* @param vTapId vTap identifier
* @return removed vTap object or null if error occurred
*/
OpenstackVtap removeVtap(OpenstackVtapId vTapId);
/**
* Sets output port and VLAN tag for vTap.
*
* @param deviceId device identifier
* @param type vTap type
* @param portNumber port number
* @param vlanId VLAN tag
*/
void setVtapOutput(DeviceId deviceId, OpenstackVtap.Type type,
PortNumber portNumber, VlanId vlanId);
/**
* Sets output port and VNI for vTap.
*
* @param deviceId device identifier
* @param type vTap type
* @param portNumber port number
* @param vni virtual network index (VNI) of VxLAN
*/
void setVtapOutput(DeviceId deviceId, OpenstackVtap.Type type,
PortNumber portNumber, int vni);
}

View File

@ -0,0 +1,114 @@
/*
* Copyright 2018-present Open Networking Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.openstackvtap.api;
import org.onlab.packet.IpPrefix;
import org.onlab.packet.TpPort;
/**
* A vTAP criterion used for mirroring traffic.
*/
public interface OpenstackVtapCriterion {
/**
* Returns IP Prefix of Source VM.
*
* @return source IP prefix
*/
IpPrefix srcIpPrefix();
/**
* Returns IP Prefix of Destination VM.
*
* @return destination IP prefix
*/
IpPrefix dstIpPrefix();
/**
* Returns IP protocol.
*
* @return IP protocol
*/
byte ipProtocol();
/**
* Returns source transport port.
*
* @return source transport port number
*/
TpPort srcTpPort();
/**
* Returns destination transport port.
*
* @return destination transport port number
*/
TpPort dstTpPort();
/**
* Builder of new openstack vTap criteria.
*/
interface Builder {
/**
* Builds an immutable openstack vTap criterion instance.
*
* @return openstack vTap criterion
*/
OpenstackVtapCriterion build();
/**
* Returns openstack vTap criterion builder with supplied srcIpPrefix.
*
* @param srcIpPrefix Source IP address
* @return openstack vTap criterion builder
*/
Builder srcIpPrefix(IpPrefix srcIpPrefix);
/**
* Returns openstack vTap criterion builder with supplied srcIpPrefix.
*
* @param dstIpPrefix Destination IP Prefix
* @return openstack vTap criterion builder
*/
Builder dstIpPrefix(IpPrefix dstIpPrefix);
/**
* Returns openstack vTap criterion builder with supplied ipProtocol.
*
* @param ipProtocol IP protocol number
* @return openstack vTap criterion builder
*/
Builder ipProtocol(byte ipProtocol);
/**
* Returns openstack vTap criterion builder with supplied srcTpPort.
*
* @param srcTpPort Source transport port number
* @return openstack vTap criterion builder
*/
Builder srcTpPort(TpPort srcTpPort);
/**
* Returns openstack vTap criterion builder with supplied dstTpPort.
*
* @param dstTpPort Destination transport port number
* @return openstack vTap criterion builder
*/
Builder dstTpPort(TpPort dstTpPort);
}
}

View File

@ -0,0 +1,108 @@
/*
* Copyright 2018-present Open Networking Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.openstackvtap.api;
import org.onlab.util.Tools;
import org.onosproject.event.AbstractEvent;
import static com.google.common.base.MoreObjects.toStringHelper;
/**
* Describes vTap event.
*/
public class OpenstackVtapEvent extends AbstractEvent<OpenstackVtapEvent.Type, OpenstackVtap> {
/**
* Type of vTap events.
*/
public enum Type {
/**
* Signifies that a new vTap has been added.
*/
VTAP_ADDED,
/**
* Signifies that a vTap has been removed.
*/
VTAP_REMOVED,
/**
* Signifies that a vTap data changed.
*/
VTAP_UPDATED,
}
private OpenstackVtap prevSubject;
/**
* Creates an event of a given type and for the specified vTap and the
* current time.
*
* @param type vTap event type
* @param vTap event vTap subject
*/
public OpenstackVtapEvent(Type type, OpenstackVtap vTap) {
super(type, vTap);
}
/**
* Creates an event of a given type and for the specified vTap and time.
*
* @param type vTap event type
* @param vTap event vTap subject
* @param time occurrence time
*/
public OpenstackVtapEvent(Type type, OpenstackVtap vTap, long time) {
super(type, vTap, time);
}
/**
* Creates an event with previous subject.
*
* The previous subject is ignored if the type is not moved or updated
*
* @param type vTap event type
* @param vTap event vTap subject
* @param prevSubject previous vTap subject
*/
public OpenstackVtapEvent(Type type, OpenstackVtap vTap, OpenstackVtap prevSubject) {
super(type, vTap);
if (type == Type.VTAP_UPDATED) {
this.prevSubject = prevSubject;
}
}
/**
* Gets the previous subject in this vTap event.
*
* @return the previous subject, or null if previous subject is not
* specified.
*/
public OpenstackVtap prevSubject() {
return this.prevSubject;
}
@Override
public String toString() {
return toStringHelper(this)
.add("time", Tools.defaultOffsetDataTime(time()))
.add("type", type())
.add("subject", subject())
.add("prevSubject", prevSubject())
.toString();
}
}

View File

@ -0,0 +1,106 @@
/*
* Copyright 2018-present Open Networking Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.openstackvtap.api;
import java.util.Objects;
import java.util.UUID;
/**
* Immutable representation of an openstack vTap identifier.
*/
public final class OpenstackVtapId {
/**
* Represents either no vTap, or an unspecified vTap.
*/
public static final OpenstackVtapId NONE = new OpenstackVtapId(null);
private final UUID uuid;
// Public construction is prohibited
private OpenstackVtapId(UUID uuid) {
this.uuid = uuid;
}
// Default constructor for serialization
private OpenstackVtapId() {
this.uuid = null;
}
/**
* Returns an unique UUID.
*
* @return UUID
*/
public UUID uuid() {
return uuid;
}
/**
* Creates a vTap identifier using the supplied UUID.
*
* @param uuid vTap UUID
* @return vTap identifier
*/
public static OpenstackVtapId vTapId(UUID uuid) {
return new OpenstackVtapId(uuid);
}
/**
* Creates a vTap identifier using the supplied string format of UUID.
*
* @param uuidString vTap UUID
* @return vTap identifier
*/
public static OpenstackVtapId vTapId(String uuidString) {
try {
return vTapId(UUID.fromString(uuidString));
} catch (Exception e) {
throw new IllegalArgumentException("Invalid UUID string: " + uuidString);
}
}
/**
* Creates a OpenstackVtap id using random uuid.
*
* @return OpenstackVtap identifier
*/
public static OpenstackVtapId vTapId() {
return new OpenstackVtapId(UUID.randomUUID());
}
@Override
public String toString() {
return uuid.toString();
}
@Override
public int hashCode() {
return Objects.hash(uuid);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof OpenstackVtapId) {
final OpenstackVtapId other = (OpenstackVtapId) obj;
return Objects.equals(this.uuid, other.uuid);
}
return false;
}
}

View File

@ -0,0 +1,24 @@
/*
* Copyright 2018-present Open Networking Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.openstackvtap.api;
import org.onosproject.event.EventListener;
/**
* Entity capable of receiving user related events.
*/
public interface OpenstackVtapListener extends EventListener<OpenstackVtapEvent> {
}

View File

@ -15,13 +15,47 @@
*/
package org.onosproject.openstackvtap.api;
import org.onosproject.event.ListenerService;
import org.onosproject.net.DeviceId;
import java.util.Set;
/**
* Openstack vtap interface.
* Service for interacting with the inventory of vTap.
*/
public interface OpenstackVtapService {
public interface OpenstackVtapService
extends ListenerService<OpenstackVtapEvent, OpenstackVtapListener> {
/**
* A dummy method.
* Returns the number of vTaps in the store.
*
* @param type vTap type
* @return vTap count
*/
void dummy();
int getVtapCount(OpenstackVtap.Type type);
/**
* Returns a collection of selected vTaps in the store.
*
* @param type vTap type
* @return iterable collection of selected vTaps
*/
Set<OpenstackVtap> getVtaps(OpenstackVtap.Type type);
/**
* Returns the vTap with the specified identifier.
*
* @param vTapId vTap identifier
* @return vTap or null if not exist
*/
OpenstackVtap getVtap(OpenstackVtapId vTapId);
/**
* Returns a collection of vTaps which are associated with the given device.
*
* @param type vTap type
* @param deviceId device identifier
* @return a set of vTaps
*/
Set<OpenstackVtap> getVtapsByDeviceId(OpenstackVtap.Type type, DeviceId deviceId);
}

View File

@ -0,0 +1,112 @@
/*
* Copyright 2018-present Open Networking Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.openstackvtap.api;
import org.onosproject.net.DeviceId;
import org.onosproject.store.Store;
import java.util.Set;
/**
* Manages inventory of OpenstackVtap states; not intended for direct use.
*/
public interface OpenstackVtapStore
extends Store<OpenstackVtapEvent, OpenstackVtapStoreDelegate> {
/**
* Creates a new vTap or updates the existing one based on the specified
* description.
*
* @param vTapId vTap identifier
* @param description vTap description data
* @param replaceFlag replace device set if true, merge device set otherwise
* @return created or updated vTap object or null if error occurred
*/
OpenstackVtap createOrUpdateVtap(OpenstackVtapId vTapId, OpenstackVtap description, boolean replaceFlag);
/**
* Removes the specified vTap from the inventory by the given vTap identifier.
*
* @param vTapId vTap identifier
* @return removed vTap object or null if error occurred
*/
OpenstackVtap removeVtapById(OpenstackVtapId vTapId);
/**
* Adds the specified device id from the vTap entry.
*
* @param vTapId vTap identification
* @param type vTap type
* @param deviceId device identifier to be added
* @return true on success, false otherwise
*/
boolean addDeviceToVtap(OpenstackVtapId vTapId, OpenstackVtap.Type type, DeviceId deviceId);
/**
* Removes the specified device id from the vTap entry.
*
* @param vTapId vTap identification
* @param type vTap type
* @param deviceId device identifier to be removed
* @return true on success, false otherwise
*/
boolean removeDeviceFromVtap(OpenstackVtapId vTapId, OpenstackVtap.Type type, DeviceId deviceId);
/**
* Adds the specified device id from the vTap entry.
*
* @param vTapId vTap identification
* @param txDeviceIds TX device identifiers to be updated
* @param rxDeviceIds RX device identifiers to be updated
* @param replaceFlag replace device set if true, merge device set otherwise
* @return true on success, false otherwise
*/
boolean updateDeviceForVtap(OpenstackVtapId vTapId, Set<DeviceId> txDeviceIds,
Set<DeviceId> rxDeviceIds, boolean replaceFlag);
/**
* Returns the number of vTaps in the store.
*
* @param type vTap type
* @return vTap count
*/
int getVtapCount(OpenstackVtap.Type type);
/**
* Returns a collection of selected vTaps in the store.
*
* @param type vTap type
* @return iterable collection of selected vTaps
*/
Set<OpenstackVtap> getVtaps(OpenstackVtap.Type type);
/**
* Returns the vTap with the specified identifier.
*
* @param vTapId vTap identifier
* @return vtap or null if not found
*/
OpenstackVtap getVtap(OpenstackVtapId vTapId);
/**
* Returns the set of vTaps whose included on device.
*
* @param type vTap type
* @param deviceId device identifier
* @return set of vTaps
*/
Set<OpenstackVtap> getVtapsByDeviceId(OpenstackVtap.Type type, DeviceId deviceId);
}

View File

@ -0,0 +1,24 @@
/*
* Copyright 2018-present Open Networking Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.openstackvtap.api;
import org.onosproject.store.StoreDelegate;
/**
* OpenstackVtap store delegate abstraction.
*/
public interface OpenstackVtapStoreDelegate extends StoreDelegate<OpenstackVtapEvent> {
}

View File

@ -156,6 +156,12 @@
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.onosproject</groupId>
<artifactId>onos-core-serializers</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.onosproject</groupId>
<artifactId>onos-rest</artifactId>

View File

@ -15,14 +15,44 @@
*/
package org.onosproject.openstackvtap.impl;
import org.onosproject.net.DeviceId;
import org.onosproject.openstackvtap.api.OpenstackVtap;
import org.onosproject.openstackvtap.api.OpenstackVtapId;
import org.onosproject.openstackvtap.api.OpenstackVtapListener;
import org.onosproject.openstackvtap.api.OpenstackVtapService;
import java.util.Set;
/**
* Implementation of openstack vtap.
*/
public class OpenstackVtapManager implements OpenstackVtapService {
@Override
public void dummy() {
public int getVtapCount(OpenstackVtap.Type type) {
return 0;
}
@Override
public Set<OpenstackVtap> getVtaps(OpenstackVtap.Type type) {
return null;
}
@Override
public OpenstackVtap getVtap(OpenstackVtapId vTapId) {
return null;
}
@Override
public Set<OpenstackVtap> getVtapsByDeviceId(OpenstackVtap.Type type, DeviceId deviceId) {
return null;
}
@Override
public void addListener(OpenstackVtapListener listener) {
}
@Override
public void removeListener(OpenstackVtapListener listener) {
}
}