blob: d4c3f61efe28fa62ae6543e9bccdf6a24a46290a [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.PiActionProfileId;
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.PiEntity;
import org.onosproject.net.pi.runtime.PiHandle;
import java.util.Collection;
import java.util.concurrent.CompletableFuture;
/**
* P4Runtime client interface for the Read RPC that allows reading multiple
* entities with one request.
*/
public interface P4RuntimeReadClient {
/**
* Returns a new {@link ReadRequest} instance that can bed used to build a
* batched read request, for the given pipeconf.
*
* @param pipeconf pipeconf
* @return new read request
*/
ReadRequest read(PiPipeconf pipeconf);
/**
* Abstraction of a batched P4Runtime read request. Multiple entities can be
* added to the same request before submitting it.
*/
interface ReadRequest {
/**
* Requests to read one entity identified by the given handle.
*
* @param handle handle
* @return this
*/
ReadRequest handle(PiHandle handle);
/**
* Requests to read multiple entities identified by the given handles.
*
* @param handles iterable of handles
* @return this
*/
ReadRequest handles(Iterable<? extends PiHandle> handles);
/**
* Requests to read all table entries from the given table ID.
*
* @param tableId table ID
* @return this
*/
ReadRequest tableEntries(PiTableId tableId);
/**
* Requests to read all table entries from the given table IDs.
*
* @param tableIds table IDs
* @return this
*/
ReadRequest tableEntries(Iterable<PiTableId> tableIds);
/**
* Requests to read the default table entry from the given table.
*
* @param tableId table ID
* @return this
*/
ReadRequest defaultTableEntry(PiTableId tableId);
/**
* Requests to read the default table entry from the given tables.
*
* @param tableIds table IDs
* @return this
*/
ReadRequest defaultTableEntry(Iterable<PiTableId> tableIds);
/**
* Requests to read all action profile groups from the given action
* profile.
*
* @param actionProfileId action profile ID
* @return this
*/
ReadRequest actionProfileGroups(PiActionProfileId actionProfileId);
/**
* Requests to read all action profile groups from the given action
* profiles.
*
* @param actionProfileIds action profile IDs
* @return this
*/
ReadRequest actionProfileGroups(Iterable<PiActionProfileId> actionProfileIds);
/**
* Requests to read all action profile members from the given action
* profile.
*
* @param actionProfileId action profile ID
* @return this
*/
ReadRequest actionProfileMembers(PiActionProfileId actionProfileId);
/**
* Requests to read all action profile members from the given action
* profiles.
*
* @param actionProfileIds action profile IDs
* @return this
*/
ReadRequest actionProfileMembers(Iterable<PiActionProfileId> actionProfileIds);
/**
* Requests to read all counter cells from the given counter.
*
* @param counterId counter ID
* @return this
*/
ReadRequest counterCells(PiCounterId counterId);
/**
* Requests to read all counter cells from the given counters.
*
* @param counterIds counter IDs
* @return this
*/
ReadRequest counterCells(Iterable<PiCounterId> counterIds);
/**
* Requests to read all direct counter cells from the given table.
*
* @param tableId table ID
* @return this
*/
ReadRequest directCounterCells(PiTableId tableId);
/**
* Requests to read all direct counter cells from the given tables.
*
* @param tableIds table IDs
* @return this
*/
ReadRequest directCounterCells(Iterable<PiTableId> tableIds);
/**
* Requests to read all meter cell configs from the given meter ID.
*
* @param meterId meter ID
* @return this
*/
ReadRequest meterCells(PiMeterId meterId);
/**
* Requests to read all meter cell configs from the given meter IDs.
*
* @param meterIds meter IDs
* @return this
*/
ReadRequest meterCells(Iterable<PiMeterId> meterIds);
/**
* Requests to read all direct meter cell configs from the given table.
*
* @param tableId table ID
* @return this
*/
ReadRequest directMeterCells(PiTableId tableId);
/**
* Requests to read all direct meter cell configs from the given
* tables.
*
* @param tableIds table IDs
* @return this
*/
ReadRequest directMeterCells(Iterable<PiTableId> tableIds);
/**
* Submits the read request and returns a read response wrapped in a
* completable future. The future is completed once all entities have
* been received by the P4Runtime client.
*
* @return completable future of a read response
*/
CompletableFuture<ReadResponse> submit();
/**
* Similar to {@link #submit()}, but blocks until the operation is
* completed, after which, it returns a read response.
*
* @return read response
*/
ReadResponse submitSync();
//TODO: implement per-entity asynchronous reads. This would allow a user
// of this client to process read entities as they arrive, instead of
// waiting for the client to receive them all. Java 9 Reactive Streams
// seems a good way of doing it.
}
/**
* Response to a P4Runtime read request.
*/
interface ReadResponse {
/**
* Returns true if the request was successful with no errors, otherwise
* returns false. In case of errors, further details can be obtained
* with {@link #explanation()} and {@link #throwable()}.
*
* @return true if the request was successful with no errors, false
* otherwise
*/
boolean isSuccess();
/**
* Returns a collection of all PI entities returned by the server.
*
* @return collection of all PI entities returned by the server
*/
Collection<PiEntity> all();
/**
* Returns a collection of all PI entities of a given class returned by
* the server.
*
* @param clazz PI entity class
* @param <E> PI entity class
* @return collection of all PI entities returned by the server for the
* given PI entity class
*/
<E extends PiEntity> Collection<E> all(Class<E> clazz);
/**
* If the read request was not successful, 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 read request was not successful, 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
*/
Throwable throwable();
}
}