Skip to content

Commit e4d8e52

Browse files
authored
adding rollback logic if Reservation and/or Purchase fail (#55)
Adding logic that makes the PeeringCandidate choosen for Reservation and Purchase avaiable again if something fails
1 parent f71e844 commit e4d8e52

1 file changed

Lines changed: 44 additions & 0 deletions

File tree

pkg/rear-controller/contract-manager/reservation_controller.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,21 @@ func (r *ReservationReconciler) handleReserve(ctx context.Context,
182182
return ctrl.Result{Requeue: true}, nil
183183
}
184184
klog.Errorf("Error when reserving flavour for Reservation %s: %s", req.NamespacedName, err)
185+
186+
// Set the peering candidate as available again
187+
peeringCandidate.Spec.Available = true
188+
if err := r.Update(ctx, peeringCandidate); err != nil {
189+
klog.Errorf("Error when updating PeeringCandidate %s status before reconcile: %s", req.NamespacedName, err)
190+
return ctrl.Result{}, err
191+
}
192+
peeringCandidate.Status.LastUpdateTime = tools.GetTimeNow()
193+
194+
if err := r.Status().Update(ctx, peeringCandidate); err != nil {
195+
klog.Errorf("Error when updating PeeringCandidate %s status before reconcile: %s", req.NamespacedName, err)
196+
return ctrl.Result{}, err
197+
}
198+
199+
// Set the reservation as failed
185200
reservation.SetReserveStatus(nodecorev1alpha1.PhaseFailed)
186201
reservation.SetPhase(nodecorev1alpha1.PhaseFailed, "Reservation failed: error when reserving flavour")
187202
if err := r.updateReservationStatus(ctx, reservation); err != nil {
@@ -267,6 +282,35 @@ func (r *ReservationReconciler) handlePurchase(ctx context.Context,
267282
resPurchase, err := r.Gateway.PurchaseFlavour(ctx, transactionID, reservation.Spec.Seller)
268283
if err != nil {
269284
klog.Errorf("Error when purchasing flavour for Reservation %s: %s", req.NamespacedName, err)
285+
286+
// Set the PeerCandidate as available again
287+
var peeringCandidate advertisementv1alpha1.PeeringCandidate
288+
if err := r.Get(ctx, client.ObjectKey{
289+
Name: reservation.Spec.PeeringCandidate.Name,
290+
Namespace: reservation.Spec.PeeringCandidate.Namespace,
291+
}, &peeringCandidate); err != nil {
292+
klog.Errorf("Error when getting PeeringCandidate %s before reconcile: %s", req.NamespacedName, err)
293+
reservation.SetPhase(nodecorev1alpha1.PhaseFailed, "Reservation failed: error when getting PeeringCandidate")
294+
if err := r.updateReservationStatus(ctx, reservation); err != nil {
295+
klog.Errorf("Error when updating Reservation %s status before reconcile: %s", req.NamespacedName, err)
296+
return ctrl.Result{}, err
297+
}
298+
return ctrl.Result{}, err
299+
}
300+
301+
peeringCandidate.Spec.Available = true
302+
if err := r.Update(ctx, &peeringCandidate); err != nil {
303+
klog.Errorf("Error when updating PeeringCandidate %s status before reconcile: %s", req.NamespacedName, err)
304+
return ctrl.Result{}, err
305+
}
306+
peeringCandidate.Status.LastUpdateTime = tools.GetTimeNow()
307+
308+
if err := r.Status().Update(ctx, &peeringCandidate); err != nil {
309+
klog.Errorf("Error when updating PeeringCandidate %s status before reconcile: %s", req.NamespacedName, err)
310+
return ctrl.Result{}, err
311+
}
312+
313+
// Set the reservation as failed
270314
reservation.SetPurchaseStatus(nodecorev1alpha1.PhaseFailed)
271315
reservation.SetPhase(nodecorev1alpha1.PhaseFailed, "Reservation failed: error when purchasing flavour")
272316
if err := r.updateReservationStatus(ctx, reservation); err != nil {

0 commit comments

Comments
 (0)