This is an automated email from the ASF dual-hosted git repository. lahirujayathilake pushed a commit to branch vizfold in repository https://gitbox.apache.org/repos/asf/airavata.git
commit a31c44e6d288982c656eb759a684246f5de0fe55 Author: lahiruj <[email protected]> AuthorDate: Sun Oct 5 21:52:27 2025 -0400 agent pull batch job unit assignment implementation --- .../connection/service/db/repo/JobUnitRepo.java | 36 +- .../service/handlers/AgentConnectionHandler.java | 41 + .../service/handlers/AgentWorkService.java | 63 + .../service/handlers/JobUnitAllocator.java | 66 + .../connection/service/models/AssignResult.java | 47 + modules/agent-framework/airavata-agent/agent.go | 125 +- .../protos/agent-communication.pb.go | 1423 ++++++++++++++------ .../protos/agent-communication_grpc.pb.go | 22 +- .../proto/agent-communication.proto | 28 + 9 files changed, 1377 insertions(+), 474 deletions(-) diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/repo/JobUnitRepo.java b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/repo/JobUnitRepo.java index 02f9261352..5c8293af6a 100644 --- a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/repo/JobUnitRepo.java +++ b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/db/repo/JobUnitRepo.java @@ -1,4 +1,3 @@ - /** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file @@ -21,8 +20,43 @@ package org.apache.airavata.agent.connection.service.db.repo; import org.apache.airavata.agent.connection.service.db.entity.JobUnitEntity; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @Repository public interface JobUnitRepo extends JpaRepository<JobUnitEntity, String> { + + @Query(value = """ + SELECT ID + FROM JOB_UNIT + WHERE BATCH_ID = :batchId AND STATUS = 'PENDING' + ORDER BY CREATED_AT, ID + FOR UPDATE SKIP LOCKED + LIMIT 1 + """, nativeQuery = true) + String lockNextPending(@Param("batchId") String batchId); + + @Modifying + @Query(value = """ + UPDATE JOB_UNIT SET STATUS='IN_PROGRESS', AGENT_ID=:agentId, STARTED_AT=CURRENT_TIMESTAMP(6) WHERE ID=:id + """, nativeQuery = true) + int markInProgress(@Param("id") String id, @Param("agentId") String agentId); + + @Query(value = "SELECT RESOLVED_COMMAND FROM JOB_UNIT WHERE ID=:id", nativeQuery = true) + String getResolvedCommand(@Param("id") String id); + + @Modifying + @Query(value = """ + UPDATE JOB_UNIT SET STATUS='COMPLETED', COMPLETED_AT=CURRENT_TIMESTAMP(6) WHERE ID=:id + """, nativeQuery = true) + int markCompleted(@Param("id") String id); + + @Query(value = """ + SELECT COUNT(*) + FROM JOB_UNIT + WHERE BATCH_ID = :batchId AND STATUS IN ('PENDING','IN_PROGRESS') + """, nativeQuery = true) + int countRemaining(@Param("batchId") String batchId); } diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/AgentConnectionHandler.java b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/AgentConnectionHandler.java index 56a8f54fce..693dc9345d 100644 --- a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/AgentConnectionHandler.java +++ b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/AgentConnectionHandler.java @@ -57,6 +57,8 @@ public class AgentConnectionHandler extends AgentCommunicationServiceGrpc.AgentC private final Map<String, PythonExecutionResponse> PYTHON_EXECUTION_RESPONSE_CACHE = new ConcurrentHashMap<>(); private final Map<String, TunnelCreationResponse> TUNNEL_CREATION_RESPONSE_CACHE = new ConcurrentHashMap<>(); + private final AgentWorkService agentWorkService; + @Value("${airavata.tunnel.serverHost}") private String tunnelServerHost; @@ -69,6 +71,10 @@ public class AgentConnectionHandler extends AgentCommunicationServiceGrpc.AgentC @Value("${airavata.tunnel.serverToken}") private String tunnelServerToken; + public AgentConnectionHandler(AgentWorkService agentWorkService) { + this.agentWorkService = agentWorkService; + } + // response handling public AgentInfoResponse isAgentUp(String agentId) { if (AGENT_STREAM_MAPPING.containsKey(agentId) @@ -602,6 +608,33 @@ public class AgentConnectionHandler extends AgentCommunicationServiceGrpc.AgentC PYTHON_EXECUTION_RESPONSE_CACHE.put(executionResponse.getExecutionId(), executionResponse); } + private void handleNextJobUnitRequest(String agentId, StreamObserver<ServerMessage> responseObserver) { + logger.info("Received next job unit request for agent id {}", agentId); + AssignResult assignResult = agentWorkService.assignNextForAgent(agentId); + + try { + if (assignResult instanceof AssignResult.Assigned assigned) { + responseObserver.onNext(ServerMessage.newBuilder().setAssignJobUnit(AssignJobUnit.newBuilder() + .setJobUnitId(assigned.jobUnitId()) + .setResolvedCommand(assigned.resolvedCommand()) + .build()).build()); + logger.info("Assigned job unit id {} to agent id {}", assigned.jobUnitId(), agentId); + + } else if (assignResult instanceof AssignResult.NoWork noWork) { + responseObserver.onNext(ServerMessage.newBuilder().setNoJobUnitAvailable(NoJobUnitAvailable.newBuilder() + .setReason(noWork.reason()) + .build()).build()); + logger.info("No job unit available for agent id {}, reason: {}", agentId, noWork.reason()); + } + } catch (Exception e) { + logger.error("Failed to send reply to agent {}", agentId, e); + } + } + + private void handleJobUnitCompletion(String jobUnitId) { + agentWorkService.markCompleted(jobUnitId); + } + // routing private Optional<StreamObserver<ServerMessage>> getAgentStreamObserver(String agentId) { if (AGENT_STREAM_MAPPING.containsKey(agentId) @@ -659,6 +692,14 @@ public class AgentConnectionHandler extends AgentCommunicationServiceGrpc.AgentC case ASYNCCOMMANDTERMINATERESPONSE -> { handleAsyncCommandTerminateResponse(request.getAsyncCommandTerminateResponse()); } + + case REQUESTNEXTJOBUNIT -> { + handleNextJobUnitRequest(request.getRequestNextJobUnit().getAgentId(), responseObserver); + } + + case JOBUNITCOMPLETED -> { + handleJobUnitCompletion(request.getJobUnitCompleted().getJobUnitId()); + } } } diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/AgentWorkService.java b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/AgentWorkService.java new file mode 100644 index 0000000000..0771ddaa4c --- /dev/null +++ b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/AgentWorkService.java @@ -0,0 +1,63 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 + * <p> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p> + * 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.apache.airavata.agent.connection.service.handlers; + +import org.apache.airavata.agent.connection.service.db.entity.AgentBatchAssignmentEntity; +import org.apache.airavata.agent.connection.service.db.repo.AgentBatchAssignmentRepo; +import org.apache.airavata.agent.connection.service.db.repo.JobUnitRepo; +import org.apache.airavata.agent.connection.service.models.AssignResult; +import org.springframework.stereotype.Service; + +import java.util.Optional; + +@Service +public class AgentWorkService { + + private final AgentBatchAssignmentRepo assignmentRepo; + private final JobUnitAllocator allocator; + private final JobUnitRepo jobUnitRepo; + + public AgentWorkService(AgentBatchAssignmentRepo assignmentRepo, JobUnitAllocator allocator, JobUnitRepo jobUnitRepo) { + this.assignmentRepo = assignmentRepo; + this.allocator = allocator; + this.jobUnitRepo = jobUnitRepo; + } + + public AssignResult assignNextForAgent(String agentId) { + Optional<AgentBatchAssignmentEntity> absOp = assignmentRepo.findByAgentId(agentId); + if (absOp.isEmpty()) { + return AssignResult.noAssignment(); + } + + var batchId = absOp.get().getBatchId(); + Optional<JobUnitAllocator.JobUnitRow> next = allocator.allocateNext(batchId, agentId); + if (next.isPresent()) { + JobUnitAllocator.JobUnitRow row = next.get(); + return AssignResult.assigned(row.id(), row.resolvedCommand()); + } + + int remaining = jobUnitRepo.countRemaining(batchId); + return (remaining == 0) ? AssignResult.emptyAllDone() : AssignResult.empty(); + } + + public void markCompleted(String jobUnitId) { + allocator.markCompleted(jobUnitId); + } +} + diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/JobUnitAllocator.java b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/JobUnitAllocator.java new file mode 100644 index 0000000000..fd8b48bb6b --- /dev/null +++ b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/handlers/JobUnitAllocator.java @@ -0,0 +1,66 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 + * <p> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p> + * 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.apache.airavata.agent.connection.service.handlers; + +import jakarta.transaction.Transactional; +import org.apache.airavata.agent.connection.service.db.repo.JobUnitRepo; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.util.Optional; + +@Service +public class JobUnitAllocator { + + private static final Logger LOGGER = LoggerFactory.getLogger(JobUnitAllocator.class); + + private final JobUnitRepo jobUnitRepo; + + public record JobUnitRow(String id, String resolvedCommand) { + } + + public JobUnitAllocator(JobUnitRepo jobUnitRepo) { + this.jobUnitRepo = jobUnitRepo; + } + + @Transactional + public Optional<JobUnitRow> allocateNext(String batchId, String agentId) { + String id = jobUnitRepo.lockNextPending(batchId); + LOGGER.info("Job unit {} allocated to agent {}", id, agentId); + if (id == null) { + return Optional.empty(); + } + + if (jobUnitRepo.markInProgress(id, agentId) != 1) { + // If another agent grabbed the same job unit + LOGGER.warn("Job unit {} is already in progress by an agent", id); + return Optional.empty(); + } + + String cmd = jobUnitRepo.getResolvedCommand(id); + return Optional.of(new JobUnitRow(id, cmd)); + } + + @Transactional + public void markCompleted(String jobUnitId) { + int result = jobUnitRepo.markCompleted(jobUnitId); + LOGGER.info("Job unit {} marked as completed with result {}", jobUnitId, result); + } +} diff --git a/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AssignResult.java b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AssignResult.java new file mode 100644 index 0000000000..1103a9c408 --- /dev/null +++ b/modules/agent-framework/agent-service/src/main/java/org/apache/airavata/agent/connection/service/models/AssignResult.java @@ -0,0 +1,47 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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 + * <p> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p> + * 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.apache.airavata.agent.connection.service.models; + +public sealed interface AssignResult permits AssignResult.Assigned, AssignResult.NoWork { + + record Assigned(String jobUnitId, String resolvedCommand) implements AssignResult { + } + + record NoWork(String reason) implements AssignResult { + public static final String EMPTY = "EMPTY"; + public static final String EMPTY_ALL_DONE = "EMPTY_ALL_DONE"; + public static final String NO_ASSIGNMENT = "NO_ASSIGNMENT"; + } + + static Assigned assigned(String id, String cmd) { + return new Assigned(id, cmd); + } + + static NoWork empty() { + return new NoWork(NoWork.EMPTY); + } + + static NoWork emptyAllDone() { + return new NoWork(NoWork.EMPTY_ALL_DONE); + } + + static NoWork noAssignment() { + return new NoWork(NoWork.NO_ASSIGNMENT); + } +} \ No newline at end of file diff --git a/modules/agent-framework/airavata-agent/agent.go b/modules/agent-framework/airavata-agent/agent.go index 06cfe6d6a3..e1d270b47f 100644 --- a/modules/agent-framework/airavata-agent/agent.go +++ b/modules/agent-framework/airavata-agent/agent.go @@ -20,12 +20,14 @@ package main import ( protos "airavata-agent/protos" "context" + "errors" "flag" "io" "log" "os" "os/exec" "strings" + "time" "airavata-agent/pkg" @@ -37,6 +39,11 @@ type Stream = grpc.BidiStreamingClient[protos.AgentMessage, protos.ServerMessage var defaultLibs = []string{"python<3.12", "pip", "ipykernel", "git", "flask", "jupyter_client", "ttyd"} +const ( + noWorkBackoff = 3 * time.Second // sleep between polls when no work + maxEmptyReplies = 3 // exit after 3 consecutive empty replies +) + func main() { // Define flags with default empty values. @@ -144,9 +151,11 @@ func main() { } log.Printf("[agent.go] main() Connected to the server.\n") + requestNextJobUnit(stream, *agentId) + // start interceptor ch := make(chan struct{}) - go startInterceptor(stream, ch) + go startInterceptor(stream, ch, *agentId, *environ) <-ch @@ -156,7 +165,9 @@ func main() { } -func startInterceptor(stream Stream, grpcStreamChannel chan struct{}) { +func startInterceptor(stream Stream, grpcStreamChannel chan struct{}, agentId string, envName string) { + consecutiveEmpty := 0 + pollingJobEnabled := true for { in, err := stream.Recv() @@ -173,34 +184,34 @@ func startInterceptor(stream Stream, grpcStreamChannel chan struct{}) { case *protos.ServerMessage_EnvSetupRequest: log.Printf("[agent.go] Recived a env setup request\n") executionId := x.EnvSetupRequest.ExecutionId - envName := x.EnvSetupRequest.EnvName + envNameReq := x.EnvSetupRequest.EnvName envLibs := x.EnvSetupRequest.Libraries envPip := x.EnvSetupRequest.Pip - go pkg.CreateEnv(stream, executionId, envName, append(envLibs, defaultLibs...), envPip) + go pkg.CreateEnv(stream, executionId, envNameReq, append(envLibs, defaultLibs...), envPip) case *protos.ServerMessage_PythonExecutionRequest: log.Printf("[agent.go] Recived a python execution request\n") executionId := x.PythonExecutionRequest.ExecutionId - envName := x.PythonExecutionRequest.EnvName + envNameReq := x.PythonExecutionRequest.EnvName workingDir := x.PythonExecutionRequest.WorkingDir code := x.PythonExecutionRequest.Code - go pkg.ExecutePython(stream, executionId, envName, workingDir, code) + go pkg.ExecutePython(stream, executionId, envNameReq, workingDir, code) case *protos.ServerMessage_CommandExecutionRequest: log.Printf("[agent.go] Recived a shell execution request\n") executionId := x.CommandExecutionRequest.ExecutionId - envName := x.CommandExecutionRequest.EnvName + envNameReq := x.CommandExecutionRequest.EnvName workingDir := x.CommandExecutionRequest.WorkingDir execArgs := x.CommandExecutionRequest.Arguments - go pkg.ExecuteShell(stream, executionId, envName, workingDir, execArgs) + go pkg.ExecuteShell(stream, executionId, envNameReq, workingDir, execArgs) case *protos.ServerMessage_AsyncCommandExecutionRequest: log.Printf("[agent.go] Recived a async shell execution request\n") executionId := x.AsyncCommandExecutionRequest.ExecutionId - envName := x.AsyncCommandExecutionRequest.EnvName + envNameReq := x.AsyncCommandExecutionRequest.EnvName workingDir := x.AsyncCommandExecutionRequest.WorkingDir execArgs := x.AsyncCommandExecutionRequest.Arguments - go pkg.ExecuteShellAsync(stream, executionId, envName, workingDir, execArgs) + go pkg.ExecuteShellAsync(stream, executionId, envNameReq, workingDir, execArgs) case *protos.ServerMessage_AsyncCommandListRequest: log.Printf("[agent.go] Recived async shell list request\n") @@ -216,15 +227,15 @@ func startInterceptor(stream Stream, grpcStreamChannel chan struct{}) { case *protos.ServerMessage_JupyterExecutionRequest: log.Printf("[agent.go] Recived a jupyter execution request\n") executionId := x.JupyterExecutionRequest.ExecutionId - envName := x.JupyterExecutionRequest.EnvName + envNameReq := x.JupyterExecutionRequest.EnvName code := x.JupyterExecutionRequest.Code - go pkg.ExecuteJupyter(stream, executionId, envName, code) + go pkg.ExecuteJupyter(stream, executionId, envNameReq, code) case *protos.ServerMessage_KernelRestartRequest: log.Printf("[agent.go] Recived a kernel restart request\n") executionId := x.KernelRestartRequest.ExecutionId - envName := x.KernelRestartRequest.EnvName - go pkg.RestartKernel(stream, executionId, envName) + envNameReq := x.KernelRestartRequest.EnvName + go pkg.RestartKernel(stream, executionId, envNameReq) case *protos.ServerMessage_TunnelCreationRequest: log.Printf("[agent.go] Received a tunnel creation request\n") @@ -248,7 +259,93 @@ func startInterceptor(stream Stream, grpcStreamChannel chan struct{}) { } else { log.Printf("[agent.go] Closed tunnel: %s\n", tunnelId) } + + case *protos.ServerMessage_AssignJobUnit: + if !pollingJobEnabled { + // Shouldn't happen, but ignore if an agent is in interactive mode + break + } + + consecutiveEmpty = 0 // reset on actual work + ju := x.AssignJobUnit + log.Printf("[agent.go] Assigned job unit: %s\n", ju.JobUnitId) + + exitCode := runResolvedCommand(envName, ju.ResolvedCommand) + + _ = stream.Send(&protos.AgentMessage{ + Message: &protos.AgentMessage_JobUnitCompleted{ + JobUnitCompleted: &protos.JobUnitCompleted{ + JobUnitId: ju.JobUnitId, + ExitCode: int32(exitCode), + }, + }, + }) + requestNextJobUnit(stream, agentId) + + case *protos.ServerMessage_NoJobUnitAvailable: + reason := x.NoJobUnitAvailable.Reason + + // If the server says no batch jobs have assigned for the agent + if reason == "NO_ASSIGNMENT" { + if pollingJobEnabled { + log.Printf("[agent.go] No batch assignment for this agent; stopping job unit polling and staying in interactive mode.\n") + } + pollingJobEnabled = false + break + } + + // If polling is disabled, ignore no work messages + if !pollingJobEnabled { + break + } + + switch reason { + case "EMPTY", "EMPTY_ALL_DONE": + consecutiveEmpty++ + log.Printf("[agent.go] No job unit available (%d/%d): %s\n", consecutiveEmpty, maxEmptyReplies, reason) + + if consecutiveEmpty >= maxEmptyReplies { + log.Printf("[agent.go] No work after %d polls — shutting down agent (sweep complete).\n", maxEmptyReplies) + close(grpcStreamChannel) + return + } + + time.Sleep(noWorkBackoff) + requestNextJobUnit(stream, agentId) + + default: + // Unknown condition, retry without counting + time.Sleep(noWorkBackoff) + requestNextJobUnit(stream, agentId) + } } } } + +func requestNextJobUnit(stream Stream, agentId string) { + _ = stream.Send(&protos.AgentMessage{ + Message: &protos.AgentMessage_RequestNextJobUnit{ + RequestNextJobUnit: &protos.RequestNextJobUnit{ + AgentId: agentId, + }, + }, + }) +} + +func runResolvedCommand(envName string, resolved string) int { + log.Printf("[agent.go] Running job unit command: %s\n", resolved) + cmd := exec.Command("micromamba", "run", "-n", envName, "bash", "-lc", resolved) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + if err := cmd.Run(); err != nil { + var ee *exec.ExitError + if errors.As(err, &ee) { + log.Printf("[agent.go] Command exited with code %d\n", ee.ExitCode()) + return ee.ExitCode() + } + log.Printf("[agent.go] Command failed to start/run: %v\n", err) + return 1 + } + return 0 +} diff --git a/modules/agent-framework/airavata-agent/protos/agent-communication.pb.go b/modules/agent-framework/airavata-agent/protos/agent-communication.pb.go index 4527355eac..85a4280797 100644 --- a/modules/agent-framework/airavata-agent/protos/agent-communication.pb.go +++ b/modules/agent-framework/airavata-agent/protos/agent-communication.pb.go @@ -1,25 +1,27 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.36.6 -// protoc v4.25.3 -// source: agent-communication.proto - +// // Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file +// or more contributor license agreements. See the NOTICE file // distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file +// regarding copyright ownership. The ASF licenses this file // to you 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 +// 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 +// KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. +// + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.35.1 +// protoc v5.29.3 +// source: agent-communication.proto package protos @@ -28,7 +30,6 @@ import ( protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" sync "sync" - unsafe "unsafe" ) const ( @@ -40,10 +41,11 @@ const ( // agent pinging the server type AgentPing struct { - state protoimpl.MessageState `protogen:"open.v1"` - AgentId string `protobuf:"bytes,1,opt,name=agentId,proto3" json:"agentId,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AgentId string `protobuf:"bytes,1,opt,name=agentId,proto3" json:"agentId,omitempty"` } func (x *AgentPing) Reset() { @@ -85,10 +87,11 @@ func (x *AgentPing) GetAgentId() string { // server requesting the agent to shutdown type ShutdownRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - AgentId string `protobuf:"bytes,1,opt,name=agentId,proto3" json:"agentId,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AgentId string `protobuf:"bytes,1,opt,name=agentId,proto3" json:"agentId,omitempty"` } func (x *ShutdownRequest) Reset() { @@ -130,14 +133,15 @@ func (x *ShutdownRequest) GetAgentId() string { // server requesting the agent to create a new agent subprocess type CreateAgentRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` - AgentId string `protobuf:"bytes,2,opt,name=agentId,proto3" json:"agentId,omitempty"` - ContainerId string `protobuf:"bytes,3,opt,name=containerId,proto3" json:"containerId,omitempty"` - WorkingDir string `protobuf:"bytes,4,opt,name=workingDir,proto3" json:"workingDir,omitempty"` - Mounts []string `protobuf:"bytes,5,rep,name=mounts,proto3" json:"mounts,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` + AgentId string `protobuf:"bytes,2,opt,name=agentId,proto3" json:"agentId,omitempty"` + ContainerId string `protobuf:"bytes,3,opt,name=containerId,proto3" json:"containerId,omitempty"` + WorkingDir string `protobuf:"bytes,4,opt,name=workingDir,proto3" json:"workingDir,omitempty"` + Mounts []string `protobuf:"bytes,5,rep,name=mounts,proto3" json:"mounts,omitempty"` } func (x *CreateAgentRequest) Reset() { @@ -206,12 +210,13 @@ func (x *CreateAgentRequest) GetMounts() []string { } type CreateAgentResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` - AgentId string `protobuf:"bytes,2,opt,name=agentId,proto3" json:"agentId,omitempty"` - Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` + AgentId string `protobuf:"bytes,2,opt,name=agentId,proto3" json:"agentId,omitempty"` + Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` } func (x *CreateAgentResponse) Reset() { @@ -267,11 +272,12 @@ func (x *CreateAgentResponse) GetStatus() string { // server requesting the agent to terminate an agent subprocess type TerminateAgentRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` - AgentId string `protobuf:"bytes,2,opt,name=agentId,proto3" json:"agentId,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` + AgentId string `protobuf:"bytes,2,opt,name=agentId,proto3" json:"agentId,omitempty"` } func (x *TerminateAgentRequest) Reset() { @@ -319,12 +325,13 @@ func (x *TerminateAgentRequest) GetAgentId() string { } type TerminateAgentResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` - AgentId string `protobuf:"bytes,2,opt,name=agentId,proto3" json:"agentId,omitempty"` - Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` + AgentId string `protobuf:"bytes,2,opt,name=agentId,proto3" json:"agentId,omitempty"` + Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` } func (x *TerminateAgentResponse) Reset() { @@ -380,13 +387,14 @@ func (x *TerminateAgentResponse) GetStatus() string { // server requesting the agent to setup an environment type EnvSetupRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` - EnvName string `protobuf:"bytes,2,opt,name=envName,proto3" json:"envName,omitempty"` - Libraries []string `protobuf:"bytes,3,rep,name=libraries,proto3" json:"libraries,omitempty"` - Pip []string `protobuf:"bytes,4,rep,name=pip,proto3" json:"pip,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` + EnvName string `protobuf:"bytes,2,opt,name=envName,proto3" json:"envName,omitempty"` + Libraries []string `protobuf:"bytes,3,rep,name=libraries,proto3" json:"libraries,omitempty"` + Pip []string `protobuf:"bytes,4,rep,name=pip,proto3" json:"pip,omitempty"` } func (x *EnvSetupRequest) Reset() { @@ -448,11 +456,12 @@ func (x *EnvSetupRequest) GetPip() []string { } type EnvSetupResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` } func (x *EnvSetupResponse) Reset() { @@ -501,13 +510,14 @@ func (x *EnvSetupResponse) GetStatus() string { // server requesting the agent to execute a shell command in the environment type CommandExecutionRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` - EnvName string `protobuf:"bytes,2,opt,name=envName,proto3" json:"envName,omitempty"` - WorkingDir string `protobuf:"bytes,3,opt,name=workingDir,proto3" json:"workingDir,omitempty"` - Arguments []string `protobuf:"bytes,4,rep,name=arguments,proto3" json:"arguments,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` + EnvName string `protobuf:"bytes,2,opt,name=envName,proto3" json:"envName,omitempty"` + WorkingDir string `protobuf:"bytes,3,opt,name=workingDir,proto3" json:"workingDir,omitempty"` + Arguments []string `protobuf:"bytes,4,rep,name=arguments,proto3" json:"arguments,omitempty"` } func (x *CommandExecutionRequest) Reset() { @@ -569,11 +579,12 @@ func (x *CommandExecutionRequest) GetArguments() []string { } type CommandExecutionResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` - ResponseString string `protobuf:"bytes,2,opt,name=responseString,proto3" json:"responseString,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` + ResponseString string `protobuf:"bytes,2,opt,name=responseString,proto3" json:"responseString,omitempty"` } func (x *CommandExecutionResponse) Reset() { @@ -621,13 +632,14 @@ func (x *CommandExecutionResponse) GetResponseString() string { } type AsyncCommandExecutionRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` - EnvName string `protobuf:"bytes,2,opt,name=envName,proto3" json:"envName,omitempty"` - WorkingDir string `protobuf:"bytes,3,opt,name=workingDir,proto3" json:"workingDir,omitempty"` - Arguments []string `protobuf:"bytes,4,rep,name=arguments,proto3" json:"arguments,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` + EnvName string `protobuf:"bytes,2,opt,name=envName,proto3" json:"envName,omitempty"` + WorkingDir string `protobuf:"bytes,3,opt,name=workingDir,proto3" json:"workingDir,omitempty"` + Arguments []string `protobuf:"bytes,4,rep,name=arguments,proto3" json:"arguments,omitempty"` } func (x *AsyncCommandExecutionRequest) Reset() { @@ -689,12 +701,13 @@ func (x *AsyncCommandExecutionRequest) GetArguments() []string { } type AsyncCommandExecutionResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` - ProcessId int32 `protobuf:"varint,2,opt,name=processId,proto3" json:"processId,omitempty"` - ErrorMessage string `protobuf:"bytes,3,opt,name=errorMessage,proto3" json:"errorMessage,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` + ProcessId int32 `protobuf:"varint,2,opt,name=processId,proto3" json:"processId,omitempty"` + ErrorMessage string `protobuf:"bytes,3,opt,name=errorMessage,proto3" json:"errorMessage,omitempty"` } func (x *AsyncCommandExecutionResponse) Reset() { @@ -749,10 +762,11 @@ func (x *AsyncCommandExecutionResponse) GetErrorMessage() string { } type AsyncCommandListRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` } func (x *AsyncCommandListRequest) Reset() { @@ -793,11 +807,12 @@ func (x *AsyncCommandListRequest) GetExecutionId() string { } type AsyncCommand struct { - state protoimpl.MessageState `protogen:"open.v1"` - ProcessId int32 `protobuf:"varint,1,opt,name=processId,proto3" json:"processId,omitempty"` - Arguments []string `protobuf:"bytes,4,rep,name=arguments,proto3" json:"arguments,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ProcessId int32 `protobuf:"varint,1,opt,name=processId,proto3" json:"processId,omitempty"` + Arguments []string `protobuf:"bytes,4,rep,name=arguments,proto3" json:"arguments,omitempty"` } func (x *AsyncCommand) Reset() { @@ -845,11 +860,12 @@ func (x *AsyncCommand) GetArguments() []string { } type AsyncCommandListResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` - Commands []*AsyncCommand `protobuf:"bytes,2,rep,name=commands,proto3" json:"commands,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` + Commands []*AsyncCommand `protobuf:"bytes,2,rep,name=commands,proto3" json:"commands,omitempty"` } func (x *AsyncCommandListResponse) Reset() { @@ -897,11 +913,12 @@ func (x *AsyncCommandListResponse) GetCommands() []*AsyncCommand { } type AsyncCommandTerminateRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` - ProcessId int32 `protobuf:"varint,2,opt,name=processId,proto3" json:"processId,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` + ProcessId int32 `protobuf:"varint,2,opt,name=processId,proto3" json:"processId,omitempty"` } func (x *AsyncCommandTerminateRequest) Reset() { @@ -949,11 +966,12 @@ func (x *AsyncCommandTerminateRequest) GetProcessId() int32 { } type AsyncCommandTerminateResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` } func (x *AsyncCommandTerminateResponse) Reset() { @@ -1002,13 +1020,14 @@ func (x *AsyncCommandTerminateResponse) GetStatus() string { // server requesting the agent to execute a python script in the environment type PythonExecutionRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` - EnvName string `protobuf:"bytes,2,opt,name=envName,proto3" json:"envName,omitempty"` - WorkingDir string `protobuf:"bytes,3,opt,name=workingDir,proto3" json:"workingDir,omitempty"` - Code string `protobuf:"bytes,4,opt,name=code,proto3" json:"code,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` + EnvName string `protobuf:"bytes,2,opt,name=envName,proto3" json:"envName,omitempty"` + WorkingDir string `protobuf:"bytes,3,opt,name=workingDir,proto3" json:"workingDir,omitempty"` + Code string `protobuf:"bytes,4,opt,name=code,proto3" json:"code,omitempty"` } func (x *PythonExecutionRequest) Reset() { @@ -1070,11 +1089,12 @@ func (x *PythonExecutionRequest) GetCode() string { } type PythonExecutionResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` - ResponseString string `protobuf:"bytes,2,opt,name=responseString,proto3" json:"responseString,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` + ResponseString string `protobuf:"bytes,2,opt,name=responseString,proto3" json:"responseString,omitempty"` } func (x *PythonExecutionResponse) Reset() { @@ -1123,12 +1143,13 @@ func (x *PythonExecutionResponse) GetResponseString() string { // server requesting the agent to execute a jupyter notebook cell in the environment type JupyterExecutionRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` - EnvName string `protobuf:"bytes,2,opt,name=envName,proto3" json:"envName,omitempty"` - Code string `protobuf:"bytes,3,opt,name=code,proto3" json:"code,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` + EnvName string `protobuf:"bytes,2,opt,name=envName,proto3" json:"envName,omitempty"` + Code string `protobuf:"bytes,3,opt,name=code,proto3" json:"code,omitempty"` } func (x *JupyterExecutionRequest) Reset() { @@ -1183,11 +1204,12 @@ func (x *JupyterExecutionRequest) GetCode() string { } type JupyterExecutionResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` - ResponseString string `protobuf:"bytes,2,opt,name=responseString,proto3" json:"responseString,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` + ResponseString string `protobuf:"bytes,2,opt,name=responseString,proto3" json:"responseString,omitempty"` } func (x *JupyterExecutionResponse) Reset() { @@ -1236,11 +1258,12 @@ func (x *JupyterExecutionResponse) GetResponseString() string { // server requesting the agent to restart a jupyter kernel type KernelRestartRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` - EnvName string `protobuf:"bytes,2,opt,name=envName,proto3" json:"envName,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` + EnvName string `protobuf:"bytes,2,opt,name=envName,proto3" json:"envName,omitempty"` } func (x *KernelRestartRequest) Reset() { @@ -1288,11 +1311,12 @@ func (x *KernelRestartRequest) GetEnvName() string { } type KernelRestartResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` } func (x *KernelRestartResponse) Reset() { @@ -1341,16 +1365,17 @@ func (x *KernelRestartResponse) GetStatus() string { // server requesting the agent to create a ssh tunnel type TunnelCreationRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` - LocalPort int32 `protobuf:"varint,2,opt,name=localPort,proto3" json:"localPort,omitempty"` - LocalBindHost string `protobuf:"bytes,3,opt,name=localBindHost,proto3" json:"localBindHost,omitempty"` - TunnelServerHost string `protobuf:"bytes,4,opt,name=tunnelServerHost,proto3" json:"tunnelServerHost,omitempty"` - TunnelServerPort int32 `protobuf:"varint,5,opt,name=tunnelServerPort,proto3" json:"tunnelServerPort,omitempty"` - TunnelServerApiUrl string `protobuf:"bytes,6,opt,name=tunnelServerApiUrl,proto3" json:"tunnelServerApiUrl,omitempty"` - TunnelServerToken string `protobuf:"bytes,7,opt,name=tunnelServerToken,proto3" json:"tunnelServerToken,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` + LocalPort int32 `protobuf:"varint,2,opt,name=localPort,proto3" json:"localPort,omitempty"` + LocalBindHost string `protobuf:"bytes,3,opt,name=localBindHost,proto3" json:"localBindHost,omitempty"` + TunnelServerHost string `protobuf:"bytes,4,opt,name=tunnelServerHost,proto3" json:"tunnelServerHost,omitempty"` + TunnelServerPort int32 `protobuf:"varint,5,opt,name=tunnelServerPort,proto3" json:"tunnelServerPort,omitempty"` + TunnelServerApiUrl string `protobuf:"bytes,6,opt,name=tunnelServerApiUrl,proto3" json:"tunnelServerApiUrl,omitempty"` + TunnelServerToken string `protobuf:"bytes,7,opt,name=tunnelServerToken,proto3" json:"tunnelServerToken,omitempty"` } func (x *TunnelCreationRequest) Reset() { @@ -1433,14 +1458,15 @@ func (x *TunnelCreationRequest) GetTunnelServerToken() string { } type TunnelCreationResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` - TunnelHost string `protobuf:"bytes,3,opt,name=tunnelHost,proto3" json:"tunnelHost,omitempty"` - TunnelPort int32 `protobuf:"varint,4,opt,name=tunnelPort,proto3" json:"tunnelPort,omitempty"` - TunnelId string `protobuf:"bytes,5,opt,name=tunnelId,proto3" json:"tunnelId,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + TunnelHost string `protobuf:"bytes,3,opt,name=tunnelHost,proto3" json:"tunnelHost,omitempty"` + TunnelPort int32 `protobuf:"varint,4,opt,name=tunnelPort,proto3" json:"tunnelPort,omitempty"` + TunnelId string `protobuf:"bytes,5,opt,name=tunnelId,proto3" json:"tunnelId,omitempty"` } func (x *TunnelCreationResponse) Reset() { @@ -1510,11 +1536,12 @@ func (x *TunnelCreationResponse) GetTunnelId() string { // server requesting the agent to terminate a ssh tunnel type TunnelTerminationRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` - TunnelId string `protobuf:"bytes,2,opt,name=tunnelId,proto3" json:"tunnelId,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` + TunnelId string `protobuf:"bytes,2,opt,name=tunnelId,proto3" json:"tunnelId,omitempty"` } func (x *TunnelTerminationRequest) Reset() { @@ -1562,11 +1589,12 @@ func (x *TunnelTerminationRequest) GetTunnelId() string { } type TunnelTerminationResponse struct { - state protoimpl.MessageState `protogen:"open.v1"` - ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ExecutionId string `protobuf:"bytes,1,opt,name=executionId,proto3" json:"executionId,omitempty"` + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` } func (x *TunnelTerminationResponse) Reset() { @@ -1613,9 +1641,212 @@ func (x *TunnelTerminationResponse) GetStatus() string { return "" } +// Agent requesting the next job unit from the Job Workload +type RequestNextJobUnit struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AgentId string `protobuf:"bytes,1,opt,name=agent_id,json=agentId,proto3" json:"agent_id,omitempty"` +} + +func (x *RequestNextJobUnit) Reset() { + *x = RequestNextJobUnit{} + mi := &file_agent_communication_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RequestNextJobUnit) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RequestNextJobUnit) ProtoMessage() {} + +func (x *RequestNextJobUnit) ProtoReflect() protoreflect.Message { + mi := &file_agent_communication_proto_msgTypes[27] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RequestNextJobUnit.ProtoReflect.Descriptor instead. +func (*RequestNextJobUnit) Descriptor() ([]byte, []int) { + return file_agent_communication_proto_rawDescGZIP(), []int{27} +} + +func (x *RequestNextJobUnit) GetAgentId() string { + if x != nil { + return x.AgentId + } + return "" +} + +// Agent letting know the job unit is completed +type JobUnitCompleted struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + JobUnitId string `protobuf:"bytes,1,opt,name=job_unit_id,json=jobUnitId,proto3" json:"job_unit_id,omitempty"` + ExitCode int32 `protobuf:"varint,2,opt,name=exit_code,json=exitCode,proto3" json:"exit_code,omitempty"` +} + +func (x *JobUnitCompleted) Reset() { + *x = JobUnitCompleted{} + mi := &file_agent_communication_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *JobUnitCompleted) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JobUnitCompleted) ProtoMessage() {} + +func (x *JobUnitCompleted) ProtoReflect() protoreflect.Message { + mi := &file_agent_communication_proto_msgTypes[28] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use JobUnitCompleted.ProtoReflect.Descriptor instead. +func (*JobUnitCompleted) Descriptor() ([]byte, []int) { + return file_agent_communication_proto_rawDescGZIP(), []int{28} +} + +func (x *JobUnitCompleted) GetJobUnitId() string { + if x != nil { + return x.JobUnitId + } + return "" +} + +func (x *JobUnitCompleted) GetExitCode() int32 { + if x != nil { + return x.ExitCode + } + return 0 +} + +// Server assigning the job unit with the resolved command +type AssignJobUnit struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + JobUnitId string `protobuf:"bytes,1,opt,name=job_unit_id,json=jobUnitId,proto3" json:"job_unit_id,omitempty"` + ResolvedCommand string `protobuf:"bytes,2,opt,name=resolved_command,json=resolvedCommand,proto3" json:"resolved_command,omitempty"` +} + +func (x *AssignJobUnit) Reset() { + *x = AssignJobUnit{} + mi := &file_agent_communication_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AssignJobUnit) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AssignJobUnit) ProtoMessage() {} + +func (x *AssignJobUnit) ProtoReflect() protoreflect.Message { + mi := &file_agent_communication_proto_msgTypes[29] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AssignJobUnit.ProtoReflect.Descriptor instead. +func (*AssignJobUnit) Descriptor() ([]byte, []int) { + return file_agent_communication_proto_rawDescGZIP(), []int{29} +} + +func (x *AssignJobUnit) GetJobUnitId() string { + if x != nil { + return x.JobUnitId + } + return "" +} + +func (x *AssignJobUnit) GetResolvedCommand() string { + if x != nil { + return x.ResolvedCommand + } + return "" +} + +// Server indicating the agent that there are no job units to be consumed +type NoJobUnitAvailable struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Reason string `protobuf:"bytes,1,opt,name=reason,proto3" json:"reason,omitempty"` // "EMPTY" | "PREPARING" +} + +func (x *NoJobUnitAvailable) Reset() { + *x = NoJobUnitAvailable{} + mi := &file_agent_communication_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *NoJobUnitAvailable) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NoJobUnitAvailable) ProtoMessage() {} + +func (x *NoJobUnitAvailable) ProtoReflect() protoreflect.Message { + mi := &file_agent_communication_proto_msgTypes[30] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NoJobUnitAvailable.ProtoReflect.Descriptor instead. +func (*NoJobUnitAvailable) Descriptor() ([]byte, []int) { + return file_agent_communication_proto_rawDescGZIP(), []int{30} +} + +func (x *NoJobUnitAvailable) GetReason() string { + if x != nil { + return x.Reason + } + return "" +} + type AgentMessage struct { - state protoimpl.MessageState `protogen:"open.v1"` - // Types that are valid to be assigned to Message: + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Message: // // *AgentMessage_AgentPing // *AgentMessage_CreateAgentResponse @@ -1630,14 +1861,14 @@ type AgentMessage struct { // *AgentMessage_AsyncCommandExecutionResponse // *AgentMessage_AsyncCommandListResponse // *AgentMessage_AsyncCommandTerminateResponse - Message isAgentMessage_Message `protobuf_oneof:"message"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // *AgentMessage_RequestNextJobUnit + // *AgentMessage_JobUnitCompleted + Message isAgentMessage_Message `protobuf_oneof:"message"` } func (x *AgentMessage) Reset() { *x = AgentMessage{} - mi := &file_agent_communication_proto_msgTypes[27] + mi := &file_agent_communication_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1649,7 +1880,7 @@ func (x *AgentMessage) String() string { func (*AgentMessage) ProtoMessage() {} func (x *AgentMessage) ProtoReflect() protoreflect.Message { - mi := &file_agent_communication_proto_msgTypes[27] + mi := &file_agent_communication_proto_msgTypes[31] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1662,129 +1893,117 @@ func (x *AgentMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use AgentMessage.ProtoReflect.Descriptor instead. func (*AgentMessage) Descriptor() ([]byte, []int) { - return file_agent_communication_proto_rawDescGZIP(), []int{27} + return file_agent_communication_proto_rawDescGZIP(), []int{31} } -func (x *AgentMessage) GetMessage() isAgentMessage_Message { - if x != nil { - return x.Message +func (m *AgentMessage) GetMessage() isAgentMessage_Message { + if m != nil { + return m.Message } return nil } func (x *AgentMessage) GetAgentPing() *AgentPing { - if x != nil { - if x, ok := x.Message.(*AgentMessage_AgentPing); ok { - return x.AgentPing - } + if x, ok := x.GetMessage().(*AgentMessage_AgentPing); ok { + return x.AgentPing } return nil } func (x *AgentMessage) GetCreateAgentResponse() *CreateAgentResponse { - if x != nil { - if x, ok := x.Message.(*AgentMessage_CreateAgentResponse); ok { - return x.CreateAgentResponse - } + if x, ok := x.GetMessage().(*AgentMessage_CreateAgentResponse); ok { + return x.CreateAgentResponse } return nil } func (x *AgentMessage) GetTerminateAgentResponse() *TerminateAgentResponse { - if x != nil { - if x, ok := x.Message.(*AgentMessage_TerminateAgentResponse); ok { - return x.TerminateAgentResponse - } + if x, ok := x.GetMessage().(*AgentMessage_TerminateAgentResponse); ok { + return x.TerminateAgentResponse } return nil } func (x *AgentMessage) GetEnvSetupResponse() *EnvSetupResponse { - if x != nil { - if x, ok := x.Message.(*AgentMessage_EnvSetupResponse); ok { - return x.EnvSetupResponse - } + if x, ok := x.GetMessage().(*AgentMessage_EnvSetupResponse); ok { + return x.EnvSetupResponse } return nil } func (x *AgentMessage) GetCommandExecutionResponse() *CommandExecutionResponse { - if x != nil { - if x, ok := x.Message.(*AgentMessage_CommandExecutionResponse); ok { - return x.CommandExecutionResponse - } + if x, ok := x.GetMessage().(*AgentMessage_CommandExecutionResponse); ok { + return x.CommandExecutionResponse } return nil } func (x *AgentMessage) GetPythonExecutionResponse() *PythonExecutionResponse { - if x != nil { - if x, ok := x.Message.(*AgentMessage_PythonExecutionResponse); ok { - return x.PythonExecutionResponse - } + if x, ok := x.GetMessage().(*AgentMessage_PythonExecutionResponse); ok { + return x.PythonExecutionResponse } return nil } func (x *AgentMessage) GetJupyterExecutionResponse() *JupyterExecutionResponse { - if x != nil { - if x, ok := x.Message.(*AgentMessage_JupyterExecutionResponse); ok { - return x.JupyterExecutionResponse - } + if x, ok := x.GetMessage().(*AgentMessage_JupyterExecutionResponse); ok { + return x.JupyterExecutionResponse } return nil } func (x *AgentMessage) GetKernelRestartResponse() *KernelRestartResponse { - if x != nil { - if x, ok := x.Message.(*AgentMessage_KernelRestartResponse); ok { - return x.KernelRestartResponse - } + if x, ok := x.GetMessage().(*AgentMessage_KernelRestartResponse); ok { + return x.KernelRestartResponse } return nil } func (x *AgentMessage) GetTunnelCreationResponse() *TunnelCreationResponse { - if x != nil { - if x, ok := x.Message.(*AgentMessage_TunnelCreationResponse); ok { - return x.TunnelCreationResponse - } + if x, ok := x.GetMessage().(*AgentMessage_TunnelCreationResponse); ok { + return x.TunnelCreationResponse } return nil } func (x *AgentMessage) GetTunnelTerminationResponse() *TunnelTerminationResponse { - if x != nil { - if x, ok := x.Message.(*AgentMessage_TunnelTerminationResponse); ok { - return x.TunnelTerminationResponse - } + if x, ok := x.GetMessage().(*AgentMessage_TunnelTerminationResponse); ok { + return x.TunnelTerminationResponse } return nil } func (x *AgentMessage) GetAsyncCommandExecutionResponse() *AsyncCommandExecutionResponse { - if x != nil { - if x, ok := x.Message.(*AgentMessage_AsyncCommandExecutionResponse); ok { - return x.AsyncCommandExecutionResponse - } + if x, ok := x.GetMessage().(*AgentMessage_AsyncCommandExecutionResponse); ok { + return x.AsyncCommandExecutionResponse } return nil } func (x *AgentMessage) GetAsyncCommandListResponse() *AsyncCommandListResponse { - if x != nil { - if x, ok := x.Message.(*AgentMessage_AsyncCommandListResponse); ok { - return x.AsyncCommandListResponse - } + if x, ok := x.GetMessage().(*AgentMessage_AsyncCommandListResponse); ok { + return x.AsyncCommandListResponse } return nil } func (x *AgentMessage) GetAsyncCommandTerminateResponse() *AsyncCommandTerminateResponse { - if x != nil { - if x, ok := x.Message.(*AgentMessage_AsyncCommandTerminateResponse); ok { - return x.AsyncCommandTerminateResponse - } + if x, ok := x.GetMessage().(*AgentMessage_AsyncCommandTerminateResponse); ok { + return x.AsyncCommandTerminateResponse + } + return nil +} + +func (x *AgentMessage) GetRequestNextJobUnit() *RequestNextJobUnit { + if x, ok := x.GetMessage().(*AgentMessage_RequestNextJobUnit); ok { + return x.RequestNextJobUnit + } + return nil +} + +func (x *AgentMessage) GetJobUnitCompleted() *JobUnitCompleted { + if x, ok := x.GetMessage().(*AgentMessage_JobUnitCompleted); ok { + return x.JobUnitCompleted } return nil } @@ -1845,6 +2064,14 @@ type AgentMessage_AsyncCommandTerminateResponse struct { AsyncCommandTerminateResponse *AsyncCommandTerminateResponse `protobuf:"bytes,13,opt,name=asyncCommandTerminateResponse,proto3,oneof"` } +type AgentMessage_RequestNextJobUnit struct { + RequestNextJobUnit *RequestNextJobUnit `protobuf:"bytes,20,opt,name=requestNextJobUnit,proto3,oneof"` +} + +type AgentMessage_JobUnitCompleted struct { + JobUnitCompleted *JobUnitCompleted `protobuf:"bytes,21,opt,name=jobUnitCompleted,proto3,oneof"` +} + func (*AgentMessage_AgentPing) isAgentMessage_Message() {} func (*AgentMessage_CreateAgentResponse) isAgentMessage_Message() {} @@ -1871,9 +2098,16 @@ func (*AgentMessage_AsyncCommandListResponse) isAgentMessage_Message() {} func (*AgentMessage_AsyncCommandTerminateResponse) isAgentMessage_Message() {} +func (*AgentMessage_RequestNextJobUnit) isAgentMessage_Message() {} + +func (*AgentMessage_JobUnitCompleted) isAgentMessage_Message() {} + type ServerMessage struct { - state protoimpl.MessageState `protogen:"open.v1"` - // Types that are valid to be assigned to Message: + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Message: // // *ServerMessage_ShutdownRequest // *ServerMessage_CreateAgentRequest @@ -1888,14 +2122,14 @@ type ServerMessage struct { // *ServerMessage_AsyncCommandExecutionRequest // *ServerMessage_AsyncCommandListRequest // *ServerMessage_AsyncCommandTerminateRequest - Message isServerMessage_Message `protobuf_oneof:"message"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // *ServerMessage_AssignJobUnit + // *ServerMessage_NoJobUnitAvailable + Message isServerMessage_Message `protobuf_oneof:"message"` } func (x *ServerMessage) Reset() { *x = ServerMessage{} - mi := &file_agent_communication_proto_msgTypes[28] + mi := &file_agent_communication_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1907,7 +2141,7 @@ func (x *ServerMessage) String() string { func (*ServerMessage) ProtoMessage() {} func (x *ServerMessage) ProtoReflect() protoreflect.Message { - mi := &file_agent_communication_proto_msgTypes[28] + mi := &file_agent_communication_proto_msgTypes[32] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1920,129 +2154,117 @@ func (x *ServerMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use ServerMessage.ProtoReflect.Descriptor instead. func (*ServerMessage) Descriptor() ([]byte, []int) { - return file_agent_communication_proto_rawDescGZIP(), []int{28} + return file_agent_communication_proto_rawDescGZIP(), []int{32} } -func (x *ServerMessage) GetMessage() isServerMessage_Message { - if x != nil { - return x.Message +func (m *ServerMessage) GetMessage() isServerMessage_Message { + if m != nil { + return m.Message } return nil } func (x *ServerMessage) GetShutdownRequest() *ShutdownRequest { - if x != nil { - if x, ok := x.Message.(*ServerMessage_ShutdownRequest); ok { - return x.ShutdownRequest - } + if x, ok := x.GetMessage().(*ServerMessage_ShutdownRequest); ok { + return x.ShutdownRequest } return nil } func (x *ServerMessage) GetCreateAgentRequest() *CreateAgentRequest { - if x != nil { - if x, ok := x.Message.(*ServerMessage_CreateAgentRequest); ok { - return x.CreateAgentRequest - } + if x, ok := x.GetMessage().(*ServerMessage_CreateAgentRequest); ok { + return x.CreateAgentRequest } return nil } func (x *ServerMessage) GetTerminateAgentRequest() *TerminateAgentRequest { - if x != nil { - if x, ok := x.Message.(*ServerMessage_TerminateAgentRequest); ok { - return x.TerminateAgentRequest - } + if x, ok := x.GetMessage().(*ServerMessage_TerminateAgentRequest); ok { + return x.TerminateAgentRequest } return nil } func (x *ServerMessage) GetEnvSetupRequest() *EnvSetupRequest { - if x != nil { - if x, ok := x.Message.(*ServerMessage_EnvSetupRequest); ok { - return x.EnvSetupRequest - } + if x, ok := x.GetMessage().(*ServerMessage_EnvSetupRequest); ok { + return x.EnvSetupRequest } return nil } func (x *ServerMessage) GetCommandExecutionRequest() *CommandExecutionRequest { - if x != nil { - if x, ok := x.Message.(*ServerMessage_CommandExecutionRequest); ok { - return x.CommandExecutionRequest - } + if x, ok := x.GetMessage().(*ServerMessage_CommandExecutionRequest); ok { + return x.CommandExecutionRequest } return nil } func (x *ServerMessage) GetPythonExecutionRequest() *PythonExecutionRequest { - if x != nil { - if x, ok := x.Message.(*ServerMessage_PythonExecutionRequest); ok { - return x.PythonExecutionRequest - } + if x, ok := x.GetMessage().(*ServerMessage_PythonExecutionRequest); ok { + return x.PythonExecutionRequest } return nil } func (x *ServerMessage) GetJupyterExecutionRequest() *JupyterExecutionRequest { - if x != nil { - if x, ok := x.Message.(*ServerMessage_JupyterExecutionRequest); ok { - return x.JupyterExecutionRequest - } + if x, ok := x.GetMessage().(*ServerMessage_JupyterExecutionRequest); ok { + return x.JupyterExecutionRequest } return nil } func (x *ServerMessage) GetKernelRestartRequest() *KernelRestartRequest { - if x != nil { - if x, ok := x.Message.(*ServerMessage_KernelRestartRequest); ok { - return x.KernelRestartRequest - } + if x, ok := x.GetMessage().(*ServerMessage_KernelRestartRequest); ok { + return x.KernelRestartRequest } return nil } func (x *ServerMessage) GetTunnelCreationRequest() *TunnelCreationRequest { - if x != nil { - if x, ok := x.Message.(*ServerMessage_TunnelCreationRequest); ok { - return x.TunnelCreationRequest - } + if x, ok := x.GetMessage().(*ServerMessage_TunnelCreationRequest); ok { + return x.TunnelCreationRequest } return nil } func (x *ServerMessage) GetTunnelTerminationRequest() *TunnelTerminationRequest { - if x != nil { - if x, ok := x.Message.(*ServerMessage_TunnelTerminationRequest); ok { - return x.TunnelTerminationRequest - } + if x, ok := x.GetMessage().(*ServerMessage_TunnelTerminationRequest); ok { + return x.TunnelTerminationRequest } return nil } func (x *ServerMessage) GetAsyncCommandExecutionRequest() *AsyncCommandExecutionRequest { - if x != nil { - if x, ok := x.Message.(*ServerMessage_AsyncCommandExecutionRequest); ok { - return x.AsyncCommandExecutionRequest - } + if x, ok := x.GetMessage().(*ServerMessage_AsyncCommandExecutionRequest); ok { + return x.AsyncCommandExecutionRequest } return nil } func (x *ServerMessage) GetAsyncCommandListRequest() *AsyncCommandListRequest { - if x != nil { - if x, ok := x.Message.(*ServerMessage_AsyncCommandListRequest); ok { - return x.AsyncCommandListRequest - } + if x, ok := x.GetMessage().(*ServerMessage_AsyncCommandListRequest); ok { + return x.AsyncCommandListRequest } return nil } func (x *ServerMessage) GetAsyncCommandTerminateRequest() *AsyncCommandTerminateRequest { - if x != nil { - if x, ok := x.Message.(*ServerMessage_AsyncCommandTerminateRequest); ok { - return x.AsyncCommandTerminateRequest - } + if x, ok := x.GetMessage().(*ServerMessage_AsyncCommandTerminateRequest); ok { + return x.AsyncCommandTerminateRequest + } + return nil +} + +func (x *ServerMessage) GetAssignJobUnit() *AssignJobUnit { + if x, ok := x.GetMessage().(*ServerMessage_AssignJobUnit); ok { + return x.AssignJobUnit + } + return nil +} + +func (x *ServerMessage) GetNoJobUnitAvailable() *NoJobUnitAvailable { + if x, ok := x.GetMessage().(*ServerMessage_NoJobUnitAvailable); ok { + return x.NoJobUnitAvailable } return nil } @@ -2103,6 +2325,14 @@ type ServerMessage_AsyncCommandTerminateRequest struct { AsyncCommandTerminateRequest *AsyncCommandTerminateRequest `protobuf:"bytes,13,opt,name=asyncCommandTerminateRequest,proto3,oneof"` } +type ServerMessage_AssignJobUnit struct { + AssignJobUnit *AssignJobUnit `protobuf:"bytes,20,opt,name=assignJobUnit,proto3,oneof"` +} + +type ServerMessage_NoJobUnitAvailable struct { + NoJobUnitAvailable *NoJobUnitAvailable `protobuf:"bytes,21,opt,name=noJobUnitAvailable,proto3,oneof"` +} + func (*ServerMessage_ShutdownRequest) isServerMessage_Message() {} func (*ServerMessage_CreateAgentRequest) isServerMessage_Message() {} @@ -2129,173 +2359,455 @@ func (*ServerMessage_AsyncCommandListRequest) isServerMessage_Message() {} func (*ServerMessage_AsyncCommandTerminateRequest) isServerMessage_Message() {} +func (*ServerMessage_AssignJobUnit) isServerMessage_Message() {} + +func (*ServerMessage_NoJobUnitAvailable) isServerMessage_Message() {} + var File_agent_communication_proto protoreflect.FileDescriptor -const file_agent_communication_proto_rawDesc = "" + - "\n" + - "\x19agent-communication.proto\x12\x19org.apache.airavata.agent\"%\n" + - "\tAgentPing\x12\x18\n" + - "\aagentId\x18\x01 \x01(\tR\aagentId\"+\n" + - "\x0fShutdownRequest\x12\x18\n" + - "\aagentId\x18\x01 \x01(\tR\aagentId\"\xaa\x01\n" + - "\x12CreateAgentRequest\x12 \n" + - "\vexecutionId\x18\x01 \x01(\tR\vexecutionId\x12\x18\n" + - "\aagentId\x18\x02 \x01(\tR\aagentId\x12 \n" + - "\vcontainerId\x18\x03 \x01(\tR\vcontainerId\x12\x1e\n" + - "\n" + - "workingDir\x18\x04 \x01(\tR\n" + - "workingDir\x12\x16\n" + - "\x06mounts\x18\x05 \x03(\tR\x06mounts\"i\n" + - "\x13CreateAgentResponse\x12 \n" + - "\vexecutionId\x18\x01 \x01(\tR\vexecutionId\x12\x18\n" + - "\aagentId\x18\x02 \x01(\tR\aagentId\x12\x16\n" + - "\x06status\x18\x03 \x01(\tR\x06status\"S\n" + - "\x15TerminateAgentRequest\x12 \n" + - "\vexecutionId\x18\x01 \x01(\tR\vexecutionId\x12\x18\n" + - "\aagentId\x18\x02 \x01(\tR\aagentId\"l\n" + - "\x16TerminateAgentResponse\x12 \n" + - "\vexecutionId\x18\x01 \x01(\tR\vexecutionId\x12\x18\n" + - "\aagentId\x18\x02 \x01(\tR\aagentId\x12\x16\n" + - "\x06status\x18\x03 \x01(\tR\x06status\"}\n" + - "\x0fEnvSetupRequest\x12 \n" + - "\vexecutionId\x18\x01 \x01(\tR\vexecutionId\x12\x18\n" + - "\aenvName\x18\x02 \x01(\tR\aenvName\x12\x1c\n" + - "\tlibraries\x18\x03 \x03(\tR\tlibraries\x12\x10\n" + - "\x03pip\x18\x04 \x03(\tR\x03pip\"L\n" + - "\x10EnvSetupResponse\x12 \n" + - "\vexecutionId\x18\x01 \x01(\tR\vexecutionId\x12\x16\n" + - "\x06status\x18\x02 \x01(\tR\x06status\"\x93\x01\n" + - "\x17CommandExecutionRequest\x12 \n" + - "\vexecutionId\x18\x01 \x01(\tR\vexecutionId\x12\x18\n" + - "\aenvName\x18\x02 \x01(\tR\aenvName\x12\x1e\n" + - "\n" + - "workingDir\x18\x03 \x01(\tR\n" + - "workingDir\x12\x1c\n" + - "\targuments\x18\x04 \x03(\tR\targuments\"d\n" + - "\x18CommandExecutionResponse\x12 \n" + - "\vexecutionId\x18\x01 \x01(\tR\vexecutionId\x12&\n" + - "\x0eresponseString\x18\x02 \x01(\tR\x0eresponseString\"\x98\x01\n" + - "\x1cAsyncCommandExecutionRequest\x12 \n" + - "\vexecutionId\x18\x01 \x01(\tR\vexecutionId\x12\x18\n" + - "\aenvName\x18\x02 \x01(\tR\aenvName\x12\x1e\n" + - "\n" + - "workingDir\x18\x03 \x01(\tR\n" + - "workingDir\x12\x1c\n" + - "\targuments\x18\x04 \x03(\tR\targuments\"\x83\x01\n" + - "\x1dAsyncCommandExecutionResponse\x12 \n" + - "\vexecutionId\x18\x01 \x01(\tR\vexecutionId\x12\x1c\n" + - "\tprocessId\x18\x02 \x01(\x05R\tprocessId\x12\"\n" + - "\ferrorMessage\x18\x03 \x01(\tR\ferrorMessage\";\n" + - "\x17AsyncCommandListRequest\x12 \n" + - "\vexecutionId\x18\x01 \x01(\tR\vexecutionId\"J\n" + - "\fAsyncCommand\x12\x1c\n" + - "\tprocessId\x18\x01 \x01(\x05R\tprocessId\x12\x1c\n" + - "\targuments\x18\x04 \x03(\tR\targuments\"\x81\x01\n" + - "\x18AsyncCommandListResponse\x12 \n" + - "\vexecutionId\x18\x01 \x01(\tR\vexecutionId\x12C\n" + - "\bcommands\x18\x02 \x03(\v2'.org.apache.airavata.agent.AsyncCommandR\bcommands\"^\n" + - "\x1cAsyncCommandTerminateRequest\x12 \n" + - "\vexecutionId\x18\x01 \x01(\tR\vexecutionId\x12\x1c\n" + - "\tprocessId\x18\x02 \x01(\x05R\tprocessId\"Y\n" + - "\x1dAsyncCommandTerminateResponse\x12 \n" + - "\vexecutionId\x18\x01 \x01(\tR\vexecutionId\x12\x16\n" + - "\x06status\x18\x02 \x01(\tR\x06status\"\x88\x01\n" + - "\x16PythonExecutionRequest\x12 \n" + - "\vexecutionId\x18\x01 \x01(\tR\vexecutionId\x12\x18\n" + - "\aenvName\x18\x02 \x01(\tR\aenvName\x12\x1e\n" + - "\n" + - "workingDir\x18\x03 \x01(\tR\n" + - "workingDir\x12\x12\n" + - "\x04code\x18\x04 \x01(\tR\x04code\"c\n" + - "\x17PythonExecutionResponse\x12 \n" + - "\vexecutionId\x18\x01 \x01(\tR\vexecutionId\x12&\n" + - "\x0eresponseString\x18\x02 \x01(\tR\x0eresponseString\"i\n" + - "\x17JupyterExecutionRequest\x12 \n" + - "\vexecutionId\x18\x01 \x01(\tR\vexecutionId\x12\x18\n" + - "\aenvName\x18\x02 \x01(\tR\aenvName\x12\x12\n" + - "\x04code\x18\x03 \x01(\tR\x04code\"d\n" + - "\x18JupyterExecutionResponse\x12 \n" + - "\vexecutionId\x18\x01 \x01(\tR\vexecutionId\x12&\n" + - "\x0eresponseString\x18\x02 \x01(\tR\x0eresponseString\"R\n" + - "\x14KernelRestartRequest\x12 \n" + - "\vexecutionId\x18\x01 \x01(\tR\vexecutionId\x12\x18\n" + - "\aenvName\x18\x02 \x01(\tR\aenvName\"Q\n" + - "\x15KernelRestartResponse\x12 \n" + - "\vexecutionId\x18\x01 \x01(\tR\vexecutionId\x12\x16\n" + - "\x06status\x18\x02 \x01(\tR\x06status\"\xb3\x02\n" + - "\x15TunnelCreationRequest\x12 \n" + - "\vexecutionId\x18\x01 \x01(\tR\vexecutionId\x12\x1c\n" + - "\tlocalPort\x18\x02 \x01(\x05R\tlocalPort\x12$\n" + - "\rlocalBindHost\x18\x03 \x01(\tR\rlocalBindHost\x12*\n" + - "\x10tunnelServerHost\x18\x04 \x01(\tR\x10tunnelServerHost\x12*\n" + - "\x10tunnelServerPort\x18\x05 \x01(\x05R\x10tunnelServerPort\x12.\n" + - "\x12tunnelServerApiUrl\x18\x06 \x01(\tR\x12tunnelServerApiUrl\x12,\n" + - "\x11tunnelServerToken\x18\a \x01(\tR\x11tunnelServerToken\"\xae\x01\n" + - "\x16TunnelCreationResponse\x12 \n" + - "\vexecutionId\x18\x01 \x01(\tR\vexecutionId\x12\x16\n" + - "\x06status\x18\x02 \x01(\tR\x06status\x12\x1e\n" + - "\n" + - "tunnelHost\x18\x03 \x01(\tR\n" + - "tunnelHost\x12\x1e\n" + - "\n" + - "tunnelPort\x18\x04 \x01(\x05R\n" + - "tunnelPort\x12\x1a\n" + - "\btunnelId\x18\x05 \x01(\tR\btunnelId\"X\n" + - "\x18TunnelTerminationRequest\x12 \n" + - "\vexecutionId\x18\x01 \x01(\tR\vexecutionId\x12\x1a\n" + - "\btunnelId\x18\x02 \x01(\tR\btunnelId\"U\n" + - "\x19TunnelTerminationResponse\x12 \n" + - "\vexecutionId\x18\x01 \x01(\tR\vexecutionId\x12\x16\n" + - "\x06status\x18\x02 \x01(\tR\x06status\"\xa7\v\n" + - "\fAgentMessage\x12D\n" + - "\tagentPing\x18\x01 \x01(\v2$.org.apache.airavata.agent.AgentPingH\x00R\tagentPing\x12b\n" + - "\x13createAgentResponse\x18\x02 \x01(\v2..org.apache.airavata.agent.CreateAgentResponseH\x00R\x13createAgentResponse\x12k\n" + - "\x16terminateAgentResponse\x18\x03 \x01(\v21.org.apache.airavata.agent.TerminateAgentResponseH\x00R\x16terminateAgentResponse\x12Y\n" + - "\x10envSetupResponse\x18\x04 \x01(\v2+.org.apache.airavata.agent.EnvSetupResponseH\x00R\x10envSetupResponse\x12q\n" + - "\x18commandExecutionResponse\x18\x05 \x01(\v23.org.apache.airavata.agent.CommandExecutionResponseH\x00R\x18commandExecutionResponse\x12n\n" + - "\x17pythonExecutionResponse\x18\x06 \x01(\v22.org.apache.airavata.agent.PythonExecutionResponseH\x00R\x17pythonExecutionResponse\x12q\n" + - "\x18jupyterExecutionResponse\x18\a \x01(\v23.org.apache.airavata.agent.JupyterExecutionResponseH\x00R\x18jupyterExecutionResponse\x12h\n" + - "\x15kernelRestartResponse\x18\b \x01(\v20.org.apache.airavata.agent.KernelRestartResponseH\x00R\x15kernelRestartResponse\x12k\n" + - "\x16tunnelCreationResponse\x18\t \x01(\v21.org.apache.airavata.agent.TunnelCreationResponseH\x00R\x16tunnelCreationResponse\x12t\n" + - "\x19tunnelTerminationResponse\x18\n" + - " \x01(\v24.org.apache.airavata.agent.TunnelTerminationResponseH\x00R\x19tunnelTerminationResponse\x12\x80\x01\n" + - "\x1dasyncCommandExecutionResponse\x18\v \x01(\v28.org.apache.airavata.agent.AsyncCommandExecutionResponseH\x00R\x1dasyncCommandExecutionResponse\x12q\n" + - "\x18asyncCommandListResponse\x18\f \x01(\v23.org.apache.airavata.agent.AsyncCommandListResponseH\x00R\x18asyncCommandListResponse\x12\x80\x01\n" + - "\x1dasyncCommandTerminateResponse\x18\r \x01(\v28.org.apache.airavata.agent.AsyncCommandTerminateResponseH\x00R\x1dasyncCommandTerminateResponseB\t\n" + - "\amessage\"\x94\v\n" + - "\rServerMessage\x12V\n" + - "\x0fshutdownRequest\x18\x01 \x01(\v2*.org.apache.airavata.agent.ShutdownRequestH\x00R\x0fshutdownRequest\x12_\n" + - "\x12createAgentRequest\x18\x02 \x01(\v2-.org.apache.airavata.agent.CreateAgentRequestH\x00R\x12createAgentRequest\x12h\n" + - "\x15terminateAgentRequest\x18\x03 \x01(\v20.org.apache.airavata.agent.TerminateAgentRequestH\x00R\x15terminateAgentRequest\x12V\n" + - "\x0fenvSetupRequest\x18\x04 \x01(\v2*.org.apache.airavata.agent.EnvSetupRequestH\x00R\x0fenvSetupRequest\x12n\n" + - "\x17commandExecutionRequest\x18\x05 \x01(\v22.org.apache.airavata.agent.CommandExecutionRequestH\x00R\x17commandExecutionRequest\x12k\n" + - "\x16pythonExecutionRequest\x18\x06 \x01(\v21.org.apache.airavata.agent.PythonExecutionRequestH\x00R\x16pythonExecutionRequest\x12n\n" + - "\x17jupyterExecutionRequest\x18\a \x01(\v22.org.apache.airavata.agent.JupyterExecutionRequestH\x00R\x17jupyterExecutionRequest\x12e\n" + - "\x14kernelRestartRequest\x18\b \x01(\v2/.org.apache.airavata.agent.KernelRestartRequestH\x00R\x14kernelRestartRequest\x12h\n" + - "\x15tunnelCreationRequest\x18\t \x01(\v20.org.apache.airavata.agent.TunnelCreationRequestH\x00R\x15tunnelCreationRequest\x12q\n" + - "\x18tunnelTerminationRequest\x18\n" + - " \x01(\v23.org.apache.airavata.agent.TunnelTerminationRequestH\x00R\x18tunnelTerminationRequest\x12}\n" + - "\x1casyncCommandExecutionRequest\x18\v \x01(\v27.org.apache.airavata.agent.AsyncCommandExecutionRequestH\x00R\x1casyncCommandExecutionRequest\x12n\n" + - "\x17asyncCommandListRequest\x18\f \x01(\v22.org.apache.airavata.agent.AsyncCommandListRequestH\x00R\x17asyncCommandListRequest\x12}\n" + - "\x1casyncCommandTerminateRequest\x18\r \x01(\v27.org.apache.airavata.agent.AsyncCommandTerminateRequestH\x00R\x1casyncCommandTerminateRequestB\t\n" + - "\amessage2\x86\x01\n" + - "\x19AgentCommunicationService\x12i\n" + - "\x10createMessageBus\x12'.org.apache.airavata.agent.AgentMessage\x1a(.org.apache.airavata.agent.ServerMessage(\x010\x01B?\n" + - "\x19org.apache.airavata.agentB\x17AgentCommunicationProtoP\x01Z\aprotos/b\x06proto3" +var file_agent_communication_proto_rawDesc = []byte{ + 0x0a, 0x19, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, 0x6f, 0x72, 0x67, + 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 0x61, + 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x22, 0x25, 0x0a, 0x09, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, + 0x69, 0x6e, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x2b, 0x0a, + 0x0f, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xaa, 0x01, 0x0a, 0x12, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, + 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x12, + 0x1e, 0x0a, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x72, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x72, 0x12, + 0x16, 0x0a, 0x06, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x06, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x22, 0x69, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, + 0x0a, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x22, 0x53, 0x0a, 0x15, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x18, 0x0a, + 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x6c, 0x0a, 0x16, 0x54, 0x65, 0x72, 0x6d, 0x69, + 0x6e, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x7d, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x53, 0x65, 0x74, 0x75, + 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, + 0x76, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x6e, 0x76, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, 0x65, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x69, + 0x65, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x03, 0x70, 0x69, 0x70, 0x22, 0x4c, 0x0a, 0x10, 0x45, 0x6e, 0x76, 0x53, 0x65, 0x74, 0x75, 0x70, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x22, 0x93, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x45, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, + 0x0a, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x76, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x65, 0x6e, 0x76, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x77, 0x6f, + 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x64, 0x0a, 0x18, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x98, + 0x01, 0x0a, 0x1c, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x45, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x20, 0x0a, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x76, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x65, 0x6e, 0x76, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x77, + 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x83, 0x01, 0x0a, 0x1d, 0x41, 0x73, + 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1c, 0x0a, + 0x09, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x09, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, + 0x3b, 0x0a, 0x17, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x4a, 0x0a, 0x0c, + 0x41, 0x73, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x1c, 0x0a, 0x09, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x09, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x81, 0x01, 0x0a, 0x18, 0x41, 0x73, 0x79, + 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6f, 0x72, 0x67, 0x2e, + 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 0x61, 0x2e, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x5e, 0x0a, 0x1c, + 0x41, 0x73, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x65, 0x72, 0x6d, + 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1c, + 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x49, 0x64, 0x22, 0x59, 0x0a, 0x1d, + 0x41, 0x73, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x65, 0x72, 0x6d, + 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, + 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x88, 0x01, 0x0a, 0x16, 0x50, 0x79, 0x74, 0x68, + 0x6f, 0x6e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x76, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x6e, 0x76, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, + 0x0a, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x72, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x72, 0x12, 0x12, + 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, + 0x64, 0x65, 0x22, 0x63, 0x0a, 0x17, 0x50, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x45, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, + 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, + 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x69, 0x0a, 0x17, 0x4a, 0x75, 0x70, 0x79, 0x74, + 0x65, 0x72, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x76, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x6e, 0x76, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x6f, + 0x64, 0x65, 0x22, 0x64, 0x0a, 0x18, 0x4a, 0x75, 0x70, 0x79, 0x74, 0x65, 0x72, 0x45, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, + 0x0a, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x52, 0x0a, 0x14, 0x4b, 0x65, 0x72, 0x6e, + 0x65, 0x6c, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x76, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x6e, 0x76, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x51, 0x0a, 0x15, + 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, + 0xb3, 0x02, 0x0a, 0x15, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x42, 0x69, 0x6e, 0x64, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x42, 0x69, 0x6e, 0x64, 0x48, 0x6f, 0x73, 0x74, 0x12, + 0x2a, 0x0a, 0x10, 0x74, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, + 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x74, 0x75, 0x6e, 0x6e, 0x65, + 0x6c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x74, + 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x74, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x2e, 0x0a, 0x12, 0x74, 0x75, 0x6e, 0x6e, 0x65, + 0x6c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x41, 0x70, 0x69, 0x55, 0x72, 0x6c, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x12, 0x74, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x41, 0x70, 0x69, 0x55, 0x72, 0x6c, 0x12, 0x2c, 0x0a, 0x11, 0x74, 0x75, 0x6e, 0x6e, 0x65, + 0x6c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x11, 0x74, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xae, 0x01, 0x0a, 0x16, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x75, + 0x6e, 0x6e, 0x65, 0x6c, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x74, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x75, + 0x6e, 0x6e, 0x65, 0x6c, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, + 0x74, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x75, + 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x75, + 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x22, 0x58, 0x0a, 0x18, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, + 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, + 0x22, 0x55, 0x0a, 0x19, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, + 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x2f, 0x0a, 0x12, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x4e, 0x65, 0x78, 0x74, 0x4a, 0x6f, 0x62, 0x55, 0x6e, 0x69, 0x74, 0x12, 0x19, 0x0a, + 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x4f, 0x0a, 0x10, 0x4a, 0x6f, 0x62, 0x55, + 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0b, + 0x6a, 0x6f, 0x62, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x6a, 0x6f, 0x62, 0x55, 0x6e, 0x69, 0x74, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, + 0x65, 0x78, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x08, 0x65, 0x78, 0x69, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x5a, 0x0a, 0x0d, 0x41, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x4a, 0x6f, 0x62, 0x55, 0x6e, 0x69, 0x74, 0x12, 0x1e, 0x0a, 0x0b, 0x6a, 0x6f, + 0x62, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x6a, 0x6f, 0x62, 0x55, 0x6e, 0x69, 0x74, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, + 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x64, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0x2c, 0x0a, 0x12, 0x4e, 0x6f, 0x4a, 0x6f, 0x62, 0x55, 0x6e, + 0x69, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, + 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, + 0x73, 0x6f, 0x6e, 0x22, 0xe3, 0x0c, 0x0a, 0x0c, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x44, 0x0a, 0x09, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x69, 0x6e, + 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, + 0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, + 0x09, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x62, 0x0a, 0x13, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, + 0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x13, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6b, + 0x0a, 0x16, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, + 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, + 0x76, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, + 0x6e, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x48, 0x00, 0x52, 0x16, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x59, 0x0a, 0x10, 0x65, + 0x6e, 0x76, 0x53, 0x65, 0x74, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, + 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x2e, 0x45, 0x6e, 0x76, 0x53, 0x65, 0x74, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x48, 0x00, 0x52, 0x10, 0x65, 0x6e, 0x76, 0x53, 0x65, 0x74, 0x75, 0x70, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x71, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, + 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 0x61, 0x2e, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x45, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, + 0x18, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6e, 0x0a, 0x17, 0x70, 0x79, 0x74, + 0x68, 0x6f, 0x6e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x6f, 0x72, 0x67, + 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 0x61, + 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x45, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, + 0x52, 0x17, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x71, 0x0a, 0x18, 0x6a, 0x75, 0x70, + 0x79, 0x74, 0x65, 0x72, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x6f, 0x72, + 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, + 0x61, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x75, 0x70, 0x79, 0x74, 0x65, 0x72, 0x45, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x48, 0x00, 0x52, 0x18, 0x6a, 0x75, 0x70, 0x79, 0x74, 0x65, 0x72, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x68, 0x0a, 0x15, + 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x6f, 0x72, + 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, + 0x61, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x52, 0x65, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, + 0x15, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6b, 0x0a, 0x16, 0x74, 0x75, 0x6e, 0x6e, 0x65, 0x6c, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, + 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x16, 0x74, 0x75, 0x6e, + 0x6e, 0x65, 0x6c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a, 0x19, 0x74, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, + 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, + 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x19, + 0x74, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x80, 0x01, 0x0a, 0x1d, 0x61, 0x73, + 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, + 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x73, + 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x1d, 0x61, + 0x73, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x71, 0x0a, 0x18, + 0x61, 0x73, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, + 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, + 0x76, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x73, 0x79, 0x6e, 0x63, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x18, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x80, 0x01, 0x0a, 0x1d, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, + 0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x48, 0x00, 0x52, 0x1d, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x12, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4e, 0x65, 0x78, + 0x74, 0x4a, 0x6f, 0x62, 0x55, 0x6e, 0x69, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, + 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, + 0x76, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x4e, 0x65, 0x78, 0x74, 0x4a, 0x6f, 0x62, 0x55, 0x6e, 0x69, 0x74, 0x48, 0x00, 0x52, + 0x12, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4e, 0x65, 0x78, 0x74, 0x4a, 0x6f, 0x62, 0x55, + 0x6e, 0x69, 0x74, 0x12, 0x59, 0x0a, 0x10, 0x6a, 0x6f, 0x62, 0x55, 0x6e, 0x69, 0x74, 0x43, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, + 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, + 0x61, 0x74, 0x61, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x55, 0x6e, 0x69, + 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x10, 0x6a, 0x6f, + 0x62, 0x55, 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x42, 0x09, + 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xc7, 0x0c, 0x0a, 0x0d, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x56, 0x0a, 0x0f, 0x73, + 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, + 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x2e, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x48, 0x00, 0x52, 0x0f, 0x73, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x5f, 0x0a, 0x12, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2d, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, + 0x61, 0x76, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, + 0x52, 0x12, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x68, 0x0a, 0x15, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, + 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, + 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, + 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x15, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, + 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x56, + 0x0a, 0x0f, 0x65, 0x6e, 0x76, 0x53, 0x65, 0x74, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, + 0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x6e, 0x76, 0x53, 0x65, 0x74, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0f, 0x65, 0x6e, 0x76, 0x53, 0x65, 0x74, 0x75, 0x70, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x6e, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, + 0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x17, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x6b, 0x0a, 0x16, 0x70, 0x79, 0x74, 0x68, 0x6f, 0x6e, + 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, + 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x2e, 0x50, 0x79, 0x74, 0x68, 0x6f, 0x6e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x16, 0x70, 0x79, 0x74, + 0x68, 0x6f, 0x6e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x6e, 0x0a, 0x17, 0x6a, 0x75, 0x70, 0x79, 0x74, 0x65, 0x72, 0x45, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, + 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x2e, 0x4a, 0x75, 0x70, 0x79, 0x74, 0x65, 0x72, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x17, 0x6a, 0x75, 0x70, 0x79, + 0x74, 0x65, 0x72, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x65, 0x0a, 0x14, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, + 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4b, 0x65, + 0x72, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x48, 0x00, 0x52, 0x14, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x68, 0x0a, 0x15, 0x74, 0x75, + 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x6f, 0x72, 0x67, 0x2e, + 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 0x61, 0x2e, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x15, 0x74, + 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x71, 0x0a, 0x18, 0x74, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, + 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, + 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x18, 0x74, + 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x7d, 0x0a, 0x1c, 0x61, 0x73, 0x79, 0x6e, 0x63, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, + 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, + 0x61, 0x74, 0x61, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x1c, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x6e, 0x0a, 0x17, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, + 0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x17, 0x61, + 0x73, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x7d, 0x0a, 0x1c, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x6f, + 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, + 0x74, 0x61, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x1c, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x50, 0x0a, 0x0d, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x4a, + 0x6f, 0x62, 0x55, 0x6e, 0x69, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, + 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, + 0x74, 0x61, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x4a, + 0x6f, 0x62, 0x55, 0x6e, 0x69, 0x74, 0x48, 0x00, 0x52, 0x0d, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, + 0x4a, 0x6f, 0x62, 0x55, 0x6e, 0x69, 0x74, 0x12, 0x5f, 0x0a, 0x12, 0x6e, 0x6f, 0x4a, 0x6f, 0x62, + 0x55, 0x6e, 0x69, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x15, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, + 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, + 0x4e, 0x6f, 0x4a, 0x6f, 0x62, 0x55, 0x6e, 0x69, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x48, 0x00, 0x52, 0x12, 0x6e, 0x6f, 0x4a, 0x6f, 0x62, 0x55, 0x6e, 0x69, 0x74, 0x41, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x32, 0x86, 0x01, 0x0a, 0x19, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6d, + 0x6d, 0x75, 0x6e, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x69, 0x0a, 0x10, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x42, 0x75, 0x73, 0x12, 0x27, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, + 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x28, + 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, + 0x76, 0x61, 0x74, 0x61, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x28, 0x01, 0x30, 0x01, 0x42, 0x3f, 0x0a, 0x19, + 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x61, 0x69, 0x72, 0x61, 0x76, + 0x61, 0x74, 0x61, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x42, 0x17, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x43, 0x6f, 0x6d, 0x6d, 0x75, 0x6e, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x07, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, +} var ( file_agent_communication_proto_rawDescOnce sync.Once - file_agent_communication_proto_rawDescData []byte + file_agent_communication_proto_rawDescData = file_agent_communication_proto_rawDesc ) func file_agent_communication_proto_rawDescGZIP() []byte { file_agent_communication_proto_rawDescOnce.Do(func() { - file_agent_communication_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_agent_communication_proto_rawDesc), len(file_agent_communication_proto_rawDesc))) + file_agent_communication_proto_rawDescData = protoimpl.X.CompressGZIP(file_agent_communication_proto_rawDescData) }) return file_agent_communication_proto_rawDescData } -var file_agent_communication_proto_msgTypes = make([]protoimpl.MessageInfo, 29) +var file_agent_communication_proto_msgTypes = make([]protoimpl.MessageInfo, 33) var file_agent_communication_proto_goTypes = []any{ (*AgentPing)(nil), // 0: org.apache.airavata.agent.AgentPing (*ShutdownRequest)(nil), // 1: org.apache.airavata.agent.ShutdownRequest @@ -2324,8 +2836,12 @@ var file_agent_communication_proto_goTypes = []any{ (*TunnelCreationResponse)(nil), // 24: org.apache.airavata.agent.TunnelCreationResponse (*TunnelTerminationRequest)(nil), // 25: org.apache.airavata.agent.TunnelTerminationRequest (*TunnelTerminationResponse)(nil), // 26: org.apache.airavata.agent.TunnelTerminationResponse - (*AgentMessage)(nil), // 27: org.apache.airavata.agent.AgentMessage - (*ServerMessage)(nil), // 28: org.apache.airavata.agent.ServerMessage + (*RequestNextJobUnit)(nil), // 27: org.apache.airavata.agent.RequestNextJobUnit + (*JobUnitCompleted)(nil), // 28: org.apache.airavata.agent.JobUnitCompleted + (*AssignJobUnit)(nil), // 29: org.apache.airavata.agent.AssignJobUnit + (*NoJobUnitAvailable)(nil), // 30: org.apache.airavata.agent.NoJobUnitAvailable + (*AgentMessage)(nil), // 31: org.apache.airavata.agent.AgentMessage + (*ServerMessage)(nil), // 32: org.apache.airavata.agent.ServerMessage } var file_agent_communication_proto_depIdxs = []int32{ 13, // 0: org.apache.airavata.agent.AsyncCommandListResponse.commands:type_name -> org.apache.airavata.agent.AsyncCommand @@ -2342,26 +2858,30 @@ var file_agent_communication_proto_depIdxs = []int32{ 11, // 11: org.apache.airavata.agent.AgentMessage.asyncCommandExecutionResponse:type_name -> org.apache.airavata.agent.AsyncCommandExecutionResponse 14, // 12: org.apache.airavata.agent.AgentMessage.asyncCommandListResponse:type_name -> org.apache.airavata.agent.AsyncCommandListResponse 16, // 13: org.apache.airavata.agent.AgentMessage.asyncCommandTerminateResponse:type_name -> org.apache.airavata.agent.AsyncCommandTerminateResponse - 1, // 14: org.apache.airavata.agent.ServerMessage.shutdownRequest:type_name -> org.apache.airavata.agent.ShutdownRequest - 2, // 15: org.apache.airavata.agent.ServerMessage.createAgentRequest:type_name -> org.apache.airavata.agent.CreateAgentRequest - 4, // 16: org.apache.airavata.agent.ServerMessage.terminateAgentRequest:type_name -> org.apache.airavata.agent.TerminateAgentRequest - 6, // 17: org.apache.airavata.agent.ServerMessage.envSetupRequest:type_name -> org.apache.airavata.agent.EnvSetupRequest - 8, // 18: org.apache.airavata.agent.ServerMessage.commandExecutionRequest:type_name -> org.apache.airavata.agent.CommandExecutionRequest - 17, // 19: org.apache.airavata.agent.ServerMessage.pythonExecutionRequest:type_name -> org.apache.airavata.agent.PythonExecutionRequest - 19, // 20: org.apache.airavata.agent.ServerMessage.jupyterExecutionRequest:type_name -> org.apache.airavata.agent.JupyterExecutionRequest - 21, // 21: org.apache.airavata.agent.ServerMessage.kernelRestartRequest:type_name -> org.apache.airavata.agent.KernelRestartRequest - 23, // 22: org.apache.airavata.agent.ServerMessage.tunnelCreationRequest:type_name -> org.apache.airavata.agent.TunnelCreationRequest - 25, // 23: org.apache.airavata.agent.ServerMessage.tunnelTerminationRequest:type_name -> org.apache.airavata.agent.TunnelTerminationRequest - 10, // 24: org.apache.airavata.agent.ServerMessage.asyncCommandExecutionRequest:type_name -> org.apache.airavata.agent.AsyncCommandExecutionRequest - 12, // 25: org.apache.airavata.agent.ServerMessage.asyncCommandListRequest:type_name -> org.apache.airavata.agent.AsyncCommandListRequest - 15, // 26: org.apache.airavata.agent.ServerMessage.asyncCommandTerminateRequest:type_name -> org.apache.airavata.agent.AsyncCommandTerminateRequest - 27, // 27: org.apache.airavata.agent.AgentCommunicationService.createMessageBus:input_type -> org.apache.airavata.agent.AgentMessage - 28, // 28: org.apache.airavata.agent.AgentCommunicationService.createMessageBus:output_type -> org.apache.airavata.agent.ServerMessage - 28, // [28:29] is the sub-list for method output_type - 27, // [27:28] is the sub-list for method input_type - 27, // [27:27] is the sub-list for extension type_name - 27, // [27:27] is the sub-list for extension extendee - 0, // [0:27] is the sub-list for field type_name + 27, // 14: org.apache.airavata.agent.AgentMessage.requestNextJobUnit:type_name -> org.apache.airavata.agent.RequestNextJobUnit + 28, // 15: org.apache.airavata.agent.AgentMessage.jobUnitCompleted:type_name -> org.apache.airavata.agent.JobUnitCompleted + 1, // 16: org.apache.airavata.agent.ServerMessage.shutdownRequest:type_name -> org.apache.airavata.agent.ShutdownRequest + 2, // 17: org.apache.airavata.agent.ServerMessage.createAgentRequest:type_name -> org.apache.airavata.agent.CreateAgentRequest + 4, // 18: org.apache.airavata.agent.ServerMessage.terminateAgentRequest:type_name -> org.apache.airavata.agent.TerminateAgentRequest + 6, // 19: org.apache.airavata.agent.ServerMessage.envSetupRequest:type_name -> org.apache.airavata.agent.EnvSetupRequest + 8, // 20: org.apache.airavata.agent.ServerMessage.commandExecutionRequest:type_name -> org.apache.airavata.agent.CommandExecutionRequest + 17, // 21: org.apache.airavata.agent.ServerMessage.pythonExecutionRequest:type_name -> org.apache.airavata.agent.PythonExecutionRequest + 19, // 22: org.apache.airavata.agent.ServerMessage.jupyterExecutionRequest:type_name -> org.apache.airavata.agent.JupyterExecutionRequest + 21, // 23: org.apache.airavata.agent.ServerMessage.kernelRestartRequest:type_name -> org.apache.airavata.agent.KernelRestartRequest + 23, // 24: org.apache.airavata.agent.ServerMessage.tunnelCreationRequest:type_name -> org.apache.airavata.agent.TunnelCreationRequest + 25, // 25: org.apache.airavata.agent.ServerMessage.tunnelTerminationRequest:type_name -> org.apache.airavata.agent.TunnelTerminationRequest + 10, // 26: org.apache.airavata.agent.ServerMessage.asyncCommandExecutionRequest:type_name -> org.apache.airavata.agent.AsyncCommandExecutionRequest + 12, // 27: org.apache.airavata.agent.ServerMessage.asyncCommandListRequest:type_name -> org.apache.airavata.agent.AsyncCommandListRequest + 15, // 28: org.apache.airavata.agent.ServerMessage.asyncCommandTerminateRequest:type_name -> org.apache.airavata.agent.AsyncCommandTerminateRequest + 29, // 29: org.apache.airavata.agent.ServerMessage.assignJobUnit:type_name -> org.apache.airavata.agent.AssignJobUnit + 30, // 30: org.apache.airavata.agent.ServerMessage.noJobUnitAvailable:type_name -> org.apache.airavata.agent.NoJobUnitAvailable + 31, // 31: org.apache.airavata.agent.AgentCommunicationService.createMessageBus:input_type -> org.apache.airavata.agent.AgentMessage + 32, // 32: org.apache.airavata.agent.AgentCommunicationService.createMessageBus:output_type -> org.apache.airavata.agent.ServerMessage + 32, // [32:33] is the sub-list for method output_type + 31, // [31:32] is the sub-list for method input_type + 31, // [31:31] is the sub-list for extension type_name + 31, // [31:31] is the sub-list for extension extendee + 0, // [0:31] is the sub-list for field type_name } func init() { file_agent_communication_proto_init() } @@ -2369,7 +2889,7 @@ func file_agent_communication_proto_init() { if File_agent_communication_proto != nil { return } - file_agent_communication_proto_msgTypes[27].OneofWrappers = []any{ + file_agent_communication_proto_msgTypes[31].OneofWrappers = []any{ (*AgentMessage_AgentPing)(nil), (*AgentMessage_CreateAgentResponse)(nil), (*AgentMessage_TerminateAgentResponse)(nil), @@ -2383,8 +2903,10 @@ func file_agent_communication_proto_init() { (*AgentMessage_AsyncCommandExecutionResponse)(nil), (*AgentMessage_AsyncCommandListResponse)(nil), (*AgentMessage_AsyncCommandTerminateResponse)(nil), + (*AgentMessage_RequestNextJobUnit)(nil), + (*AgentMessage_JobUnitCompleted)(nil), } - file_agent_communication_proto_msgTypes[28].OneofWrappers = []any{ + file_agent_communication_proto_msgTypes[32].OneofWrappers = []any{ (*ServerMessage_ShutdownRequest)(nil), (*ServerMessage_CreateAgentRequest)(nil), (*ServerMessage_TerminateAgentRequest)(nil), @@ -2398,14 +2920,16 @@ func file_agent_communication_proto_init() { (*ServerMessage_AsyncCommandExecutionRequest)(nil), (*ServerMessage_AsyncCommandListRequest)(nil), (*ServerMessage_AsyncCommandTerminateRequest)(nil), + (*ServerMessage_AssignJobUnit)(nil), + (*ServerMessage_NoJobUnitAvailable)(nil), } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: unsafe.Slice(unsafe.StringData(file_agent_communication_proto_rawDesc), len(file_agent_communication_proto_rawDesc)), + RawDescriptor: file_agent_communication_proto_rawDesc, NumEnums: 0, - NumMessages: 29, + NumMessages: 33, NumExtensions: 0, NumServices: 1, }, @@ -2414,6 +2938,7 @@ func file_agent_communication_proto_init() { MessageInfos: file_agent_communication_proto_msgTypes, }.Build() File_agent_communication_proto = out.File + file_agent_communication_proto_rawDesc = nil file_agent_communication_proto_goTypes = nil file_agent_communication_proto_depIdxs = nil } diff --git a/modules/agent-framework/airavata-agent/protos/agent-communication_grpc.pb.go b/modules/agent-framework/airavata-agent/protos/agent-communication_grpc.pb.go index cb3b6f99f4..fbf393bf7d 100644 --- a/modules/agent-framework/airavata-agent/protos/agent-communication_grpc.pb.go +++ b/modules/agent-framework/airavata-agent/protos/agent-communication_grpc.pb.go @@ -1,25 +1,27 @@ -// Code generated by protoc-gen-go-grpc. DO NOT EDIT. -// versions: -// - protoc-gen-go-grpc v1.5.1 -// - protoc v4.25.3 -// source: agent-communication.proto - +// // Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file +// or more contributor license agreements. See the NOTICE file // distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file +// regarding copyright ownership. The ASF licenses this file // to you 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 +// 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 +// KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. +// + +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc v5.29.3 +// source: agent-communication.proto package protos diff --git a/modules/agent-framework/proto/agent-communication.proto b/modules/agent-framework/proto/agent-communication.proto index 9e1dd82542..16baa82a54 100644 --- a/modules/agent-framework/proto/agent-communication.proto +++ b/modules/agent-framework/proto/agent-communication.proto @@ -189,6 +189,28 @@ message TunnelTerminationResponse { string status = 2; } +// Agent requesting the next job unit from the Job Workload +message RequestNextJobUnit { + string agent_id = 1; +} + +// Agent letting know the job unit is completed +message JobUnitCompleted { + string job_unit_id = 1; + int32 exit_code = 2; +} + +// Server assigning the job unit with the resolved command +message AssignJobUnit { + string job_unit_id = 1; + string resolved_command = 2; +} + +// Server indicating the agent that there are no job units to be consumed +message NoJobUnitAvailable { + string reason = 1; // EMPTY, EMPTY_ALL_DONE, NO_ASSIGNMENT +} + message AgentMessage { oneof message { AgentPing agentPing = 1; @@ -204,6 +226,9 @@ message AgentMessage { AsyncCommandExecutionResponse asyncCommandExecutionResponse = 11; AsyncCommandListResponse asyncCommandListResponse = 12; AsyncCommandTerminateResponse asyncCommandTerminateResponse = 13; + + RequestNextJobUnit requestNextJobUnit = 20; + JobUnitCompleted jobUnitCompleted = 21; } } @@ -222,5 +247,8 @@ message ServerMessage { AsyncCommandExecutionRequest asyncCommandExecutionRequest = 11; AsyncCommandListRequest asyncCommandListRequest = 12; AsyncCommandTerminateRequest asyncCommandTerminateRequest = 13; + + AssignJobUnit assignJobUnit = 20; + NoJobUnitAvailable noJobUnitAvailable = 21; } }
