Implment worker api (fixes #3)
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user