273 lines
10 KiB
Protocol Buffer
273 lines
10 KiB
Protocol Buffer
/*
|
|
* Copyright (C) 2023 The Android Open Source Project
|
|
*
|
|
* 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.
|
|
*/
|
|
|
|
syntax = "proto3";
|
|
|
|
package com.android.federatedcompute.proto;
|
|
|
|
import "common.proto";
|
|
import "google/protobuf/duration.proto";
|
|
|
|
option java_package = "com.android.federatedcompute.proto";
|
|
option java_multiple_files = true;
|
|
|
|
service TaskAssignments {
|
|
// A request sent by the device to check if it should participate in the
|
|
// current task.
|
|
//
|
|
// Clients should use the same `ForwardingInfo` (incl. the headers) as used in
|
|
// this request to construct the URI to poll the operation service to check
|
|
// for task assignment completion.
|
|
//
|
|
// When the task assignment is complete, the result of the operation will
|
|
// either contain an error or the resulting `StartTaskAssignmentResponse` in
|
|
// the response.
|
|
//
|
|
// If the client no longer needs a task assignment because it is interrupted
|
|
// or drops out or an error occurs during polling the long running operation,
|
|
// the client should make a best effort to call CancelOperation.
|
|
//
|
|
// If the returned operation is not complete, clients should poll for status
|
|
// at the rate specified in the StartTaskAssignmentMetadata.
|
|
rpc StartTaskAssignment(StartTaskAssignmentRequest)
|
|
returns (StartTaskAssignmentResponse) {}
|
|
|
|
// A request sent by the device to participate in multiple tasks
|
|
// simultaneously.
|
|
//
|
|
// Unlike StartTaskAssignment, which returns at most one task assignment of
|
|
// the server's choice, this RPC attempts to return assignments for *all*
|
|
// tasks requested by the client.
|
|
rpc PerformMultipleTaskAssignments(PerformMultipleTaskAssignmentsRequest)
|
|
returns (PerformMultipleTaskAssignmentsResponse) {}
|
|
|
|
// A request sent by the device to report the result of running the task
|
|
// provided by `StartTaskAssignmentResponse`.
|
|
//
|
|
// Clients should use the same `ForwardingInfo` as used in the
|
|
// `StartTaskAssignment` request to construct the URI for this request.
|
|
//
|
|
// A result with a status code other than Code.OK indicates client session
|
|
// termination. The client may not send any future requests with the given
|
|
// session_id.
|
|
rpc ReportTaskResult(ReportTaskResultRequest)
|
|
returns (ReportTaskResultResponse) {}
|
|
}
|
|
|
|
message StartTaskAssignmentRequest {
|
|
// The name of the population this client belongs to.
|
|
//
|
|
// Note that http clients set this value in the request URL instead of the
|
|
// request body.
|
|
string population_name = 1;
|
|
|
|
// The session id returned by the server.
|
|
//
|
|
// Note that http clients set this value in the request URL instead of the
|
|
// request body.
|
|
string session_id = 2;
|
|
|
|
reserved 3;
|
|
|
|
ClientVersion client_version = 4;
|
|
|
|
// The client computes this message using the task returned by a previous
|
|
// `RequestEligibilityEvalTask` call.
|
|
//
|
|
// If this field is set, it describes to the server which tasks the client is
|
|
// (in)eligible. The server must take this information into account when
|
|
// deciding task to serve in response to this request.
|
|
//
|
|
// If this field is unset, it may indicate that the client previously received
|
|
// an `EligibilityEvalTask` without an `EligibilityEvalPayload` message (i.e.
|
|
// the population did not have an eligibility-computing task configured at the
|
|
// time of the request). It may also indicate a client for which the
|
|
// eligibility-computing task feature has been disabled, or an old client that
|
|
// does not support this feature yet.
|
|
//
|
|
// If this field is unset but the population has an eligibility-computing task
|
|
// configured, then the server must reject this client, since the server has
|
|
// no way to determine which tasks the client is (in)eligible for.
|
|
//
|
|
// If this field is unset and the population does not have an
|
|
// eligibility-computing task configured, then the server may serve this
|
|
// client any task.
|
|
//
|
|
TaskEligibilityInfo task_eligibility_info = 5;
|
|
|
|
// The client's capabilities when downloading and processing resources.
|
|
ResourceCapabilities resource_capabilities = 6;
|
|
}
|
|
|
|
message StartTaskAssignmentMetadata {
|
|
// The suggested duration between instances of polling the StartTaskAssignment
|
|
// LRO.
|
|
google.protobuf.Duration polling_interval = 1;
|
|
}
|
|
|
|
message StartTaskAssignmentResponse {
|
|
// One of two outcomes, depending on server's decision on participation of the
|
|
// client.
|
|
oneof result {
|
|
// If the client joined the task with this call, information on how to
|
|
// proceed.
|
|
TaskAssignment task_assignment = 1;
|
|
|
|
// If the client was not accepted, information how to proceed.
|
|
RejectionInfo rejection_info = 2;
|
|
}
|
|
}
|
|
|
|
message PerformMultipleTaskAssignmentsRequest {
|
|
// The name of the population this client belongs to.
|
|
//
|
|
// Note that http clients set this value in the request URL instead of the
|
|
// request body.
|
|
string population_name = 1;
|
|
|
|
// The session id returned by the server.
|
|
string session_id = 2;
|
|
|
|
// The client's version information.
|
|
ClientVersion client_version = 3;
|
|
|
|
// The client's capabilities when downloading and processing resources.
|
|
ResourceCapabilities resource_capabilities = 4;
|
|
|
|
// The list of tasks for which the client would like TaskAssignments. These
|
|
// names are produced by running the population's Eligibility Eval task (see
|
|
// /EligibilityEvalTasks.RequestEligibilityEvalTask).
|
|
repeated string task_names = 5;
|
|
}
|
|
|
|
message PerformMultipleTaskAssignmentsResponse {
|
|
// The TaskAssignments requested by the client. The server may omit requested
|
|
// TaskAssignments, e.g. for any tasks that no longer exist or are not
|
|
// currently accepting client contributions; these cases should be infrequent.
|
|
repeated TaskAssignment task_assignments = 1;
|
|
}
|
|
|
|
// When client (device) is accepted for the current task, this data structure
|
|
// carries information necessary to begin task execution.
|
|
message TaskAssignment {
|
|
// Information to construct the URI to use for providing resulting aggregation
|
|
// data after task execution.
|
|
ForwardingInfo aggregation_data_forwarding_info = 1;
|
|
|
|
message AggregationInfo {}
|
|
|
|
message SecureAggregationInfo {
|
|
// The minimum number of clients' values that must be aggregated together
|
|
// before the server can gain access to the aggregate,
|
|
// even transiently (e.g. in RAM).
|
|
// This isn't needed by Secure Aggregation protocol on the client side but
|
|
// shared by the server with clients for transparency or policy reasons.
|
|
int32 minimum_clients_in_server_visible_aggregate = 1;
|
|
}
|
|
|
|
oneof aggregation_type {
|
|
// If set, indicates that the Aggregations service (see
|
|
// `aggregations.proto`) should be used to perform aggregation.
|
|
AggregationInfo aggregation_info = 9;
|
|
|
|
// If set, indicates that the SecureAggregations service (see
|
|
// `secure_aggregations.proto`) should be used to perform aggregation.
|
|
SecureAggregationInfo secure_aggregation_info = 10;
|
|
}
|
|
|
|
// Unique identifier for the client's protocol session.
|
|
string session_id = 5;
|
|
|
|
// The opaque id of the aggregation session the client has joined. This is a
|
|
// string generated by the server and MUST NOT contain any information that
|
|
// could be used to identify a specific device.
|
|
string aggregation_id = 2;
|
|
|
|
// Unique identifier for the client's participation in an aggregation session.
|
|
string authorization_token = 6;
|
|
|
|
// The name identifying the task that was assigned.
|
|
string task_name = 7;
|
|
|
|
// The checkpoint from which to start execution.
|
|
Resource init_checkpoint = 3;
|
|
|
|
// The plan to be used for execution.
|
|
Resource plan = 4;
|
|
|
|
// Info for how to generate URIs for fetching slices at runtime.
|
|
FederatedSelectUriInfo federated_select_uri_info = 8;
|
|
}
|
|
|
|
// Info for how to generate URIs for fetching slices that the task might request
|
|
// to be downloaded at runtime.
|
|
//
|
|
// When one or more slices are requested by the task, the template specified
|
|
// here should be used to form a URI from which the client can download the
|
|
// slice data, by replacing the "{served_at_id}" and "{key_base10}" substrings
|
|
// with the `google.internal.federated.plan.SlicesSelector.served_at_id` and the
|
|
// base-10 representation of the `SlicesSelector.keys` value. The client must
|
|
// not perform any URI escaping to the values that the substrings are replaced
|
|
// with.
|
|
message FederatedSelectUriInfo {
|
|
// The URI template to use for fetching slices.
|
|
//
|
|
// This template must always start with "https://".
|
|
//
|
|
// This template must contain the following substrings: "{served_at_id}" and
|
|
// "{key_base10}", as per the above documentation.
|
|
string uri_template = 1;
|
|
}
|
|
|
|
message ReportTaskResultRequest {
|
|
// The name of the population this client belongs to.
|
|
//
|
|
// Note that http clients set this value in the request URL instead of the
|
|
// request body.
|
|
string population_name = 1;
|
|
|
|
// The session id returned by the server.
|
|
//
|
|
// Note that http clients set this value in the request URL instead of the
|
|
// request body.
|
|
string session_id = 2;
|
|
|
|
// The opaque id of the aggregation session the client has joined. This is a
|
|
// string generated by the server and MUST NOT contain any information that
|
|
// could be used to identify a specific device.
|
|
string aggregation_id = 5;
|
|
|
|
// Computation status code reported by client.
|
|
// Code.OK indicates that the client computation completed successfully. Any
|
|
// other code indicates unsuccessful computation execution and termination of
|
|
// the protocol session.
|
|
int32 computation_status_code = 3;
|
|
|
|
// Stats produced during the client-side execution of the task.
|
|
ClientStats client_stats = 4;
|
|
}
|
|
|
|
// This message is used to report client stats and execution duration to the
|
|
// server.
|
|
message ClientStats {
|
|
// The time spent on running the task (includes I/O such as reading examples,
|
|
// but does not include time spent on the network for retrieving the task
|
|
// or uploading results).
|
|
google.protobuf.Duration computation_execution_duration = 1;
|
|
}
|
|
|
|
message ReportTaskResultResponse {}
|