ONOS-7887 Rename action profile-related entities

Members can exist outside of a group. Previous naming was ambiguous
about this.

Action group -> action profile group
Action group member -> action profile member

Change-Id: I5097e92253353d355b864e689f9653df2d318230
This commit is contained in:
Carmelo Cascone 2018-09-11 15:17:23 -07:00
parent a7d7bd95a1
commit f2b7bfe201
43 changed files with 501 additions and 493 deletions

View File

@ -40,8 +40,8 @@ import org.onosproject.net.group.GroupBuckets;
import org.onosproject.net.group.GroupDescription;
import org.onosproject.net.group.GroupKey;
import org.onosproject.net.pi.runtime.PiAction;
import org.onosproject.net.pi.runtime.PiActionGroupId;
import org.onosproject.net.pi.runtime.PiActionParam;
import org.onosproject.net.pi.runtime.PiActionProfileGroupId;
import org.onosproject.net.pi.runtime.PiGroupKey;
import org.onosproject.net.pi.runtime.PiTableAction;
import org.onosproject.net.topology.DefaultTopologyVertex;
@ -272,7 +272,7 @@ public class EcmpFabricApp extends AbstractUpgradableFabricApp {
.build())
.withTreatment(
DefaultTrafficTreatment.builder()
.piTableAction(PiActionGroupId.of(groupId))
.piTableAction(PiActionProfileGroupId.of(groupId))
.build())
.build();
}

View File

@ -19,8 +19,8 @@ package org.onosproject.net.flow.instructions;
import com.google.common.annotations.Beta;
import com.google.common.base.Objects;
import org.onosproject.net.pi.runtime.PiActionGroupId;
import org.onosproject.net.pi.runtime.PiActionGroupMemberId;
import org.onosproject.net.pi.runtime.PiActionProfileGroupId;
import org.onosproject.net.pi.runtime.PiActionProfileMemberId;
import org.onosproject.net.pi.runtime.PiTableAction;
/**
@ -74,10 +74,10 @@ public final class PiInstruction implements Instruction {
@Override
public String toString() {
switch (tableAction.type()) {
case ACTION_GROUP_ID:
return "GROUP:0x" + Integer.toHexString(((PiActionGroupId) tableAction).id());
case GROUP_MEMBER_ID:
return "GROUP_MEMBER:0x" + Integer.toHexString(((PiActionGroupMemberId) tableAction).id());
case ACTION_PROFILE_GROUP_ID:
return "GROUP:0x" + Integer.toHexString(((PiActionProfileGroupId) tableAction).id());
case ACTION_PROFILE_MEMBER_ID:
return "GROUP_MEMBER:0x" + Integer.toHexString(((PiActionProfileMemberId) tableAction).id());
default:
return tableAction.toString();
}

View File

@ -29,37 +29,38 @@ import java.util.Map;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* Instance of an action group of a protocol-independent pipeline.
* Instance of an action profile group of a protocol-independent pipeline.
*/
@Beta
public final class PiActionGroup implements PiEntity {
public final class PiActionProfileGroup implements PiEntity {
private final PiActionGroupId id;
private final ImmutableSet<PiActionGroupMember> members;
private final PiActionProfileId piActionProfileId;
private final PiActionProfileGroupId id;
private final ImmutableSet<PiActionProfileMember> members;
private final PiActionProfileId actionProfileId;
private PiActionGroup(PiActionGroupId id, ImmutableSet<PiActionGroupMember> members,
PiActionProfileId piActionProfileId) {
private PiActionProfileGroup(PiActionProfileGroupId id,
ImmutableSet<PiActionProfileMember> members,
PiActionProfileId actionProfileId) {
this.id = id;
this.members = members;
this.piActionProfileId = piActionProfileId;
this.actionProfileId = actionProfileId;
}
/**
* Returns the identifier of this action group.
* Returns the identifier of this action profile group.
*
* @return action group identifier
* @return action profile group identifier
*/
public PiActionGroupId id() {
public PiActionProfileGroupId id() {
return id;
}
/**
* Returns the members of this action group.
* Returns the members of this action profile group.
*
* @return collection of action members.
* @return collection of action profile members.
*/
public Collection<PiActionGroupMember> members() {
public Collection<PiActionProfileMember> members() {
return members;
}
@ -69,7 +70,7 @@ public final class PiActionGroup implements PiEntity {
* @return action profile id
*/
public PiActionProfileId actionProfileId() {
return piActionProfileId;
return actionProfileId;
}
@Override
@ -77,13 +78,13 @@ public final class PiActionGroup implements PiEntity {
if (this == o) {
return true;
}
if (o == null || !(o instanceof PiActionGroup)) {
if (o == null || !(o instanceof PiActionProfileGroup)) {
return false;
}
PiActionGroup that = (PiActionGroup) o;
PiActionProfileGroup that = (PiActionProfileGroup) o;
return Objects.equal(id, that.id) &&
Objects.equal(members, that.members) &&
Objects.equal(piActionProfileId, that.piActionProfileId);
Objects.equal(actionProfileId, that.actionProfileId);
}
@Override
@ -96,14 +97,14 @@ public final class PiActionGroup implements PiEntity {
return MoreObjects.toStringHelper(this)
.add("groupId", id)
.add("members", members)
.add("piActionProfileId", piActionProfileId)
.add("piActionProfileId", actionProfileId)
.toString();
}
/**
* Returns a new builder of action groups.
* Returns a new builder of action profile groups.
*
* @return action group builder
* @return action profile group builder
*/
public static Builder builder() {
return new Builder();
@ -111,16 +112,16 @@ public final class PiActionGroup implements PiEntity {
@Override
public PiEntityType piEntityType() {
return PiEntityType.GROUP;
return PiEntityType.ACTION_PROFILE_GROUP;
}
/**
* Builder of action groups.
* Builder of action profile groups.
*/
public static final class Builder {
private PiActionGroupId id;
private Map<PiActionGroupMemberId, PiActionGroupMember> members = Maps.newHashMap();
private PiActionProfileGroupId id;
private Map<PiActionProfileMemberId, PiActionProfileMember> members = Maps.newHashMap();
private PiActionProfileId piActionProfileId;
private Builder() {
@ -128,34 +129,34 @@ public final class PiActionGroup implements PiEntity {
}
/**
* Sets the identifier of this action group.
* Sets the identifier of this action profile group.
*
* @param id action group identifier
* @param id action profile group identifier
* @return this
*/
public Builder withId(PiActionGroupId id) {
public Builder withId(PiActionProfileGroupId id) {
this.id = id;
return this;
}
/**
* Adds one member to this action group.
* Adds one member to this action profile group.
*
* @param member action group member
* @param member action profile member
* @return this
*/
public Builder addMember(PiActionGroupMember member) {
public Builder addMember(PiActionProfileMember member) {
members.put(member.id(), member);
return this;
}
/**
* Adds many members to this action group.
* Adds many members to this action profile group.
*
* @param members action group members
* @param members action profile members
* @return this
*/
public Builder addMembers(Collection<PiActionGroupMember> members) {
public Builder addMembers(Collection<PiActionProfileMember> members) {
members.forEach(this::addMember);
return this;
}
@ -172,15 +173,15 @@ public final class PiActionGroup implements PiEntity {
}
/**
* Creates a new action group.
* Creates a new action profile group.
*
* @return action group
* @return action profile group
*/
public PiActionGroup build() {
public PiActionProfileGroup build() {
checkNotNull(id);
checkNotNull(piActionProfileId);
return new PiActionGroup(id, ImmutableSet.copyOf(members.values()),
piActionProfileId);
return new PiActionProfileGroup(
id, ImmutableSet.copyOf(members.values()), piActionProfileId);
}
}
}

View File

@ -23,36 +23,36 @@ import org.onosproject.net.DeviceId;
import org.onosproject.net.pi.model.PiActionProfileId;
/**
* Global identifier of a PI action group applied to a device, uniquely defined
* by a device ID, action profile ID and group ID.
* Global identifier of a PI action profile group applied to a device, uniquely
* defined by a device ID, action profile ID and group ID.
*/
@Beta
public final class PiActionGroupHandle extends PiHandle<PiActionGroup> {
public final class PiActionProfileGroupHandle extends PiHandle<PiActionProfileGroup> {
private final PiActionProfileId actionProfileId;
private final PiActionGroupId groupId;
private final PiActionProfileGroupId groupId;
private PiActionGroupHandle(DeviceId deviceId, PiActionGroup group) {
private PiActionProfileGroupHandle(DeviceId deviceId, PiActionProfileGroup group) {
super(deviceId);
actionProfileId = group.actionProfileId();
groupId = group.id();
}
/**
* Creates a new handle for the given device ID and PI action group.
* Creates a new handle for the given device ID and PI action profile group.
*
* @param deviceId device ID
* @param group PI action group
* @return PI action group handle
* @param group PI action profile group
* @return PI action profile group handle
*/
public static PiActionGroupHandle of(DeviceId deviceId,
PiActionGroup group) {
return new PiActionGroupHandle(deviceId, group);
public static PiActionProfileGroupHandle of(DeviceId deviceId,
PiActionProfileGroup group) {
return new PiActionProfileGroupHandle(deviceId, group);
}
@Override
public PiEntityType entityType() {
return PiEntityType.GROUP;
return PiEntityType.ACTION_PROFILE_GROUP;
}
@Override
@ -70,7 +70,7 @@ public final class PiActionGroupHandle extends PiHandle<PiActionGroup> {
if (o == null || getClass() != o.getClass()) {
return false;
}
PiActionGroupHandle that = (PiActionGroupHandle) o;
PiActionProfileGroupHandle that = (PiActionProfileGroupHandle) o;
return Objects.equal(deviceId(), that.deviceId()) &&
Objects.equal(actionProfileId,
that.actionProfileId) &&

View File

@ -20,32 +20,34 @@ import com.google.common.annotations.Beta;
import org.onlab.util.Identifier;
/**
* Identifier of an action group in a protocol-independent pipeline, unique within the scope of an action profile.
* Identifier of an action profile group in a protocol-independent pipeline,
* unique within the scope of an action profile.
*/
@Beta
public final class PiActionGroupId extends Identifier<Integer> implements PiTableAction {
public final class PiActionProfileGroupId extends Identifier<Integer> implements PiTableAction {
private PiActionGroupId(int id) {
private PiActionProfileGroupId(int id) {
super(id);
}
/**
* Returns an action group identifier for the given integer value.
* Returns an action profile group identifier for the given integer value.
*
* @param id identifier
* @return action group
* @return action profile group
*/
public static PiActionGroupId of(int id) {
return new PiActionGroupId(id);
public static PiActionProfileGroupId of(int id) {
return new PiActionProfileGroupId(id);
}
/*
In P4Runtime, groups can be referenced directly as table actions (i.e. without invoking the selector).
In future we should consider having a more appropriate wrapper class for group IDs, instead of implementing
the PiTableAction interface.
In P4Runtime, groups can be referenced directly as table actions (i.e.
without invoking the selector). In future we should consider having a more
appropriate wrapper class for group IDs, instead of implementing the
PiTableAction interface.
*/
@Override
public Type type() {
return Type.ACTION_GROUP_ID;
return Type.ACTION_PROFILE_GROUP_ID;
}
}

View File

@ -24,24 +24,25 @@ import org.onosproject.net.pi.model.PiActionProfileId;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* Instance of a member of an action group in a protocol-independent pipeline.
* Instance of a member of an action profile in a protocol-independent pipeline.
*/
@Beta
public final class PiActionGroupMember implements PiEntity {
public final class PiActionProfileMember implements PiEntity {
private final PiActionProfileId actionProfileId;
private final PiActionGroupMemberId id;
private final PiActionProfileMemberId memberId;
private final PiAction action;
// FIXME: in P4Runtime weight is an attribute of the member reference in a
// group. Either remove it from this class or define the containing group
// ID.
private final int weight;
private PiActionGroupMember(
PiActionProfileId actionProfileId, PiActionGroupMemberId id,
PiAction action, int weight) {
private PiActionProfileMember(PiActionProfileId actionProfileId,
PiActionProfileMemberId memberId,
PiAction action,
int weight) {
this.actionProfileId = actionProfileId;
this.id = id;
this.memberId = memberId;
this.action = action;
this.weight = weight;
}
@ -51,8 +52,8 @@ public final class PiActionGroupMember implements PiEntity {
*
* @return member identifier
*/
public PiActionGroupMemberId id() {
return id;
public PiActionProfileMemberId id() {
return memberId;
}
/**
@ -84,7 +85,7 @@ public final class PiActionGroupMember implements PiEntity {
@Override
public PiEntityType piEntityType() {
return PiEntityType.GROUP_MEMBER;
return PiEntityType.ACTION_PROFILE_MEMBER;
}
@Override
@ -92,33 +93,33 @@ public final class PiActionGroupMember implements PiEntity {
if (this == o) {
return true;
}
if (!(o instanceof PiActionGroupMember)) {
if (!(o instanceof PiActionProfileMember)) {
return false;
}
PiActionGroupMember that = (PiActionGroupMember) o;
PiActionProfileMember that = (PiActionProfileMember) o;
return weight == that.weight &&
Objects.equal(actionProfileId, that.actionProfileId) &&
Objects.equal(id, that.id) &&
Objects.equal(memberId, that.memberId) &&
Objects.equal(action, that.action);
}
@Override
public int hashCode() {
return Objects.hashCode(actionProfileId, id, action, weight);
return Objects.hashCode(actionProfileId, memberId, action, weight);
}
@Override
public String toString() {
return MoreObjects.toStringHelper(this)
.add("actionProfile", actionProfileId)
.add("id", id)
.add("id", memberId)
.add("action", action)
.add("weight", weight)
.toString();
}
/**
* Returns a new builder of action group members.
* Returns a new builder of action profile members.
*
* @return member builder
*/
@ -127,12 +128,12 @@ public final class PiActionGroupMember implements PiEntity {
}
/**
* Builder of action group members.
* Builder of action profile members.
*/
public static final class Builder {
private PiActionProfileId actionProfileId;
private PiActionGroupMemberId id;
private PiActionProfileMemberId id;
private PiAction action;
private int weight;
@ -157,7 +158,7 @@ public final class PiActionGroupMember implements PiEntity {
* @param id member identifier
* @return this
*/
public Builder withId(PiActionGroupMemberId id) {
public Builder withId(PiActionProfileMemberId id) {
this.id = id;
return this;
}
@ -187,15 +188,15 @@ public final class PiActionGroupMember implements PiEntity {
}
/**
* Creates a new action group member.
* Creates a new action profile member.
*
* @return action group member
* @return action profile member
*/
public PiActionGroupMember build() {
public PiActionProfileMember build() {
checkNotNull(actionProfileId);
checkNotNull(id);
checkNotNull(action);
return new PiActionGroupMember(actionProfileId, id, action, weight);
return new PiActionProfileMember(actionProfileId, id, action, weight);
}
}
}

View File

@ -27,14 +27,14 @@ import static com.google.common.base.Preconditions.checkNotNull;
* Global identifier of a PI action profile group member, uniquely defined by a
* device ID, action profile ID, and member ID.
*/
public final class PiActionGroupMemberHandle extends PiHandle<PiActionGroupMember> {
public final class PiActionProfileMemberHandle extends PiHandle<PiActionProfileMember> {
private final PiActionGroupMemberId memberId;
private final PiActionProfileMemberId memberId;
private final PiActionProfileId actionProfileId;
private PiActionGroupMemberHandle(DeviceId deviceId,
private PiActionProfileMemberHandle(DeviceId deviceId,
PiActionProfileId actionProfileId,
PiActionGroupMemberId memberId) {
PiActionProfileMemberId memberId) {
super(deviceId);
this.actionProfileId = actionProfileId;
this.memberId = memberId;
@ -49,11 +49,11 @@ public final class PiActionGroupMemberHandle extends PiHandle<PiActionGroupMembe
* @param memberId member ID
* @return action profile group member handle
*/
public static PiActionGroupMemberHandle of(
public static PiActionProfileMemberHandle of(
DeviceId deviceId,
PiActionProfileId actionProfileId,
PiActionGroupMemberId memberId) {
return new PiActionGroupMemberHandle(
PiActionProfileMemberId memberId) {
return new PiActionProfileMemberHandle(
deviceId, actionProfileId, memberId);
}
@ -65,11 +65,11 @@ public final class PiActionGroupMemberHandle extends PiHandle<PiActionGroupMembe
* @param member member instance
* @return action profile group member handle
*/
public static PiActionGroupMemberHandle of(
public static PiActionProfileMemberHandle of(
DeviceId deviceId,
PiActionGroupMember member) {
PiActionProfileMember member) {
checkNotNull(member);
return new PiActionGroupMemberHandle(
return new PiActionProfileMemberHandle(
deviceId, member.actionProfile(), member.id());
}
@ -78,7 +78,7 @@ public final class PiActionGroupMemberHandle extends PiHandle<PiActionGroupMembe
*
* @return member ID
*/
public PiActionGroupMemberId memberId() {
public PiActionProfileMemberId memberId() {
return memberId;
}
@ -93,7 +93,7 @@ public final class PiActionGroupMemberHandle extends PiHandle<PiActionGroupMembe
@Override
public PiEntityType entityType() {
return PiEntityType.GROUP_MEMBER;
return PiEntityType.ACTION_PROFILE_MEMBER;
}
@Override
@ -109,7 +109,7 @@ public final class PiActionGroupMemberHandle extends PiHandle<PiActionGroupMembe
if (obj == null || getClass() != obj.getClass()) {
return false;
}
final PiActionGroupMemberHandle other = (PiActionGroupMemberHandle) obj;
final PiActionProfileMemberHandle other = (PiActionProfileMemberHandle) obj;
return Objects.equal(this.deviceId(), other.deviceId())
&& Objects.equal(this.actionProfileId, other.actionProfileId)
&& Objects.equal(this.memberId, other.memberId);

View File

@ -20,33 +20,35 @@ import com.google.common.annotations.Beta;
import org.onlab.util.Identifier;
/**
* Identifier of a member of an action group in a protocol-independent pipeline, unique withing the scope on an action
* profile.
* Identifier of a member of an action profile in a protocol-independent
* pipeline, unique within the scope on an action profile.
*/
@Beta
public final class PiActionGroupMemberId extends Identifier<Integer> implements PiTableAction {
public final class PiActionProfileMemberId extends Identifier<Integer>
implements PiTableAction {
private PiActionGroupMemberId(int id) {
private PiActionProfileMemberId(int id) {
super(id);
}
/**
* Returns an action group identifier for the given integer value.
* Returns a member identifier for the given integer value.
*
* @param id identifier
* @return action group
* @return action profile group
*/
public static PiActionGroupMemberId of(int id) {
return new PiActionGroupMemberId(id);
public static PiActionProfileMemberId of(int id) {
return new PiActionProfileMemberId(id);
}
/*
In P4Runtime, group members can be referenced directly as table actions.
In future we should consider having a more appropriate wrapper class for group member IDs, instead of implementing
the PiTableAction interface.
In P4Runtime, action profile members can be referenced directly as table
actions. In future we should consider having a more appropriate wrapper
class for group member IDs, instead of implementing the PiTableAction
interface.
*/
@Override
public Type type() {
return Type.GROUP_MEMBER_ID;
return Type.ACTION_PROFILE_MEMBER_ID;
}
}

View File

@ -31,12 +31,12 @@ public enum PiEntityType {
/**
* Action profile group.
*/
GROUP,
ACTION_PROFILE_GROUP,
/**
* Action profile group member.
* Action profile member.
*/
GROUP_MEMBER,
ACTION_PROFILE_MEMBER,
/**
* Meter config.

View File

@ -19,8 +19,8 @@ package org.onosproject.net.pi.runtime;
import com.google.common.annotations.Beta;
/**
* Instance of an action that can be executed as a consequence of a match in a match+action table of a
* protocol-independent pipeline.
* Instance of an action that can be executed as a consequence of a match in a
* match+action table of a protocol-independent pipeline.
*/
@Beta
public interface PiTableAction {
@ -35,14 +35,15 @@ public interface PiTableAction {
ACTION,
/**
* Executes the action group specified by the given identifier.
* Executes the action profile group specified by the given identifier.
*/
ACTION_GROUP_ID,
ACTION_PROFILE_GROUP_ID,
/**
* Executes the action member group specified by the given identifier.
* Executes the action profile member specified by the given
* identifier.
*/
GROUP_MEMBER_ID
ACTION_PROFILE_MEMBER_ID
}
/**

View File

@ -179,10 +179,10 @@ public final class PiTableEntry implements PiEntity {
return "null";
}
switch (tableAction.type()) {
case ACTION_GROUP_ID:
return "GROUP:" + ((PiActionGroupId) tableAction).id();
case GROUP_MEMBER_ID:
return "GROUP_MEMBER:" + ((PiActionGroupMemberId) tableAction).id();
case ACTION_PROFILE_GROUP_ID:
return "ACT_PROF_GROUP:" + ((PiActionProfileGroupId) tableAction).id();
case ACTION_PROFILE_MEMBER_ID:
return "ACT_PROF_MEMBER:" + ((PiActionProfileMemberId) tableAction).id();
case ACTION:
default:
return tableAction.toString();

View File

@ -18,13 +18,13 @@ package org.onosproject.net.pi.service;
import com.google.common.annotations.Beta;
import org.onosproject.net.group.Group;
import org.onosproject.net.pi.runtime.PiActionGroup;
import org.onosproject.net.pi.runtime.PiActionProfileGroup;
/**
* A PI translation store that keeps track of which groups have been
* translated to which PI action groups.
* translated to which PI action profile groups.
*/
@Beta
public interface PiGroupTranslationStore
extends PiTranslationStore<Group, PiActionGroup> {
extends PiTranslationStore<Group, PiActionProfileGroup> {
}

View File

@ -18,12 +18,12 @@ package org.onosproject.net.pi.service;
import com.google.common.annotations.Beta;
import org.onosproject.net.group.Group;
import org.onosproject.net.pi.runtime.PiActionGroup;
import org.onosproject.net.pi.runtime.PiActionProfileGroup;
/**
* A translator of groups to PI action groups.
* A translator of groups to PI action profile groups.
*/
@Beta
public interface PiGroupTranslator
extends PiTranslator<Group, PiActionGroup> {
extends PiTranslator<Group, PiActionProfileGroup> {
}

View File

@ -19,28 +19,27 @@ package org.onosproject.net.pi.runtime;
import com.google.common.testing.EqualsTester;
import org.junit.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.notNullValue;
import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
/**
* Unit tests for PiActionGroupId class.
* Unit tests for PiActionProfileGroupId class.
*/
public class PiActionGroupIdTest {
public class PiActionProfileGroupIdTest {
final PiActionGroupId piActionGroupId1 = PiActionGroupId.of(10);
final PiActionGroupId sameAsPiActionGroupId1 = PiActionGroupId.of(10);
final PiActionGroupId piActionGroupId2 = PiActionGroupId.of(20);
final PiActionProfileGroupId piActionGroupId1 = PiActionProfileGroupId.of(10);
final PiActionProfileGroupId sameAsPiActionProfileGroupId1 = PiActionProfileGroupId.of(10);
final PiActionProfileGroupId piActionGroupId2 = PiActionProfileGroupId.of(20);
/**
* Checks that the PiActionGroupId class is immutable.
* Checks that the PiActionProfileGroupId class is immutable.
*/
@Test
public void testImmutability() {
assertThatClassIsImmutable(PiActionGroupId.class);
assertThatClassIsImmutable(PiActionProfileGroupId.class);
}
/**
@ -50,19 +49,19 @@ public class PiActionGroupIdTest {
public void testEquals() {
new EqualsTester()
.addEqualityGroup(piActionGroupId1, sameAsPiActionGroupId1)
.addEqualityGroup(piActionGroupId1, sameAsPiActionProfileGroupId1)
.addEqualityGroup(piActionGroupId2)
.testEquals();
}
/**
* Checks the methods of PiActionGroupId.
* Checks the methods of PiActionProfileGroupId.
*/
@Test
public void testMethods() {
assertThat(piActionGroupId1, is(notNullValue()));
assertThat(piActionGroupId1.type(), is(PiTableAction.Type.ACTION_GROUP_ID));
assertThat(piActionGroupId1.type(), is(PiTableAction.Type.ACTION_PROFILE_GROUP_ID));
assertThat(piActionGroupId1.id(), is(10));
}
}

View File

@ -35,48 +35,48 @@ import static org.onosproject.net.pi.runtime.PiConstantsTest.DST_ADDR;
import static org.onosproject.net.pi.runtime.PiConstantsTest.MOD_NW_DST;
/**
* Unit tests for PiActionGroup class.
* Unit tests for PiActionProfileGroup class.
*/
public class PiActionGroupTest {
public class PiActionProfileGroupTest {
private final PiActionGroupMemberId piActionGroupMemberId = PiActionGroupMemberId.of(10);
private final PiActionProfileMemberId piActionProfileMemberId = PiActionProfileMemberId.of(10);
private final PiAction piAction = PiAction.builder().withId(PiActionId.of(MOD_NW_DST))
.withParameter(new PiActionParam(PiActionParamId.of(DST_ADDR), copyFrom(0x0a010101)))
.build();
private final PiActionGroupMember piActionGroupMember = PiActionGroupMember.builder()
private final PiActionProfileMember piActionProfileMember = PiActionProfileMember.builder()
.forActionProfile(ACTION_PROF_ID)
.withId(piActionGroupMemberId)
.withId(piActionProfileMemberId)
.withAction(piAction)
.withWeight(10)
.build();
private PiActionGroupId piActionGroupId = PiActionGroupId.of(10);
private PiActionGroup piActionGroup1 = PiActionGroup.builder()
.addMember(piActionGroupMember)
private PiActionProfileGroupId piActionGroupId = PiActionProfileGroupId.of(10);
private PiActionProfileGroup piActionGroup1 = PiActionProfileGroup.builder()
.addMember(piActionProfileMember)
.withId(piActionGroupId)
.withActionProfileId(ACTION_PROF_ID)
.build();
private PiActionGroup sameAsPiActionGroup1 = PiActionGroup.builder()
.addMember(piActionGroupMember)
private PiActionProfileGroup sameAsPiActionProfileGroup1 = PiActionProfileGroup.builder()
.addMember(piActionProfileMember)
.withId(piActionGroupId)
.withActionProfileId(ACTION_PROF_ID)
.build();
private PiActionGroupId piActionGroupId2 = PiActionGroupId.of(20);
private PiActionGroup piActionGroup2 = PiActionGroup.builder()
.addMember(piActionGroupMember)
private PiActionProfileGroupId piActionGroupId2 = PiActionProfileGroupId.of(20);
private PiActionProfileGroup piActionGroup2 = PiActionProfileGroup.builder()
.addMember(piActionProfileMember)
.withId(piActionGroupId2)
.withActionProfileId(ACTION_PROF_ID)
.build();
/**
* Checks that the PiActionGroup class is immutable.
* Checks that the PiActionProfileGroup class is immutable.
*/
@Test
public void testImmutability() {
assertThatClassIsImmutable(PiActionGroup.class);
assertThatClassIsImmutable(PiActionProfileGroup.class);
}
/**
@ -86,23 +86,23 @@ public class PiActionGroupTest {
public void testEquals() {
new EqualsTester()
.addEqualityGroup(piActionGroup1, sameAsPiActionGroup1)
.addEqualityGroup(piActionGroup1, sameAsPiActionProfileGroup1)
.addEqualityGroup(piActionGroup2)
.testEquals();
}
/**
* Checks the methods of PiActionGroup.
* Checks the methods of PiActionProfileGroup.
*/
@Test
public void testMethods() {
Collection<PiActionGroupMember> piActionGroupMembers = Lists.newArrayList();
Collection<PiActionProfileMember> piActionProfileMembers = Lists.newArrayList();
piActionGroupMembers.add(piActionGroupMember);
piActionProfileMembers.add(piActionProfileMember);
assertThat(piActionGroup1, is(notNullValue()));
assertThat(piActionGroup1.id(), is(piActionGroupId));
assertThat("Incorrect members value",
CollectionUtils.isEqualCollection(piActionGroup1.members(), piActionGroupMembers));
CollectionUtils.isEqualCollection(piActionGroup1.members(), piActionProfileMembers));
}
}

View File

@ -25,21 +25,21 @@ import static org.hamcrest.Matchers.notNullValue;
import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
/**
* Unit tests for PiActionGroupMemberId class.
* Unit tests for PiActionProfileMemberId class.
*/
public class PiActionGroupMemberIdTest {
public class PiActionProfileMemberIdTest {
final PiActionGroupMemberId piActionGroupMemberId1 = PiActionGroupMemberId.of(10);
final PiActionGroupMemberId sameAsPiActionGroupMemberId1 = PiActionGroupMemberId.of(10);
final PiActionGroupMemberId piActionGroupMemberId2 = PiActionGroupMemberId.of(20);
final PiActionProfileMemberId piActionProfileMemberId1 = PiActionProfileMemberId.of(10);
final PiActionProfileMemberId sameAsPiActionProfileMemberId1 = PiActionProfileMemberId.of(10);
final PiActionProfileMemberId piActionProfileMemberId2 = PiActionProfileMemberId.of(20);
/**
* Checks that the PiActionGroupMemberId class is immutable.
* Checks that the PiActionProfileMemberId class is immutable.
*/
@Test
public void testImmutability() {
assertThatClassIsImmutable(PiActionGroupMemberId.class);
assertThatClassIsImmutable(PiActionProfileMemberId.class);
}
/**
@ -49,19 +49,19 @@ public class PiActionGroupMemberIdTest {
public void testEquals() {
new EqualsTester()
.addEqualityGroup(piActionGroupMemberId1, sameAsPiActionGroupMemberId1)
.addEqualityGroup(piActionGroupMemberId2)
.addEqualityGroup(piActionProfileMemberId1, sameAsPiActionProfileMemberId1)
.addEqualityGroup(piActionProfileMemberId2)
.testEquals();
}
/**
* Checks the methods of PiActionGroupMemberId.
* Checks the methods of PiActionProfileMemberId.
*/
@Test
public void testMethods() {
assertThat(piActionGroupMemberId1, is(notNullValue()));
assertThat(piActionGroupMemberId1.type(), is(PiTableAction.Type.GROUP_MEMBER_ID));
assertThat(piActionGroupMemberId1.id(), is(10));
assertThat(piActionProfileMemberId1, is(notNullValue()));
assertThat(piActionProfileMemberId1.type(), is(PiTableAction.Type.ACTION_PROFILE_MEMBER_ID));
assertThat(piActionProfileMemberId1.id(), is(10));
}
}

View File

@ -31,49 +31,49 @@ import static org.onosproject.net.pi.runtime.PiConstantsTest.DST_ADDR;
import static org.onosproject.net.pi.runtime.PiConstantsTest.MOD_NW_DST;
/**
* Unit tests for PiActionGroupMember class.
* Unit tests for PiActionProfileMember class.
*/
public class PiActionGroupMemberTest {
public class PiActionProfileMemberTest {
private final PiActionProfileId actionProfileId1 = PiActionProfileId.of("foo");
private final PiActionProfileId actionProfileId2 = PiActionProfileId.of("bar");
private final PiActionGroupMemberId piActionGroupMemberId = PiActionGroupMemberId.of(10);
private final PiActionProfileMemberId piActionProfileMemberId = PiActionProfileMemberId.of(10);
private final PiAction piAction = PiAction.builder().withId(PiActionId.of(MOD_NW_DST))
.withParameter(new PiActionParam(PiActionParamId.of(DST_ADDR), copyFrom(0x0a010101)))
.build();
private final PiActionGroupMember piActionGroupMember1 = PiActionGroupMember.builder()
private final PiActionProfileMember piActionProfileMember1 = PiActionProfileMember.builder()
.forActionProfile(actionProfileId1)
.withId(piActionGroupMemberId)
.withId(piActionProfileMemberId)
.withAction(piAction)
.withWeight(10)
.build();
private final PiActionGroupMember sameAsPiActionGroupMember1 = PiActionGroupMember.builder()
private final PiActionProfileMember sameAsPiActionProfileMember1 = PiActionProfileMember.builder()
.forActionProfile(actionProfileId1)
.withId(piActionGroupMemberId)
.withId(piActionProfileMemberId)
.withAction(piAction)
.withWeight(10)
.build();
private final PiActionGroupMember piActionGroupMember2 = PiActionGroupMember.builder()
private final PiActionProfileMember piActionProfileMember2 = PiActionProfileMember.builder()
.forActionProfile(actionProfileId1)
.withId(piActionGroupMemberId)
.withId(piActionProfileMemberId)
.withAction(piAction)
.withWeight(20)
.build();
private final PiActionGroupMember piActionGroupMember1ForOtherProfile = PiActionGroupMember.builder()
private final PiActionProfileMember piActionGroupMember1ForOtherProfile = PiActionProfileMember.builder()
.forActionProfile(actionProfileId2)
.withId(piActionGroupMemberId)
.withId(piActionProfileMemberId)
.withAction(piAction)
.withWeight(10)
.build();
/**
* Checks that the PiActionGroupMember class is immutable.
* Checks that the PiActionProfileMember class is immutable.
*/
@Test
public void testImmutability() {
assertThatClassIsImmutable(PiActionGroupMember.class);
assertThatClassIsImmutable(PiActionProfileMember.class);
}
/**
@ -83,21 +83,21 @@ public class PiActionGroupMemberTest {
public void testEquals() {
new EqualsTester()
.addEqualityGroup(piActionGroupMember1, sameAsPiActionGroupMember1)
.addEqualityGroup(piActionGroupMember2)
.addEqualityGroup(piActionProfileMember1, sameAsPiActionProfileMember1)
.addEqualityGroup(piActionProfileMember2)
.addEqualityGroup(piActionGroupMember1ForOtherProfile)
.testEquals();
}
/**
* Checks the methods of PiActionGroupMember.
* Checks the methods of PiActionProfileMember.
*/
@Test
public void testMethods() {
assertThat(piActionGroupMember1, is(notNullValue()));
assertThat(piActionGroupMember1.weight(), is(10));
assertThat(piActionGroupMember1.id(), is(piActionGroupMemberId));
assertThat(piActionGroupMember1.action(), is(piAction));
assertThat(piActionProfileMember1, is(notNullValue()));
assertThat(piActionProfileMember1.weight(), is(10));
assertThat(piActionProfileMember1.id(), is(piActionProfileMemberId));
assertThat(piActionProfileMember1.action(), is(piAction));
}
}

View File

@ -29,7 +29,6 @@ import org.onlab.packet.VlanId;
import org.onlab.util.HexString;
import org.onlab.util.ImmutableByteSequence;
import org.onosproject.codec.CodecContext;
import org.onosproject.net.flow.ExtensionTreatmentCodec;
import org.onosproject.core.GroupId;
import org.onosproject.net.ChannelSpacing;
import org.onosproject.net.Device;
@ -39,6 +38,7 @@ import org.onosproject.net.OchSignal;
import org.onosproject.net.OduSignalId;
import org.onosproject.net.PortNumber;
import org.onosproject.net.device.DeviceService;
import org.onosproject.net.flow.ExtensionTreatmentCodec;
import org.onosproject.net.flow.StatTriggerField;
import org.onosproject.net.flow.StatTriggerFlag;
import org.onosproject.net.flow.instructions.ExtensionTreatment;
@ -53,9 +53,9 @@ import org.onosproject.net.meter.MeterId;
import org.onosproject.net.pi.model.PiActionId;
import org.onosproject.net.pi.model.PiActionParamId;
import org.onosproject.net.pi.runtime.PiAction;
import org.onosproject.net.pi.runtime.PiActionGroupId;
import org.onosproject.net.pi.runtime.PiActionGroupMemberId;
import org.onosproject.net.pi.runtime.PiActionParam;
import org.onosproject.net.pi.runtime.PiActionProfileGroupId;
import org.onosproject.net.pi.runtime.PiActionProfileMemberId;
import org.onosproject.net.pi.runtime.PiTableAction;
import org.slf4j.Logger;
@ -306,18 +306,18 @@ public final class DecodeInstructionCodecHelper {
}
return Instructions.piTableAction(builder.withId(piActionId).build());
} else if (subType.equals(PiTableAction.Type.ACTION_GROUP_ID.name())) {
PiActionGroupId piActionGroupId = PiActionGroupId.of(nullIsIllegal(
json.get(InstructionCodec.PI_ACTION_GROUP_ID),
InstructionCodec.PI_ACTION_GROUP_ID + InstructionCodec.MISSING_MEMBER_MESSAGE).asInt());
} else if (subType.equals(PiTableAction.Type.ACTION_PROFILE_GROUP_ID.name())) {
PiActionProfileGroupId piActionGroupId = PiActionProfileGroupId.of(nullIsIllegal(
json.get(InstructionCodec.PI_ACTION_PROFILE_GROUP_ID),
InstructionCodec.PI_ACTION_PROFILE_GROUP_ID + InstructionCodec.MISSING_MEMBER_MESSAGE).asInt());
return Instructions.piTableAction(piActionGroupId);
} else if (subType.equals(PiTableAction.Type.GROUP_MEMBER_ID.name())) {
PiActionGroupMemberId piActionGroupMemberId = PiActionGroupMemberId.of(nullIsIllegal(
json.get(InstructionCodec.PI_ACTION_GROUP_MEMBER_ID),
InstructionCodec.PI_ACTION_GROUP_MEMBER_ID + InstructionCodec.MISSING_MEMBER_MESSAGE).asInt());
} else if (subType.equals(PiTableAction.Type.ACTION_PROFILE_MEMBER_ID.name())) {
PiActionProfileMemberId piActionProfileMemberId = PiActionProfileMemberId.of(nullIsIllegal(
json.get(InstructionCodec.PI_ACTION_PROFILE_MEMBER_ID),
InstructionCodec.PI_ACTION_PROFILE_MEMBER_ID + InstructionCodec.MISSING_MEMBER_MESSAGE).asInt());
return Instructions.piTableAction(piActionGroupMemberId);
return Instructions.piTableAction(piActionProfileMemberId);
}
throw new IllegalArgumentException("Protocol-independent Instruction subtype "
+ subType + " is not supported");

View File

@ -20,12 +20,12 @@ import org.onlab.osgi.DefaultServiceDirectory;
import org.onlab.osgi.ServiceDirectory;
import org.onlab.util.HexString;
import org.onosproject.codec.CodecContext;
import org.onosproject.net.flow.ExtensionTreatmentCodec;
import org.onosproject.net.Device;
import org.onosproject.net.DeviceId;
import org.onosproject.net.OchSignal;
import org.onosproject.net.OduSignalId;
import org.onosproject.net.device.DeviceService;
import org.onosproject.net.flow.ExtensionTreatmentCodec;
import org.onosproject.net.flow.instructions.Instruction;
import org.onosproject.net.flow.instructions.Instructions;
import org.onosproject.net.flow.instructions.L0ModificationInstruction;
@ -35,9 +35,9 @@ import org.onosproject.net.flow.instructions.L3ModificationInstruction;
import org.onosproject.net.flow.instructions.L4ModificationInstruction;
import org.onosproject.net.flow.instructions.PiInstruction;
import org.onosproject.net.pi.runtime.PiAction;
import org.onosproject.net.pi.runtime.PiActionGroupId;
import org.onosproject.net.pi.runtime.PiActionGroupMemberId;
import org.onosproject.net.pi.runtime.PiActionParam;
import org.onosproject.net.pi.runtime.PiActionProfileGroupId;
import org.onosproject.net.pi.runtime.PiActionProfileMemberId;
import org.slf4j.Logger;
import static org.onlab.util.Tools.toHexWithPrefix;
@ -264,13 +264,13 @@ public final class EncodeInstructionCodecHelper {
}
result.set(InstructionCodec.PI_ACTION_PARAMS, jsonActionParams);
break;
case ACTION_GROUP_ID:
final PiActionGroupId piActionGroupId = (PiActionGroupId) piInstruction.action();
result.put(InstructionCodec.PI_ACTION_GROUP_ID, piActionGroupId.id());
case ACTION_PROFILE_GROUP_ID:
final PiActionProfileGroupId groupId = (PiActionProfileGroupId) piInstruction.action();
result.put(InstructionCodec.PI_ACTION_PROFILE_GROUP_ID, groupId.id());
break;
case GROUP_MEMBER_ID:
final PiActionGroupMemberId piActionGroupMemberId = (PiActionGroupMemberId) piInstruction.action();
result.put(InstructionCodec.PI_ACTION_GROUP_MEMBER_ID, piActionGroupMemberId.id());
case ACTION_PROFILE_MEMBER_ID:
final PiActionProfileMemberId memberId = (PiActionProfileMemberId) piInstruction.action();
result.put(InstructionCodec.PI_ACTION_PROFILE_MEMBER_ID, memberId.id());
break;
default:
throw new IllegalArgumentException("Cannot convert protocol-independent subtype of" +

View File

@ -66,8 +66,8 @@ public final class InstructionCodec extends JsonCodec<Instruction> {
static final String STAT_DURATION = "duration";
static final String PI_ACTION_ID = "actionId";
static final String PI_ACTION_GROUP_ID = "groupId";
static final String PI_ACTION_GROUP_MEMBER_ID = "memberId";
static final String PI_ACTION_PROFILE_GROUP_ID = "groupId";
static final String PI_ACTION_PROFILE_MEMBER_ID = "memberId";
static final String PI_ACTION_PARAMS = "actionParams";
static final String MISSING_MEMBER_MESSAGE =

View File

@ -44,9 +44,9 @@ import org.onosproject.net.flow.instructions.PiInstruction;
import org.onosproject.net.pi.model.PiActionId;
import org.onosproject.net.pi.model.PiActionParamId;
import org.onosproject.net.pi.runtime.PiAction;
import org.onosproject.net.pi.runtime.PiActionGroupId;
import org.onosproject.net.pi.runtime.PiActionGroupMemberId;
import org.onosproject.net.pi.runtime.PiActionParam;
import org.onosproject.net.pi.runtime.PiActionProfileGroupId;
import org.onosproject.net.pi.runtime.PiActionProfileMemberId;
import org.onosproject.net.pi.runtime.PiTableAction;
import java.io.IOException;
@ -264,17 +264,17 @@ public class InstructionCodecTest {
instructionCodec.encode(actionInstruction, context);
assertThat(actionInstructionJson, matchesInstruction(actionInstruction));
PiTableAction actionGroupId = PiActionGroupId.of(10);
PiTableAction actionGroupId = PiActionProfileGroupId.of(10);
final PiInstruction actionGroupIdInstruction = Instructions.piTableAction(actionGroupId);
final ObjectNode actionGroupIdInstructionJson =
instructionCodec.encode(actionGroupIdInstruction, context);
assertThat(actionGroupIdInstructionJson, matchesInstruction(actionGroupIdInstruction));
PiTableAction actionGroupMemberId = PiActionGroupMemberId.of(10);
final PiInstruction actionGroupMemberIdInstruction = Instructions.piTableAction(actionGroupMemberId);
final ObjectNode actionGroupMemberIdInstructionJson =
instructionCodec.encode(actionGroupMemberIdInstruction, context);
assertThat(actionGroupMemberIdInstructionJson, matchesInstruction(actionGroupMemberIdInstruction));
PiTableAction actionProfileMemberId = PiActionProfileMemberId.of(10);
final PiInstruction actionProfileMemberIdInstruction = Instructions.piTableAction(actionProfileMemberId);
final ObjectNode actionProfileMemberIdInstructionJson =
instructionCodec.encode(actionProfileMemberIdInstruction, context);
assertThat(actionProfileMemberIdInstructionJson, matchesInstruction(actionProfileMemberIdInstruction));
}
/**
@ -294,17 +294,17 @@ public class InstructionCodecTest {
Assert.assertThat(actionParam.id().id(), is("port"));
Assert.assertThat(actionParam.value(), is(copyFrom((byte) 0x1)));
Instruction actionGroupIdInstruction = getInstruction("PiActionGroupIdInstruction.json");
Instruction actionGroupIdInstruction = getInstruction("PiActionProfileGroupIdInstruction.json");
Assert.assertThat(actionInstruction.type(), is(Instruction.Type.PROTOCOL_INDEPENDENT));
PiTableAction actionGroupId = ((PiInstruction) actionGroupIdInstruction).action();
Assert.assertThat(actionGroupId.type(), is(PiTableAction.Type.ACTION_GROUP_ID));
Assert.assertThat(((PiActionGroupId) actionGroupId).id(), is(100));
Assert.assertThat(actionGroupId.type(), is(PiTableAction.Type.ACTION_PROFILE_GROUP_ID));
Assert.assertThat(((PiActionProfileGroupId) actionGroupId).id(), is(100));
Instruction actionMemberIdInstruction = getInstruction("PiActionMemberIdInstruction.json");
Instruction actionMemberIdInstruction = getInstruction("PiActionProfileMemberIdInstruction.json");
Assert.assertThat(actionInstruction.type(), is(Instruction.Type.PROTOCOL_INDEPENDENT));
PiTableAction actionMemberId = ((PiInstruction) actionMemberIdInstruction).action();
Assert.assertThat(actionMemberId.type(), is(PiTableAction.Type.GROUP_MEMBER_ID));
Assert.assertThat(((PiActionGroupMemberId) actionMemberId).id(), is(100));
Assert.assertThat(actionMemberId.type(), is(PiTableAction.Type.ACTION_PROFILE_MEMBER_ID));
Assert.assertThat(((PiActionProfileMemberId) actionMemberId).id(), is(100));
}
/**

View File

@ -37,9 +37,9 @@ import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModIPInst
import org.onosproject.net.flow.instructions.L3ModificationInstruction.ModIPv6FlowLabelInstruction;
import org.onosproject.net.flow.instructions.PiInstruction;
import org.onosproject.net.pi.runtime.PiAction;
import org.onosproject.net.pi.runtime.PiActionGroupId;
import org.onosproject.net.pi.runtime.PiActionGroupMemberId;
import org.onosproject.net.pi.runtime.PiActionParam;
import org.onosproject.net.pi.runtime.PiActionProfileGroupId;
import org.onosproject.net.pi.runtime.PiActionProfileMemberId;
import java.util.Collection;
import java.util.Objects;
@ -554,19 +554,19 @@ public final class InstructionJsonMatcher extends TypeSafeDiagnosingMatcher<Json
}
}
break;
case ACTION_GROUP_ID:
case ACTION_PROFILE_GROUP_ID:
if (!Objects.equals(instructionJson.get("groupId").asInt(),
((PiActionGroupId) instructionToMatch.action()).id())) {
description.appendText("action group id was " +
((PiActionGroupId) instructionToMatch.action()).id());
((PiActionProfileGroupId) instructionToMatch.action()).id())) {
description.appendText("action profile group id was " +
((PiActionProfileGroupId) instructionToMatch.action()).id());
return false;
}
break;
case GROUP_MEMBER_ID:
case ACTION_PROFILE_MEMBER_ID:
if (!Objects.equals(instructionJson.get("memberId").asInt(),
((PiActionGroupMemberId) instructionToMatch.action()).id())) {
description.appendText("action member id was " +
((PiActionGroupMemberId) instructionToMatch.action()).id());
((PiActionProfileMemberId) instructionToMatch.action()).id())) {
description.appendText("action profile member id was " +
((PiActionProfileMemberId) instructionToMatch.action()).id());
return false;
}
break;

View File

@ -1,5 +1,5 @@
{
"type":"PROTOCOL_INDEPENDENT",
"subtype":"ACTION_GROUP_ID",
"subtype": "ACTION_PROFILE_GROUP_ID",
"groupId": 100
}

View File

@ -1,5 +1,5 @@
{
"type":"PROTOCOL_INDEPENDENT",
"subtype":"GROUP_MEMBER_ID",
"subtype": "ACTION_PROFILE_MEMBER_ID",
"memberId": 100
}
}

View File

@ -24,10 +24,10 @@ import org.onosproject.net.group.GroupDescription;
import org.onosproject.net.pi.model.PiPipeconf;
import org.onosproject.net.pi.model.PiPipelineInterpreter;
import org.onosproject.net.pi.runtime.PiAction;
import org.onosproject.net.pi.runtime.PiActionGroup;
import org.onosproject.net.pi.runtime.PiActionGroupId;
import org.onosproject.net.pi.runtime.PiActionGroupMember;
import org.onosproject.net.pi.runtime.PiActionGroupMemberId;
import org.onosproject.net.pi.runtime.PiActionProfileGroup;
import org.onosproject.net.pi.runtime.PiActionProfileGroupId;
import org.onosproject.net.pi.runtime.PiActionProfileMember;
import org.onosproject.net.pi.runtime.PiActionProfileMemberId;
import org.onosproject.net.pi.runtime.PiGroupKey;
import org.onosproject.net.pi.runtime.PiTableAction;
import org.onosproject.net.pi.service.PiTranslationException;
@ -55,15 +55,16 @@ final class PiGroupTranslatorImpl {
}
/**
* Returns a PI action group equivalent to the given group, for the given pipeconf and device.
* Returns a PI action profile group equivalent to the given group, for the given pipeconf and device.
*
* @param group group
* @param pipeconf pipeconf
* @param device device
* @return PI action group
* @return PI action profile group
* @throws PiTranslationException if the group cannot be translated
*/
static PiActionGroup translate(Group group, PiPipeconf pipeconf, Device device) throws PiTranslationException {
static PiActionProfileGroup translate(Group group, PiPipeconf pipeconf, Device device)
throws PiTranslationException {
if (!SUPPORTED_GROUP_TYPES.contains(group.type())) {
throw new PiTranslationException(format(
@ -72,8 +73,8 @@ final class PiGroupTranslatorImpl {
final PiPipelineInterpreter interpreter = getInterpreterOrNull(device, pipeconf);
final PiActionGroup.Builder piActionGroupBuilder = PiActionGroup.builder()
.withId(PiActionGroupId.of(group.id().id()));
final PiActionProfileGroup.Builder piActionGroupBuilder = PiActionProfileGroup.builder()
.withId(PiActionProfileGroupId.of(group.id().id()));
if (!(group.appCookie() instanceof PiGroupKey)) {
throw new PiTranslationException("group app cookie is not PI (class should be PiGroupKey)");
@ -88,7 +89,7 @@ final class PiGroupTranslatorImpl {
/*
FIXME: the way member IDs are computed can cause collisions!
Problem:
In P4Runtime action group members, i.e. action buckets, are associated to a numeric ID chosen
In P4Runtime action profile members, i.e. action buckets, are associated to a numeric ID chosen
at member insertion time. This ID must be unique for the whole action profile (i.e. the group table in
OpenFlow). In ONOS, GroupBucket doesn't specify any ID.
@ -118,9 +119,9 @@ final class PiGroupTranslatorImpl {
"PI table action of type %s is not supported in groups", tableAction.type()));
}
piActionGroupBuilder.addMember(PiActionGroupMember.builder()
piActionGroupBuilder.addMember(PiActionProfileMember.builder()
.forActionProfile(groupKey.actionProfileId())
.withId(PiActionGroupMemberId.of(memberId))
.withId(PiActionProfileMemberId.of(memberId))
.withAction((PiAction) tableAction)
.withWeight(bucket.weight())
.build());

View File

@ -29,7 +29,7 @@ import org.onosproject.net.flow.FlowRule;
import org.onosproject.net.group.Group;
import org.onosproject.net.meter.Meter;
import org.onosproject.net.pi.model.PiPipeconf;
import org.onosproject.net.pi.runtime.PiActionGroup;
import org.onosproject.net.pi.runtime.PiActionProfileGroup;
import org.onosproject.net.pi.runtime.PiMeterCellConfig;
import org.onosproject.net.pi.runtime.PiMulticastGroupEntry;
import org.onosproject.net.pi.runtime.PiTableEntry;
@ -139,7 +139,7 @@ public class PiTranslationServiceImpl implements PiTranslationService {
}
private final class InternalGroupTranslator
extends AbstractPiTranslatorImpl<Group, PiActionGroup>
extends AbstractPiTranslatorImpl<Group, PiActionProfileGroup>
implements PiGroupTranslator {
private InternalGroupTranslator(PiGroupTranslationStore store) {
@ -147,7 +147,7 @@ public class PiTranslationServiceImpl implements PiTranslationService {
}
@Override
public PiActionGroup translate(Group original, PiPipeconf pipeconf)
public PiActionProfileGroup translate(Group original, PiPipeconf pipeconf)
throws PiTranslationException {
return PiGroupTranslatorImpl
.translate(original, pipeconf, getDevice(original.deviceId()));

View File

@ -38,10 +38,10 @@ import org.onosproject.net.group.GroupBuckets;
import org.onosproject.net.group.GroupDescription;
import org.onosproject.net.pi.model.PiPipeconf;
import org.onosproject.net.pi.runtime.PiAction;
import org.onosproject.net.pi.runtime.PiActionGroup;
import org.onosproject.net.pi.runtime.PiActionGroupMember;
import org.onosproject.net.pi.runtime.PiActionGroupMemberId;
import org.onosproject.net.pi.runtime.PiActionParam;
import org.onosproject.net.pi.runtime.PiActionProfileGroup;
import org.onosproject.net.pi.runtime.PiActionProfileMember;
import org.onosproject.net.pi.runtime.PiActionProfileMemberId;
import org.onosproject.net.pi.runtime.PiGroupKey;
import org.onosproject.net.pi.runtime.PiTableAction;
import org.onosproject.pipelines.basic.PipeconfLoader;
@ -80,7 +80,7 @@ public class PiGroupTranslatorImplTest {
private static final Group SELECT_GROUP = new DefaultGroup(GROUP_ID, SELECT_GROUP_DESC);
private static final int DEFAULT_MEMBER_WEIGHT = 1;
private static final int BASE_MEM_ID = 65535;
private Collection<PiActionGroupMember> expectedMembers;
private Collection<PiActionProfileMember> expectedMembers;
private PiPipeconf pipeconf;
@ -102,16 +102,16 @@ public class PiGroupTranslatorImplTest {
return DefaultGroupBucket.createSelectGroupBucket(treatment);
}
private static PiActionGroupMember outputMember(int portNum)
private static PiActionProfileMember outputMember(int portNum)
throws ImmutableByteSequence.ByteSequenceTrimException {
PiActionParam param = new PiActionParam(ACT_PRM_PORT_ID, copyFrom(portNum).fit(PORT_BITWIDTH));
PiAction piAction = PiAction.builder()
.withId(ACT_SET_EGRESS_PORT_WCMP_ID)
.withParameter(param).build();
return PiActionGroupMember.builder()
return PiActionProfileMember.builder()
.forActionProfile(ACT_PRF_WCMP_SELECTOR_ID)
.withAction(piAction)
.withId(PiActionGroupMemberId.of(BASE_MEM_ID + portNum))
.withId(PiActionProfileMemberId.of(BASE_MEM_ID + portNum))
.withWeight(DEFAULT_MEMBER_WEIGHT)
.build();
}
@ -122,8 +122,8 @@ public class PiGroupTranslatorImplTest {
@Test
public void testTranslateGroups() throws Exception {
PiActionGroup piGroup1 = PiGroupTranslatorImpl.translate(SELECT_GROUP, pipeconf, null);
PiActionGroup piGroup2 = PiGroupTranslatorImpl.translate(SELECT_GROUP, pipeconf, null);
PiActionProfileGroup piGroup1 = PiGroupTranslatorImpl.translate(SELECT_GROUP, pipeconf, null);
PiActionProfileGroup piGroup2 = PiGroupTranslatorImpl.translate(SELECT_GROUP, pipeconf, null);
new EqualsTester()
.addEqualityGroup(piGroup1, piGroup2)
@ -135,7 +135,7 @@ public class PiGroupTranslatorImplTest {
piGroup1.actionProfileId(), is(equalTo(ACT_PRF_WCMP_SELECTOR_ID)));
// members installed
Collection<PiActionGroupMember> members = piGroup1.members();
Collection<PiActionProfileMember> members = piGroup1.members();
assertThat("The number of group members must be equal",
piGroup1.members().size(), is(expectedMembers.size()));
assertThat("Group members must be equal",

View File

@ -19,7 +19,7 @@ package org.onosproject.store.pi.impl;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Service;
import org.onosproject.net.group.Group;
import org.onosproject.net.pi.runtime.PiActionGroup;
import org.onosproject.net.pi.runtime.PiActionProfileGroup;
import org.onosproject.net.pi.service.PiGroupTranslationStore;
/**
@ -28,7 +28,7 @@ import org.onosproject.net.pi.service.PiGroupTranslationStore;
@Component(immediate = true)
@Service
public class DistributedPiGroupTranslationStore
extends AbstractDistributedPiTranslationStore<Group, PiActionGroup>
extends AbstractDistributedPiTranslationStore<Group, PiActionProfileGroup>
implements PiGroupTranslationStore {
private static final String MAP_SIMPLE_NAME = "group";

View File

@ -226,13 +226,13 @@ import org.onosproject.net.pi.model.PiPipeconfId;
import org.onosproject.net.pi.model.PiTableId;
import org.onosproject.net.pi.model.PiTableType;
import org.onosproject.net.pi.runtime.PiAction;
import org.onosproject.net.pi.runtime.PiActionGroup;
import org.onosproject.net.pi.runtime.PiActionGroupHandle;
import org.onosproject.net.pi.runtime.PiActionGroupId;
import org.onosproject.net.pi.runtime.PiActionGroupMember;
import org.onosproject.net.pi.runtime.PiActionGroupMemberHandle;
import org.onosproject.net.pi.runtime.PiActionGroupMemberId;
import org.onosproject.net.pi.runtime.PiActionParam;
import org.onosproject.net.pi.runtime.PiActionProfileGroup;
import org.onosproject.net.pi.runtime.PiActionProfileGroupHandle;
import org.onosproject.net.pi.runtime.PiActionProfileGroupId;
import org.onosproject.net.pi.runtime.PiActionProfileMember;
import org.onosproject.net.pi.runtime.PiActionProfileMemberHandle;
import org.onosproject.net.pi.runtime.PiActionProfileMemberId;
import org.onosproject.net.pi.runtime.PiControlMetadata;
import org.onosproject.net.pi.runtime.PiCounterCell;
import org.onosproject.net.pi.runtime.PiCounterCellData;
@ -692,12 +692,12 @@ public final class KryoNamespaces {
PiTableType.class,
// PI Runtime
PiAction.class,
PiActionGroup.class,
PiActionGroupHandle.class,
PiActionGroupId.class,
PiActionGroupMember.class,
PiActionGroupMemberHandle.class,
PiActionGroupMemberId.class,
PiActionProfileGroup.class,
PiActionProfileGroupHandle.class,
PiActionProfileGroupId.class,
PiActionProfileMember.class,
PiActionProfileMemberHandle.class,
PiActionProfileMemberId.class,
PiActionParam.class,
PiControlMetadata.class,
PiCounterCell.class,

View File

@ -23,8 +23,8 @@ import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.google.common.util.concurrent.Striped;
import org.onlab.util.SharedExecutors;
import org.onosproject.drivers.p4runtime.mirror.P4RuntimeActionProfileGroupMirror;
import org.onosproject.drivers.p4runtime.mirror.P4RuntimeActionProfileMemberMirror;
import org.onosproject.drivers.p4runtime.mirror.P4RuntimeGroupMirror;
import org.onosproject.drivers.p4runtime.mirror.TimedEntry;
import org.onosproject.net.DefaultAnnotations;
import org.onosproject.net.DeviceId;
@ -40,11 +40,11 @@ import org.onosproject.net.pi.model.PiActionId;
import org.onosproject.net.pi.model.PiActionProfileId;
import org.onosproject.net.pi.model.PiActionProfileModel;
import org.onosproject.net.pi.runtime.PiAction;
import org.onosproject.net.pi.runtime.PiActionGroup;
import org.onosproject.net.pi.runtime.PiActionGroupHandle;
import org.onosproject.net.pi.runtime.PiActionGroupMember;
import org.onosproject.net.pi.runtime.PiActionGroupMemberHandle;
import org.onosproject.net.pi.runtime.PiActionGroupMemberId;
import org.onosproject.net.pi.runtime.PiActionProfileGroup;
import org.onosproject.net.pi.runtime.PiActionProfileGroupHandle;
import org.onosproject.net.pi.runtime.PiActionProfileMember;
import org.onosproject.net.pi.runtime.PiActionProfileMemberHandle;
import org.onosproject.net.pi.runtime.PiActionProfileMemberId;
import org.onosproject.net.pi.service.PiGroupTranslator;
import org.onosproject.net.pi.service.PiTranslatedEntity;
import org.onosproject.net.pi.service.PiTranslationException;
@ -80,7 +80,7 @@ public class P4RuntimeActionGroupProgrammable
private static final String MAX_MEM_SIZE = "maxMemSize";
protected GroupStore groupStore;
private P4RuntimeGroupMirror groupMirror;
private P4RuntimeActionProfileGroupMirror groupMirror;
private P4RuntimeActionProfileMemberMirror memberMirror;
private PiGroupTranslator groupTranslator;
@ -93,7 +93,7 @@ public class P4RuntimeActionGroupProgrammable
if (!super.setupBehaviour()) {
return false;
}
groupMirror = this.handler().get(P4RuntimeGroupMirror.class);
groupMirror = this.handler().get(P4RuntimeActionProfileGroupMirror.class);
memberMirror = this.handler().get(P4RuntimeActionProfileMemberMirror.class);
groupStore = handler().get(GroupStore.class);
groupTranslator = translationService.groupTranslator();
@ -140,14 +140,14 @@ public class P4RuntimeActionGroupProgrammable
.stream()
.map(PiActionProfileModel::id)
.collect(Collectors.toList());
final List<PiActionGroup> groupsOnDevice = actionProfileIds.stream()
final List<PiActionProfileGroup> groupsOnDevice = actionProfileIds.stream()
.flatMap(this::streamGroupsFromDevice)
.collect(Collectors.toList());
final Set<PiActionGroupMemberHandle> membersOnDevice = actionProfileIds
final Set<PiActionProfileMemberHandle> membersOnDevice = actionProfileIds
.stream()
.flatMap(actProfId -> getMembersFromDevice(actProfId)
.stream()
.map(memberId -> PiActionGroupMemberHandle.of(
.map(memberId -> PiActionProfileMemberHandle.of(
deviceId, actProfId, memberId)))
.collect(Collectors.toSet());
@ -160,10 +160,10 @@ public class P4RuntimeActionGroupProgrammable
syncMemberMirror(membersOnDevice);
final List<Group> result = Lists.newArrayList();
final List<PiActionGroup> inconsistentGroups = Lists.newArrayList();
final List<PiActionGroup> validGroups = Lists.newArrayList();
final List<PiActionProfileGroup> inconsistentGroups = Lists.newArrayList();
final List<PiActionProfileGroup> validGroups = Lists.newArrayList();
for (PiActionGroup piGroup : groupsOnDevice) {
for (PiActionProfileGroup piGroup : groupsOnDevice) {
final Group pdGroup = forgeGroupEntry(piGroup);
if (pdGroup == null) {
// Entry is on device but unknown to translation service or
@ -178,11 +178,11 @@ public class P4RuntimeActionGroupProgrammable
// Trigger clean up of inconsistent groups and members. This will also
// remove all members that are not used by any group, and update the
// mirror accordingly.
final Set<PiActionGroupMemberHandle> membersToKeep = validGroups.stream()
final Set<PiActionProfileMemberHandle> membersToKeep = validGroups.stream()
.flatMap(g -> g.members().stream())
.map(m -> PiActionGroupMemberHandle.of(deviceId, m))
.map(m -> PiActionProfileMemberHandle.of(deviceId, m))
.collect(Collectors.toSet());
final Set<PiActionGroupMemberHandle> inconsistentMembers = Sets.difference(
final Set<PiActionProfileMemberHandle> inconsistentMembers = Sets.difference(
membersOnDevice, membersToKeep);
SharedExecutors.getSingleThreadExecutor().execute(
() -> cleanUpInconsistentGroupsAndMembers(
@ -191,15 +191,15 @@ public class P4RuntimeActionGroupProgrammable
return result;
}
private void syncGroupMirror(Collection<PiActionGroup> groups) {
Map<PiActionGroupHandle, PiActionGroup> handleMap = Maps.newHashMap();
groups.forEach(g -> handleMap.put(PiActionGroupHandle.of(deviceId, g), g));
private void syncGroupMirror(Collection<PiActionProfileGroup> groups) {
Map<PiActionProfileGroupHandle, PiActionProfileGroup> handleMap = Maps.newHashMap();
groups.forEach(g -> handleMap.put(PiActionProfileGroupHandle.of(deviceId, g), g));
groupMirror.sync(deviceId, handleMap);
}
private void syncMemberMirror(Collection<PiActionGroupMemberHandle> memberHandles) {
Map<PiActionGroupMemberHandle, PiActionGroupMember> handleMap = Maps.newHashMap();
memberHandles.forEach(handle -> handleMap.put(
private void syncMemberMirror(Collection<PiActionProfileMemberHandle> memberHandles) {
Map<PiActionProfileMemberHandle, PiActionProfileMember> handleMap = Maps.newHashMap();
memberHandles.forEach(handle -> handleMap.put(
handle, dummyMember(handle.actionProfileId(), handle.memberId())));
memberMirror.sync(deviceId, handleMap);
}
@ -212,8 +212,8 @@ public class P4RuntimeActionGroupProgrammable
.collect(Collectors.toList());
}
private void cleanUpInconsistentGroupsAndMembers(Collection<PiActionGroup> groupsToRemove,
Collection<PiActionGroupMemberHandle> membersToRemove) {
private void cleanUpInconsistentGroupsAndMembers(Collection<PiActionProfileGroup> groupsToRemove,
Collection<PiActionProfileMemberHandle> membersToRemove) {
if (!groupsToRemove.isEmpty()) {
log.warn("Found {} inconsistent action profile groups on {}, removing them...",
groupsToRemove.size(), deviceId);
@ -227,33 +227,33 @@ public class P4RuntimeActionGroupProgrammable
membersToRemove.size(), deviceId);
// FIXME: implement client call to remove members from multiple
// action profiles in one shot.
final ListMultimap<PiActionProfileId, PiActionGroupMemberId>
final ListMultimap<PiActionProfileId, PiActionProfileMemberId>
membersByActProfId = ArrayListMultimap.create();
membersToRemove.forEach(m -> membersByActProfId.put(
m.actionProfileId(), m.memberId()));
membersByActProfId.keySet().forEach(actProfId -> {
List<PiActionGroupMemberId> removedMembers = getFutureWithDeadline(
List<PiActionProfileMemberId> removedMembers = getFutureWithDeadline(
client.removeActionProfileMembers(
actProfId, membersByActProfId.get(actProfId), pipeconf),
"cleaning up action profile members", Collections.emptyList());
// Update member mirror.
removedMembers.stream()
.map(id -> PiActionGroupMemberHandle.of(deviceId, actProfId, id))
.map(id -> PiActionProfileMemberHandle.of(deviceId, actProfId, id))
.forEach(memberMirror::remove);
});
}
}
private Stream<PiActionGroup> streamGroupsFromDevice(PiActionProfileId actProfId) {
private Stream<PiActionProfileGroup> streamGroupsFromDevice(PiActionProfileId actProfId) {
// TODO: implement P4Runtime client call to read all groups with one call
// Good if pipeline has multiple action profiles.
final Collection<PiActionGroup> groups = getFutureWithDeadline(
client.dumpGroups(actProfId, pipeconf),
final Collection<PiActionProfileGroup> groups = getFutureWithDeadline(
client.dumpActionProfileGroups(actProfId, pipeconf),
"dumping groups", Collections.emptyList());
return groups.stream();
}
private List<PiActionGroupMemberId> getMembersFromDevice(PiActionProfileId actProfId) {
private List<PiActionProfileMemberId> getMembersFromDevice(PiActionProfileId actProfId) {
// TODO: implement P4Runtime client call to read all members with one call
// Good if pipeline has multiple action profiles.
return getFutureWithDeadline(
@ -261,11 +261,11 @@ public class P4RuntimeActionGroupProgrammable
"dumping action profile ids", Collections.emptyList());
}
private Group forgeGroupEntry(PiActionGroup piGroup) {
final PiActionGroupHandle handle = PiActionGroupHandle.of(deviceId, piGroup);
final Optional<PiTranslatedEntity<Group, PiActionGroup>>
private Group forgeGroupEntry(PiActionProfileGroup piGroup) {
final PiActionProfileGroupHandle handle = PiActionProfileGroupHandle.of(deviceId, piGroup);
final Optional<PiTranslatedEntity<Group, PiActionProfileGroup>>
translatedEntity = groupTranslator.lookup(handle);
final TimedEntry<PiActionGroup> timedEntry = groupMirror.get(handle);
final TimedEntry<PiActionProfileGroup> timedEntry = groupMirror.get(handle);
// Is entry consistent with our state?
if (!translatedEntity.isPresent()) {
log.warn("Group handle not found in translation store: {}", handle);
@ -292,7 +292,7 @@ public class P4RuntimeActionGroupProgrammable
}
private void processGroupOperation(Group pdGroup, GroupOperation.Type opType) {
final PiActionGroup piGroup;
final PiActionProfileGroup piGroup;
try {
piGroup = groupTranslator.translate(pdGroup, pipeconf);
} catch (PiTranslationException e) {
@ -305,10 +305,10 @@ public class P4RuntimeActionGroupProgrammable
processGroup(piGroup, pdGroup, operation);
}
private void processGroup(PiActionGroup groupToApply,
private void processGroup(PiActionProfileGroup groupToApply,
Group pdGroup,
Operation operation) {
final PiActionGroupHandle handle = PiActionGroupHandle.of(deviceId, groupToApply);
final PiActionProfileGroupHandle handle = PiActionProfileGroupHandle.of(deviceId, groupToApply);
STRIPED_LOCKS.get(handle).lock();
try {
switch (operation) {
@ -332,7 +332,7 @@ public class P4RuntimeActionGroupProgrammable
}
}
private boolean applyGroupWithMembersOrNothing(PiActionGroup group, PiActionGroupHandle handle) {
private boolean applyGroupWithMembersOrNothing(PiActionProfileGroup group, PiActionProfileGroupHandle handle) {
// First apply members, then group, if fails, delete members.
if (!applyAllMembersOrNothing(group.members())) {
return false;
@ -344,7 +344,7 @@ public class P4RuntimeActionGroupProgrammable
return true;
}
private boolean applyGroup(PiActionGroup group, PiActionGroupHandle handle) {
private boolean applyGroup(PiActionProfileGroup group, PiActionProfileGroupHandle handle) {
final int currentMemberSize = group.members().size();
if (groupMirror.get(handle) != null) {
String maxMemSize = "";
@ -352,7 +352,7 @@ public class P4RuntimeActionGroupProgrammable
groupMirror.annotations(handle).value(MAX_MEM_SIZE) != null) {
maxMemSize = groupMirror.annotations(handle).value(MAX_MEM_SIZE);
}
if (maxMemSize == "" || currentMemberSize > Integer.parseInt(maxMemSize)) {
if (maxMemSize.equals("") || currentMemberSize > Integer.parseInt(maxMemSize)) {
deleteGroup(group, handle);
}
}
@ -362,7 +362,7 @@ public class P4RuntimeActionGroupProgrammable
int currentMaxMemberSize = opType == INSERT ? (currentMemberSize + GROUP_MEMBERS_BUFFER_SIZE) : 0;
final boolean success = getFutureWithDeadline(
client.writeActionGroup(group, opType, pipeconf, currentMaxMemberSize),
client.writeActionProfileGroup(group, opType, pipeconf, currentMaxMemberSize),
"performing action profile group " + opType, false);
if (success) {
groupMirror.put(handle, group);
@ -376,9 +376,9 @@ public class P4RuntimeActionGroupProgrammable
return success;
}
private boolean deleteGroup(PiActionGroup group, PiActionGroupHandle handle) {
private boolean deleteGroup(PiActionProfileGroup group, PiActionProfileGroupHandle handle) {
final boolean success = getFutureWithDeadline(
client.writeActionGroup(group, DELETE, pipeconf, 0),
client.writeActionProfileGroup(group, DELETE, pipeconf, 0),
"performing action profile group " + DELETE, false);
if (success) {
groupMirror.remove(handle);
@ -386,8 +386,8 @@ public class P4RuntimeActionGroupProgrammable
return success;
}
private boolean applyAllMembersOrNothing(Collection<PiActionGroupMember> members) {
Collection<PiActionGroupMember> appliedMembers = applyMembers(members);
private boolean applyAllMembersOrNothing(Collection<PiActionProfileMember> members) {
Collection<PiActionProfileMember> appliedMembers = applyMembers(members);
if (appliedMembers.size() == members.size()) {
return true;
} else {
@ -396,22 +396,22 @@ public class P4RuntimeActionGroupProgrammable
}
}
private Collection<PiActionGroupMember> applyMembers(
Collection<PiActionGroupMember> members) {
private Collection<PiActionProfileMember> applyMembers(
Collection<PiActionProfileMember> members) {
return members.stream()
.filter(this::applyMember)
.collect(Collectors.toList());
}
private boolean applyMember(PiActionGroupMember member) {
private boolean applyMember(PiActionProfileMember member) {
// If exists, modify, otherwise insert
final PiActionGroupMemberHandle handle = PiActionGroupMemberHandle.of(
final PiActionProfileMemberHandle handle = PiActionProfileMemberHandle.of(
deviceId, member);
final P4RuntimeClient.WriteOperationType opType =
memberMirror.get(handle) == null ? INSERT : MODIFY;
final boolean success = getFutureWithDeadline(
client.writeActionGroupMembers(Collections.singletonList(member),
opType, pipeconf),
client.writeActionProfileMembers(Collections.singletonList(member),
opType, pipeconf),
"performing action profile member " + opType, false);
if (success) {
memberMirror.put(handle, dummyMember(member.actionProfile(), member.id()));
@ -419,16 +419,16 @@ public class P4RuntimeActionGroupProgrammable
return success;
}
private void deleteMembers(Collection<PiActionGroupMember> members) {
private void deleteMembers(Collection<PiActionProfileMember> members) {
members.forEach(this::deleteMember);
}
private void deleteMember(PiActionGroupMember member) {
final PiActionGroupMemberHandle handle = PiActionGroupMemberHandle.of(
private void deleteMember(PiActionProfileMember member) {
final PiActionProfileMemberHandle handle = PiActionProfileMemberHandle.of(
deviceId, member);
final boolean success = getFutureWithDeadline(
client.writeActionGroupMembers(Collections.singletonList(member),
DELETE, pipeconf),
client.writeActionProfileMembers(Collections.singletonList(member),
DELETE, pipeconf),
"performing action profile member " + DELETE, false);
if (success) {
memberMirror.remove(handle);
@ -436,15 +436,13 @@ public class P4RuntimeActionGroupProgrammable
}
// FIXME: this is nasty, we have to rely on a dummy member of the mirror
// because the PiActionGroupMember abstraction is broken, since it includes
// because the PiActionProfileMember abstraction is broken, since it includes
// attributes that are not part of a P4Runtime member, e.g. weight.
// We should remove weight from the class, and have client methods that
// return the full PiActionGroupMember, not just the IDs. Also the naming
// "ActionGroupMember" is wrong since it makes believe that members can
// exists only inside a group, which is not true.
private PiActionGroupMember dummyMember(
PiActionProfileId actionProfileId, PiActionGroupMemberId memberId) {
return PiActionGroupMember.builder()
// return the full PiActionProfileMember, not just the IDs.
private PiActionProfileMember dummyMember(
PiActionProfileId actionProfileId, PiActionProfileMemberId memberId) {
return PiActionProfileMember.builder()
.forActionProfile(actionProfileId)
.withId(memberId)
.withAction(PiAction.builder()

View File

@ -19,21 +19,21 @@ package org.onosproject.drivers.p4runtime.mirror;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Service;
import org.onlab.util.KryoNamespace;
import org.onosproject.net.pi.runtime.PiActionGroup;
import org.onosproject.net.pi.runtime.PiActionGroupHandle;
import org.onosproject.net.pi.runtime.PiActionProfileGroup;
import org.onosproject.net.pi.runtime.PiActionProfileGroupHandle;
import org.onosproject.store.serializers.KryoNamespaces;
/**
* Distributed implementation of a P4Runtime group mirror.
* Distributed implementation of a P4Runtime action profile group mirror.
*/
@Component(immediate = true)
@Service
public final class DistributedP4RuntimeGroupMirror
public final class DistributedP4RuntimeActionProfileGroupMirror
extends AbstractDistributedP4RuntimeMirror
<PiActionGroupHandle, PiActionGroup>
implements P4RuntimeGroupMirror {
<PiActionProfileGroupHandle, PiActionProfileGroup>
implements P4RuntimeActionProfileGroupMirror {
private static final String DIST_MAP_NAME = "onos-p4runtime-group-mirror";
private static final String DIST_MAP_NAME = "onos-p4runtime-act-prof-group-mirror";
@Override
String mapName() {

View File

@ -19,8 +19,8 @@ package org.onosproject.drivers.p4runtime.mirror;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Service;
import org.onlab.util.KryoNamespace;
import org.onosproject.net.pi.runtime.PiActionGroupMember;
import org.onosproject.net.pi.runtime.PiActionGroupMemberHandle;
import org.onosproject.net.pi.runtime.PiActionProfileMember;
import org.onosproject.net.pi.runtime.PiActionProfileMemberHandle;
import org.onosproject.store.serializers.KryoNamespaces;
/**
@ -30,7 +30,7 @@ import org.onosproject.store.serializers.KryoNamespaces;
@Service
public class DistributedP4RuntimeActionProfileMemberMirror
extends AbstractDistributedP4RuntimeMirror
<PiActionGroupMemberHandle, PiActionGroupMember>
<PiActionProfileMemberHandle, PiActionProfileMember>
implements P4RuntimeActionProfileMemberMirror {
private static final String DIST_MAP_NAME = "onos-p4runtime-act-prof-member-mirror";

View File

@ -16,12 +16,12 @@
package org.onosproject.drivers.p4runtime.mirror;
import org.onosproject.net.pi.runtime.PiActionGroup;
import org.onosproject.net.pi.runtime.PiActionGroupHandle;
import org.onosproject.net.pi.runtime.PiActionProfileGroup;
import org.onosproject.net.pi.runtime.PiActionProfileGroupHandle;
/**
* Mirror of action groups installed on a P4Runtime device.
* Mirror of action profile groups installed on a P4Runtime device.
*/
public interface P4RuntimeGroupMirror
extends P4RuntimeMirror<PiActionGroupHandle, PiActionGroup> {
public interface P4RuntimeActionProfileGroupMirror
extends P4RuntimeMirror<PiActionProfileGroupHandle, PiActionProfileGroup> {
}

View File

@ -16,12 +16,12 @@
package org.onosproject.drivers.p4runtime.mirror;
import org.onosproject.net.pi.runtime.PiActionGroupMember;
import org.onosproject.net.pi.runtime.PiActionGroupMemberHandle;
import org.onosproject.net.pi.runtime.PiActionProfileMember;
import org.onosproject.net.pi.runtime.PiActionProfileMemberHandle;
/**
* Mirror of action profile members installed on a P4Runtime device.
*/
public interface P4RuntimeActionProfileMemberMirror
extends P4RuntimeMirror<PiActionGroupMemberHandle, PiActionGroupMember> {
extends P4RuntimeMirror<PiActionProfileMemberHandle, PiActionProfileMember> {
}

View File

@ -43,8 +43,8 @@ import org.onosproject.net.group.GroupDescription;
import org.onosproject.net.group.GroupKey;
import org.onosproject.net.pi.model.PiTableId;
import org.onosproject.net.pi.runtime.PiAction;
import org.onosproject.net.pi.runtime.PiActionGroupId;
import org.onosproject.net.pi.runtime.PiActionParam;
import org.onosproject.net.pi.runtime.PiActionProfileGroupId;
import org.onosproject.net.pi.runtime.PiGroupKey;
import org.onosproject.pipelines.fabric.FabricCapabilities;
import org.onosproject.pipelines.fabric.FabricConstants;
@ -216,7 +216,7 @@ class NextObjectiveTranslator
final TrafficSelector selector = nextIdSelector(obj.id());
final TrafficTreatment treatment = DefaultTrafficTreatment.builder()
.piTableAction(PiActionGroupId.of(groupId))
.piTableAction(PiActionProfileGroupId.of(groupId))
.build();
resultBuilder.addFlowRule(flowRule(

View File

@ -36,8 +36,8 @@ import org.onosproject.net.group.GroupBuckets;
import org.onosproject.net.group.GroupDescription;
import org.onosproject.net.group.GroupKey;
import org.onosproject.net.pi.runtime.PiAction;
import org.onosproject.net.pi.runtime.PiActionGroupId;
import org.onosproject.net.pi.runtime.PiActionParam;
import org.onosproject.net.pi.runtime.PiActionProfileGroupId;
import org.onosproject.net.pi.runtime.PiGroupKey;
import org.onosproject.pipelines.fabric.FabricConstants;
@ -256,7 +256,7 @@ public class FabricNextPipelinerTest extends FabricPipelinerTest {
TrafficSelector nextIdSelector = DefaultTrafficSelector.builder()
.matchPi(nextIdCriterion)
.build();
PiActionGroupId actionGroupId = PiActionGroupId.of(NEXT_ID_1);
PiActionProfileGroupId actionGroupId = PiActionProfileGroupId.of(NEXT_ID_1);
TrafficTreatment treatment = DefaultTrafficTreatment.builder()
.piTableAction(actionGroupId)
.build();

View File

@ -23,9 +23,9 @@ import org.onosproject.net.pi.model.PiCounterId;
import org.onosproject.net.pi.model.PiMeterId;
import org.onosproject.net.pi.model.PiPipeconf;
import org.onosproject.net.pi.model.PiTableId;
import org.onosproject.net.pi.runtime.PiActionGroup;
import org.onosproject.net.pi.runtime.PiActionGroupMember;
import org.onosproject.net.pi.runtime.PiActionGroupMemberId;
import org.onosproject.net.pi.runtime.PiActionProfileGroup;
import org.onosproject.net.pi.runtime.PiActionProfileMember;
import org.onosproject.net.pi.runtime.PiActionProfileMemberId;
import org.onosproject.net.pi.runtime.PiCounterCell;
import org.onosproject.net.pi.runtime.PiCounterCellId;
import org.onosproject.net.pi.runtime.PiMeterCellConfig;
@ -185,41 +185,44 @@ public interface P4RuntimeClient extends GrpcClient {
Set<PiCounterCellId> cellIds, PiPipeconf pipeconf);
/**
* Performs the given write operation for the given action group members and
* pipeconf.
* Performs the given write operation for the given action profile members
* and pipeconf.
*
* @param members action group members
* @param opType write operation type
* @param pipeconf the pipeconf currently deployed on the device
* @param members action profile members
* @param opType write operation type
* @param pipeconf the pipeconf currently deployed on the device
* @return true if the operation was successful, false otherwise
*/
CompletableFuture<Boolean> writeActionGroupMembers(
List<PiActionGroupMember> members,
CompletableFuture<Boolean> writeActionProfileMembers(
List<PiActionProfileMember> members,
WriteOperationType opType, PiPipeconf pipeconf);
/**
* Performs the given write operation for the given action group and
* Performs the given write operation for the given action profile group and
* pipeconf.
*
* @param group the action group
* @param opType write operation type
* @param pipeconf the pipeconf currently deployed on the device
* @param maxMemberSize the maximum number of members that can be added to the group.
* This is meaningful only if it's an INSERT operation, otherwise
* its value should be 0
* @param group the action profile group
* @param opType write operation type
* @param pipeconf the pipeconf currently deployed on the device
* @param maxMemberSize the maximum number of members that can be added to
* the group. This is meaningful only if it's an INSERT
* operation, otherwise its value should be 0
* @return true if the operation was successful, false otherwise
*/
CompletableFuture<Boolean> writeActionGroup(
PiActionGroup group, WriteOperationType opType, PiPipeconf pipeconf, int maxMemberSize);
CompletableFuture<Boolean> writeActionProfileGroup(
PiActionProfileGroup group,
WriteOperationType opType,
PiPipeconf pipeconf,
int maxMemberSize);
/**
* Dumps all groups currently installed for the given action profile.
* Dumps all groups currently installed in the given action profile.
*
* @param actionProfileId the action profile id
* @param pipeconf the pipeconf currently deployed on the device
* @return completable future of a list of groups
*/
CompletableFuture<List<PiActionGroup>> dumpGroups(
CompletableFuture<List<PiActionProfileGroup>> dumpActionProfileGroups(
PiActionProfileId actionProfileId, PiPipeconf pipeconf);
/**
@ -229,7 +232,7 @@ public interface P4RuntimeClient extends GrpcClient {
* @param pipeconf pipeconf
* @return future of list of action profile member ID
*/
CompletableFuture<List<PiActionGroupMemberId>> dumpActionProfileMemberIds(
CompletableFuture<List<PiActionProfileMemberId>> dumpActionProfileMemberIds(
PiActionProfileId actionProfileId, PiPipeconf pipeconf);
/**
@ -241,9 +244,9 @@ public interface P4RuntimeClient extends GrpcClient {
* @param pipeconf pipeconf
* @return list of member IDs that were successfully removed from the device
*/
CompletableFuture<List<PiActionGroupMemberId>> removeActionProfileMembers(
CompletableFuture<List<PiActionProfileMemberId>> removeActionProfileMembers(
PiActionProfileId actionProfileId,
List<PiActionGroupMemberId> memberIds,
List<PiActionProfileMemberId> memberIds,
PiPipeconf pipeconf);
/**

View File

@ -19,8 +19,8 @@ package org.onosproject.p4runtime.ctl;
import com.google.common.collect.Maps;
import org.onosproject.net.pi.model.PiActionProfileId;
import org.onosproject.net.pi.model.PiPipeconf;
import org.onosproject.net.pi.runtime.PiActionGroup;
import org.onosproject.net.pi.runtime.PiActionGroupId;
import org.onosproject.net.pi.runtime.PiActionProfileGroup;
import org.onosproject.net.pi.runtime.PiActionProfileGroupId;
import p4.config.v1.P4InfoOuterClass;
import p4.v1.P4RuntimeOuterClass.ActionProfileGroup;
import p4.v1.P4RuntimeOuterClass.ActionProfileGroup.Member;
@ -41,18 +41,18 @@ final class ActionProfileGroupEncoder {
}
/**
* Encode a PI action group to a action profile group.
* Encode a PI action profile group to a action profile group.
*
* @param piActionGroup the action profile group
* @param pipeconf the pipeconf
* @param maxMemberSize the max member size of action group
* @return a action profile group encoded from PI action group
* @return a action profile group encoded from PI action profile group
* @throws P4InfoBrowser.NotFoundException if can't find action profile from
* P4Info browser
* @throws EncodeException if can't find P4Info from
* pipeconf
*/
static ActionProfileGroup encode(PiActionGroup piActionGroup, PiPipeconf pipeconf, int maxMemberSize)
static ActionProfileGroup encode(PiActionProfileGroup piActionGroup, PiPipeconf pipeconf, int maxMemberSize)
throws P4InfoBrowser.NotFoundException, EncodeException {
P4InfoBrowser browser = PipeconfHelper.getP4InfoBrowser(pipeconf);
@ -86,26 +86,26 @@ final class ActionProfileGroupEncoder {
/**
* Decode an action profile group with members information to a PI action
* group.
* profile group.
*
* @param actionProfileGroup the action profile group
* @param members members of the action profile group
* @param pipeconf the pipeconf
* @return decoded PI action group
* @return decoded PI action profile group
* @throws P4InfoBrowser.NotFoundException if can't find action profile from
* P4Info browser
* @throws EncodeException if can't find P4Info from
* pipeconf
*/
static PiActionGroup decode(ActionProfileGroup actionProfileGroup,
Collection<ActionProfileMember> members,
PiPipeconf pipeconf)
static PiActionProfileGroup decode(ActionProfileGroup actionProfileGroup,
Collection<ActionProfileMember> members,
PiPipeconf pipeconf)
throws P4InfoBrowser.NotFoundException, EncodeException {
P4InfoBrowser browser = PipeconfHelper.getP4InfoBrowser(pipeconf);
if (browser == null) {
throw new EncodeException(format("Can't get P4 info browser from pipeconf %s", pipeconf));
}
PiActionGroup.Builder piActionGroupBuilder = PiActionGroup.builder();
PiActionProfileGroup.Builder piActionGroupBuilder = PiActionProfileGroup.builder();
P4InfoOuterClass.ActionProfile actionProfile = browser.actionProfiles()
.getById(actionProfileGroup.getActionProfileId());
@ -113,14 +113,14 @@ final class ActionProfileGroupEncoder {
piActionGroupBuilder
.withActionProfileId(piActionProfileId)
.withId(PiActionGroupId.of(actionProfileGroup.getGroupId()));
.withId(PiActionProfileGroupId.of(actionProfileGroup.getGroupId()));
Map<Integer, Integer> memberWeights = Maps.newHashMap();
actionProfileGroup.getMembersList().forEach(member -> {
int weight = member.getWeight();
if (weight < 1) {
// FIXME: currently PI has a bug which will always return weight 0
// ONOS won't accept group member with weight 0
// ONOS won't accept group buckets with weight 0
weight = 1;
}
memberWeights.put(member.getMemberId(), weight);

View File

@ -18,8 +18,8 @@ package org.onosproject.p4runtime.ctl;
import org.onosproject.net.pi.model.PiActionProfileId;
import org.onosproject.net.pi.model.PiPipeconf;
import org.onosproject.net.pi.runtime.PiActionGroupMember;
import org.onosproject.net.pi.runtime.PiActionGroupMemberId;
import org.onosproject.net.pi.runtime.PiActionProfileMember;
import org.onosproject.net.pi.runtime.PiActionProfileMemberId;
import p4.config.v1.P4InfoOuterClass;
import p4.v1.P4RuntimeOuterClass;
import p4.v1.P4RuntimeOuterClass.ActionProfileMember;
@ -37,16 +37,16 @@ final class ActionProfileMemberEncoder {
}
/**
* Encode a PiActionGroupMember to a ActionProfileMember.
* Encode a PiActionProfileMember to a ActionProfileMember.
*
* @param member the member to encode
* @param pipeconf the pipeconf, as encode spec
* @param member the member to encode
* @param pipeconf the pipeconf, as encode spec
* @return encoded member
* @throws P4InfoBrowser.NotFoundException can't find action profile from
* P4Info browser
* @throws EncodeException can't find P4Info from pipeconf
*/
static ActionProfileMember encode(PiActionGroupMember member,
static ActionProfileMember encode(PiActionProfileMember member,
PiPipeconf pipeconf)
throws P4InfoBrowser.NotFoundException, EncodeException {
@ -77,20 +77,20 @@ final class ActionProfileMemberEncoder {
}
/**
* Decode an action profile member to PI action group member.
* Decode an action profile member to PI action profile member.
*
* @param member the action profile member
* @param weight the weight of the member
* @param pipeconf the pipeconf, as decode spec
* @return decoded PI action group member
* @return decoded PI action profile member
* @throws P4InfoBrowser.NotFoundException can't find definition of action
* from P4 info
* @throws EncodeException can't get P4 info browser from
* pipeconf
*/
static PiActionGroupMember decode(ActionProfileMember member,
int weight,
PiPipeconf pipeconf)
static PiActionProfileMember decode(ActionProfileMember member,
int weight,
PiPipeconf pipeconf)
throws P4InfoBrowser.NotFoundException, EncodeException {
P4InfoBrowser browser = PipeconfHelper.getP4InfoBrowser(pipeconf);
if (browser == null) {
@ -103,9 +103,9 @@ final class ActionProfileMemberEncoder {
.getPreamble()
.getName());
return PiActionGroupMember.builder()
return PiActionProfileMember.builder()
.forActionProfile(actionProfileId)
.withId(PiActionGroupMemberId.of(member.getMemberId()))
.withId(PiActionProfileMemberId.of(member.getMemberId()))
.withWeight(weight)
.withAction(decodeActionMsg(member.getAction(), browser))
.build();

View File

@ -38,9 +38,9 @@ import org.onosproject.net.pi.model.PiCounterId;
import org.onosproject.net.pi.model.PiMeterId;
import org.onosproject.net.pi.model.PiPipeconf;
import org.onosproject.net.pi.model.PiTableId;
import org.onosproject.net.pi.runtime.PiActionGroup;
import org.onosproject.net.pi.runtime.PiActionGroupMember;
import org.onosproject.net.pi.runtime.PiActionGroupMemberId;
import org.onosproject.net.pi.runtime.PiActionProfileGroup;
import org.onosproject.net.pi.runtime.PiActionProfileMember;
import org.onosproject.net.pi.runtime.PiActionProfileMemberId;
import org.onosproject.net.pi.runtime.PiCounterCell;
import org.onosproject.net.pi.runtime.PiCounterCellId;
import org.onosproject.net.pi.runtime.PiMeterCellConfig;
@ -218,41 +218,41 @@ final class P4RuntimeClientImpl extends AbstractGrpcClient implements P4RuntimeC
}
@Override
public CompletableFuture<Boolean> writeActionGroupMembers(List<PiActionGroupMember> members,
public CompletableFuture<Boolean> writeActionProfileMembers(List<PiActionProfileMember> members,
WriteOperationType opType,
PiPipeconf pipeconf) {
return supplyInContext(() -> doWriteActionProfileMembers(members, opType, pipeconf),
"writeActionProfileMembers-" + opType.name());
}
@Override
public CompletableFuture<Boolean> writeActionProfileGroup(PiActionProfileGroup group,
WriteOperationType opType,
PiPipeconf pipeconf) {
return supplyInContext(() -> doWriteActionGroupMembers(members, opType, pipeconf),
"writeActionGroupMembers-" + opType.name());
}
@Override
public CompletableFuture<Boolean> writeActionGroup(PiActionGroup group,
WriteOperationType opType,
PiPipeconf pipeconf,
PiPipeconf pipeconf,
int maxMemberSize) {
return supplyInContext(() -> doWriteActionGroup(group, opType, pipeconf, maxMemberSize),
"writeActionGroup-" + opType.name());
return supplyInContext(() -> doWriteActionProfileGroup(group, opType, pipeconf, maxMemberSize),
"writeActionProfileGroup-" + opType.name());
}
@Override
public CompletableFuture<List<PiActionGroup>> dumpGroups(PiActionProfileId actionProfileId,
PiPipeconf pipeconf) {
public CompletableFuture<List<PiActionProfileGroup>> dumpActionProfileGroups(
PiActionProfileId actionProfileId, PiPipeconf pipeconf) {
return supplyInContext(() -> doDumpGroups(actionProfileId, pipeconf),
"dumpGroups-" + actionProfileId.id());
"dumpActionProfileGroups-" + actionProfileId.id());
}
@Override
public CompletableFuture<List<PiActionGroupMemberId>> dumpActionProfileMemberIds(
public CompletableFuture<List<PiActionProfileMemberId>> dumpActionProfileMemberIds(
PiActionProfileId actionProfileId, PiPipeconf pipeconf) {
return supplyInContext(() -> doDumpActionProfileMemberIds(actionProfileId, pipeconf),
"dumpActionProfileMemberIds-" + actionProfileId.id());
}
@Override
public CompletableFuture<List<PiActionGroupMemberId>> removeActionProfileMembers(
public CompletableFuture<List<PiActionProfileMemberId>> removeActionProfileMembers(
PiActionProfileId actionProfileId,
List<PiActionGroupMemberId> memberIds,
List<PiActionProfileMemberId> memberIds,
PiPipeconf pipeconf) {
return supplyInContext(
() -> doRemoveActionProfileMembers(actionProfileId, memberIds, pipeconf),
@ -667,15 +667,15 @@ final class P4RuntimeClientImpl extends AbstractGrpcClient implements P4RuntimeC
return CounterEntryCodec.decodeCounterEntities(entities, pipeconf);
}
private boolean doWriteActionGroupMembers(List<PiActionGroupMember> members,
WriteOperationType opType, PiPipeconf pipeconf) {
private boolean doWriteActionProfileMembers(List<PiActionProfileMember> members,
WriteOperationType opType, PiPipeconf pipeconf) {
final List<ActionProfileMember> actionProfileMembers = Lists.newArrayList();
for (PiActionGroupMember member : members) {
for (PiActionProfileMember member : members) {
try {
actionProfileMembers.add(ActionProfileMemberEncoder.encode(member, pipeconf));
} catch (EncodeException | P4InfoBrowser.NotFoundException e) {
log.warn("Unable to encode group member, aborting {} operation: {} [{}]",
log.warn("Unable to encode action profile member, aborting {} operation: {} [{}]",
opType.name(), e.getMessage(), member.toString());
return false;
}
@ -696,10 +696,10 @@ final class P4RuntimeClientImpl extends AbstractGrpcClient implements P4RuntimeC
return true;
}
return write(updateMsgs, members, opType, "group member");
return write(updateMsgs, members, opType, "action profile member");
}
private List<PiActionGroup> doDumpGroups(PiActionProfileId piActionProfileId, PiPipeconf pipeconf) {
private List<PiActionProfileGroup> doDumpGroups(PiActionProfileId piActionProfileId, PiPipeconf pipeconf) {
log.debug("Dumping groups from action profile {} from {} (pipeconf {})...",
piActionProfileId.id(), deviceId, pipeconf.id());
@ -806,7 +806,7 @@ final class P4RuntimeClientImpl extends AbstractGrpcClient implements P4RuntimeC
.map(Map.Entry::getKey)
.forEach(gid -> groupIdToMembersMap.put(gid, member)));
log.debug("Retrieved {} group members from action profile {} on {}...",
log.debug("Retrieved {} members from action profile {} on {}...",
groupIdToMembersMap.size(), piActionProfileId.id(), deviceId);
return groupMsgs.stream()
@ -824,7 +824,7 @@ final class P4RuntimeClientImpl extends AbstractGrpcClient implements P4RuntimeC
.collect(Collectors.toList());
}
private List<PiActionGroupMemberId> doDumpActionProfileMemberIds(
private List<PiActionProfileMemberId> doDumpActionProfileMemberIds(
PiActionProfileId actionProfileId, PiPipeconf pipeconf) {
final P4InfoBrowser browser = PipeconfHelper.getP4InfoBrowser(pipeconf);
@ -875,13 +875,13 @@ final class P4RuntimeClientImpl extends AbstractGrpcClient implements P4RuntimeC
// removing members of other groups.
.filter(m -> m.getActionProfileId() == p4ActProfId)
.map(ActionProfileMember::getMemberId)
.map(PiActionGroupMemberId::of)
.map(PiActionProfileMemberId::of)
.collect(Collectors.toList());
}
private List<PiActionGroupMemberId> doRemoveActionProfileMembers(
private List<PiActionProfileMemberId> doRemoveActionProfileMembers(
PiActionProfileId actionProfileId,
List<PiActionGroupMemberId> memberIds,
List<PiActionProfileMemberId> memberIds,
PiPipeconf pipeconf) {
if (memberIds.isEmpty()) {
@ -922,7 +922,8 @@ final class P4RuntimeClientImpl extends AbstractGrpcClient implements P4RuntimeC
"action profile members");
}
private boolean doWriteActionGroup(PiActionGroup group, WriteOperationType opType, PiPipeconf pipeconf,
private boolean doWriteActionProfileGroup(
PiActionProfileGroup group, WriteOperationType opType, PiPipeconf pipeconf,
int maxMemberSize) {
final ActionProfileGroup actionProfileGroup;
if (opType == P4RuntimeClient.WriteOperationType.INSERT && maxMemberSize < group.members().size()) {

View File

@ -26,9 +26,9 @@ import org.onosproject.net.pi.model.PiMatchFieldId;
import org.onosproject.net.pi.model.PiPipeconf;
import org.onosproject.net.pi.model.PiTableId;
import org.onosproject.net.pi.runtime.PiAction;
import org.onosproject.net.pi.runtime.PiActionGroupId;
import org.onosproject.net.pi.runtime.PiActionGroupMemberId;
import org.onosproject.net.pi.runtime.PiActionParam;
import org.onosproject.net.pi.runtime.PiActionProfileGroupId;
import org.onosproject.net.pi.runtime.PiActionProfileMemberId;
import org.onosproject.net.pi.runtime.PiCounterCellData;
import org.onosproject.net.pi.runtime.PiExactFieldMatch;
import org.onosproject.net.pi.runtime.PiFieldMatch;
@ -46,7 +46,6 @@ import p4.v1.P4RuntimeOuterClass.FieldMatch;
import p4.v1.P4RuntimeOuterClass.TableAction;
import p4.v1.P4RuntimeOuterClass.TableEntry;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
@ -109,7 +108,7 @@ final class TableEntryEncoder {
}
/**
* Same as {@link #encode(Collection, PiPipeconf)} but encodes only one entry.
* Same as {@link #encode(List, PiPipeconf)} but encodes only one entry.
*
* @param piTableEntry table entry
* @param pipeconf pipeconf
@ -162,7 +161,7 @@ final class TableEntryEncoder {
}
/**
* Same as {@link #decode(Collection, PiPipeconf)} but decodes only one entry.
* Same as {@link #decode(List, PiPipeconf)} but decodes only one entry.
*
* @param tableEntryMsg table entry message
* @param pipeconf pipeconf
@ -443,13 +442,13 @@ final class TableEntryEncoder {
Action theAction = encodePiAction(piAction, browser);
tableActionMsgBuilder.setAction(theAction);
break;
case ACTION_GROUP_ID:
PiActionGroupId actionGroupId = (PiActionGroupId) piTableAction;
case ACTION_PROFILE_GROUP_ID:
PiActionProfileGroupId actionGroupId = (PiActionProfileGroupId) piTableAction;
tableActionMsgBuilder.setActionProfileGroupId(actionGroupId.id());
break;
case GROUP_MEMBER_ID:
PiActionGroupMemberId actionGroupMemberId = (PiActionGroupMemberId) piTableAction;
tableActionMsgBuilder.setActionProfileMemberId(actionGroupMemberId.id());
case ACTION_PROFILE_MEMBER_ID:
PiActionProfileMemberId actionProfileMemberId = (PiActionProfileMemberId) piTableAction;
tableActionMsgBuilder.setActionProfileMemberId(actionProfileMemberId.id());
break;
default:
throw new EncodeException(
@ -467,9 +466,9 @@ final class TableEntryEncoder {
Action actionMsg = tableActionMsg.getAction();
return decodeActionMsg(actionMsg, browser);
case ACTION_PROFILE_GROUP_ID:
return PiActionGroupId.of(tableActionMsg.getActionProfileGroupId());
return PiActionProfileGroupId.of(tableActionMsg.getActionProfileGroupId());
case ACTION_PROFILE_MEMBER_ID:
return PiActionGroupMemberId.of(tableActionMsg.getActionProfileMemberId());
return PiActionProfileMemberId.of(tableActionMsg.getActionProfileMemberId());
default:
throw new EncodeException(
format("Decoding of table action type %s not implemented", typeCase.name()));
@ -524,4 +523,4 @@ final class TableEntryEncoder {
static PiCounterCellData decodeCounter(CounterData counterData) {
return new PiCounterCellData(counterData.getPacketCount(), counterData.getByteCount());
}
}
}

View File

@ -39,11 +39,11 @@ import org.onosproject.net.pi.model.PiPipeconf;
import org.onosproject.net.pi.model.PiPipeconfId;
import org.onosproject.net.pi.model.PiPipelineModel;
import org.onosproject.net.pi.runtime.PiAction;
import org.onosproject.net.pi.runtime.PiActionGroup;
import org.onosproject.net.pi.runtime.PiActionGroupId;
import org.onosproject.net.pi.runtime.PiActionGroupMember;
import org.onosproject.net.pi.runtime.PiActionGroupMemberId;
import org.onosproject.net.pi.runtime.PiActionParam;
import org.onosproject.net.pi.runtime.PiActionProfileGroup;
import org.onosproject.net.pi.runtime.PiActionProfileGroupId;
import org.onosproject.net.pi.runtime.PiActionProfileMember;
import org.onosproject.net.pi.runtime.PiActionProfileMemberId;
import org.onosproject.p4runtime.api.P4RuntimeClientKey;
import p4.v1.P4RuntimeOuterClass.ActionProfileGroup;
import p4.v1.P4RuntimeOuterClass.ActionProfileMember;
@ -78,19 +78,19 @@ public class P4RuntimeGroupTest {
private static final PiPipeconf PIPECONF = buildPipeconf();
private static final int P4_INFO_ACT_PROF_ID = 285227860;
private static final PiActionProfileId ACT_PROF_ID = PiActionProfileId.of("ecmp_selector");
private static final PiActionGroupId GROUP_ID = PiActionGroupId.of(1);
private static final PiActionProfileGroupId GROUP_ID = PiActionProfileGroupId.of(1);
private static final int DEFAULT_MEMBER_WEIGHT = 1;
private static final PiActionId EGRESS_PORT_ACTION_ID = PiActionId.of("set_egress_port");
private static final PiActionParamId PORT_PARAM_ID = PiActionParamId.of("port");
private static final int BASE_MEM_ID = 65535;
private static final List<Integer> MEMBER_IDS = ImmutableList.of(65536, 65537, 65538);
private static final List<PiActionGroupMember> GROUP_MEMBERS =
private static final List<PiActionProfileMember> GROUP_MEMBERS =
Lists.newArrayList(
outputMember((short) 1),
outputMember((short) 2),
outputMember((short) 3)
);
private static final PiActionGroup GROUP = PiActionGroup.builder()
private static final PiActionProfileGroup GROUP = PiActionProfileGroup.builder()
.withId(GROUP_ID)
.addMembers(GROUP_MEMBERS)
.withActionProfileId(ACT_PROF_ID)
@ -110,17 +110,17 @@ public class P4RuntimeGroupTest {
private static Server grpcServer;
private static ManagedChannel grpcChannel;
private static PiActionGroupMember outputMember(short portNum) {
private static PiActionProfileMember outputMember(short portNum) {
PiActionParam param = new PiActionParam(PORT_PARAM_ID,
ImmutableByteSequence.copyFrom(portNum));
PiAction piAction = PiAction.builder()
.withId(EGRESS_PORT_ACTION_ID)
.withParameter(param).build();
return PiActionGroupMember.builder()
return PiActionProfileMember.builder()
.forActionProfile(ACT_PROF_ID)
.withAction(piAction)
.withId(PiActionGroupMemberId.of(BASE_MEM_ID + portNum))
.withId(PiActionProfileMemberId.of(BASE_MEM_ID + portNum))
.withWeight(DEFAULT_MEMBER_WEIGHT)
.build();
}
@ -161,9 +161,9 @@ public class P4RuntimeGroupTest {
}
@Test
public void testInsertPiActionGroup() throws Exception {
public void testInsertPiActionProfileGroup() throws Exception {
CompletableFuture<Void> complete = p4RuntimeServerImpl.expectRequests(1);
client.writeActionGroup(GROUP, INSERT, PIPECONF, 3);
client.writeActionProfileGroup(GROUP, INSERT, PIPECONF, 3);
complete.get(DEFAULT_TIMEOUT_TIME, TimeUnit.SECONDS);
WriteRequest result = p4RuntimeServerImpl.getWriteReqs().get(0);
assertEquals(1, result.getDeviceId());
@ -192,7 +192,7 @@ public class P4RuntimeGroupTest {
@Test
public void testInsertPiActionMembers() throws Exception {
CompletableFuture<Void> complete = p4RuntimeServerImpl.expectRequests(1);
client.writeActionGroupMembers(GROUP_MEMBERS, INSERT, PIPECONF);
client.writeActionProfileMembers(GROUP_MEMBERS, INSERT, PIPECONF);
complete.get(DEFAULT_TIMEOUT_TIME, TimeUnit.SECONDS);
WriteRequest result = p4RuntimeServerImpl.getWriteReqs().get(0);
assertEquals(1, result.getDeviceId());
@ -269,12 +269,12 @@ public class P4RuntimeGroupTest {
p4RuntimeServerImpl.willReturnReadResult(responses);
CompletableFuture<Void> complete = p4RuntimeServerImpl.expectRequests(2);
CompletableFuture<List<PiActionGroup>> groupsComplete = client.dumpGroups(ACT_PROF_ID, PIPECONF);
CompletableFuture<List<PiActionProfileGroup>> groupsComplete = client.dumpActionProfileGroups(ACT_PROF_ID, PIPECONF);
complete.get(DEFAULT_TIMEOUT_TIME, TimeUnit.SECONDS);
Collection<PiActionGroup> groups = groupsComplete.get(DEFAULT_TIMEOUT_TIME, TimeUnit.SECONDS);
Collection<PiActionProfileGroup> groups = groupsComplete.get(DEFAULT_TIMEOUT_TIME, TimeUnit.SECONDS);
assertEquals(1, groups.size());
PiActionGroup piActionGroup = groups.iterator().next();
PiActionProfileGroup piActionGroup = groups.iterator().next();
assertEquals(ACT_PROF_ID, piActionGroup.actionProfileId());
assertEquals(GROUP_ID, piActionGroup.id());
assertEquals(3, piActionGroup.members().size());

View File

@ -30,8 +30,8 @@ import org.onosproject.net.pi.model.PiPipeconfId;
import org.onosproject.net.pi.model.PiPipelineModel;
import org.onosproject.net.pi.model.PiTableId;
import org.onosproject.net.pi.runtime.PiAction;
import org.onosproject.net.pi.runtime.PiActionGroupId;
import org.onosproject.net.pi.runtime.PiActionParam;
import org.onosproject.net.pi.runtime.PiActionProfileGroupId;
import org.onosproject.net.pi.runtime.PiCounterCellData;
import org.onosproject.net.pi.runtime.PiExactFieldMatch;
import org.onosproject.net.pi.runtime.PiMatchKey;
@ -140,7 +140,7 @@ public class TableEntryEncoderTest {
.withMatchKey(PiMatchKey.builder()
.addFieldMatch(new PiExactFieldMatch(ecmpGroupFieldId, ofOnes(1)))
.build())
.withAction(PiActionGroupId.of(1))
.withAction(PiActionProfileGroupId.of(1))
.withPriority(1)
.withCookie(2)
.withCounterCellData(counterCellData)