| /* |
| * Copyright 2015-present Open Networking Laboratory |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.onosproject.net.group; |
| |
| import static com.google.common.base.Preconditions.checkNotNull; |
| |
| import java.util.Objects; |
| |
| import org.onosproject.core.GroupId; |
| |
| /** |
| * Group operation definition to be used between core and provider |
| * layers of group subsystem. |
| * |
| */ |
| public final class GroupOperation { |
| private final Type opType; |
| private final GroupId groupId; |
| private final GroupDescription.Type groupType; |
| private final GroupBuckets buckets; |
| private final GroupMsgErrorCode failureCode; |
| |
| public enum Type { |
| /** |
| * Create a group in a device with the specified parameters. |
| */ |
| ADD, |
| /** |
| * Modify a group in a device with the specified parameters. |
| */ |
| MODIFY, |
| /** |
| * Delete a specified group. |
| */ |
| DELETE |
| } |
| |
| /** |
| * Possible error codes for a failure of a group operation. |
| * |
| */ |
| public enum GroupMsgErrorCode { |
| GROUP_EXISTS, |
| INVALID_GROUP, |
| WEIGHT_UNSUPPORTED, |
| OUT_OF_GROUPS, |
| OUT_OF_BUCKETS, |
| CHAINING_UNSUPPORTED, |
| WATCH_UNSUPPORTED, |
| LOOP, |
| UNKNOWN_GROUP, |
| CHAINED_GROUP, |
| BAD_TYPE, |
| BAD_COMMAND, |
| BAD_BUCKET, |
| BAD_WATCH, |
| EPERM |
| } |
| |
| /** |
| * Group operation constructor with the parameters. |
| * |
| * @param opType group operation type |
| * @param groupId group Identifier |
| * @param groupType type of the group |
| * @param buckets immutable list of group buckets to be part of group |
| */ |
| private GroupOperation(Type opType, |
| GroupId groupId, |
| GroupDescription.Type groupType, |
| GroupBuckets buckets) { |
| this.opType = checkNotNull(opType); |
| this.groupId = checkNotNull(groupId); |
| this.groupType = checkNotNull(groupType); |
| this.buckets = buckets; |
| this.failureCode = null; |
| } |
| |
| /** |
| * Group operation copy-constructor with additional field to set failure code. |
| * Typically used by provider to return information to the core about |
| * the failure reason for a group operation. |
| * |
| * @param groupOp the original group operation |
| * @param failureCode failure code for a failed group operation |
| */ |
| private GroupOperation(GroupOperation groupOp, GroupMsgErrorCode failureCode) { |
| this.opType = groupOp.opType; |
| this.groupId = groupOp.groupId; |
| this.groupType = groupOp.groupType; |
| this.buckets = groupOp.buckets; |
| this.failureCode = failureCode; |
| } |
| |
| /** |
| * Creates ADD group operation object. |
| * |
| * @param groupId group Identifier |
| * @param groupType type of the group |
| * @param buckets immutable list of group buckets to be part of group |
| * @return add group operation object |
| */ |
| public static GroupOperation createAddGroupOperation(GroupId groupId, |
| GroupDescription.Type groupType, |
| GroupBuckets buckets) { |
| checkNotNull(buckets); |
| return new GroupOperation(Type.ADD, groupId, groupType, buckets); |
| } |
| |
| /** |
| * Creates MODIFY group operation object. |
| * |
| * @param groupId group Identifier |
| * @param groupType type of the group |
| * @param buckets immutable list of group buckets to be part of group |
| * @return modify group operation object |
| */ |
| public static GroupOperation createModifyGroupOperation(GroupId groupId, |
| GroupDescription.Type groupType, |
| GroupBuckets buckets) { |
| checkNotNull(buckets); |
| return new GroupOperation(Type.MODIFY, groupId, groupType, buckets); |
| |
| } |
| |
| /** |
| * Creates DELETE group operation object. |
| * |
| * @param groupId group Identifier |
| * @param groupType type of the group |
| * @return delete group operation object |
| */ |
| public static GroupOperation createDeleteGroupOperation(GroupId groupId, |
| GroupDescription.Type groupType) { |
| return new GroupOperation(Type.DELETE, groupId, groupType, null); |
| |
| } |
| |
| /** |
| * Creates failure group operation object by setting failure code |
| * to inform the failure reason. |
| * |
| * @param groupOperation the original group operation |
| * @param failureCode failure code for a failed group operation |
| * @return failed group operation object |
| */ |
| public static GroupOperation createFailedGroupOperation(GroupOperation groupOperation, |
| GroupMsgErrorCode failureCode) { |
| checkNotNull(groupOperation); |
| return new GroupOperation(groupOperation, failureCode); |
| } |
| |
| /** |
| * Returns group operation type. |
| * |
| * @return GroupOpType group operation type |
| */ |
| public Type opType() { |
| return this.opType; |
| } |
| |
| /** |
| * Returns group identifier attribute of the operation. |
| * |
| * @return GroupId group identifier |
| */ |
| public GroupId groupId() { |
| return this.groupId; |
| } |
| |
| /** |
| * Returns group type attribute of the operation. |
| * |
| * @return GroupType group type |
| */ |
| public GroupDescription.Type groupType() { |
| return this.groupType; |
| } |
| |
| /** |
| * Returns group buckets associated with the operation. |
| * |
| * @return GroupBuckets group buckets |
| */ |
| public GroupBuckets buckets() { |
| return this.buckets; |
| } |
| |
| /** |
| * Returns the failure code representing the failure of a group operation. |
| * |
| * @return error code for failure of group operation |
| */ |
| public GroupMsgErrorCode failureCode() { |
| return failureCode; |
| } |
| |
| @Override |
| /* |
| * The deviceId, type and buckets are used for hash. |
| * |
| * (non-Javadoc) |
| * @see java.lang.Object#equals(java.lang.Object) |
| */ |
| public int hashCode() { |
| return (buckets != null) ? Objects.hash(groupId, opType, buckets) : |
| Objects.hash(groupId, opType); |
| } |
| |
| @Override |
| /* |
| * The deviceId, type and buckets should be same. |
| * |
| * (non-Javadoc) |
| * @see java.lang.Object#equals(java.lang.Object) |
| */ |
| public boolean equals(Object obj) { |
| if (this == obj) { |
| return true; |
| } |
| if (obj instanceof GroupOperation) { |
| GroupOperation that = (GroupOperation) obj; |
| return Objects.equals(groupId, that.groupId) && |
| Objects.equals(groupType, that.groupType) && |
| Objects.equals(opType, that.opType) && |
| Objects.equals(buckets, that.buckets); |
| |
| } |
| return false; |
| } |
| } |