Skip to content

Commit

Permalink
Merge pull request openshift#17955 from coreydaley/trello_1435_defaul…
Browse files Browse the repository at this point in the history
…t_tolerations_via_buildconfig_defaulter

Automatic merge from submit-queue.

Ability to specify default tolerations via the buildconfig defaulter
  • Loading branch information
openshift-merge-robot authored and mjudeikis committed Jan 7, 2018
2 parents 44c3009 + bf3275f commit 2820878
Show file tree
Hide file tree
Showing 11 changed files with 114 additions and 25 deletions.
7 changes: 3 additions & 4 deletions pkg/apps/generated/informers/internalversion/factory.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,16 @@
package internalversion

import (
reflect "reflect"
sync "sync"
time "time"

apps "github.com/openshift/origin/pkg/apps/generated/informers/internalversion/apps"
internalinterfaces "github.com/openshift/origin/pkg/apps/generated/informers/internalversion/internalinterfaces"
internalclientset "github.com/openshift/origin/pkg/apps/generated/internalclientset"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
runtime "k8s.io/apimachinery/pkg/runtime"
schema "k8s.io/apimachinery/pkg/runtime/schema"
cache "k8s.io/client-go/tools/cache"
reflect "reflect"
sync "sync"
time "time"
)

type sharedInformerFactory struct {
Expand Down
1 change: 0 additions & 1 deletion pkg/apps/generated/informers/internalversion/generic.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ package internalversion

import (
"fmt"

apps "github.com/openshift/origin/pkg/apps/apis/apps"
schema "k8s.io/apimachinery/pkg/runtime/schema"
cache "k8s.io/client-go/tools/cache"
Expand Down
29 changes: 12 additions & 17 deletions pkg/build/controller/build/defaults/defaults.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,9 @@ func (b BuildDefaults) ApplyDefaults(pod *v1.Pod) error {
}

glog.V(4).Infof("Applying defaults to build %s/%s", build.Namespace, build.Name)

b.applyBuildDefaults(build)

glog.V(4).Infof("Applying defaults to pod %s/%s", pod.Namespace, pod.Name)
b.applyPodDefaults(pod)

err = buildadmission.SetPodLogLevelFromBuild(pod, build)
Expand All @@ -68,11 +68,13 @@ func (b BuildDefaults) applyPodDefaults(pod *v1.Pod) {
}
}

if len(b.config.Annotations) != 0 && pod.Annotations == nil {
pod.Annotations = map[string]string{}
}
for k, v := range b.config.Annotations {
addDefaultAnnotations(k, v, pod.Annotations)
if len(b.config.Annotations) != 0 {
if pod.Annotations == nil {
pod.Annotations = map[string]string{}
}
for k, v := range b.config.Annotations {
addDefaultAnnotation(k, v, pod.Annotations)
}
}

// Apply default resources
Expand Down Expand Up @@ -187,29 +189,22 @@ func addDefaultEnvVar(build *buildapi.Build, v kapi.EnvVar) {
}

func addDefaultLabel(defaultLabel buildapi.ImageLabel, buildLabels *[]buildapi.ImageLabel) {
found := false
for _, lbl := range *buildLabels {
if lbl.Name == defaultLabel.Name {
found = true
return
}
}
if !found {
*buildLabels = append(*buildLabels, defaultLabel)
}
*buildLabels = append(*buildLabels, defaultLabel)
}

func addDefaultNodeSelector(k, v string, selectors map[string]string) bool {
func addDefaultNodeSelector(k, v string, selectors map[string]string) {
if _, ok := selectors[k]; !ok {
selectors[k] = v
return true
}
return false
}

func addDefaultAnnotations(k, v string, annotations map[string]string) bool {
func addDefaultAnnotation(k, v string, annotations map[string]string) {
if _, ok := annotations[k]; !ok {
annotations[k] = v
return true
}
return false
}
5 changes: 5 additions & 0 deletions pkg/build/controller/build/overrides/api/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package api

import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
kapi "k8s.io/kubernetes/pkg/apis/core"

buildapi "github.com/openshift/origin/pkg/build/apis/build"
)
Expand All @@ -27,4 +28,8 @@ type BuildOverridesConfig struct {

// annotations are annotations that will be added to the build pod
Annotations map[string]string

// tolerations is a list of Tolerations that will override any existing
// tolerations set on a build pod.
Tolerations []kapi.Toleration
}
5 changes: 5 additions & 0 deletions pkg/build/controller/build/overrides/api/v1/types.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package v1

import (
kapi "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

buildapi "github.com/openshift/api/build/v1"
Expand All @@ -25,4 +26,8 @@ type BuildOverridesConfig struct {

// annotations are annotations that will be added to the build pod
Annotations map[string]string `json:"annotations,omitempty"`

// tolerations is a list of Tolerations that will override any existing
// tolerations set on a build pod.
Tolerations []kapi.Toleration `json:"tolerations,omitempty"`
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ package v1

import (
build_v1 "github.com/openshift/api/build/v1"
core_v1 "k8s.io/api/core/v1"
runtime "k8s.io/apimachinery/pkg/runtime"
)

Expand All @@ -32,6 +33,13 @@ func (in *BuildOverridesConfig) DeepCopyInto(out *BuildOverridesConfig) {
(*out)[key] = val
}
}
if in.Tolerations != nil {
in, out := &in.Tolerations, &out.Tolerations
*out = make([]core_v1.Toleration, len(*in))
for i := range *in {
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
return
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ package api
import (
build "github.com/openshift/origin/pkg/build/apis/build"
runtime "k8s.io/apimachinery/pkg/runtime"
core "k8s.io/kubernetes/pkg/apis/core"
)

// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
Expand All @@ -32,6 +33,13 @@ func (in *BuildOverridesConfig) DeepCopyInto(out *BuildOverridesConfig) {
(*out)[key] = val
}
}
if in.Tolerations != nil {
in, out := &in.Tolerations, &out.Tolerations
*out = make([]core.Toleration, len(*in))
for i := range *in {
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
return
}

Expand Down
21 changes: 21 additions & 0 deletions pkg/build/controller/build/overrides/overrides.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
package overrides

import (
"fmt"

"github.com/golang/glog"

"k8s.io/api/core/v1"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
kapiv1 "k8s.io/kubernetes/pkg/apis/core/v1"

buildadmission "github.com/openshift/origin/pkg/build/admission"
buildapi "github.com/openshift/origin/pkg/build/apis/build"
Expand Down Expand Up @@ -84,6 +89,22 @@ func (b BuildOverrides) ApplyOverrides(pod *v1.Pod) error {
pod.Annotations[k] = v
}

// Override Tolerations
if len(b.config.Tolerations) != 0 {
glog.V(5).Infof("Overriding tolerations for pod %s/%s", pod.Namespace, pod.Name)
pod.Spec.Tolerations = []v1.Toleration{}
for _, toleration := range b.config.Tolerations {
t := v1.Toleration{}

if err := kapiv1.Convert_core_Toleration_To_v1_Toleration(&toleration, &t, nil); err != nil {
err := fmt.Errorf("Unable to convert core.Toleration to v1.Toleration: %v", err)
utilruntime.HandleError(err)
return err
}
pod.Spec.Tolerations = append(pod.Spec.Tolerations, t)
}
}

return buildadmission.SetBuildInPod(pod, build, version)
}

Expand Down
16 changes: 13 additions & 3 deletions pkg/image/importer/importer.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,9 +81,11 @@ func NewImageStreamImporter(retriever RepositoryRetriever, maximumTagsPerRepo in
// Import tries to complete the provided isi object with images loaded from remote registries.
func (i *ImageStreamImporter) Import(ctx gocontext.Context, isi *imageapi.ImageStreamImport, stream *imageapi.ImageStream) error {
// Initialize layer size cache if not given.
glog.V(5).Infof("BUG15. ISI")
if i.digestToLayerSizeCache == nil {
cache, err := NewImageStreamLayerCache(DefaultImageStreamLayerCacheSize)
if err != nil {
glog.V(5).Infof("BUG15. ISI. Error [%v]", err)
return err
}
i.digestToLayerSizeCache = &cache
Expand All @@ -92,7 +94,7 @@ func (i *ImageStreamImporter) Import(ctx gocontext.Context, isi *imageapi.ImageS
if _, ok := i.digestToRepositoryCache[ctx]; !ok {
i.digestToRepositoryCache[ctx] = make(map[manifestKey]*imageapi.Image)
}

glog.V(5).Infof("BUG15. Importing... [%v]", isi.Spec)
i.importImages(ctx, i.retriever, isi, stream, i.limiter)
i.importFromRepository(ctx, i.retriever, isi, i.maximumTagsPerRepo, i.limiter)
return nil
Expand All @@ -107,6 +109,7 @@ func (i *ImageStreamImporter) importImages(ctx gocontext.Context, retriever Repo
cache := i.digestToRepositoryCache[ctx]

isi.Status.Images = make([]imageapi.ImageImportStatus, len(isi.Spec.Images))
glog.V(5).Infof("BUG15. Importing image. [%v]", isi.Status.Images)
for i := range isi.Spec.Images {
spec := &isi.Spec.Images[i]
from := spec.From
Expand Down Expand Up @@ -143,6 +146,7 @@ func (i *ImageStreamImporter) importImages(ctx gocontext.Context, retriever Repo
}
repositories[key] = repo
}
glog.V(5).Infof("BUG15. Importing image. [%v][%v]", repo, repositories)

if len(defaultRef.ID) > 0 {
id := manifestKey{repositoryKey: key}
Expand Down Expand Up @@ -458,6 +462,7 @@ func (isi *ImageStreamImporter) importRepositoryFromDocker(ctx gocontext.Context
glog.V(5).Infof("importing remote Docker repository registry=%s repository=%s insecure=%t", repository.Registry, repository.Name, repository.Insecure)
// retrieve the repository
repo, err := retriever.Repository(ctx, repository.Registry, repository.Name, repository.Insecure)
glog.V(5).Infof("unable to access repository %#v", repo)
if err != nil {
glog.V(5).Infof("unable to access repository %#v: %#v", repository, err)
switch {
Expand All @@ -473,13 +478,16 @@ func (isi *ImageStreamImporter) importRepositoryFromDocker(ctx gocontext.Context
err = kapierrors.NewUnauthorized(fmt.Sprintf("you may not have access to the Docker image %q and did not have credentials to the repository", repository.Ref.Exact()))
case strings.HasSuffix(err.Error(), "does not support v2 API"):
importRepositoryFromDockerV1(ctx, repository, limiter)
glog.V(5).Infof("BUG15. importRepositoryFromDocker. [%v]", err)
return
}
applyErrorToRepository(repository, err)
glog.V(5).Infof("BUG15. importRepositoryFromDocker. [%v] [%v]", repository, err)
return
}

glog.V(4).Infof("BUG15. Repo followup [%v]", repo)
// get a manifest context

s, err := repo.Manifests(ctx)
if err != nil {
glog.V(5).Infof("unable to access manifests for repository %#v: %#v", repository, err)
Expand Down Expand Up @@ -576,12 +584,14 @@ func (isi *ImageStreamImporter) importRepositoryFromDocker(ctx gocontext.Context

manifest, err := s.Get(ctx, "", distribution.WithTag(importTag.Name))
if err != nil {
glog.V(5).Infof("unable to get manifest by tag %q for image %s: %#v", importTag.Name, ref.Exact(), err)
glog.V(5).Infof("unable to get manifest by tag %q for image [%s]: [%#v]", importTag.Name, ref.Exact(), err)
importTag.Err = formatRepositoryError(ref, err)
glog.V(5).Infof("formated error [%v]", importTag.Err)
continue
}

importTag.Image, importTag.Err = isi.importManifest(ctx, manifest, ref, "", s, b, importTag.PreferArch, importTag.PreferOS)
glog.V(5).Infof("BUG15. Erros %#v", importTag.Err)
}
}

Expand Down
4 changes: 4 additions & 0 deletions pkg/image/registry/imagestreamimport/rest.go
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,7 @@ func (r *REST) Create(ctx apirequest.Context, obj runtime.Object, createValidati

// only load secrets if we need them
credentials := importer.NewLazyCredentialsForSecrets(func() ([]corev1.Secret, error) {
glog.V(4).Infof("BUG15. Secret loader")
secrets, err := r.isClient.ImageStreams(namespace).Secrets(isi.Name, metav1.ListOptions{})
if err != nil {
return nil, err
Expand All @@ -201,16 +202,19 @@ func (r *REST) Create(ctx apirequest.Context, obj runtime.Object, createValidati
}
return secretsv1, nil
})
glog.V(4).Infof("BUG15. creds [%v]", credentials)
importCtx := importer.NewContext(r.transport, r.insecureTransport).WithCredentials(credentials)
imports := r.importFn(importCtx)
if err := imports.Import(ctx.(gocontext.Context), isi, stream); err != nil {
glog.V(4).Infof("BUG15. Secret loader error")
return nil, kapierrors.NewInternalError(err)
}

// if we encountered an error loading credentials and any images could not be retrieved with an access
// related error, modify the message.
// TODO: set a status cause
if err := credentials.Err(); err != nil {
glog.V(4).Infof("BUG15. Error")
for i, image := range isi.Status.Images {
switch image.Status.Reason {
case metav1.StatusReasonUnauthorized, metav1.StatusReasonForbidden:
Expand Down
35 changes: 35 additions & 0 deletions test/integration/buildpod_admission_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
watchapi "k8s.io/apimachinery/pkg/watch"
kclientset "k8s.io/client-go/kubernetes"
kapi "k8s.io/kubernetes/pkg/apis/core"
kapiv1 "k8s.io/kubernetes/pkg/apis/core/v1"

buildtestutil "github.com/openshift/origin/pkg/build/admission/testutil"
buildapi "github.com/openshift/origin/pkg/build/apis/build"
Expand Down Expand Up @@ -107,6 +108,40 @@ func TestBuildDefaultAnnotations(t *testing.T) {
}
}

func TestBuildOverrideTolerations(t *testing.T) {
tolerations := []kapi.Toleration{
{
Key: "mykey1",
Value: "myvalue1",
Effect: "NoSchedule",
Operator: "Equal",
},
{
Key: "mykey2",
Value: "myvalue2",
Effect: "NoSchedule",
Operator: "Equal",
},
}

oclient, kclientset, fn := setupBuildOverridesAdmissionTest(t, &overridesapi.BuildOverridesConfig{
Tolerations: tolerations,
})

defer fn()

_, pod := runBuildPodAdmissionTest(t, oclient, kclientset, buildPodAdmissionTestDockerBuild())
for i, toleration := range tolerations {
tol := v1.Toleration{}
if err := kapiv1.Convert_core_Toleration_To_v1_Toleration(&toleration, &tol, nil); err != nil {
t.Errorf("Unable to convert core.Toleration to v1.Toleration: %v", err)
}
if !reflect.DeepEqual(pod.Spec.Tolerations[i], tol) {
t.Errorf("Resulting pod did not get expected tolerations, expected: %#v, actual: %#v", toleration, pod.Spec.Tolerations[i])
}
}
}

func TestBuildOverrideForcePull(t *testing.T) {
oclient, kclientset, fn := setupBuildOverridesAdmissionTest(t, &overridesapi.BuildOverridesConfig{
ForcePull: true,
Expand Down

0 comments on commit 2820878

Please sign in to comment.