From 06211bf2d28b5c66d23b0c3f8533a5fb71e2de00 Mon Sep 17 00:00:00 2001 From: Mustafa Gezen Date: Fri, 25 Aug 2023 18:45:07 +0200 Subject: [PATCH] Add Create and DeleteWorker methods --- tools/mothership/admin/rpc/worker.go | 60 ++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/tools/mothership/admin/rpc/worker.go b/tools/mothership/admin/rpc/worker.go index 2c78eedb..7920aa8f 100644 --- a/tools/mothership/admin/rpc/worker.go +++ b/tools/mothership/admin/rpc/worker.go @@ -20,8 +20,11 @@ import ( base "go.resf.org/peridot/base/go" mshipadminpb "go.resf.org/peridot/tools/mothership/admin/pb" mothership_db "go.resf.org/peridot/tools/mothership/db" + "google.golang.org/genproto/googleapis/rpc/errdetails" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" + "google.golang.org/protobuf/types/known/emptypb" + "strings" ) func (s *Server) GetWorker(_ context.Context, req *mshipadminpb.GetWorkerRequest) (*mshipadminpb.Worker, error) { @@ -52,3 +55,60 @@ func (s *Server) ListWorkers(_ context.Context, req *mshipadminpb.ListWorkersReq NextPageToken: nt, }, nil } + +func (s *Server) CreateWorker(_ context.Context, req *mshipadminpb.CreateWorkerRequest) (*mshipadminpb.Worker, error) { + // Verify that the id is at least 4 characters long. + if len(req.WorkerId) < 4 { + return nil, status.Error(codes.InvalidArgument, "worker id must be at least 4 characters long") + } + + // Create the worker. + name := base.NameGen("workers") + worker := &mothership_db.Worker{ + Name: name, + WorkerID: req.WorkerId, + ApiSecret: base.NameGen(name), + } + + err := base.Q[mothership_db.Worker](s.db).Create(worker) + if err != nil { + // if the error is a duplicate key error, return an already exists error. + if strings.Contains(err.Error(), "duplicate key") { + st, _ := status. + New(codes.AlreadyExists, "worker already exists"). + WithDetails(&errdetails.LocalizedMessage{ + Locale: "en-US", + Message: "Worker with given ID already exists.", + }) + + return nil, st.Err() + } + + base.LogErrorf("failed to create worker: %v", err) + return nil, status.Error(codes.Internal, "failed to create worker") + } + pb := worker.ToPB() + pb.ApiSecret = worker.ApiSecret + + return pb, nil +} + +func (s *Server) DeleteWorker(_ context.Context, req *mshipadminpb.DeleteWorkerRequest) (*emptypb.Empty, error) { + worker, err := base.Q[mothership_db.Worker](s.db).F("name", req.Name).GetOrNil() + if err != nil { + base.LogErrorf("failed to get worker: %v", err) + return nil, status.Error(codes.Internal, "failed to get worker") + } + + if worker == nil { + return nil, status.Error(codes.NotFound, "worker not found") + } + + err = base.Q[mothership_db.Worker](s.db).D(worker) + if err != nil { + base.LogErrorf("failed to delete worker: %v", err) + return nil, status.Error(codes.Internal, "failed to delete worker") + } + + return &emptypb.Empty{}, nil +}