Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 25 additions & 21 deletions benchmarking/locust/common/ateapi_pb2.py

Large diffs are not rendered by default.

62 changes: 50 additions & 12 deletions benchmarking/locust/common/ateapi_pb2_grpc.py
Original file line number Diff line number Diff line change
Expand Up @@ -1629,10 +1629,7 @@ def DeleteActorTemplate(request,


class WorkerServiceStub:
"""WorkerService is how a Worker tells the control plane about itself. It is
separate from Control because the two have different callers and different
authorization: Control is the client-facing API, while these RPCs are served
only to an atelet, and only for the Workers on its own node.
"""WorkerService is the RPC service tailored to be called by Atelet.
"""

def __init__(self, channel):
Expand All @@ -1646,13 +1643,15 @@ def __init__(self, channel):
request_serializer=ateapi__pb2.SetWorkerCapacityRequest.SerializeToString,
response_deserializer=ateapi__pb2.SetWorkerCapacityResponse.FromString,
_registered_method=True)
self.MintAteomActorCertificate = channel.unary_unary(
'/ateapi.WorkerService/MintAteomActorCertificate',
request_serializer=ateapi__pb2.MintAteomActorCertificateRequest.SerializeToString,
response_deserializer=ateapi__pb2.MintAteomActorCertificateResponse.FromString,
_registered_method=True)


class WorkerServiceServicer:
"""WorkerService is how a Worker tells the control plane about itself. It is
separate from Control because the two have different callers and different
authorization: Control is the client-facing API, while these RPCs are served
only to an atelet, and only for the Workers on its own node.
"""WorkerService is the RPC service tailored to be called by Atelet.
"""

def SetWorkerCapacity(self, request, context):
Expand All @@ -1668,6 +1667,16 @@ def SetWorkerCapacity(self, request, context):
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')

def MintAteomActorCertificate(self, request, context):
"""Create a Substrate-issued SPIFFE certificate that asserts an ateom acting
on behalf of a particular actor.

SPIFFE URI: spiffe://${trustdomain}/ateom-for-actor/${atespace}/${actor}
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')


def add_WorkerServiceServicer_to_server(servicer, server):
rpc_method_handlers = {
Expand All @@ -1676,6 +1685,11 @@ def add_WorkerServiceServicer_to_server(servicer, server):
request_deserializer=ateapi__pb2.SetWorkerCapacityRequest.FromString,
response_serializer=ateapi__pb2.SetWorkerCapacityResponse.SerializeToString,
),
'MintAteomActorCertificate': grpc.unary_unary_rpc_method_handler(
servicer.MintAteomActorCertificate,
request_deserializer=ateapi__pb2.MintAteomActorCertificateRequest.FromString,
response_serializer=ateapi__pb2.MintAteomActorCertificateResponse.SerializeToString,
),
}
generic_handler = grpc.method_handlers_generic_handler(
'ateapi.WorkerService', rpc_method_handlers)
Expand All @@ -1685,10 +1699,7 @@ def add_WorkerServiceServicer_to_server(servicer, server):

# This class is part of an EXPERIMENTAL API.
class WorkerService:
"""WorkerService is how a Worker tells the control plane about itself. It is
separate from Control because the two have different callers and different
authorization: Control is the client-facing API, while these RPCs are served
only to an atelet, and only for the Workers on its own node.
"""WorkerService is the RPC service tailored to be called by Atelet.
"""

@staticmethod
Expand Down Expand Up @@ -1717,3 +1728,30 @@ def SetWorkerCapacity(request,
timeout,
metadata,
_registered_method=True)

@staticmethod
def MintAteomActorCertificate(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(
request,
target,
'/ateapi.WorkerService/MintAteomActorCertificate',
ateapi__pb2.MintAteomActorCertificateRequest.SerializeToString,
ateapi__pb2.MintAteomActorCertificateResponse.FromString,
options,
channel_credentials,
insecure,
call_credentials,
compression,
wait_for_ready,
timeout,
metadata,
_registered_method=True)
119 changes: 119 additions & 0 deletions cmd/ateapi/internal/controlapi/zz_generated.validation.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 10 additions & 2 deletions cmd/ateapi/internal/workerservice/capacity.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import (

"github.com/agent-substrate/substrate/cmd/ateapi/internal/ateletauth"
"github.com/agent-substrate/substrate/cmd/ateapi/internal/store"
"github.com/agent-substrate/substrate/internal/localca"
"github.com/agent-substrate/substrate/internal/resources"
"github.com/agent-substrate/substrate/pkg/proto/ateapipb"
"google.golang.org/grpc/codes"
Expand All @@ -44,17 +45,24 @@ type Server struct {

// ateletSPIFFEID is the identity the calling atelet must present.
ateletSPIFFEID string

actorIDCAPool localca.Pool
}

var _ ateapipb.WorkerServiceServer = (*Server)(nil)

func New(store store.Interface, ateletSPIFFEID string) *Server {
return &Server{store: store, ateletSPIFFEID: ateletSPIFFEID}
func New(store store.Interface, ateletSPIFFEID string, actorIDCAPool localca.Pool) *Server {
return &Server{
store: store,
ateletSPIFFEID: ateletSPIFFEID,
actorIDCAPool: actorIDCAPool,
}
}

// SetWorkerCapacity records a Worker's reported capacity. As with MintCert,
// the caller must be an atelet running on the Worker's node.
func (s *Server) SetWorkerCapacity(ctx context.Context, req *ateapipb.SetWorkerCapacityRequest) (*ateapipb.SetWorkerCapacityResponse, error) {
// TODO(identity): This check should be handled by OpenFGA.
caller, err := ateletauth.Authenticate(ctx, s.ateletSPIFFEID)
if err != nil {
return nil, err
Expand Down
10 changes: 5 additions & 5 deletions cmd/ateapi/internal/workerservice/capacity_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ func setRequest(actors int32) *ateapipb.SetWorkerCapacityRequest {
func TestSetWorkerCapacity(t *testing.T) {
st, cleanup := storetest.SetupTestStore(t)
defer cleanup()
s := New(st, installdefaults.SPIFFEID(installdefaults.SystemNamespace, installdefaults.AteletServiceAccount))
s := New(st, installdefaults.SPIFFEID(installdefaults.SystemNamespace, installdefaults.AteletServiceAccount), nil)
seedReportedWorker(t, st, capNode, &ateapipb.WorkerResources{Actors: 1, Resources: resources.CPUMemory(2000, 0)})

got, err := s.SetWorkerCapacity(ateletauthtest.ContextWith(ateletauthtest.CertOn(t, capNode)), setRequest(4094))
Expand All @@ -95,7 +95,7 @@ func TestSetWorkerCapacity(t *testing.T) {
func TestSetWorkerCapacity_OtherNodeIsNotFound(t *testing.T) {
st, cleanup := storetest.SetupTestStore(t)
defer cleanup()
s := New(st, installdefaults.SPIFFEID(installdefaults.SystemNamespace, installdefaults.AteletServiceAccount))
s := New(st, installdefaults.SPIFFEID(installdefaults.SystemNamespace, installdefaults.AteletServiceAccount), nil)
seedReportedWorker(t, st, capNode, &ateapipb.WorkerResources{Actors: 1})

_, err := s.SetWorkerCapacity(ateletauthtest.ContextWith(ateletauthtest.CertOn(t, "some-other-node")), setRequest(4094))
Expand All @@ -119,7 +119,7 @@ func TestSetWorkerCapacity_OtherNodeIsNotFound(t *testing.T) {
func TestSetWorkerCapacity_UnchangedDoesNotWrite(t *testing.T) {
st, cleanup := storetest.SetupTestStore(t)
defer cleanup()
s := New(st, installdefaults.SPIFFEID(installdefaults.SystemNamespace, installdefaults.AteletServiceAccount))
s := New(st, installdefaults.SPIFFEID(installdefaults.SystemNamespace, installdefaults.AteletServiceAccount), nil)
seeded := seedReportedWorker(t, st, capNode, &ateapipb.WorkerResources{Actors: 4094})

for range 3 {
Expand All @@ -139,7 +139,7 @@ func TestSetWorkerCapacity_UnchangedDoesNotWrite(t *testing.T) {
func TestSetWorkerCapacity_Errors(t *testing.T) {
st, cleanup := storetest.SetupTestStore(t)
defer cleanup()
s := New(st, installdefaults.SPIFFEID(installdefaults.SystemNamespace, installdefaults.AteletServiceAccount))
s := New(st, installdefaults.SPIFFEID(installdefaults.SystemNamespace, installdefaults.AteletServiceAccount), nil)
seedReportedWorker(t, st, capNode, &ateapipb.WorkerResources{Actors: 1})
authed := ateletauthtest.ContextWith(ateletauthtest.CertOn(t, capNode))

Expand Down Expand Up @@ -177,7 +177,7 @@ func TestSetWorkerCapacity_Errors(t *testing.T) {
func TestSetWorkerCapacity_RejectsNonsense(t *testing.T) {
st, cleanup := storetest.SetupTestStore(t)
defer cleanup()
s := New(st, installdefaults.SPIFFEID(installdefaults.SystemNamespace, installdefaults.AteletServiceAccount))
s := New(st, installdefaults.SPIFFEID(installdefaults.SystemNamespace, installdefaults.AteletServiceAccount), nil)
seeded := seedReportedWorker(t, st, capNode, &ateapipb.WorkerResources{Actors: 4094})
authed := ateletauthtest.ContextWith(ateletauthtest.CertOn(t, capNode))

Expand Down
Loading
Loading