Skip to content
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
111 changes: 29 additions & 82 deletions Gopkg.lock

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

5 changes: 5 additions & 0 deletions Gopkg.toml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,10 @@ required = [ "k8s.io/code-generator/cmd/client-gen", "k8s.io/gengo/types" ]
name = "k8s.io/code-generator"
version = "kubernetes-1.11.1"

[[constraint]]
name = "k8s.io/kube-aggregator"
version = "kubernetes-1.11.1"

[[constraint]]
name = "k8s.io/utils"
revision = "045dc31ee5c40e8240241ce28dc24d7b56130373"
Expand All @@ -62,3 +66,4 @@ required = [ "k8s.io/code-generator/cmd/client-gen", "k8s.io/gengo/types" ]
[[constraint]]
name = "github.com/openshift/client-go"
branch = "master"

30 changes: 30 additions & 0 deletions lib/resourceapply/apireg.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package resourceapply

import (
"github.com/openshift/cluster-version-operator/lib/resourcemerge"
apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
apiregv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1"
apiregclientv1 "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1"
"k8s.io/utils/pointer"
)

func ApplyAPIService(client apiregclientv1.APIServicesGetter, required *apiregv1.APIService) (*apiregv1.APIService, bool, error) {
existing, err := client.APIServices().Get(required.Name, metav1.GetOptions{})
if apierrors.IsNotFound(err) {
actual, err := client.APIServices().Create(required)
return actual, true, err
}
if err != nil {
return nil, false, err
}

modified := pointer.BoolPtr(false)
resourcemerge.EnsureAPIService(modified, existing, *required)
if !*modified {
return existing, false, nil
}

actual, err := client.APIServices().Update(existing)
return actual, true, err
}
31 changes: 30 additions & 1 deletion lib/resourceapply/core.go
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package resourceapply

import (
"github.com/openshift/cluster-version-operator/lib/resourcemerge"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/equality"
apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
coreclientv1 "k8s.io/client-go/kubernetes/typed/core/v1"
"k8s.io/utils/pointer"

"github.com/openshift/cluster-version-operator/lib/resourcemerge"
)

// ApplyNamespace merges objectmeta, does not worry about anything else
Expand All @@ -30,6 +32,33 @@ func ApplyNamespace(client coreclientv1.NamespacesGetter, required *corev1.Names
return actual, true, err
}

// ApplyService merges objectmeta and requires
// TODO, since this cannot determine whether changes are due to legitimate actors (api server) or illegitimate ones (users), we cannot update
// TODO I've special cased the selector for now
func ApplyService(client coreclientv1.ServicesGetter, required *corev1.Service) (*corev1.Service, bool, error) {
existing, err := client.Services(required.Namespace).Get(required.Name, metav1.GetOptions{})
if apierrors.IsNotFound(err) {
actual, err := client.Services(required.Namespace).Create(required)
return actual, true, err
}
if err != nil {
return nil, false, err
}

modified := pointer.BoolPtr(false)
resourcemerge.EnsureObjectMeta(modified, &existing.ObjectMeta, required.ObjectMeta)
selectorSame := equality.Semantic.DeepEqual(existing.Spec.Selector, required.Spec.Selector)
typeSame := equality.Semantic.DeepEqual(existing.Spec.Type, required.Spec.Type)
if selectorSame && typeSame && !*modified {
return nil, false, nil
}
existing.Spec.Selector = required.Spec.Selector
existing.Spec.Type = required.Spec.Type // if this is different, the update will fail. Status will indicate it.

actual, err := client.Services(required.Namespace).Update(existing)
return actual, true, err
}

// ApplyServiceAccount applies the required serviceaccount to the cluster.
func ApplyServiceAccount(client coreclientv1.ServiceAccountsGetter, required *corev1.ServiceAccount) (*corev1.ServiceAccount, bool, error) {
existing, err := client.ServiceAccounts(required.Namespace).Get(required.Name, metav1.GetOptions{})
Expand Down
36 changes: 36 additions & 0 deletions lib/resourcebuilder/apireg.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package resourcebuilder

import (
"github.com/openshift/cluster-version-operator/lib"
"github.com/openshift/cluster-version-operator/lib/resourceapply"
"github.com/openshift/cluster-version-operator/lib/resourceread"
"k8s.io/client-go/rest"
apiregclientv1 "k8s.io/kube-aggregator/pkg/client/clientset_generated/clientset/typed/apiregistration/v1"
)

type apiServiceBuilder struct {
client *apiregclientv1.ApiregistrationV1Client
raw []byte
modifier MetaV1ObjectModifierFunc
}

func newAPIServiceBuilder(config *rest.Config, m lib.Manifest) Interface {
return &apiServiceBuilder{
client: apiregclientv1.NewForConfigOrDie(config),
raw: m.Raw,
}
}

func (b *apiServiceBuilder) WithModifier(f MetaV1ObjectModifierFunc) Interface {
b.modifier = f
return b
}

func (b *apiServiceBuilder) Do() error {
apiService := resourceread.ReadAPIServiceV1OrDie(b.raw)
if b.modifier != nil {
b.modifier(apiService)
}
_, _, err := resourceapply.ApplyAPIService(b.client, apiService)
return err
}
4 changes: 2 additions & 2 deletions lib/resourcebuilder/apps.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,11 @@ func (b *deploymentBuilder) Do() error {
if b.modifier != nil {
b.modifier(deployment)
}
_, updated, err := resourceapply.ApplyDeployment(b.client, deployment)
actual, updated, err := resourceapply.ApplyDeployment(b.client, deployment)
if err != nil {
return err
}
if updated {
if updated && actual.Generation > 1 {
return waitForDeploymentCompletion(b.client, deployment)
}
return nil
Expand Down
27 changes: 27 additions & 0 deletions lib/resourcebuilder/core.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,3 +88,30 @@ func (b *namespaceBuilder) Do() error {
_, _, err := resourceapply.ApplyNamespace(b.client, namespace)
return err
}

type serviceBuilder struct {
client *coreclientv1.CoreV1Client
raw []byte
modifier MetaV1ObjectModifierFunc
}

func newServiceBuilder(config *rest.Config, m lib.Manifest) Interface {
return &serviceBuilder{
client: coreclientv1.NewForConfigOrDie(config),
raw: m.Raw,
}
}

func (b *serviceBuilder) WithModifier(f MetaV1ObjectModifierFunc) Interface {
b.modifier = f
return b
}

func (b *serviceBuilder) Do() error {
service := resourceread.ReadServiceV1OrDie(b.raw)
if b.modifier != nil {
b.modifier(service)
}
_, _, err := resourceapply.ApplyService(b.client, service)
return err
}
Loading