r.Recorder.Eventf(opt.dynamoComponentDeployment,corev1.EventTypeWarning,fmt.Sprintf("Get%s",resourceType),"Failed to get %s %s: %s",resourceType,resourceNamespace,err)
logs.Error(err,"Failed to get HPA.")
return
}
err=nil
ifoldResourceIsNotFound{
iftoDelete{
logs.Info("Resource not found. Nothing to do.")
return
}
logs.Info("Resource not found. Creating a new one.")
err=errors.Wrapf(patch.DefaultAnnotator.SetLastAppliedAnnotation(resource),"set last applied annotation for resource %s",resourceName)
iferr!=nil{
logs.Error(err,"Failed to set last applied annotation.")
r.Recorder.Eventf(opt.dynamoComponentDeployment,corev1.EventTypeWarning,"SetLastAppliedAnnotation","Failed to set last applied annotation for %s %s: %s",resourceType,resourceNamespace,err)
logs.Error(err,"Failed to set controller reference.")
r.Recorder.Eventf(opt.dynamoComponentDeployment,corev1.EventTypeWarning,"SetControllerReference","Failed to set controller reference for %s %s: %s",resourceType,resourceNamespace,err)
return
}
r.Recorder.Eventf(opt.dynamoComponentDeployment,corev1.EventTypeNormal,fmt.Sprintf("Create%s",resourceType),"Creating a new %s %s",resourceType,resourceNamespace)
err=r.Create(ctx,resource)
iferr!=nil{
logs.Error(err,"Failed to create Resource.")
r.Recorder.Eventf(opt.dynamoComponentDeployment,corev1.EventTypeWarning,fmt.Sprintf("Create%s",resourceType),"Failed to create %s %s: %s",resourceType,resourceNamespace,err)
r.Recorder.Eventf(opt.dynamoComponentDeployment,corev1.EventTypeWarning,fmt.Sprintf("CalculatePatch%s",resourceType),"Failed to calculate patch for %s %s: %s",resourceType,resourceNamespace,err)
return
}
if!patchResult.IsEmpty(){
logs.Info(fmt.Sprintf("%s spec is different. Updating %s. The patch result is: %s",resourceType,resourceType,patchResult.String()))
err=errors.Wrapf(patch.DefaultAnnotator.SetLastAppliedAnnotation(resource),"set last applied annotation for resource %s",resourceName)
iferr!=nil{
logs.Error(err,"Failed to set last applied annotation.")
r.Recorder.Eventf(opt.dynamoComponentDeployment,corev1.EventTypeWarning,fmt.Sprintf("SetLastAppliedAnnotation%s",resourceType),"Failed to set last applied annotation for %s %s: %s",resourceType,resourceNamespace,err)
r.GetRecorder().Eventf(parentResource,corev1.EventTypeWarning,fmt.Sprintf("Get%s",resourceType),"Failed to get %s %s: %s",resourceType,resourceNamespace,err)
logs.Error(err,"Failed to get resource.")
return
}
}
err=nil
// Retrieve the existing resource
ifoldResourceIsNotFound{
err=c.Get(ctx,namespacedName,current)
iftoDelete{
iferr!=nil{
logs.Info("Resource not found. Nothing to do.")
iferrors.IsNotFound(err){
return
// If the resource doesn't exist, create it
}
iferr:=c.Create(ctx,desired);err!=nil{
logs.Info("Resource not found. Creating a new one.")
returndesired,fmt.Errorf("failed to create resource: %w",err)
logs.Error(err,"Failed to set controller reference.")
r.GetRecorder().Eventf(parentResource,corev1.EventTypeWarning,"SetControllerReference","Failed to set controller reference for %s %s: %s",resourceType,resourceNamespace,err)
return
}
varhashstring
hash,err=GetSpecHash(resource)
iferr!=nil{
logs.Error(err,"Failed to get spec hash.")
r.GetRecorder().Eventf(parentResource,corev1.EventTypeWarning,"GetSpecHash","Failed to get spec hash for %s %s: %s",resourceType,resourceNamespace,err)
return
}
updateHashAnnotation(resource,hash)
r.GetRecorder().Eventf(parentResource,corev1.EventTypeNormal,fmt.Sprintf("Create%s",resourceType),"Creating a new %s %s",resourceType,resourceNamespace)
err=r.Create(ctx,resource)
iferr!=nil{
logs.Error(err,"Failed to create Resource.")
r.GetRecorder().Eventf(parentResource,corev1.EventTypeWarning,fmt.Sprintf("Create%s",resourceType),"Failed to create %s %s: %s",resourceType,resourceNamespace,err)
// Check if the Spec has changed and update if necessary
varnewHash*string
newHash,err=IsSpecChanged(oldResource,resource)
iferr!=nil{
r.GetRecorder().Eventf(parentResource,corev1.EventTypeWarning,fmt.Sprintf("CalculatePatch%s",resourceType),"Failed to calculate patch for %s %s: %s",resourceType,resourceNamespace,err)
returnfalse,resource,fmt.Errorf("failed to check if spec has changed: %w",err)
}
}
returndesired,fmt.Errorf("failed to get resource: %w",err)
ifnewHash!=nil{
// update the spec of the current object with the desired spec
err=CopySpec(resource,oldResource)
iferr!=nil{
logs.Error(err,fmt.Sprintf("Failed to copy spec for %s.",resourceType))
r.GetRecorder().Eventf(parentResource,corev1.EventTypeWarning,fmt.Sprintf("CopySpec%s",resourceType),"Failed to copy spec for %s %s: %s",resourceType,resourceNamespace,err)
return
}
updateHashAnnotation(oldResource,*newHash)
err=r.Update(ctx,oldResource)
iferr!=nil{
logs.Error(err,fmt.Sprintf("Failed to update %s.",resourceType))
r.GetRecorder().Eventf(parentResource,corev1.EventTypeWarning,fmt.Sprintf("Update%s",resourceType),"Failed to update %s %s: %s",resourceType,resourceNamespace,err)