keel/provider/provider.go

129 lines
2.9 KiB
Go
Raw Normal View History

2017-06-10 11:23:31 +00:00
package provider
import (
2017-08-28 19:07:23 +00:00
"context"
2017-11-01 18:25:28 +00:00
"github.com/keel-hq/keel/approvals"
"github.com/keel-hq/keel/types"
2018-03-03 11:32:00 +00:00
log "github.com/sirupsen/logrus"
2017-06-10 11:23:31 +00:00
)
// Provider - generic provider interface
type Provider interface {
Submit(event types.Event) error
2017-07-20 17:55:47 +00:00
TrackedImages() ([]*types.TrackedImage, error)
2017-06-10 11:23:31 +00:00
GetName() string
2017-07-20 17:55:47 +00:00
Stop()
2017-06-10 11:23:31 +00:00
}
// Providers - available providers
type Providers interface {
Submit(event types.Event) error
2017-07-20 17:55:47 +00:00
TrackedImages() ([]*types.TrackedImage, error)
List() []string // list all providers
2017-07-20 17:55:47 +00:00
Stop() // stop all providers
}
// New - new providers registry
2017-08-28 19:07:23 +00:00
func New(providers []Provider, approvalsManager approvals.Manager) *DefaultProviders {
pvs := make(map[string]Provider)
for _, p := range providers {
pvs[p.GetName()] = p
2017-07-23 17:15:16 +00:00
log.Infof("provider.defaultProviders: provider '%s' registered", p.GetName())
}
2017-08-28 19:07:23 +00:00
dp := &DefaultProviders{
providers: pvs,
approvalsManager: approvalsManager,
stopCh: make(chan struct{}),
}
2017-08-28 19:07:23 +00:00
// subscribing to approved events
// TODO: create Start() function for DefaultProviders
go dp.subscribeToApproved()
return dp
}
2017-07-20 17:55:47 +00:00
// DefaultProviders - default providers container
type DefaultProviders struct {
2017-08-28 19:07:23 +00:00
providers map[string]Provider
approvalsManager approvals.Manager
stopCh chan struct{}
}
func (p *DefaultProviders) subscribeToApproved() {
ctx, cancel := context.WithCancel(context.Background())
approvedCh, err := p.approvalsManager.SubscribeApproved(ctx)
if err != nil {
log.WithFields(log.Fields{
"error": err,
}).Fatal("provider.subscribeToApproved: failed to subscribe for approved reqs")
}
for {
select {
case approval := <-approvedCh:
p.Submit(*approval.Event)
case <-p.stopCh:
cancel()
return
}
}
}
2017-07-20 17:55:47 +00:00
// Submit - submit event to all providers
func (p *DefaultProviders) Submit(event types.Event) error {
for _, provider := range p.providers {
err := provider.Submit(event)
if err != nil {
log.WithFields(log.Fields{
"error": err,
"provider": provider.GetName(),
"event": event.Repository,
"trigger": event.TriggerName,
2017-08-28 19:07:23 +00:00
}).Error("provider.Submit: submit event failed")
}
}
return nil
}
2017-07-20 17:55:47 +00:00
// TrackedImages - get tracked images for provider
func (p *DefaultProviders) TrackedImages() ([]*types.TrackedImage, error) {
var trackedImages []*types.TrackedImage
for _, provider := range p.providers {
ti, err := provider.TrackedImages()
if err != nil {
log.WithFields(log.Fields{
"error": err,
"provider": provider.GetName(),
2017-07-23 17:15:16 +00:00
}).Error("provider.defaultProviders: failed to get tracked images")
2017-07-20 17:55:47 +00:00
continue
}
trackedImages = append(trackedImages, ti...)
}
return trackedImages, nil
}
// List - list available providers
func (p *DefaultProviders) List() []string {
list := []string{}
for name := range p.providers {
list = append(list, name)
}
return list
}
2017-07-20 17:55:47 +00:00
// Stop - stop all providers
func (p *DefaultProviders) Stop() {
for _, provider := range p.providers {
provider.Stop()
}
}