helm approvals

pull/99/head
Karolis Rusenas 2017-09-12 15:50:53 +03:00
parent ec7e4a2cd6
commit a589ad6556
1 changed files with 77 additions and 0 deletions

View File

@ -0,0 +1,77 @@
package helm
import (
"fmt"
"time"
"github.com/rusenask/keel/cache"
"github.com/rusenask/keel/types"
log "github.com/Sirupsen/logrus"
)
// namespace/release name/version
func getIdentifier(namespace, name, version string) string {
return namespace + "/" + name + ":" + version
}
func (p *Provider) checkForApprovals(event *types.Event, plans []*UpdatePlan) (approvedPlans []*UpdatePlan) {
approvedPlans = []*UpdatePlan{}
for _, plan := range plans {
approved, err := p.isApproved(event, plan)
if err != nil {
log.WithFields(log.Fields{
"error": err,
"release_name": plan.Name,
"namespace": plan.Namespace,
}).Error("provider.helm: failed to check approval status for deployment")
continue
}
if approved {
approvedPlans = append(approvedPlans, plan)
}
}
return approvedPlans
}
func (p *Provider) isApproved(event *types.Event, plan *UpdatePlan) (bool, error) {
if plan.Config.Approvals == 0 {
return true, nil
}
identifier := getIdentifier(plan.Namespace, plan.Name, plan.NewVersion)
// checking for existing approval
existing, err := p.approvalManager.Get(identifier)
if err != nil {
if err == cache.ErrNotFound {
// creating new one
approval := &types.Approval{
Provider: types.ProviderTypeKubernetes,
Identifier: identifier,
Event: event,
CurrentVersion: plan.CurrentVersion,
NewVersion: plan.NewVersion,
VotesRequired: plan.Config.Approvals,
VotesReceived: 0,
Rejected: false,
Deadline: time.Now().Add(time.Duration(plan.Config.ApprovalDeadline) * time.Hour),
}
approval.Message = fmt.Sprintf("New image is available for deployment %s/%s (%s).",
plan.Namespace,
plan.Name,
approval.Delta(),
)
fmt.Println("requesting approval, ns: ", plan.Namespace)
return false, p.approvalManager.Create(approval)
}
return false, err
}
return existing.Status() == types.ApprovalStatusApproved, nil
}