blob: a6f34080007c8bcd6e0d4cfd054bdeb7b8765c93 [file] [log] [blame]
/*
* Copyright 2019-present Open Networking Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onosproject.p4runtime.api;
import org.onosproject.net.pi.model.PiPipeconf;
import org.onosproject.net.pi.runtime.PiEntity;
import org.onosproject.net.pi.runtime.PiEntityType;
import org.onosproject.net.pi.runtime.PiHandle;
import java.util.Collection;
import java.util.concurrent.CompletableFuture;
/**
* P4Runtime client interface for the Write RPC that allows inserting, modifying
* and deleting PI entities. Allows batching of write requests and it returns a
* detailed response for each PI entity in the request.
*/
public interface P4RuntimeWriteClient {
/**
* Returns a new {@link WriteRequest} instance that can be used to build a
* batched write request, for the given pipeconf.
*
* @param pipeconf pipeconf
* @return new write request
*/
WriteRequest write(PiPipeconf pipeconf);
/**
* Signals the type of write operation for a given PI entity.
*/
enum UpdateType {
/**
* Inserts an entity.
*/
INSERT,
/**
* Modifies an existing entity.
*/
MODIFY,
/**
* Deletes an existing entity.
*/
DELETE
}
/**
* Signals if the entity was written successfully or not.
*/
enum EntityUpdateStatus {
/**
* The entity was written successfully, no errors occurred.
*/
OK,
/**
* The server didn't return any status for the entity.
*/
PENDING,
/**
* The entity was not added to the write request because it was not
* possible to encode/decode it.
*/
CODEC_ERROR,
/**
* Server responded that it was not possible to insert the entity as
* another one with the same handle already exists.
*/
ALREADY_EXIST,
/**
* Server responded that it was not possible to modify or delete the
* entity as the same cannot be found on the server.
*/
NOT_FOUND,
/**
* Other error. See {@link EntityUpdateResponse#explanation()} or {@link
* EntityUpdateResponse#throwable()} for more details.
*/
OTHER_ERROR,
}
/**
* Signals the atomicity mode that the server should follow when executing a
* write request. For more information on each atomicity mode please see the
* P4Runtime spec.
*/
enum Atomicity {
/**
* Continue on error. Default value for all write requests.
*/
CONTINUE_ON_ERROR,
/**
* Rollback on error.
*/
ROLLBACK_ON_ERROR,
/**
* Dataplane atomic.
*/
DATAPLANE_ATOMIC,
}
/**
* Abstraction of a batched P4Runtime write request. Multiple entities can
* be added to the same request before submitting it. The implementation
* should guarantee that entities are added in the final P4Runtime protobuf
* message in the same order as added in this write request.
*/
interface WriteRequest {
/**
* Sets the atomicity mode of this write request. Default value is
* {@link Atomicity#CONTINUE_ON_ERROR}.
*
* @param atomicity atomicity mode
* @return this
*/
WriteRequest withAtomicity(Atomicity atomicity);
/**
* Requests to insert one PI entity.
*
* @param entity PI entity
* @return this
*/
WriteRequest insert(PiEntity entity);
/**
* Requests to insert multiple PI entities.
*
* @param entities iterable of PI entities
* @return this
*/
WriteRequest insert(Iterable<? extends PiEntity> entities);
/**
* Requests to modify one PI entity.
*
* @param entity PI entity
* @return this
*/
WriteRequest modify(PiEntity entity);
/**
* Requests to modify multiple PI entities.
*
* @param entities iterable of PI entities
* @return this
*/
WriteRequest modify(Iterable<? extends PiEntity> entities);
/**
* Requests to delete one PI entity identified by the given handle.
*
* @param handle PI handle
* @return this
*/
WriteRequest delete(PiHandle handle);
/**
* Requests to delete multiple PI entities identified by the given
* handles.
*
* @param handles iterable of handles
* @return this
*/
WriteRequest delete(Iterable<? extends PiHandle> handles);
/**
* Requests to write the given PI entity with the given update type. If
* {@code updateType} is {@link UpdateType#DELETE}, then only the handle
* will be considered by the request.
*
* @param entity PI entity
* @param updateType update type
* @return this
*/
WriteRequest entity(PiEntity entity, UpdateType updateType);
/**
* Requests to write the given PI entities with the given update type.
* If {@code updateType} is {@link UpdateType#DELETE}, then only the
* handles will be considered by the request.
*
* @param entities iterable of PI entity
* @param updateType update type
* @return this
*/
WriteRequest entities(Iterable<? extends PiEntity> entities, UpdateType updateType);
/**
* Submits this write request to the server and returns a completable
* future holding the response. The future is completed only after the
* server signals that all entities are written.
*
* @return completable future of the write response
*/
CompletableFuture<WriteResponse> submit();
/**
* Similar to {@link #submit()}, but blocks until the operation is
* completed, after which, it returns a read response.
*
* @return read response
*/
P4RuntimeWriteClient.WriteResponse submitSync();
/**
* Returns all entity update requests for which we are expecting a
* responce from the device, in the same order they were added to this
* batch.
*
*
*
* @return entity update requests
*/
Collection<EntityUpdateRequest> pendingUpdates();
}
/**
* Represents the update request for a specific entity.
*/
interface EntityUpdateRequest {
/**
* Returns the handle of the PI entity subject of this update.
*
* @return handle
*/
PiHandle handle();
/**
* Returns the PI entity subject of this update. Returns {@code null} if
* the update type is {@link UpdateType#DELETE}, in which case only the
* handle is used in the request.
*
* @return PI entity or null
*/
PiEntity entity();
/**
* Returns the type of update requested for this entity.
*
* @return update type
*/
UpdateType updateType();
/**
* Returns the type of entity subject of this update.
*
* @return PI entity type
*/
PiEntityType entityType();
}
/**
* Abstraction of a response obtained from a P4Runtime server after a write
* request is submitted. It allows returning a detailed response ({@link
* EntityUpdateResponse}) for each PI entity in the batched request. Entity
* responses are guaranteed to be returned in the same order as the
* corresponding PI entity in the request.
*/
interface WriteResponse {
/**
* Returns true if all entities in the request were successfully
* written. In other words, if no errors occurred. False otherwise.
*
* @return true if all entities were written successfully, false
* otherwise
*/
boolean isSuccess();
/**
* Returns a detailed response for each PI entity in the request. The
* implementation of this method should guarantee that the returned
* collection has size equal to the number of PI entities in the
* original write request.
*
* @return collection of {@link EntityUpdateResponse}
*/
Collection<EntityUpdateResponse> all();
/**
* Returns a detailed response for each PI entity that was successfully
* written. If {@link #isSuccess()} is {@code true}, then this method is
* expected to return the same values as {@link #all()}.
*
* @return collection of {@link EntityUpdateResponse}
*/
Collection<EntityUpdateResponse> success();
/**
* Returns a detailed response for each PI entity for which the server
* returned an error. If {@link #isSuccess()} is {@code true}, then this
* method is expected to return an empty collection.
*
* @return collection of {@link EntityUpdateResponse}
*/
Collection<EntityUpdateResponse> failed();
/**
* Returns a detailed response for each PI entity for which the server
* returned the given status.
*
* @param status status
* @return collection of {@link EntityUpdateResponse}
*/
Collection<EntityUpdateResponse> status(EntityUpdateStatus status);
}
/**
* Represents the response to an update request request for a specific PI
* entity.
*/
interface EntityUpdateResponse extends EntityUpdateRequest {
/**
* Returns true if this PI entity was written successfully, false
* otherwise.
*
* @return true if this PI entity was written successfully, false
* otherwise
*/
boolean isSuccess();
/**
* Returns the status for this PI entity. If {@link #isSuccess()}
* returns {@code true}, then this method is expected to return {@link
* EntityUpdateStatus#OK}. If {@link EntityUpdateStatus#OTHER_ERROR}
* is returned, further details might be provided in {@link
* #explanation()} and {@link #throwable()}.
*
* @return status
*/
EntityUpdateStatus status();
/**
* If the PI entity was NOT written successfully, this method returns a
* message explaining the error occurred. Returns an empty string if
* such message is not available, or {@code null} if no errors
* occurred.
*
* @return error explanation or empty string or null
*/
String explanation();
/**
* If the PI entity was NOT written successfully, this method returns
* the internal throwable instance associated with the error (e.g. a
* {@link io.grpc.StatusRuntimeException} instance). Returns null if
* such throwable instance is not available or if no errors occurred.
*
* @return throwable instance associated with this PI entity
*/
Throwable throwable();
}
}