Skip to content
This repository has been archived by the owner on Apr 24, 2023. It is now read-only.

INTLY-5492 Include stateful sets #32

Merged
merged 1 commit into from May 27, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
32 changes: 27 additions & 5 deletions cmd/cli/main.go
Expand Up @@ -11,6 +11,7 @@ import (
"github.com/integr8ly/heimdall/pkg/cluster"
"github.com/integr8ly/heimdall/pkg/controller/deploymentconfigs"
"github.com/integr8ly/heimdall/pkg/controller/deployments"
"github.com/integr8ly/heimdall/pkg/controller/statefulset"
"github.com/integr8ly/heimdall/pkg/domain"
"github.com/integr8ly/heimdall/pkg/registry"
"github.com/integr8ly/heimdall/pkg/rhcc"
Expand Down Expand Up @@ -49,6 +50,7 @@ func main() {
registryIS := registry.NewImagesService(&registry.Client{}, &rhcc.Client{}, &rhcc.Client{})
dcReport := deploymentconfigs.NewReport(clusterIS, registryIS, dcClient)
deploymentReport := deployments.NewReport(clusterIS, registryIS, client.AppsV1())
statefulSetReport := statefulset.NewReport(clusterIS, registryIS, client.AppsV1())
var reports []domain.ReportResult
namespaces, err := getNamespaces(client, namespacePtr)
if err != nil {
Expand All @@ -59,14 +61,15 @@ func main() {
log.Fatalf("error filtering namespaces with pattern %s: %v", *namespacePatternPtr, err)
}
for _, n := range namespaces {

dcReports, err := dcReport.Generate(n, *componentPtr)
nsReports, err := accumulateReports(n, *componentPtr,
dcReport.Generate,
deploymentReport.Generate,
statefulSetReport.Generate,
)
if err != nil {
log.Println("failed to generate image report " + err.Error())
}
reports = append(reports, dcReports...)
deploymentReports, err := deploymentReport.Generate(n, *componentPtr)
reports = append(reports, deploymentReports...)
reports = append(reports, nsReports...)
t := table.NewWriter()
t.SetOutputMirror(os.Stdout)

Expand Down Expand Up @@ -156,3 +159,22 @@ func filterNamespaces(namespaces []string, namespacePatternFlag *string) ([]stri

return result, nil
}

// accumulateReports takes a variadic list of functions that generate reports
// and invokes them passing the same given ns and name, and accumulates all
// the results in a single slice. If any of the generate function fails, the
// function returns the error.
func accumulateReports(ns, name string, generateFns ...func(string, string) ([]domain.ReportResult, error)) ([]domain.ReportResult, error) {
result := []domain.ReportResult{}

for _, generateFn := range generateFns {
reports, err := generateFn(ns, name)
if err != nil {
return result, err
}

result = append(result, reports...)
}

return result, nil
}
1 change: 1 addition & 0 deletions deploy/cluster_role.yaml
Expand Up @@ -24,6 +24,7 @@ rules:
- apps
resources:
- deployments
- statefulsets
verbs:
- '*'
- apiGroups:
Expand Down
1 change: 1 addition & 0 deletions deploy/role.yaml
Expand Up @@ -26,6 +26,7 @@ rules:
resources:
- replicasets
- deployments
- statefulsets
- deployments/finalizers
verbs:
- '*'
Expand Down
7 changes: 7 additions & 0 deletions go.sum
Expand Up @@ -51,6 +51,7 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ=
github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps=
github.com/brancz/gojsontoyaml v0.0.0-20190425155809-e8bd32d46b3d/go.mod h1:IyUJYN1gvWjtLF5ZuygmxbnsAyP3aJS6cHzIuZY50B0=
Expand Down Expand Up @@ -107,6 +108,7 @@ github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyG
github.com/docker/distribution v0.0.0-20170726174610-edc3ab29cdff/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
github.com/docker/distribution v2.6.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
github.com/docker/distribution v2.7.0+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug=
github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/docker/docker v0.7.3-0.20190409004836-2e1cfbca03da/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
Expand Down Expand Up @@ -216,6 +218,7 @@ github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48 h1:X+zN6RZXsvnrSJaAIQhZezPfAfvsqihKKR8oiLHid34=
github.com/gogo/protobuf v1.2.2-0.20190730201129-28a6bbf47e48/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20180513044358-24b0969c4cb7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
Expand Down Expand Up @@ -420,7 +423,9 @@ github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa
github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo=
github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
github.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ=
github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
github.com/opencontainers/image-spec v0.0.0-20170604055404-372ad780f634 h1:BNgUWy7fCNMkfpyG05/9wWeDnIY4hqs9UpqkGIjAb68=
github.com/opencontainers/image-spec v0.0.0-20170604055404-372ad780f634/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
github.com/opencontainers/runc v0.0.0-20181113202123-f000fe11ece1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
github.com/opencontainers/runtime-spec v1.0.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
Expand All @@ -429,6 +434,7 @@ github.com/openshift/api v3.9.1-0.20190424152011-77b8897ec79a+incompatible h1:q2
github.com/openshift/api v3.9.1-0.20190424152011-77b8897ec79a+incompatible/go.mod h1:dh9o4Fs58gpFXGSYfnVxGR9PnV53I8TW84pQaJDdGiY=
github.com/openshift/client-go v0.0.0-20190401163519-84c2b942258a h1:2t89qt9TR5koRb55cdTMM3NOMP238eHNeUnZ7uihHSA=
github.com/openshift/client-go v0.0.0-20190401163519-84c2b942258a/go.mod h1:6rzn+JTr7+WYS2E1TExP4gByoABxMznR6y2SnUIkmxk=
github.com/openshift/origin v0.0.0-20160503220234-8f127d736703 h1:KLVRXtjLhZHVtrcdnuefaI2Bf182EEiTfEVDHokoyng=
github.com/openshift/origin v0.0.0-20160503220234-8f127d736703/go.mod h1:0Rox5r9C8aQn6j1oAOQ0c1uC86mYbUFObzjBRvUKHII=
github.com/openshift/prom-label-proxy v0.1.1-0.20191016113035-b8153a7f39f1/go.mod h1:p5MuxzsYP1JPsNGwtjtcgRHHlGziCJJfztff91nNixw=
github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
Expand Down Expand Up @@ -805,6 +811,7 @@ k8s.io/kubelet v0.0.0-20190918202550-958285cf3eef/go.mod h1:y3faEeGRJ9L54/YJWIF0
k8s.io/kubernetes v1.11.7-beta.0.0.20181219023948-b875d52ea96d/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk=
k8s.io/kubernetes v1.11.8-beta.0.0.20190124204751-3a10094374f2/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk=
k8s.io/kubernetes v1.14.2/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk=
k8s.io/kubernetes v1.15.4 h1:ykcH+DoCr9wYjYfHvd2xU0HoSo/Y9m4+/0+zHqkYjbw=
k8s.io/kubernetes v1.15.4/go.mod h1:4Ggyo4AFgjbIzULOminzUJAvgbzY3j5ysXlW/a0PdcQ=
k8s.io/legacy-cloud-providers v0.0.0-20190918203421-225f0541b3ea/go.mod h1:qd7ZEaONgkMZRdUbaoK6ngxjuJz8kLBImMukwL7mOIg=
k8s.io/metrics v0.0.0-20190918202012-3c1ca76f5bda/go.mod h1:LxAN6ulYLPVQGTtRkXEUyylgseTWArq1iCZ9Zve8edc=
Expand Down
45 changes: 43 additions & 2 deletions pkg/cluster/deployments_deployment_configs.go
Expand Up @@ -3,11 +3,12 @@ package cluster
import (
"context"
"fmt"
"regexp"

"github.com/integr8ly/heimdall/pkg/domain"
v1 "github.com/openshift/api/apps/v1"
"github.com/pkg/errors"
v12 "k8s.io/api/apps/v1"
"regexp"
"sigs.k8s.io/controller-runtime/pkg/client"
)

Expand All @@ -21,9 +22,10 @@ func NewObjectLabeler(c client.Client) *ObjectsLabeler {
}
}

func (ol *ObjectsLabeler) LabelAllDeploymentsAndDeploymentConfigs(ctx context.Context, labels map[string]string, excludePattern string, ns string) error {
func (ol *ObjectsLabeler) LabelObjects(ctx context.Context, labels map[string]string, excludePattern string, ns string) error {
dcList := &v1.DeploymentConfigList{}
depList := &v12.DeploymentList{}
statSetList := &v12.StatefulSetList{}
var listOpts = &client.ListOptions{Namespace: ns}
var matchRegex *regexp.Regexp

Expand All @@ -33,6 +35,9 @@ func (ol *ObjectsLabeler) LabelAllDeploymentsAndDeploymentConfigs(ctx context.Co
if err := ol.client.List(ctx, depList, listOpts); err != nil {
return errors.Wrap(err, "failed to list deployments in namespace "+ns)
}
if err := ol.client.List(ctx, statSetList, listOpts); err != nil {
return errors.Wrap(err, "failed to list stateful sets in namespace "+ns)
}

var err error
matchRegex, err = regexp.Compile(excludePattern)
Expand Down Expand Up @@ -76,12 +81,31 @@ func (ol *ObjectsLabeler) LabelAllDeploymentsAndDeploymentConfigs(ctx context.Co
return err
}
}
for _, statSet := range statSetList.Items {
if statSet.Labels == nil {
statSet.Labels = map[string]string{}
}

for k, v := range labels {
if excludePattern != "" && matchRegex.MatchString(statSet.Name) {
fmt.Printf("skipping %s as matched by excludePattern %s/n",
statSet.Name, excludePattern)
delete(statSet.Labels, k)
continue
}
statSet.Labels[k] = v
}
if err := ol.client.Update(context.TODO(), &statSet); err != nil {
return err
}
}
return nil
}

func (ol *ObjectsLabeler) RemoveLabelsAnnotations(ctx context.Context, labels map[string]string, ns string) error {
dcList := &v1.DeploymentConfigList{}
depList := &v12.DeploymentList{}
statSetList := &v12.StatefulSetList{}
var listOpts = &client.ListOptions{Namespace: ns}

if err := ol.client.List(ctx, dcList, listOpts); err != nil {
Expand All @@ -90,6 +114,9 @@ func (ol *ObjectsLabeler) RemoveLabelsAnnotations(ctx context.Context, labels ma
if err := ol.client.List(ctx, depList, listOpts); err != nil {
return errors.Wrap(err, "failed to list deployments in namespace "+ns)
}
if err := ol.client.List(ctx, statSetList, listOpts); err != nil {
return errors.Wrap(err, "failed to list stateful sets in namespace "+ns)
}

for _, dc := range dcList.Items {

Expand Down Expand Up @@ -121,5 +148,19 @@ func (ol *ObjectsLabeler) RemoveLabelsAnnotations(ctx context.Context, labels ma
return err
}
}
for _, statSet := range statSetList.Items {
if statSet.Labels != nil {
for k, _ := range labels {
delete(statSet.Labels, k)
}
}
if statSet.Annotations != nil {
delete(statSet.Annotations, domain.HeimdallLastChecked)
delete(statSet.Annotations, domain.HeimdallImagesChecked)
}
if err := ol.client.Update(context.TODO(), &statSet); err != nil {
return err
}
}
return nil
}
2 changes: 2 additions & 0 deletions pkg/controller/add_resources.go
Expand Up @@ -4,11 +4,13 @@ import (
"github.com/integr8ly/heimdall/pkg/controller/deploymentconfigs"
"github.com/integr8ly/heimdall/pkg/controller/deployments"
"github.com/integr8ly/heimdall/pkg/controller/imagemonitor"
"github.com/integr8ly/heimdall/pkg/controller/statefulset"
)

func init() {
// AddToManagerFuncs is a list of functions to create controllers and add them to a manager.
AddToManagerFuncs = append(AddToManagerFuncs, deploymentconfigs.Add)
AddToManagerFuncs = append(AddToManagerFuncs, deployments.Add)
AddToManagerFuncs = append(AddToManagerFuncs, imagemonitor.Add)
AddToManagerFuncs = append(AddToManagerFuncs, statefulset.Add)
}