Skip to content

Commit

Permalink
fix: recreate datavolumes, stop continuous attachment of volume (#272)
Browse files Browse the repository at this point in the history
  • Loading branch information
cristiGuranIonos authored Nov 11, 2024
1 parent 72d581c commit 8fc13f8
Show file tree
Hide file tree
Showing 7 changed files with 23 additions and 14 deletions.
8 changes: 4 additions & 4 deletions internal/controller/compute/server/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -218,8 +218,8 @@ func (c *externalServer) Update(ctx context.Context, mg resource.Managed) (manag
return managed.ExternalUpdate{}, nil
}
// Attach or Detach Volume
if cr.Spec.ForProvider.VolumeCfg.VolumeID != "" {
c.log.Debug("Update, attaching Volume", "volume", cr.Spec.ForProvider.VolumeCfg.VolumeID)
if cr.Spec.ForProvider.VolumeCfg.VolumeID != "" && cr.Spec.ForProvider.VolumeCfg.VolumeID != cr.Status.AtProvider.VolumeID {
c.log.Debug("Update, attaching ", "volume", cr.Spec.ForProvider.VolumeCfg.VolumeID)
_, apiResponse, err := c.service.AttachVolume(ctx, cr.Spec.ForProvider.DatacenterCfg.DatacenterID, cr.Status.AtProvider.ServerID,
sdkgo.Volume{Id: &cr.Spec.ForProvider.VolumeCfg.VolumeID})
if err != nil {
Expand All @@ -231,8 +231,8 @@ func (c *externalServer) Update(ctx context.Context, mg resource.Managed) (manag
}
c.log.Debug("Update, finished attaching Volume", "volume", cr.Spec.ForProvider.VolumeCfg.VolumeID)

} else if cr.Status.AtProvider.VolumeID != "" {
c.log.Debug("Detaching Volume...")
} else if cr.Spec.ForProvider.VolumeCfg.VolumeID == "" && cr.Status.AtProvider.VolumeID != "" {
c.log.Debug("Update, detaching ", "volume", cr.Status.AtProvider.VolumeID)
apiResponse, err := c.service.DetachVolume(ctx, cr.Spec.ForProvider.DatacenterCfg.DatacenterID,
cr.Status.AtProvider.ServerID, cr.Status.AtProvider.VolumeID)
if err != nil {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ func (k *kubeDataVolumeController) Create(ctx context.Context, cr *v1alpha1.Stat
return v1alpha1.Volume{}, err
}
if err := kube.WaitForResource(ctx, kube.ResourceReadyTimeout, k.isAvailable, name, cr.Namespace); err != nil {
_ = k.Delete(ctx, name, cr.Namespace)
return v1alpha1.Volume{}, err
}
// get the volume again before returning to have the id populated
Expand Down Expand Up @@ -99,7 +100,14 @@ func (k *kubeDataVolumeController) isAvailable(ctx context.Context, name, namesp
}
return false, err
}
if obj != nil && obj.Status.AtProvider.VolumeID != "" && strings.EqualFold(obj.Status.AtProvider.State, ionoscloud.Available) {
if obj == nil {
return false, nil
}
if !kube.IsSuccessfullyCreated(obj) {
conditions := obj.Status.ResourceStatus.Conditions
return false, fmt.Errorf("resource name %s reason %s %w", obj.Name, conditions[len(conditions)-1].Message, kube.ErrExternalCreateFailed)
}
if obj.Status.AtProvider.VolumeID != "" && strings.EqualFold(obj.Status.AtProvider.State, ionoscloud.Available) {
return true, nil
}
return false, err
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ func (k *kubeLANController) isAvailable(ctx context.Context, name, namespace str
}
if !kube.IsSuccessfullyCreated(obj) {
conditions := obj.Status.ResourceStatus.Conditions
return false, fmt.Errorf("reason %s %w", conditions[len(conditions)-1].Message, kube.ErrExternalCreateFailed)
return false, fmt.Errorf("resource name %s reason %s %w", obj.Name, conditions[len(conditions)-1].Message, kube.ErrExternalCreateFailed)
}
if obj != nil && obj.Status.AtProvider.LanID != "" && strings.EqualFold(obj.Status.AtProvider.State, ionoscloud.Available) {
return true, nil
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@ package statefulserverset
import (
"context"
"fmt"

Check failure on line 5 in internal/controller/compute/statefulserverset/serverset_controller.go

View workflow job for this annotation

GitHub Actions / lint

File is not `goimports`-ed with -local github.com/ionos-cloud/crossplane-provider-ionoscloud (goimports)

xpv1 "github.com/crossplane/crossplane-runtime/apis/common/v1"
"github.com/crossplane/crossplane-runtime/pkg/logging"
apiErrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
"sigs.k8s.io/controller-runtime/pkg/client"

xpv1 "github.com/crossplane/crossplane-runtime/apis/common/v1"
"github.com/crossplane/crossplane-runtime/pkg/logging"

"github.com/ionos-cloud/crossplane-provider-ionoscloud/apis/compute/v1alpha1"
"github.com/ionos-cloud/crossplane-provider-ionoscloud/pkg/kube"
)
Expand Down Expand Up @@ -64,6 +64,8 @@ func (k *kubeServerSetController) Update(ctx context.Context, cr *v1alpha1.State
updateObj.Spec.ForProvider.Template = cr.Spec.ForProvider.Template
updateObj.Spec.ForProvider.BootVolumeTemplate = cr.Spec.ForProvider.BootVolumeTemplate
updateObj.Spec.ForProvider.IdentityConfigMap = cr.Spec.ForProvider.IdentityConfigMap
// in case crossplane set annotations on the sset, we need to remove to continue reconciliations
// meta.RemoveAnnotations(updateObj, meta.AnnotationKeyExternalCreatePending, meta.AnnotationKeyExternalCreateFailed)
if err := k.kube.Update(ctx, updateObj); err != nil {
return v1alpha1.ServerSet{}, err
}
Expand Down
2 changes: 1 addition & 1 deletion internal/controller/serverset/bootvolume_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ func (k *kubeBootVolumeController) isAvailable(ctx context.Context, name, namesp
}
if !kube.IsSuccessfullyCreated(obj) {
conditions := obj.Status.ResourceStatus.Conditions
return false, fmt.Errorf("reason %s %w", conditions[len(conditions)-1].Message, kube.ErrExternalCreateFailed)
return false, fmt.Errorf("resource name %s reason %s %w", obj.Name, conditions[len(conditions)-1].Message, kube.ErrExternalCreateFailed)
}
if obj != nil && obj.Status.AtProvider.VolumeID != "" && strings.EqualFold(obj.Status.AtProvider.State, ionoscloud.Available) {
return true, nil
Expand Down
2 changes: 1 addition & 1 deletion internal/controller/serverset/nic_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ func (k *kubeNicController) isAvailable(ctx context.Context, name, namespace str
}
if !kube.IsSuccessfullyCreated(obj) {
conditions := obj.Status.ResourceStatus.Conditions
return false, fmt.Errorf("reason %s %w", conditions[len(conditions)-1].Message, kube.ErrExternalCreateFailed)
return false, fmt.Errorf("resource name %s reason %s %w", obj.Name, conditions[len(conditions)-1].Message, kube.ErrExternalCreateFailed)
}

if obj != nil && obj.Status.AtProvider.NicID != "" && strings.EqualFold(obj.Status.AtProvider.State, ionoscloud.Available) {
Expand Down
5 changes: 2 additions & 3 deletions internal/controller/serverset/server_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,14 @@ package serverset
import (
"context"
"fmt"

Check failure on line 5 in internal/controller/serverset/server_controller.go

View workflow job for this annotation

GitHub Actions / lint

File is not `goimports`-ed with -local github.com/ionos-cloud/crossplane-provider-ionoscloud (goimports)
"strings"

xpv1 "github.com/crossplane/crossplane-runtime/apis/common/v1"
"github.com/crossplane/crossplane-runtime/pkg/logging"
ionoscloud "github.com/ionos-cloud/sdk-go/v6"
apiErrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
"sigs.k8s.io/controller-runtime/pkg/client"
"strings"

"github.com/ionos-cloud/crossplane-provider-ionoscloud/apis/compute/v1alpha1"
"github.com/ionos-cloud/crossplane-provider-ionoscloud/pkg/kube"
Expand Down Expand Up @@ -78,7 +77,7 @@ func (k *kubeServerController) isAvailable(ctx context.Context, name, namespace
}
if !kube.IsSuccessfullyCreated(obj) {
conditions := obj.Status.ResourceStatus.Conditions
return false, fmt.Errorf("reason %s %w", conditions[len(conditions)-1].Message, kube.ErrExternalCreateFailed)
return false, fmt.Errorf("resource name %s reason %s %w", obj.Name, conditions[len(conditions)-1].Message, kube.ErrExternalCreateFailed)
}
if obj.Status.AtProvider.ServerID != "" && strings.EqualFold(obj.Status.AtProvider.State, ionoscloud.Available) {
return true, nil
Expand Down

0 comments on commit 8fc13f8

Please sign in to comment.