@@ -231,6 +231,10 @@ func NewFakeOperator(clientObjs []runtime.Object, k8sObjs []runtime.Object, extO
231
231
op .lister .APIRegistrationV1 ().RegisterAPIServiceLister (apiServiceInformer .Lister ())
232
232
op .lister .APIExtensionsV1beta1 ().RegisterCustomResourceDefinitionLister (customResourceDefinitionInformer .Lister ())
233
233
234
+ // TODO: are there other resources that query all namespaces?
235
+ csvInformerAll := externalversions .NewSharedInformerFactory (clientFake , wakeupInterval ).Operators ().V1alpha1 ().ClusterServiceVersions ()
236
+ op .lister .OperatorsV1alpha1 ().RegisterClusterServiceVersionLister (metav1 .NamespaceAll , csvInformerAll .Lister ())
237
+
234
238
var hasSyncedCheckFns []cache.InformerSynced
235
239
for _ , informer := range informerList {
236
240
op .RegisterInformer (informer )
@@ -3470,11 +3474,12 @@ func TestSyncOperatorGroups(t *testing.T) {
3470
3474
objects map [string ][]runtime.Object
3471
3475
}
3472
3476
tests := []struct {
3473
- initial initial
3474
- name string
3475
- expectedEqual bool
3476
- expectedStatus v1.OperatorGroupStatus
3477
- final final
3477
+ initial initial
3478
+ name string
3479
+ expectedEqual bool
3480
+ expectedStatus v1.OperatorGroupStatus
3481
+ final final
3482
+ ignoreCopyError bool
3478
3483
}{
3479
3484
{
3480
3485
name : "NoMatchingNamespace/NoCSVs" ,
@@ -3546,6 +3551,7 @@ func TestSyncOperatorGroups(t *testing.T) {
3546
3551
withAnnotations (operatorCSVFailedNoTargetNS .DeepCopy (), map [string ]string {v1 .OperatorGroupAnnotationKey : "operator-group-1" , v1 .OperatorGroupNamespaceAnnotationKey : operatorNamespace }),
3547
3552
},
3548
3553
}},
3554
+ ignoreCopyError : true ,
3549
3555
},
3550
3556
{
3551
3557
name : "MatchingNamespace/NoCSVs" ,
@@ -4147,25 +4153,67 @@ func TestSyncOperatorGroups(t *testing.T) {
4147
4153
err = op .syncOperatorGroups (tt .initial .operatorGroup )
4148
4154
require .NoError (t , err )
4149
4155
4156
+ // wait on operator group updated status to be in the cache as it is required for later CSV operations
4157
+ err = wait .PollImmediate (1 * time .Millisecond , 5 * time .Second , func () (bool , error ) {
4158
+ operatorGroup , err := op .lister .OperatorsV1 ().OperatorGroupLister ().OperatorGroups (tt .initial .operatorGroup .GetNamespace ()).Get (tt .initial .operatorGroup .GetName ())
4159
+ if err != nil {
4160
+ return false , err
4161
+ }
4162
+ sort .Strings (tt .expectedStatus .Namespaces )
4163
+ sort .Strings (operatorGroup .Status .Namespaces )
4164
+ if ! reflect .DeepEqual (tt .expectedStatus , operatorGroup .Status ) {
4165
+ return false , err
4166
+ }
4167
+ return true , nil
4168
+ })
4169
+ require .NoError (t , err )
4170
+
4171
+ // this must be done twice to have annotateCSVs run in syncOperatorGroups
4172
+ // and to catch provided API changes
4173
+ err = op .syncOperatorGroups (tt .initial .operatorGroup )
4174
+ require .NoError (t , err )
4175
+
4150
4176
// Sync csvs enough to get them back to succeeded state
4151
4177
for i := 0 ; i < 8 ; i ++ {
4152
4178
opGroupCSVs , err := op .client .OperatorsV1alpha1 ().ClusterServiceVersions (operatorNamespace ).List (metav1.ListOptions {})
4153
4179
require .NoError (t , err )
4154
4180
4155
- for _ , obj := range opGroupCSVs .Items {
4181
+ for i , obj := range opGroupCSVs .Items {
4156
4182
4157
4183
err = op .syncClusterServiceVersion (& obj )
4158
4184
require .NoError (t , err , "%#v" , obj )
4159
4185
4160
4186
err = op .syncCopyCSV (& obj )
4161
- require .NoError (t , err , "%#v" , obj )
4187
+ if ! tt .ignoreCopyError {
4188
+ require .NoError (t , err , "%#v" , obj )
4189
+ }
4190
+
4191
+ if i == 0 {
4192
+ err = wait .PollImmediate (1 * time .Millisecond , 5 * time .Second , func () (bool , error ) {
4193
+ for namespace , objects := range tt .final .objects {
4194
+ if err := RequireObjectsInCache (t , op .lister , namespace , objects , false ); err != nil {
4195
+ return false , nil
4196
+ }
4197
+ }
4198
+ return true , nil
4199
+ })
4200
+ require .NoError (t , err )
4201
+ }
4202
+
4203
+ if i == 8 {
4204
+ err = wait .PollImmediate (1 * time .Millisecond , 5 * time .Second , func () (bool , error ) {
4205
+ for namespace , objects := range tt .final .objects {
4206
+ if err := RequireObjectsInCache (t , op .lister , namespace , objects , true ); err != nil {
4207
+ return false , nil
4208
+ }
4209
+ }
4210
+ return true , nil
4211
+ })
4212
+ require .NoError (t , err )
4213
+ }
4162
4214
}
4163
4215
}
4164
4216
4165
- // Sync again to catch provided API changes
4166
- err = op .syncOperatorGroups (tt .initial .operatorGroup )
4167
- require .NoError (t , err )
4168
-
4169
4217
operatorGroup , err := op .GetClient ().OperatorsV1 ().OperatorGroups (tt .initial .operatorGroup .GetNamespace ()).Get (tt .initial .operatorGroup .GetName (), metav1.GetOptions {})
4170
4218
require .NoError (t , err )
4171
4219
sort .Strings (tt .expectedStatus .Namespaces )
@@ -4179,6 +4227,41 @@ func TestSyncOperatorGroups(t *testing.T) {
4179
4227
}
4180
4228
}
4181
4229
4230
+ func RequireObjectsInCache (t * testing.T , lister operatorlister.OperatorLister , namespace string , objects []runtime.Object , doCompare bool ) error {
4231
+ for _ , object := range objects {
4232
+ var err error
4233
+ var fetched runtime.Object
4234
+ switch o := object .(type ) {
4235
+ case * appsv1.Deployment :
4236
+ fetched , err = lister .AppsV1 ().DeploymentLister ().Deployments (namespace ).Get (o .GetName ())
4237
+ case * rbacv1.ClusterRole :
4238
+ fetched , err = lister .RbacV1 ().ClusterRoleLister ().Get (o .GetName ())
4239
+ case * rbacv1.Role :
4240
+ fetched , err = lister .RbacV1 ().RoleLister ().Roles (namespace ).Get (o .GetName ())
4241
+ case * rbacv1.ClusterRoleBinding :
4242
+ fetched , err = lister .RbacV1 ().ClusterRoleBindingLister ().Get (o .GetName ())
4243
+ case * rbacv1.RoleBinding :
4244
+ fetched , err = lister .RbacV1 ().RoleBindingLister ().RoleBindings (namespace ).Get (o .GetName ())
4245
+ case * v1alpha1.ClusterServiceVersion :
4246
+ fetched , err = lister .OperatorsV1alpha1 ().ClusterServiceVersionLister ().ClusterServiceVersions (namespace ).Get (o .GetName ())
4247
+ case * v1.OperatorGroup :
4248
+ fetched , err = lister .OperatorsV1 ().OperatorGroupLister ().OperatorGroups (namespace ).Get (o .GetName ())
4249
+ default :
4250
+ require .Failf (t , "couldn't find expected object" , "%#v" , object )
4251
+ }
4252
+ if err != nil {
4253
+ return fmt .Errorf ("namespace: %v, error: %v" , namespace , err )
4254
+ }
4255
+ if doCompare {
4256
+ if ! reflect .DeepEqual (object , fetched ) {
4257
+ diff .ObjectDiff (object , fetched )
4258
+ return fmt .Errorf ("expected object didn't match %v" , object )
4259
+ }
4260
+ }
4261
+ }
4262
+ return nil
4263
+ }
4264
+
4182
4265
func RequireObjectsInNamespace (t * testing.T , opClient operatorclient.ClientInterface , client versioned.Interface , namespace string , objects []runtime.Object ) {
4183
4266
for _ , object := range objects {
4184
4267
var err error
0 commit comments