fed: Further refactor of sync controller reconcile

This change breaks out non-delete cluster updates into a method for
testability.
This commit is contained in:
Maru Newby
2017-05-04 14:40:43 -07:00
parent 547ece5b83
commit 23b2cee8de
3 changed files with 123 additions and 32 deletions

View File

@@ -348,40 +348,25 @@ func (s *FederationSyncController) reconcile(namespacedName types.NamespacedName
return statusAllOK
}
glog.V(3).Infof("Ensuring finalizers for %s %q", kind, key)
glog.V(3).Infof("Ensuring finalizers exist on %s %q", kind, key)
obj, err = s.deletionHelper.EnsureFinalizers(obj)
if err != nil {
glog.Errorf("Failed to ensure finalizers for %s %q: %v", kind, key, err)
return statusError
}
glog.V(3).Infof("Syncing %s %q in underlying clusters", kind, key)
clusters, err := s.informer.GetReadyClusters()
if err != nil {
glog.Errorf("Failed to get cluster list: %v", err)
return statusNotSynced
operationsAccessor := func(adapter federatedtypes.FederatedTypeAdapter, clusters []*federationapi.Cluster, obj pkgruntime.Object) ([]util.FederatedOperation, error) {
return clusterOperations(adapter, clusters, obj, func(clusterName string) (interface{}, bool, error) {
return s.informer.GetTargetStore().GetByKey(clusterName, key)
})
}
operations, err := clusterOperations(s.adapter, clusters, obj, key, func(clusterName string) (interface{}, bool, error) {
return s.informer.GetTargetStore().GetByKey(clusterName, key)
})
if err != nil {
glog.Error(err)
return statusError
}
if len(operations) == 0 {
return statusAllOK
}
err = s.updater.Update(operations)
if err != nil {
glog.Errorf("Failed to execute updates for %s %q: %v", kind, key, err)
return statusError
}
// Evertyhing is in order but let's be double sure
return statusNeedsRecheck
return syncToClusters(
s.informer.GetReadyClusters,
operationsAccessor,
s.updater.Update,
s.adapter,
obj,
)
}
func (s *FederationSyncController) objFromCache(kind, key string) (pkgruntime.Object, error) {
@@ -424,10 +409,47 @@ func (s *FederationSyncController) delete(obj pkgruntime.Object, kind string, na
return nil
}
type clusterAccessor func(clusterName string) (interface{}, bool, error)
type clustersAccessorFunc func() ([]*federationapi.Cluster, error)
type operationsFunc func(federatedtypes.FederatedTypeAdapter, []*federationapi.Cluster, pkgruntime.Object) ([]util.FederatedOperation, error)
type executionFunc func([]util.FederatedOperation) error
// syncToClusters ensures that the state of the given object is synchronized to member clusters.
func syncToClusters(clustersAccessor clustersAccessorFunc, operationsAccessor operationsFunc, execute executionFunc, adapter federatedtypes.FederatedTypeAdapter, obj pkgruntime.Object) reconciliationStatus {
kind := adapter.Kind()
key := federatedtypes.ObjectKey(adapter, obj)
glog.V(3).Infof("Syncing %s %q in underlying clusters", kind, key)
clusters, err := clustersAccessor()
if err != nil {
glog.Errorf("Failed to get cluster list: %v", err)
return statusNotSynced
}
operations, err := operationsAccessor(adapter, clusters, obj)
if err != nil {
glog.Error(err)
return statusError
}
if len(operations) == 0 {
return statusAllOK
}
err = execute(operations)
if err != nil {
glog.Errorf("Failed to execute updates for %s %q: %v", kind, key, err)
return statusError
}
// Evertyhing is in order but let's be double sure
return statusNeedsRecheck
}
type clusterObjectAccessorFunc func(clusterName string) (interface{}, bool, error)
// clusterOperations returns the list of operations needed to synchronize the state of the given object to the provided clusters
func clusterOperations(adapter federatedtypes.FederatedTypeAdapter, clusters []*federationapi.Cluster, obj pkgruntime.Object, key string, accessor clusterAccessor) ([]util.FederatedOperation, error) {
func clusterOperations(adapter federatedtypes.FederatedTypeAdapter, clusters []*federationapi.Cluster, obj pkgruntime.Object, accessor clusterObjectAccessorFunc) ([]util.FederatedOperation, error) {
key := federatedtypes.ObjectKey(adapter, obj)
operations := make([]util.FederatedOperation, 0)
for _, cluster := range clusters {
clusterObj, found, err := accessor(cluster.Name)