in pkg/client/mock/stub_serverV2.go [197:281]
func (s *StubServerV2) Actions(server proto.ElasticAgent_ActionsServer) error {
var m sync.Mutex
done := make(chan bool)
go func() {
for {
select {
case <-done:
return
case act := <-s.ActionsChan:
id := uuid.Must(uuid.NewV4())
m.Lock()
s.SentActions[id.String()] = act
m.Unlock()
err := server.Send(&proto.ActionRequest{
Type: act.Type,
Id: id.String(),
Name: act.Name,
Params: act.Params,
UnitId: act.UnitID,
UnitType: act.UnitType,
Level: act.Level,
})
if err != nil {
panic(err)
}
}
}
}()
defer close(done)
for {
response, err := server.Recv()
if err != nil {
return err
}
err = s.ActionImpl(response)
if err != nil {
// close connection to client
return nil
}
m.Lock()
action, ok := s.SentActions[response.Id]
if !ok {
// nothing to do, unknown action
m.Unlock()
continue
}
delete(s.SentActions, response.Id)
m.Unlock()
var result map[string]interface{}
if response.Result != nil {
err = json.Unmarshal(response.Result, &result)
if err != nil {
return err
}
}
if action.Type == proto.ActionRequest_CUSTOM {
if response.Status == proto.ActionResponse_FAILED {
error, ok := result["error"]
if ok {
err = fmt.Errorf("%s", error)
} else {
err = fmt.Errorf("unknown error")
}
action.Callback(nil, err)
} else {
action.Callback(result, nil)
}
} else if action.Type == proto.ActionRequest_DIAGNOSTICS {
if response.Status == proto.ActionResponse_FAILED {
error, ok := result["error"]
if ok {
err = fmt.Errorf("%s", error)
} else {
err = fmt.Errorf("unknown error")
}
action.DiagCallback(nil, err)
} else {
action.DiagCallback(response.Diagnostic, nil)
}
} else {
panic("unknown action type")
}
}
}