mirror of https://github.com/status-im/consul.git
58 lines
1.4 KiB
Go
58 lines
1.4 KiB
Go
|
// Copyright (c) HashiCorp, Inc.
|
||
|
// SPDX-License-Identifier: BUSL-1.1
|
||
|
|
||
|
package controller
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
|
||
|
"github.com/hashicorp/consul/agent/consul/controller/queue"
|
||
|
)
|
||
|
|
||
|
// CustomDependencyMapper is called when an Event occurs to determine which of the
|
||
|
// controller's managed resources need to be reconciled.
|
||
|
type CustomDependencyMapper func(
|
||
|
ctx context.Context,
|
||
|
rt Runtime,
|
||
|
event Event,
|
||
|
) ([]Request, error)
|
||
|
|
||
|
// Watch is responsible for watching for custom events from source and adding them to
|
||
|
// the event queue.
|
||
|
func (s *Source) Watch(ctx context.Context, add func(e Event)) error {
|
||
|
for {
|
||
|
select {
|
||
|
case <-ctx.Done():
|
||
|
return nil
|
||
|
case evt, ok := <-s.Source:
|
||
|
if !ok {
|
||
|
return nil
|
||
|
}
|
||
|
add(evt)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Source is used as a generic source of events. This can be used when events aren't coming from resources
|
||
|
// stored by the resource API.
|
||
|
type Source struct {
|
||
|
Source <-chan Event
|
||
|
}
|
||
|
|
||
|
// Event captures an event in the system which the API can choose to respond to.
|
||
|
type Event struct {
|
||
|
Obj queue.ItemType
|
||
|
}
|
||
|
|
||
|
// Key returns a string that will be used to de-duplicate items in the queue.
|
||
|
func (e Event) Key() string {
|
||
|
return e.Obj.Key()
|
||
|
}
|
||
|
|
||
|
// customWatch represent a Watch on a custom Event source and a Mapper to map said
|
||
|
// Events into Requests that the controller can respond to.
|
||
|
type customWatch struct {
|
||
|
source *Source
|
||
|
mapper CustomDependencyMapper
|
||
|
}
|