approvals integration

pull/99/head
Karolis Rusenas 2017-09-12 15:54:36 +03:00
parent 1fc0d32771
commit fd6c1b96a2
3 changed files with 79 additions and 4 deletions

View File

@ -53,10 +53,10 @@ func (p *Provider) isApproved(event *types.Event, plan *UpdatePlan) (bool, error
return true, nil
}
deadline := types.KeelApprovalTimeoutDefault
deadline := types.KeelApprovalDeadlineDefault
// deadline
deadlineStr, ok := labels[types.KeelApprovalTimeoutLabel]
deadlineStr, ok := labels[types.KeelApprovalDeadlineLabel]
if ok {
d, err := strconv.Atoi(deadlineStr)
if err == nil {
@ -81,7 +81,7 @@ func (p *Provider) isApproved(event *types.Event, plan *UpdatePlan) (bool, error
VotesRequired: minApprovals,
VotesReceived: 0,
Rejected: false,
Deadline: time.Duration(deadline) * time.Minute,
Deadline: time.Now().Add(time.Duration(deadline) * time.Hour),
}
approval.Message = fmt.Sprintf("New image is available for deployment %s/%s (%s).",

View File

@ -2,6 +2,7 @@ package kubernetes
import (
"testing"
"time"
"github.com/rusenask/keel/types"
@ -76,3 +77,77 @@ func TestCheckRequestedApproval(t *testing.T) {
t.Errorf("wrong provider: %s", approval.Provider)
}
}
func TestApprovedCheck(t *testing.T) {
fp := &fakeImplementer{}
fp.namespaces = &v1.NamespaceList{
Items: []v1.Namespace{
v1.Namespace{
meta_v1.TypeMeta{},
meta_v1.ObjectMeta{Name: "xxxx"},
v1.NamespaceSpec{},
v1.NamespaceStatus{},
},
},
}
fp.deploymentList = &v1beta1.DeploymentList{
Items: []v1beta1.Deployment{
v1beta1.Deployment{
meta_v1.TypeMeta{},
meta_v1.ObjectMeta{
Name: "dep-1",
Namespace: "xxxx",
Labels: map[string]string{types.KeelPolicyLabel: "all", types.KeelMinimumApprovalsLabel: "1"},
},
v1beta1.DeploymentSpec{
Template: v1.PodTemplateSpec{
Spec: v1.PodSpec{
Containers: []v1.Container{
v1.Container{
Image: "gcr.io/v2-namespace/hello-world:1.1.1",
},
},
},
},
},
v1beta1.DeploymentStatus{},
},
},
}
approver := approver()
provider, err := NewProvider(fp, &fakeSender{}, approver)
if err != nil {
t.Fatalf("failed to get provider: %s", err)
}
// approving event
err = provider.approvalManager.Create(&types.Approval{
Identifier: "xxxx/dep-1:1.1.2",
VotesReceived: 2,
VotesRequired: 2,
Deadline: time.Now().Add(10 * time.Second),
})
if err != nil {
t.Fatalf("failed to create approval: %s", err)
}
appr, _ := provider.approvalManager.Get("xxxx/dep-1:1.1.2")
if appr.Status() != types.ApprovalStatusApproved {
t.Fatalf("approval not approved")
}
// creating "new version" event
repo := types.Repository{
Name: "gcr.io/v2-namespace/hello-world",
Tag: "1.1.2",
}
deps, err := provider.processEvent(&types.Event{Repository: repo})
if err != nil {
t.Errorf("failed to get deployments: %s", err)
}
if len(deps) != 1 {
t.Errorf("expected to find 1 updated deployment but found %d", len(deps))
}
}

View File

@ -92,7 +92,7 @@ func (s *fakeSender) Send(event types.EventNotification) error {
func approver() *approvals.DefaultManager {
cache := memory.NewMemoryCache(10*time.Minute, 10*time.Minute, 10*time.Minute)
return approvals.New(cache, codecs.DefaultSerializer(), &fakeProvider{})
return approvals.New(cache, codecs.DefaultSerializer())
}
func TestGetNamespaces(t *testing.T) {