From 6d546a71014722f1a59b8ed8ccb216c01c0e1a42 Mon Sep 17 00:00:00 2001 From: Rich Scott Date: Mon, 9 Dec 2024 17:05:09 -0700 Subject: [PATCH] Start making some Armada GRPC test calls. Add functions for querying Armada GRPC endpoints for health and job status. Also, use symlinks to armada protobuf directory and add for gogo protobuf file. Add (commented-out) attempt to use sbt protoc path inclusion in build.sbt, but it does not yet work. --- client/scala/scala-armada-client/build.sbt | 4 + .../src/main/protobuf/armada | 1 + .../src/main/protobuf/armada/event.proto | 296 ------------------ .../src/main/protobuf/armada/health.proto | 1 - .../src/main/protobuf/armada/submit.proto | 1 - .../github.com/gogo/protobuf/gogoproto | 1 + .../src/main/scala/Main.scala | 27 +- 7 files changed, 28 insertions(+), 303 deletions(-) create mode 120000 client/scala/scala-armada-client/src/main/protobuf/armada delete mode 100644 client/scala/scala-armada-client/src/main/protobuf/armada/event.proto delete mode 120000 client/scala/scala-armada-client/src/main/protobuf/armada/health.proto delete mode 120000 client/scala/scala-armada-client/src/main/protobuf/armada/submit.proto create mode 120000 client/scala/scala-armada-client/src/main/protobuf/github.com/gogo/protobuf/gogoproto diff --git a/client/scala/scala-armada-client/build.sbt b/client/scala/scala-armada-client/build.sbt index 4b278369245..a37a7805a14 100644 --- a/client/scala/scala-armada-client/build.sbt +++ b/client/scala/scala-armada-client/build.sbt @@ -15,6 +15,10 @@ Compile / PB.targets := Seq( scalapb.gen() -> (Compile / sourceManaged).value ) +// Additional directories to search for imports: +// Compile / PB.includePaths ++= Seq(file("../../../proto"), file("../../../proto/armada")) +// Compile / PB.protoSources ++= Seq(file("../../../proto")) + libraryDependencies ++= Seq( "io.grpc" % "grpc-netty" % scalapb.compiler.Version.grpcJavaVersion, "com.thesamet.scalapb" %% "scalapb-runtime-grpc" % scalapb.compiler.Version.scalapbVersion diff --git a/client/scala/scala-armada-client/src/main/protobuf/armada b/client/scala/scala-armada-client/src/main/protobuf/armada new file mode 120000 index 00000000000..dcf0a053ce7 --- /dev/null +++ b/client/scala/scala-armada-client/src/main/protobuf/armada @@ -0,0 +1 @@ +../../../../../../proto/armada \ No newline at end of file diff --git a/client/scala/scala-armada-client/src/main/protobuf/armada/event.proto b/client/scala/scala-armada-client/src/main/protobuf/armada/event.proto deleted file mode 100644 index 6c1af5ddeaf..00000000000 --- a/client/scala/scala-armada-client/src/main/protobuf/armada/event.proto +++ /dev/null @@ -1,296 +0,0 @@ -syntax = 'proto3'; - -package api; -option go_package = "github.com/armadaproject/armada/pkg/api"; -option csharp_namespace = "ArmadaProject.Io.Api"; - -import "google/protobuf/timestamp.proto"; -import "armada/submit.proto"; -import "armada/health.proto"; -import "google/protobuf/empty.proto"; -import "google/api/annotations.proto"; -import "k8s.io/apimachinery/pkg/api/resource/generated.proto"; - -message JobSubmittedEvent { - string job_id = 1; - string job_set_id = 2; - string queue = 3; - google.protobuf.Timestamp created = 4; - Job job = 5; -} - -message JobQueuedEvent { - string job_id = 1; - string job_set_id = 2; - string queue = 3; - google.protobuf.Timestamp created = 4; -} - -message JobLeasedEvent { - string job_id = 1; - string job_set_id = 2; - string queue = 3; - google.protobuf.Timestamp created = 4; - string cluster_id = 5; -} - -message JobLeaseReturnedEvent { - string job_id = 1; - string job_set_id = 2; - string queue = 3; - google.protobuf.Timestamp created = 4; - string cluster_id = 5; - string reason = 6; - string kubernetes_id = 7; - int32 pod_number = 8; - bool run_attempted = 9; -} - -message JobLeaseExpiredEvent { - string job_id = 1; - string job_set_id = 2; - string queue = 3; - google.protobuf.Timestamp created = 4; -} - -message JobPendingEvent { - string job_id = 1; - string job_set_id = 2; - string queue = 3; - google.protobuf.Timestamp created = 4; - string cluster_id = 5; - string kubernetes_id = 6; - int32 pod_number = 7; - string pod_name = 8; - string pod_namespace = 9; -} - -message JobRunningEvent { - string job_id = 1; - string job_set_id = 2; - string queue = 3; - google.protobuf.Timestamp created = 4; - string cluster_id = 5; - string kubernetes_id = 6; - string node_name = 7; - int32 pod_number = 8; - string pod_name = 9; - string pod_namespace = 10; -} - -message JobIngressInfoEvent { - string job_id = 1; - string job_set_id = 2; - string queue = 3; - google.protobuf.Timestamp created = 4; - string cluster_id = 5; - string kubernetes_id = 6; - string node_name = 7; - int32 pod_number = 8; - string pod_name = 10; - string pod_namespace = 11; - map ingress_addresses = 9; -} - -message JobUnableToScheduleEvent { - string job_id = 1; - string job_set_id = 2; - string queue = 3; - google.protobuf.Timestamp created = 4; - string cluster_id = 5; - string reason = 6; - string kubernetes_id = 7; - string node_name = 8; - int32 pod_number = 9; - string pod_name = 10; - string pod_namespace = 11; -} - -message JobFailedEvent { - string job_id = 1; - string job_set_id = 2; - string queue = 3; - google.protobuf.Timestamp created = 4; - string cluster_id = 5; - string reason = 6; - map exit_codes = 7 [deprecated = true]; - string kubernetes_id = 8; - string node_name = 9; - int32 pod_number = 10; - string pod_name = 13; - string pod_namespace = 14; - repeated ContainerStatus container_statuses = 11; - Cause cause = 12; -} - -message JobPreemptingEvent { - string job_id = 1; - string job_set_id = 2; - string queue = 3; - google.protobuf.Timestamp created = 4; - string requestor = 5; - string reason = 6; -} - -message JobPreemptedEvent { - string job_id = 1; - string job_set_id = 2; - string queue = 3; - google.protobuf.Timestamp created = 4; - string cluster_id = 5; - string run_id = 6; - string preemptive_job_id = 7; - string preemptive_run_id = 8; - string reason = 9; -} - -message JobSucceededEvent { - string job_id = 1; - string job_set_id = 2; - string queue = 3; - google.protobuf.Timestamp created = 4; - string cluster_id = 5; - string kubernetes_id = 6; - string node_name = 7; - int32 pod_number = 8; - string pod_name = 9; - string pod_namespace = 10; -} - -message JobUtilisationEvent { - string job_id = 1; - string job_set_id = 2; - string queue = 3; - google.protobuf.Timestamp created = 4; - string cluster_id = 5; - string kubernetes_id = 6; - map MaxResourcesForPeriod = 7; - string node_name = 8; - int32 pod_number = 9; - string pod_name = 10; - string pod_namespace = 11; - map total_cumulative_usage = 12; -} - -message JobReprioritizingEvent { - string job_id = 1; - string job_set_id = 2; - string queue = 3; - google.protobuf.Timestamp created = 4; - double new_priority = 5; - string requestor = 6; -} - -message JobReprioritizedEvent { - string job_id = 1; - string job_set_id = 2; - string queue = 3; - google.protobuf.Timestamp created = 4; - double new_priority = 5; - string requestor = 6; -} - -message JobCancellingEvent { - string job_id = 1; - string job_set_id = 2; - string queue = 3; - google.protobuf.Timestamp created = 4; - string requestor = 5; - string reason = 6; -} - -message JobCancelledEvent { - string job_id = 1; - string job_set_id = 2; - string queue = 3; - google.protobuf.Timestamp created = 4; - string requestor = 5; - string reason = 6; -} - -message JobTerminatedEvent { - string job_id = 1; - string job_set_id = 2; - string queue = 3; - google.protobuf.Timestamp created = 4; - string cluster_id = 5; - string kubernetes_id = 6; - int32 pod_number = 7; - string pod_name = 9; - string pod_namespace = 10; - string reason = 8; -} - - -message EventMessage { - oneof events { - JobSubmittedEvent submitted = 1; - JobQueuedEvent queued = 2; - JobLeasedEvent leased = 3; - JobLeaseReturnedEvent lease_returned = 4; - JobLeaseExpiredEvent lease_expired = 5; - JobPendingEvent pending = 6; - JobRunningEvent running = 7; - JobUnableToScheduleEvent unable_to_schedule = 8; - JobFailedEvent failed = 9; - JobSucceededEvent succeeded = 10; - JobReprioritizedEvent reprioritized = 11; - JobCancellingEvent cancelling = 12; - JobCancelledEvent cancelled = 13; - JobUtilisationEvent utilisation = 15; - JobIngressInfoEvent ingress_info = 17; - JobReprioritizingEvent reprioritizing = 18; - JobPreemptedEvent preempted = 21; - JobPreemptingEvent preempting = 22; - } -} - -enum Cause { - Error = 0; - Evicted = 1; - OOM = 2; - DeadlineExceeded = 3; - Rejected = 4; -} - -message ContainerStatus { - string name = 1; - int32 exitCode = 2; - string message = 3; - string reason = 4; - Cause cause = 5; -} - -// swagger:model -message EventStreamMessage { - string id = 1; - EventMessage message = 2; -} - -// swagger:model -message JobSetRequest { - string id = 1; - bool watch = 2; - string from_message_id = 3; - string queue = 4; - bool errorIfMissing = 5; -} - -message WatchRequest { - string queue = 1; - string job_set_id = 2; - string from_id = 3; -} - -service Event { - rpc GetJobSetEvents (JobSetRequest) returns (stream EventStreamMessage) { - option (google.api.http) = { - post: "/v1/job-set/{queue}/{id}" - body: "*" - }; - } - rpc Watch (WatchRequest) returns (stream EventStreamMessage) { - option deprecated = true; - } - rpc Health(google.protobuf.Empty) returns (HealthCheckResponse); -} diff --git a/client/scala/scala-armada-client/src/main/protobuf/armada/health.proto b/client/scala/scala-armada-client/src/main/protobuf/armada/health.proto deleted file mode 120000 index 315066782a0..00000000000 --- a/client/scala/scala-armada-client/src/main/protobuf/armada/health.proto +++ /dev/null @@ -1 +0,0 @@ -../../../../../../../proto/armada/health.proto \ No newline at end of file diff --git a/client/scala/scala-armada-client/src/main/protobuf/armada/submit.proto b/client/scala/scala-armada-client/src/main/protobuf/armada/submit.proto deleted file mode 120000 index 9ef65ec8681..00000000000 --- a/client/scala/scala-armada-client/src/main/protobuf/armada/submit.proto +++ /dev/null @@ -1 +0,0 @@ -../../../../../../../proto/armada/submit.proto \ No newline at end of file diff --git a/client/scala/scala-armada-client/src/main/protobuf/github.com/gogo/protobuf/gogoproto b/client/scala/scala-armada-client/src/main/protobuf/github.com/gogo/protobuf/gogoproto new file mode 120000 index 00000000000..390f6a96a3d --- /dev/null +++ b/client/scala/scala-armada-client/src/main/protobuf/github.com/gogo/protobuf/gogoproto @@ -0,0 +1 @@ +../../../../../../../../../proto/github.com/gogo/protobuf/gogoproto \ No newline at end of file diff --git a/client/scala/scala-armada-client/src/main/scala/Main.scala b/client/scala/scala-armada-client/src/main/scala/Main.scala index bfb8166e1b3..0b9ef58c457 100644 --- a/client/scala/scala-armada-client/src/main/scala/Main.scala +++ b/client/scala/scala-armada-client/src/main/scala/Main.scala @@ -1,10 +1,27 @@ +import api.event.EventGrpc +import api.health.HealthCheckResponse import api.submit.Job +import com.google.protobuf.empty +import io.grpc.ManagedChannelBuilder +import queryapi.queryapi.QueryApiGrpc +import queryapi.queryapi.JobStatusResponse -@main def hello(): Unit = - println("Hello world!") +val host = "localhost" +val port = 30002 - Job(id = "test ID") +@main def getArmadaHealth(): Unit = + val channel = ManagedChannelBuilder.forAddress(host, port).usePlaintext().build + val blockingStub = EventGrpc.blockingStub(channel) - println(msg) + val reply: HealthCheckResponse = blockingStub.health(empty.Empty()) -def msg = "I was compiled by Scala 3. :) api.submit.Job exists" + println(reply.status) + +def getJobStatus(): Unit = + val channel = ManagedChannelBuilder.forAddress(host, port).usePlaintext().build + val blockingStub = QueryApiGrpc.blockingStub(channel) + + val jsReq = queryapi.queryapi.JobStatusRequest(jobId = "foobar") + val reply: queryapi.queryapi.JobStatusResponse = blockingStub.getJobStatus(jsReq) + + println(reply)