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
34 changes: 27 additions & 7 deletions Gopkg.lock

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

8 changes: 4 additions & 4 deletions cmd/start.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@ import (

"github.com/golang/glog"
"github.com/google/uuid"
clientset "github.com/openshift/client-go/config/clientset/versioned"
informers "github.com/openshift/client-go/config/informers/externalversions"
"github.com/openshift/cluster-version-operator/pkg/autoupdate"
"github.com/openshift/cluster-version-operator/pkg/cvo"
clientset "github.com/openshift/cluster-version-operator/pkg/generated/clientset/versioned"
informers "github.com/openshift/cluster-version-operator/pkg/generated/informers/externalversions"
"github.com/openshift/cluster-version-operator/pkg/version"
"github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/spf13/cobra"
Expand Down Expand Up @@ -253,7 +253,7 @@ func startControllers(ctx *controllerContext) error {
overrideDirectory,
ctx.ResyncPeriod(),
ctx.InformerFactory.Config().V1().ClusterVersions(),
ctx.InformerFactory.Operatorstatus().V1().ClusterOperators(),
ctx.InformerFactory.Config().V1().ClusterOperators(),
ctx.ClientBuilder.RestConfig(),
ctx.ClientBuilder.ClientOrDie(componentName),
ctx.ClientBuilder.KubeClientOrDie(componentName),
Expand All @@ -264,7 +264,7 @@ func startControllers(ctx *controllerContext) error {
go autoupdate.New(
componentNamespace, componentName,
ctx.InformerFactory.Config().V1().ClusterVersions(),
ctx.InformerFactory.Operatorstatus().V1().ClusterOperators(),
ctx.InformerFactory.Config().V1().ClusterOperators(),
ctx.ClientBuilder.ClientOrDie(componentName),
ctx.ClientBuilder.KubeClientOrDie(componentName),
).Run(2, ctx.Stop)
Expand Down
4 changes: 2 additions & 2 deletions docs/dev/clusteroperator.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

The ClusterOperator is a custom resource object which holds the current state of an operator. This object is used by operators to convey their state to the rest of the cluster.

Ref: [godoc](https://godoc.org/github.com/openshift/cluster-version-operator/pkg/apis/operatorstatus.openshift.io/v1#ClusterOperator) for more info on the ClusterOperator type.
Ref: [godoc](https://godoc.org/github.com/openshift/api/config/v1#ClusterOperator) for more info on the ClusterOperator type.

## Why I want ClusterOperator Custom Resource in /manifests

Expand Down Expand Up @@ -58,4 +58,4 @@ The operator should report a version which indicates the components that it is a

### Conditions

Refer [the godocs](https://godoc.org/github.com/openshift/cluster-version-operator/pkg/apis/operatorstatus.openshift.io/v1#ClusterStatusConditionType) for conditions.
Refer [the godocs](https://godoc.org/github.com/openshift/api/config/v1#ClusterStatusConditionType) for conditions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ spec:
listKind: ClusterOperatorList
plural: clusteroperators
singular: clusteroperator
scope: Namespaced
scope: Cluster
subresources:
status: {}
version: v1
Expand Down
10 changes: 5 additions & 5 deletions lib/resourceapply/cv.go
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
package resourceapply

import (
configv1 "github.com/openshift/api/config/v1"
configclientv1 "github.com/openshift/client-go/config/clientset/versioned/typed/config/v1"
configlistersv1 "github.com/openshift/client-go/config/listers/config/v1"
"github.com/openshift/cluster-version-operator/lib/resourcemerge"
cvv1 "github.com/openshift/cluster-version-operator/pkg/apis/config.openshift.io/v1"
cvclientv1 "github.com/openshift/cluster-version-operator/pkg/generated/clientset/versioned/typed/config.openshift.io/v1"
cvlistersv1 "github.com/openshift/cluster-version-operator/pkg/generated/listers/config.openshift.io/v1"
"k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/utils/pointer"
)

func ApplyClusterVersion(client cvclientv1.ClusterVersionsGetter, required *cvv1.ClusterVersion) (*cvv1.ClusterVersion, bool, error) {
func ApplyClusterVersion(client configclientv1.ClusterVersionsGetter, required *configv1.ClusterVersion) (*configv1.ClusterVersion, bool, error) {
existing, err := client.ClusterVersions().Get(required.Name, metav1.GetOptions{})
if errors.IsNotFound(err) {
actual, err := client.ClusterVersions().Create(required)
Expand All @@ -30,7 +30,7 @@ func ApplyClusterVersion(client cvclientv1.ClusterVersionsGetter, required *cvv1
return actual, true, err
}

func ApplyClusterVersionFromCache(lister cvlistersv1.ClusterVersionLister, client cvclientv1.ClusterVersionsGetter, required *cvv1.ClusterVersion) (*cvv1.ClusterVersion, bool, error) {
func ApplyClusterVersionFromCache(lister configlistersv1.ClusterVersionLister, client configclientv1.ClusterVersionsGetter, required *configv1.ClusterVersion) (*configv1.ClusterVersion, bool, error) {
obj, err := lister.Get(required.Name)
if errors.IsNotFound(err) {
actual, err := client.ClusterVersions().Create(required)
Expand Down
13 changes: 4 additions & 9 deletions lib/resourcemerge/cv.go
Original file line number Diff line number Diff line change
@@ -1,20 +1,15 @@
package resourcemerge

import (
cvv1 "github.com/openshift/cluster-version-operator/pkg/apis/config.openshift.io/v1"
configv1 "github.com/openshift/api/config/v1"
"k8s.io/apimachinery/pkg/api/equality"
)

func EnsureClusterVersion(modified *bool, existing *cvv1.ClusterVersion, required cvv1.ClusterVersion) {
func EnsureClusterVersion(modified *bool, existing *configv1.ClusterVersion, required configv1.ClusterVersion) {
EnsureObjectMeta(modified, &existing.ObjectMeta, required.ObjectMeta)
if !equality.Semantic.DeepEqual(existing.Spec.Upstream, required.Spec.Upstream) {
*modified = true
if required.Spec.Upstream != nil {
copied := *required.Spec.Upstream
existing.Spec.Upstream = &copied
} else {
existing.Spec.Upstream = nil
}
existing.Spec.Upstream = required.Spec.Upstream
}
if existing.Spec.Channel != required.Spec.Channel {
*modified = true
Expand All @@ -36,7 +31,7 @@ func EnsureClusterVersion(modified *bool, existing *cvv1.ClusterVersion, require
}
}

func EnsureClusterVersionStatus(modified *bool, existing *cvv1.ClusterVersion, required cvv1.ClusterVersion) {
func EnsureClusterVersionStatus(modified *bool, existing *configv1.ClusterVersion, required configv1.ClusterVersion) {
if !equality.Semantic.DeepEqual(existing.Status, required.Status) {
*modified = true
existing.Status = *required.Status.DeepCopy()
Expand Down
30 changes: 15 additions & 15 deletions lib/resourcemerge/os.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,15 @@ import (
"k8s.io/apimachinery/pkg/api/equality"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

osv1 "github.com/openshift/cluster-version-operator/pkg/apis/operatorstatus.openshift.io/v1"
configv1 "github.com/openshift/api/config/v1"
)

func EnsureClusterOperatorStatus(modified *bool, existing *osv1.ClusterOperator, required osv1.ClusterOperator) {
func EnsureClusterOperatorStatus(modified *bool, existing *configv1.ClusterOperator, required configv1.ClusterOperator) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This file should no longer exist in CVO. openshift/library-go#97 seems like better place for these functions. For now its okay as-is

EnsureObjectMeta(modified, &existing.ObjectMeta, required.ObjectMeta)
ensureClusterOperatorStatus(modified, &existing.Status, required.Status)
}

func ensureClusterOperatorStatus(modified *bool, existing *osv1.ClusterOperatorStatus, required osv1.ClusterOperatorStatus) {
func ensureClusterOperatorStatus(modified *bool, existing *configv1.ClusterOperatorStatus, required configv1.ClusterOperatorStatus) {
if !equality.Semantic.DeepEqual(existing.Conditions, required.Conditions) {
*modified = true
existing.Conditions = required.Conditions
Expand All @@ -33,9 +33,9 @@ func ensureClusterOperatorStatus(modified *bool, existing *osv1.ClusterOperatorS
}
}

func SetOperatorStatusCondition(conditions *[]osv1.ClusterOperatorStatusCondition, newCondition osv1.ClusterOperatorStatusCondition) {
func SetOperatorStatusCondition(conditions *[]configv1.ClusterOperatorStatusCondition, newCondition configv1.ClusterOperatorStatusCondition) {
if conditions == nil {
conditions = &[]osv1.ClusterOperatorStatusCondition{}
conditions = &[]configv1.ClusterOperatorStatusCondition{}
}
existingCondition := FindOperatorStatusCondition(*conditions, newCondition.Type)
if existingCondition == nil {
Expand All @@ -53,11 +53,11 @@ func SetOperatorStatusCondition(conditions *[]osv1.ClusterOperatorStatusConditio
existingCondition.Message = newCondition.Message
}

func RemoveOperatorStatusCondition(conditions *[]osv1.ClusterOperatorStatusCondition, conditionType osv1.ClusterStatusConditionType) {
func RemoveOperatorStatusCondition(conditions *[]configv1.ClusterOperatorStatusCondition, conditionType configv1.ClusterStatusConditionType) {
if conditions == nil {
conditions = &[]osv1.ClusterOperatorStatusCondition{}
conditions = &[]configv1.ClusterOperatorStatusCondition{}
}
newConditions := []osv1.ClusterOperatorStatusCondition{}
newConditions := []configv1.ClusterOperatorStatusCondition{}
for _, condition := range *conditions {
if condition.Type != conditionType {
newConditions = append(newConditions, condition)
Expand All @@ -67,7 +67,7 @@ func RemoveOperatorStatusCondition(conditions *[]osv1.ClusterOperatorStatusCondi
*conditions = newConditions
}

func FindOperatorStatusCondition(conditions []osv1.ClusterOperatorStatusCondition, conditionType osv1.ClusterStatusConditionType) *osv1.ClusterOperatorStatusCondition {
func FindOperatorStatusCondition(conditions []configv1.ClusterOperatorStatusCondition, conditionType configv1.ClusterStatusConditionType) *configv1.ClusterOperatorStatusCondition {
for i := range conditions {
if conditions[i].Type == conditionType {
return &conditions[i]
Expand All @@ -77,15 +77,15 @@ func FindOperatorStatusCondition(conditions []osv1.ClusterOperatorStatusConditio
return nil
}

func IsOperatorStatusConditionTrue(conditions []osv1.ClusterOperatorStatusCondition, conditionType osv1.ClusterStatusConditionType) bool {
return IsOperatorStatusConditionPresentAndEqual(conditions, conditionType, osv1.ConditionTrue)
func IsOperatorStatusConditionTrue(conditions []configv1.ClusterOperatorStatusCondition, conditionType configv1.ClusterStatusConditionType) bool {
return IsOperatorStatusConditionPresentAndEqual(conditions, conditionType, configv1.ConditionTrue)
}

func IsOperatorStatusConditionFalse(conditions []osv1.ClusterOperatorStatusCondition, conditionType osv1.ClusterStatusConditionType) bool {
return IsOperatorStatusConditionPresentAndEqual(conditions, conditionType, osv1.ConditionFalse)
func IsOperatorStatusConditionFalse(conditions []configv1.ClusterOperatorStatusCondition, conditionType configv1.ClusterStatusConditionType) bool {
return IsOperatorStatusConditionPresentAndEqual(conditions, conditionType, configv1.ConditionFalse)
}

func IsOperatorStatusConditionPresentAndEqual(conditions []osv1.ClusterOperatorStatusCondition, conditionType osv1.ClusterStatusConditionType, status osv1.ConditionStatus) bool {
func IsOperatorStatusConditionPresentAndEqual(conditions []configv1.ClusterOperatorStatusCondition, conditionType configv1.ClusterStatusConditionType, status configv1.ConditionStatus) bool {
for _, condition := range conditions {
if condition.Type == conditionType {
return condition.Status == status
Expand All @@ -94,7 +94,7 @@ func IsOperatorStatusConditionPresentAndEqual(conditions []osv1.ClusterOperatorS
return false
}

func IsOperatorStatusConditionNotIn(conditions []osv1.ClusterOperatorStatusCondition, conditionType osv1.ClusterStatusConditionType, status ...osv1.ConditionStatus) bool {
func IsOperatorStatusConditionNotIn(conditions []configv1.ClusterOperatorStatusCondition, conditionType configv1.ClusterStatusConditionType, status ...configv1.ConditionStatus) bool {
for _, condition := range conditions {
if condition.Type == conditionType {
for _, s := range status {
Expand Down
66 changes: 66 additions & 0 deletions lib/validation/validation.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package validation

import (
"net/url"
"strings"

"github.com/blang/semver"
"github.com/google/uuid"

apivalidation "k8s.io/apimachinery/pkg/api/validation"
"k8s.io/apimachinery/pkg/util/validation/field"

configv1 "github.com/openshift/api/config/v1"
)

func ValidateClusterVersion(config *configv1.ClusterVersion) field.ErrorList {
errs := apivalidation.ValidateObjectMeta(&config.ObjectMeta, false, apivalidation.NameIsDNS1035Label, nil)

if len(config.Spec.Upstream) > 0 {
if _, err := url.Parse(string(config.Spec.Upstream)); err != nil {
errs = append(errs, field.Invalid(field.NewPath("spec", "upstream"), config.Spec.Upstream, "must be a valid URL or empty"))
}
}
if len(config.Spec.ClusterID) > 0 {
id, _ := uuid.Parse(string(config.Spec.ClusterID))
switch {
case id.Variant() != uuid.RFC4122:
errs = append(errs, field.Invalid(field.NewPath("spec", "clusterID"), config.Spec.ClusterID, "must be an RFC4122-variant UUID"))
case id.Version() != 4:
errs = append(errs, field.Invalid(field.NewPath("spec", "clusterID"), config.Spec.ClusterID, "must be a version-4 UUID"))
}
}
if u := config.Spec.DesiredUpdate; u != nil {
switch {
case len(u.Version) == 0 && len(u.Payload) == 0:
errs = append(errs, field.Required(field.NewPath("spec", "desiredUpdate", "version"), "must specify version or payload"))
case len(u.Version) > 0 && !validSemVer(u.Version):
errs = append(errs, field.Invalid(field.NewPath("spec", "desiredUpdate", "version"), u.Version, "must be a semantic version (1.2.3[-...])"))
}
}
return errs
}

func ClearInvalidFields(config *configv1.ClusterVersion, errs field.ErrorList) *configv1.ClusterVersion {
if len(errs) == 0 {
return config
}
copied := config.DeepCopy()
for _, err := range errs {
switch {
case strings.HasPrefix(err.Field, "spec.desiredUpdate."):
copied.Spec.DesiredUpdate = nil
case err.Field == "spec.upstream":
// TODO: invalid means, don't fetch updates
copied.Spec.Upstream = ""
case err.Field == "spec.clusterID":
copied.Spec.ClusterID = ""
}
}
return copied
}

func validSemVer(version string) bool {
_, err := semver.Parse(version)
return err == nil
}
7 changes: 0 additions & 7 deletions pkg/apis/apis.go

This file was deleted.

Loading