func vmEventHandler()

in internal/plugin/manager/commandhandler.go [87:132]


func vmEventHandler(ctx context.Context, r []byte) ([]byte, error) {
	galog.Debugf("Handling command monitor event: %s", string(r))
	req, err := validateRequest(r)
	if err != nil {
		return nil, err
	}
	wg := sync.WaitGroup{}
	plugins := Instance().list()
	results := make([]result, len(plugins))

	for i, plugin := range plugins {
		wg.Add(1)
		go func(i int, p *Plugin) {
			result := result{plugin: p.FullName()}

			defer func() {
				results[i] = result
				wg.Done()
			}()

			if !p.IsRunning(ctx) {
				msg := fmt.Sprintf("Plugin %q is not running, last state: %v, skipping sending VM event %q", p.FullName(), p.State(), req.Event)
				result.StatusMessage = msg
				result.Status = notifySkipStatus
				galog.Warn(msg)
				return
			}

			// Apply response is empty and can safely be ignored here.
			_, rpcStatus := p.Apply(ctx, r)
			if rpcStatus.Err() != nil {
				result.StatusMessage = rpcStatus.Proto().String()
				result.Status = notifyErrorStatus
			}
		}(i, plugin)
	}
	wg.Wait()

	galog.Debugf("Completed request %s: %+v", req.Event, results)

	resBytes, err := json.Marshal(results)
	if err != nil {
		return nil, fmt.Errorf("unable to marshal results (%+v): %w", results, err)
	}
	return resBytes, nil
}