Skip to content

Commit ac394f1

Browse files
Merge pull request #252 from csrwng/hosted
Allow excluding manifests from CVO payload
2 parents 8240a9b + e890ab6 commit ac394f1

File tree

5 files changed

+44
-14
lines changed

5 files changed

+44
-14
lines changed

pkg/cvo/cvo.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,10 @@ type Operator struct {
139139
// lastAtLock guards access to controller memory about the sync loop
140140
lastAtLock sync.Mutex
141141
lastResourceVersion int64
142+
143+
// exclude is an optional identifier used to exclude certain manifests
144+
// via annotation
145+
exclude string
142146
}
143147

144148
// New returns a new cluster version operator.
@@ -156,6 +160,7 @@ func New(
156160
client clientset.Interface,
157161
kubeClient kubernetes.Interface,
158162
enableMetrics bool,
163+
exclude string,
159164
) *Operator {
160165
eventBroadcaster := record.NewBroadcaster()
161166
eventBroadcaster.StartLogging(klog.Infof)
@@ -181,6 +186,8 @@ func New(
181186
queue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "clusterversion"),
182187
availableUpdatesQueue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "availableupdates"),
183188
upgradeableQueue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "upgradeable"),
189+
190+
exclude: exclude,
184191
}
185192

186193
cvInformer.Informer().AddEventHandler(optr.eventHandler())
@@ -246,6 +253,7 @@ func (optr *Operator) InitializeFromPayload(restConfig *rest.Config, burstRestCo
246253
Factor: 1.3,
247254
Steps: 3,
248255
},
256+
optr.exclude,
249257
)
250258

251259
return nil

pkg/cvo/cvo_scenarios_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ func setupCVOTest(payloadDir string) (*Operator, map[string]runtime.Object, *fak
9090
wait.Backoff{
9191
Steps: 1,
9292
},
93+
"",
9394
)
9495
o.configSync = worker
9596

pkg/cvo/sync_worker.go

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -126,11 +126,11 @@ func (w SyncWorkerStatus) DeepCopy() *SyncWorkerStatus {
126126
// syncOnce() returns nil -> Reconciling
127127
//
128128
type SyncWorker struct {
129-
backoff wait.Backoff
130-
retriever PayloadRetriever
131-
builder payload.ResourceBuilder
132-
preconditions precondition.List
133-
reconciling bool
129+
backoff wait.Backoff
130+
retriever PayloadRetriever
131+
builder payload.ResourceBuilder
132+
preconditions precondition.List
133+
reconciling bool
134134

135135
// minimumReconcileInterval is the minimum time between reconcile attempts, and is
136136
// used to define the maximum backoff interval when syncOnce() returns an error.
@@ -148,11 +148,16 @@ type SyncWorker struct {
148148

149149
// updated by the run method only
150150
payload *payload.Update
151+
152+
// exclude is an identifier used to determine which
153+
// manifests should be excluded based on an annotation
154+
// of the form exclude.release.openshift.io/<identifier>=true
155+
exclude string
151156
}
152157

153158
// NewSyncWorker initializes a ConfigSyncWorker that will retrieve payloads to disk, apply them via builder
154159
// to a server, and obey limits about how often to reconcile or retry on errors.
155-
func NewSyncWorker(retriever PayloadRetriever, builder payload.ResourceBuilder, reconcileInterval time.Duration, backoff wait.Backoff) *SyncWorker {
160+
func NewSyncWorker(retriever PayloadRetriever, builder payload.ResourceBuilder, reconcileInterval time.Duration, backoff wait.Backoff, exclude string) *SyncWorker {
156161
return &SyncWorker{
157162
retriever: retriever,
158163
builder: builder,
@@ -165,14 +170,16 @@ func NewSyncWorker(retriever PayloadRetriever, builder payload.ResourceBuilder,
165170
// Status() or use the result of calling Update() instead because the channel can be out of date
166171
// if the reader is not fast enough.
167172
report: make(chan SyncWorkerStatus, 500),
173+
174+
exclude: exclude,
168175
}
169176
}
170177

171178
// NewSyncWorkerWithPreconditions initializes a ConfigSyncWorker that will retrieve payloads to disk, apply them via builder
172179
// to a server, and obey limits about how often to reconcile or retry on errors.
173180
// It allows providing preconditions for loading payload.
174-
func NewSyncWorkerWithPreconditions(retriever PayloadRetriever, builder payload.ResourceBuilder, preconditions precondition.List, reconcileInterval time.Duration, backoff wait.Backoff) *SyncWorker {
175-
worker := NewSyncWorker(retriever, builder, reconcileInterval, backoff)
181+
func NewSyncWorkerWithPreconditions(retriever PayloadRetriever, builder payload.ResourceBuilder, preconditions precondition.List, reconcileInterval time.Duration, backoff wait.Backoff, exclude string) *SyncWorker {
182+
worker := NewSyncWorker(retriever, builder, reconcileInterval, backoff, exclude)
176183
worker.preconditions = preconditions
177184
return worker
178185
}
@@ -614,7 +621,7 @@ func (w *SyncWorker) apply(ctx context.Context, payloadUpdate *payload.Update, w
614621
klog.V(4).Infof("Running sync for %s", task)
615622
klog.V(5).Infof("Manifest: %s", string(task.Manifest.Raw))
616623

617-
ov, ok := getOverrideForManifest(work.Overrides, task.Manifest)
624+
ov, ok := getOverrideForManifest(work.Overrides, w.exclude, task.Manifest)
618625
if ok && ov.Unmanaged {
619626
klog.V(4).Infof("Skipping %s as unmanaged", task)
620627
continue
@@ -906,7 +913,7 @@ func newMultipleError(errs []error) error {
906913
}
907914

908915
// getOverrideForManifest returns the override and true when override exists for manifest.
909-
func getOverrideForManifest(overrides []configv1.ComponentOverride, manifest *lib.Manifest) (configv1.ComponentOverride, bool) {
916+
func getOverrideForManifest(overrides []configv1.ComponentOverride, excludeIdentifier string, manifest *lib.Manifest) (configv1.ComponentOverride, bool) {
910917
for idx, ov := range overrides {
911918
kind, namespace, name := manifest.GVK.Kind, manifest.Object().GetNamespace(), manifest.Object().GetName()
912919
if ov.Kind == kind &&
@@ -915,6 +922,10 @@ func getOverrideForManifest(overrides []configv1.ComponentOverride, manifest *li
915922
return overrides[idx], true
916923
}
917924
}
925+
excludeAnnotation := fmt.Sprintf("exclude.release.openshift.io/%s", excludeIdentifier)
926+
if annotations := manifest.Object().GetAnnotations(); annotations != nil && annotations[excludeAnnotation] == "true" {
927+
return configv1.ComponentOverride{Unmanaged: true}, true
928+
}
918929
return configv1.ComponentOverride{}, false
919930
}
920931

pkg/start/start.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,11 @@ type Options struct {
5858
EnableAutoUpdate bool
5959
EnableDefaultClusterVersion bool
6060

61+
// Exclude is used to determine whether to exclude
62+
// certain manifests based on an annotation:
63+
// exclude.release.openshift.io/<identifier>=true
64+
Exclude string
65+
6166
// for testing only
6267
Name string
6368
Namespace string
@@ -87,6 +92,7 @@ func NewOptions() *Options {
8792
PayloadOverride: os.Getenv("PAYLOAD_OVERRIDE"),
8893
ResyncInterval: minResyncPeriod,
8994
EnableMetrics: true,
95+
Exclude: os.Getenv("EXCLUDE_MANIFESTS"),
9096
}
9197
}
9298

@@ -100,6 +106,9 @@ func (o *Options) Run() error {
100106
if len(o.PayloadOverride) > 0 {
101107
klog.Warningf("Using an override payload directory for testing only: %s", o.PayloadOverride)
102108
}
109+
if len(o.Exclude) > 0 {
110+
klog.Infof("Excluding manifests for %q", o.Exclude)
111+
}
103112

104113
// initialize the core objects
105114
cb, err := newClientBuilder(o.Kubeconfig)
@@ -337,6 +346,7 @@ func (o *Options) NewControllerContext(cb *ClientBuilder) *Context {
337346
cb.ClientOrDie(o.Namespace),
338347
cb.KubeClientOrDie(o.Namespace, useProtobuf),
339348
o.EnableMetrics,
349+
o.Exclude,
340350
),
341351
}
342352
if o.EnableAutoUpdate {

pkg/start/start_integration_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ func TestIntegrationCVO_initializeAndUpgrade(t *testing.T) {
241241
options.EnableMetrics = false
242242
controllers := options.NewControllerContext(cb)
243243

244-
worker := cvo.NewSyncWorker(retriever, cvo.NewResourceBuilder(cfg, cfg, nil), 5*time.Second, wait.Backoff{Steps: 3})
244+
worker := cvo.NewSyncWorker(retriever, cvo.NewResourceBuilder(cfg, cfg, nil), 5*time.Second, wait.Backoff{Steps: 3}, "")
245245
controllers.CVO.SetSyncWorkerForTesting(worker)
246246

247247
ctx, cancel := context.WithCancel(context.Background())
@@ -394,7 +394,7 @@ func TestIntegrationCVO_initializeAndHandleError(t *testing.T) {
394394
options.ResyncInterval = 3 * time.Second
395395
controllers := options.NewControllerContext(cb)
396396

397-
worker := cvo.NewSyncWorker(retriever, cvo.NewResourceBuilder(cfg, cfg, nil), 5*time.Second, wait.Backoff{Duration: time.Second, Factor: 1.2})
397+
worker := cvo.NewSyncWorker(retriever, cvo.NewResourceBuilder(cfg, cfg, nil), 5*time.Second, wait.Backoff{Duration: time.Second, Factor: 1.2}, "")
398398
controllers.CVO.SetSyncWorkerForTesting(worker)
399399

400400
ctx, cancel := context.WithCancel(context.Background())
@@ -500,7 +500,7 @@ func TestIntegrationCVO_gracefulStepDown(t *testing.T) {
500500
options.EnableMetrics = false
501501
controllers := options.NewControllerContext(cb)
502502

503-
worker := cvo.NewSyncWorker(&mapPayloadRetriever{}, cvo.NewResourceBuilder(cfg, cfg, nil), 5*time.Second, wait.Backoff{Steps: 3})
503+
worker := cvo.NewSyncWorker(&mapPayloadRetriever{}, cvo.NewResourceBuilder(cfg, cfg, nil), 5*time.Second, wait.Backoff{Steps: 3}, "")
504504
controllers.CVO.SetSyncWorkerForTesting(worker)
505505

506506
lock, err := createResourceLock(cb, ns, ns)
@@ -673,7 +673,7 @@ metadata:
673673
t.Fatal(err)
674674
}
675675

676-
worker := cvo.NewSyncWorker(retriever, cvo.NewResourceBuilder(cfg, cfg, nil), 5*time.Second, wait.Backoff{Steps: 3})
676+
worker := cvo.NewSyncWorker(retriever, cvo.NewResourceBuilder(cfg, cfg, nil), 5*time.Second, wait.Backoff{Steps: 3}, "")
677677
controllers.CVO.SetSyncWorkerForTesting(worker)
678678

679679
ctx, cancel := context.WithCancel(context.Background())

0 commit comments

Comments
 (0)