Add Create and DeleteWorker methods

This commit is contained in:
Mustafa Gezen 2023-08-25 18:45:07 +02:00
parent cc62ca763e
commit 06211bf2d2
1 changed files with 60 additions and 0 deletions

View File

@ -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
}