(specObj, clusterObj crclient.Object, api ClusterAPI)
| 152 | } |
| 153 | |
| 154 | func updateObjectGeneric(specObj, clusterObj crclient.Object, api ClusterAPI) error { |
| 155 | updateFunc := getUpdateFunc(specObj) |
| 156 | updatedObj, err := updateFunc(specObj, clusterObj) |
| 157 | if err != nil { |
| 158 | if err := api.Client.Delete(api.Ctx, specObj); err != nil { |
| 159 | return err |
| 160 | } |
| 161 | api.Logger.Info("Deleted object", "kind", reflect.TypeOf(specObj).Elem().String(), "name", specObj.GetName()) |
| 162 | return NewNotInSync(specObj, DeletedObjectReason) |
| 163 | } |
| 164 | |
| 165 | err = api.Client.Update(api.Ctx, updatedObj) |
| 166 | switch { |
| 167 | case err == nil: |
| 168 | api.Logger.Info("Updated object", "kind", reflect.TypeOf(specObj).Elem().String(), "name", specObj.GetName()) |
| 169 | return NewNotInSync(specObj, UpdatedObjectReason) |
| 170 | case k8sErrors.IsConflict(err), k8sErrors.IsNotFound(err): |
| 171 | // Need to catch IsNotFound here because we attempt to update when creation fails with AlreadyExists |
| 172 | return NewNotInSync(specObj, NeedRetryReason) |
| 173 | case k8sErrors.IsInvalid(err), k8sErrors.IsForbidden(err): |
| 174 | return &UnrecoverableSyncError{err} |
| 175 | default: |
| 176 | return err |
| 177 | } |
| 178 | } |
| 179 | |
| 180 | func isMutableObject(obj crclient.Object) bool { |
| 181 | switch obj.(type) { |
no test coverage detected