Implment worker api (fixes #3)

This commit is contained in:
2023-01-09 00:59:19 -07:00
parent f4798233ba
commit 3d7bef3a82
5 changed files with 202 additions and 45 deletions
+46 -11
View File
@@ -24,25 +24,32 @@ type ApiServer struct {
}
type RunnerWrapper struct {
runner runnermanager.Runner
runner *runnermanager.Runner
mutex sync.Mutex
}
func (r *RunnerWrapper) RunCommand(cmd string) (int64, string, string, error) {
r.mutex.Unlock()
defer r.mutex.Lock()
func (r *RunnerWrapper) RunCommand(cmd string, args []string) (int64, string, string, error) {
r.mutex.Lock()
defer r.mutex.Unlock()
return_code, stdout, stderr, err := r.runner.RunCommand(cmd)
return_code, stdout, stderr, err := r.runner.RunCommand(cmd, args)
// TODO: run command by sending websocket packet
// TODO: get stdout and stderr response
return return_code, stdout, stderr, err
}
func (s *ApiServer) GetRunnerFromMap(u uuid.UUID) *RunnerWrapper {
func (r *RunnerWrapper) Release() {
r.mutex.Lock()
defer r.mutex.Unlock()
r.runner.Release()
}
func (s *ApiServer) GetRunnerFromMap(u uuid.UUID) (*RunnerWrapper, bool) {
s.allocatedRunnersMutex.RLock()
defer s.allocatedRunnersMutex.RUnlock()
return s.allocatedRunners[u]
runner, ok := s.allocatedRunners[u]
return runner, ok
}
func (s *ApiServer) GetRunner(
@@ -69,7 +76,7 @@ func (s *ApiServer) GetRunner(
return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("Could not get runner"))
}
log.Info("Got runner with tags: %v", runnerTagsStr)
log.Infof("Got runner with tags: %v", runnerTagsStr.String())
runnerUuid := uuid.New()
@@ -84,6 +91,29 @@ func (s *ApiServer) GetRunner(
return res, nil
}
func (s *ApiServer) ReleaseRunner(
ctx context.Context,
req *connect.Request[apiv2.ReleaseRunnerRequest],
) (*connect.Response[apiv2.ReleaseRunnerResponse], error) {
uuid, err := uuid.Parse(req.Msg.Id)
if err != nil {
return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("Invalid runner id"))
}
log.Infof("Releasing runner with ID \"%v\"", uuid)
s.allocatedRunnersMutex.Lock()
runner := s.allocatedRunners[uuid]
delete(s.allocatedRunners, uuid)
runner.Release()
s.allocatedRunnersMutex.Unlock()
res := connect.NewResponse(&apiv2.ReleaseRunnerResponse{})
res.Header().Set("ReleaseRunner-Version", "v2")
return res, nil
}
func (s *ApiServer) RunCommand(
ctx context.Context,
req *connect.Request[apiv2.RunCommandRequest],
@@ -94,16 +124,19 @@ func (s *ApiServer) RunCommand(
return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("Invalid runner id"))
}
runner := s.GetRunnerFromMap(uuid)
runner, ok := s.GetRunnerFromMap(uuid)
if !ok {
return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("Invalid runner id"))
}
return_code, stdout, stderr, err := runner.RunCommand(req.Msg.Command)
returnCode, stdout, stderr, err := runner.RunCommand(req.Msg.Command, req.Msg.Args)
if err != nil {
log.Errorf("Could not run command on runner \"%v\", %v", runner.runner.Id(), err)
return nil, connect.NewError(connect.CodeInternal, fmt.Errorf("Could not run command"))
}
res := connect.NewResponse(&apiv2.RunCommandResponse{
ReturnCode: return_code,
ReturnCode: returnCode,
Stdout: stdout,
Stderr: stderr,
})
@@ -118,6 +151,8 @@ func CreateHandler(mux *http.ServeMux, getRunnerCh chan runnermanager.GetRunnerR
}
path, handler := apiv2connect.NewGetRunnerServiceHandler(api_server)
mux.Handle(path, handler)
path, handler = apiv2connect.NewReleaseRunnerServiceHandler(api_server)
mux.Handle(path, handler)
path, handler = apiv2connect.NewRunCommandServiceHandler(api_server)
mux.Handle(path, handler)
}