Skip to content

Commit

Permalink
Merge pull request #179 from keel-hq/develop
Browse files Browse the repository at this point in the history
Develop
  • Loading branch information
rusenask committed Apr 1, 2018
2 parents cf8d4d3 + cb55441 commit 8ae2990
Show file tree
Hide file tree
Showing 107 changed files with 17,940 additions and 77 deletions.
52 changes: 50 additions & 2 deletions Gopkg.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion approvals/approvals.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ func New(cache cache.Cache, serializer codecs.Serializer) *DefaultManager {
// that already reached their deadline
func (m *DefaultManager) StartExpiryService(ctx context.Context) error {
ticker := time.NewTicker(60 * time.Minute)

defer ticker.Stop()
err := m.expireEntries()
if err != nil {
log.WithFields(log.Fields{
Expand Down
2 changes: 1 addition & 1 deletion chart/keel/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

image:
repository: keelhq/keel
tag: 0.8.0
tag: 0.8.3
pullPolicy: IfNotPresent

# Enable insecure registries
Expand Down
2 changes: 1 addition & 1 deletion deployment/deployment-norbac.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ spec:
spec:
serviceAccountName: keel
containers:
- image: karolisr/keel:0.8.0
- image: keelhq/keel:0.8.3
imagePullPolicy: Always
env:
# - name: POLL
Expand Down
2 changes: 1 addition & 1 deletion deployment/deployment-rbac.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ spec:
spec:
serviceAccountName: keel
containers:
- image: karolisr/keel:0.8.0
- image: keelhq/keel:0.8.3
imagePullPolicy: Always
env:
# - name: POLL
Expand Down
2 changes: 1 addition & 1 deletion hack/deployment.sample.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ spec:
spec:
serviceAccountName: keel
containers:
- image: keelhq/keel:0.8.0
- image: keelhq/keel:0.8.3
imagePullPolicy: Always
env:
# - name: POLL
Expand Down
27 changes: 26 additions & 1 deletion provider/helm/helm.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,38 @@ import (

hapi_chart "k8s.io/helm/pkg/proto/hapi/chart"

"github.com/prometheus/client_golang/prometheus"

"github.com/keel-hq/keel/extension/notification"

log "github.com/sirupsen/logrus"
"github.com/ghodss/yaml"
log "github.com/sirupsen/logrus"
"k8s.io/helm/pkg/chartutil"
"k8s.io/helm/pkg/helm"
"k8s.io/helm/pkg/strvals"
)

var helmVersionedUpdatesCounter = prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: "helm_versioned_updates_total",
Help: "How many versioned helm charts were updated, partitioned by chart name.",
},
[]string{"chart"},
)

var helmUnversionedUpdatesCounter = prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: "helm_unversioned_updates_total",
Help: "How many unversioned helm charts were updated, partitioned by chart name.",
},
[]string{"chart"},
)

func init() {
prometheus.MustRegister(helmVersionedUpdatesCounter)
prometheus.MustRegister(helmUnversionedUpdatesCounter)
}

// Manager - high level interface into helm provider related data used by
// triggers
type Manager interface {
Expand Down Expand Up @@ -250,6 +273,7 @@ func (p *Provider) createUpdatePlans(event *types.Event) ([]*UpdatePlan, error)

if update {
plans = append(plans, plan)
helmUnversionedUpdatesCounter.With(prometheus.Labels{"chart": fmt.Sprintf("%s/%s", release.Namespace, release.Name)}).Inc()
continue
}

Expand All @@ -270,6 +294,7 @@ func (p *Provider) createUpdatePlans(event *types.Event) ([]*UpdatePlan, error)
continue
}
if update {
helmVersionedUpdatesCounter.With(prometheus.Labels{"chart": fmt.Sprintf("%s/%s", release.Namespace, release.Name)}).Inc()
plans = append(plans, plan)
}
}
Expand Down
27 changes: 25 additions & 2 deletions provider/kubernetes/kubernetes.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ import (

"github.com/rusenask/cron"

// "k8s.io/api/core/v1"
"k8s.io/api/core/v1"

"k8s.io/api/extensions/v1beta1"

"github.com/prometheus/client_golang/prometheus"

"github.com/keel-hq/keel/approvals"
"github.com/keel-hq/keel/extension/notification"
"github.com/keel-hq/keel/types"
Expand All @@ -23,6 +23,27 @@ import (
log "github.com/sirupsen/logrus"
)

var kubernetesVersionedUpdatesCounter = prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: "kubernetes_versioned_updates_total",
Help: "How many versioned deployments were updated, partitioned by deployment name.",
},
[]string{"deployment"},
)

var kubernetesUnversionedUpdatesCounter = prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: "kubernetes_unversioned_updates_total",
Help: "How many unversioned deployments were updated, partitioned by deployment name.",
},
[]string{"deployment"},
)

func init() {
prometheus.MustRegister(kubernetesVersionedUpdatesCounter)
prometheus.MustRegister(kubernetesUnversionedUpdatesCounter)
}

// ProviderName - provider name
const ProviderName = "kubernetes"

Expand Down Expand Up @@ -218,10 +239,12 @@ func (p *Provider) updateDeployments(plans []*UpdatePlan) (updated []*v1beta1.De
if reset {
// force update, terminating all pods
err = p.forceUpdate(&deployment)
kubernetesUnversionedUpdatesCounter.With(prometheus.Labels{"deployment": fmt.Sprintf("%s/%s", deployment.Namespace, deployment.Name)}).Inc()
} else {
// regular update
deployment.Annotations["kubernetes.io/change-cause"] = fmt.Sprintf("keel automated update, version %s -> %s", plan.CurrentVersion, plan.NewVersion)
err = p.implementer.Update(&deployment)
kubernetesVersionedUpdatesCounter.With(prometheus.Labels{"deployment": fmt.Sprintf("%s/%s", deployment.Namespace, deployment.Name)}).Inc()
}
if err != nil {
log.WithFields(log.Fields{
Expand Down
85 changes: 48 additions & 37 deletions registry/registry.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@ package registry

import (
"errors"
"hash/fnv"
"os"
"strings"
"sync"

"github.com/rusenask/docker-registry-client/registry"

Expand Down Expand Up @@ -31,11 +34,17 @@ type Client interface {

// New - new registry client
func New() *DefaultClient {
return &DefaultClient{}
return &DefaultClient{
mu: &sync.Mutex{},
registries: make(map[uint32]*registry.Registry),
}
}

// DefaultClient - default client implementation
type DefaultClient struct {
// a map of registries to reuse for polling
mu *sync.Mutex
registries map[uint32]*registry.Registry
}

// Opts - registry client opts. If username & password are not supplied
Expand All @@ -50,33 +59,53 @@ func LogFormatter(format string, args ...interface{}) {
log.Debugf(format, args...)
}

// Get - get repository
func (c *DefaultClient) Get(opts Opts) (*Repository, error) {
func hash(s string) uint32 {
h := fnv.New32a()
h.Write([]byte(s))
return h.Sum32()
}

func (c *DefaultClient) getRegistryClient(registryAddress, username, password string) (*registry.Registry, error) {
c.mu.Lock()
defer c.mu.Unlock()

repo := &Repository{}
var r *registry.Registry

var hub *registry.Registry
var err error
h := hash(registryAddress + username + password)
r, ok := c.registries[h]
if ok {
return r, nil
}

url := strings.TrimSuffix(registryAddress, "/")
if os.Getenv(EnvInsecure) == "true" {
hub, err = registry.NewInsecure(opts.Registry, opts.Username, opts.Password)
if err != nil {
return nil, err
}
r = registry.NewInsecure(url, username, password)
} else {
hub, err = registry.New(opts.Registry, opts.Username, opts.Password)
if err != nil {
return nil, err
}
r = registry.New(url, username, password)
}

hub.Logf = LogFormatter
r.Logf = LogFormatter

c.registries[h] = r

return r, nil
}

// Get - get repository
func (c *DefaultClient) Get(opts Opts) (*Repository, error) {

hub, err := c.getRegistryClient(opts.Registry, opts.Username, opts.Password)
if err != nil {
return nil, err
}

tags, err := hub.Tags(opts.Name)
if err != nil {
return nil, err
}
repo.Tags = tags
repo := &Repository{
Tags: tags,
}

return repo, nil
}
Expand All @@ -87,29 +116,11 @@ func (c *DefaultClient) Digest(opts Opts) (string, error) {
return "", ErrTagNotSupplied
}

log.WithFields(log.Fields{
"registry": opts.Registry,
"repository": opts.Name,
"tag": opts.Tag,
}).Debug("registry client: getting digest")

var hub *registry.Registry
var err error

if os.Getenv(EnvInsecure) == "true" {
hub, err = registry.NewInsecure(opts.Registry, opts.Username, opts.Password)
if err != nil {
return "", err
}
} else {
hub, err = registry.New(opts.Registry, opts.Username, opts.Password)
if err != nil {
return "", err
}
hub, err := c.getRegistryClient(opts.Registry, opts.Username, opts.Password)
if err != nil {
return "", err
}

hub.Logf = LogFormatter

manifestDigest, err := hub.ManifestDigest(opts.Name, opts.Tag)
if err != nil {
return "", err
Expand Down
6 changes: 3 additions & 3 deletions registry/registry_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,15 @@ func TestDigest(t *testing.T) {
client := New()
digest, err := client.Digest(Opts{
Registry: "https://index.docker.io",
Name: "karolisr/keel",
Tag: "0.2.2",
Name: "keelhq/keel",
Tag: "0.8.0",
})

if err != nil {
t.Errorf("error while getting digest: %s", err)
}

if digest != "sha256:0604af35299dd37ff23937d115d103532948b568a9dd8197d14c256a8ab8b0bb" {
if digest != "sha256:671b6250a0793abdd9603d7f5c6f2fa1b4070661d6f56bcfc7ad5de86574ab48" {
t.Errorf("unexpected digest: %s", digest)
}
}
Expand Down
Loading

0 comments on commit 8ae2990

Please sign in to comment.