Skip to content
This repository was archived by the owner on Apr 18, 2025. It is now read-only.

Commit 365e28f

Browse files
Vincent PlanchenaultVincent Planchenault
andauthored
Fixed panic when creating host with huaweicloud stack (#356)
- in some circumstances (notably when FlexibleEngine does not create host in a reasonable amount of time), tried to delete a server from nil pointer Co-authored-by: Vincent Planchenault <vincent.planchenault@csgroup.eu>
1 parent 891e482 commit 365e28f

1 file changed

Lines changed: 33 additions & 37 deletions

File tree

lib/server/iaas/stacks/huaweicloud/compute.go

Lines changed: 33 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -597,11 +597,7 @@ func (s stack) CreateHost(ctx context.Context, request abstract.HostRequest) (ho
597597
if server != nil && server.ID != "" {
598598
derr := servers.Delete(s.ComputeClient, server.ID).ExtractErr()
599599
if derr != nil {
600-
_ = xerr.AddConsequence(
601-
fail.Wrap(
602-
derr, "cleaning up on failure, failed to delete host",
603-
),
604-
)
600+
_ = xerr.AddConsequence(fail.Wrap(derr, "cleaning up on failure, failed to delete host"))
605601
}
606602
}
607603
}
@@ -623,45 +619,46 @@ func (s stack) CreateHost(ctx context.Context, request abstract.HostRequest) (ho
623619
}
624620
}
625621

626-
creationZone, zoneErr := s.GetAvailabilityZoneOfServer(server.ID)
622+
ahc.ID = server.ID
623+
ahc.Name = server.Name
624+
625+
creationZone, zoneErr := s.GetAvailabilityZoneOfServer(ahc.ID)
627626
if zoneErr != nil {
628-
logrus.Tracef("Host successfully created but cannot confirm Availability Zone: %s", zoneErr)
627+
logrus.Tracef("Host '%s' successfully created but cannot confirm Availability Zone: %s", server.Name, zoneErr)
629628
} else {
630-
logrus.Tracef("Host successfully created in requested Availability Zone '%s'", creationZone)
631-
if creationZone != srvOpts.AvailabilityZone {
632-
if srvOpts.AvailabilityZone != "" {
633-
logrus.Warnf(
634-
"Host created in the WRONG availability zone: requested '%s' and got instead '%s'",
635-
srvOpts.AvailabilityZone, creationZone,
636-
)
637-
}
629+
logrus.Tracef("Host '%s' successfully created in requested Availability Zone '%s'", server.Name, creationZone)
630+
if creationZone != srvOpts.AvailabilityZone && srvOpts.AvailabilityZone != "" {
631+
logrus.Warnf("Host '%s' created in the WRONG availability zone: requested '%s' and got instead '%s'", server.Name, srvOpts.AvailabilityZone, creationZone)
638632
}
639633
}
640634

641635
defer func() {
642-
if innerXErr != nil {
643-
derr := servers.Delete(s.ComputeClient, server.ID).ExtractErr()
636+
if innerXErr != nil && ahc.ID != "" {
637+
derr := servers.Delete(s.ComputeClient, ahc.ID).ExtractErr()
644638
if derr != nil {
645639
logrus.Errorf("cleaning up on failure, failed to delete host: %s", derr.Error())
640+
} else {
641+
ahc.ID = ""
642+
ahc.Name = ""
646643
}
647644
}
648645
}()
649646

650-
ahc.ID = server.ID
651-
ahc.Name = server.Name
652-
653647
// Wait that host is ready, not just that the build is started
648+
//FIXME: timings.HostOperationTimeout() may not be sufficient time to wait when hosts are created in parallel...
649+
// at least with it's current default value of 2 minutes and at least for flexibleengine provider
650+
// We should think of a way to increase this timing based on number of hosts are created
654651
server, innerXErr = s.WaitHostState(ctx, ahc, hoststate.Started, timings.HostOperationTimeout())
655652
if innerXErr != nil {
656653
switch innerXErr.(type) {
657654
case *fail.ErrNotAvailable:
658655
if server != nil {
659-
ahc.ID = server.ID
660-
ahc.Name = server.Name
656+
// ahc.ID = server.ID
657+
// ahc.Name = server.Name
661658
ahc.LastState = hoststate.Error
662659
}
663-
664660
return fail.Wrap(innerXErr, "host '%s' is in Error state", request.ResourceName)
661+
665662
default:
666663
return innerXErr
667664
}
@@ -671,27 +668,15 @@ func (s stack) CreateHost(ctx context.Context, request abstract.HostRequest) (ho
671668
timings.NormalDelay(),
672669
timings.HostLongOperationTimeout(),
673670
)
674-
if retryErr != nil {
675-
switch retryErr.(type) {
676-
case *retry.ErrStopRetry: // here it should never happen
677-
return nil, userData, fail.Wrap(fail.Cause(retryErr), "stopping retries")
678-
case *retry.ErrTimeout:
679-
return nil, userData, fail.Wrap(fail.Cause(retryErr), "timeout")
680-
default:
681-
return nil, userData, retryErr
682-
}
683-
}
684671

685672
// Starting from here, delete host if exiting with error
686673
defer func() {
687-
if ferr != nil {
674+
if ferr != nil && ahc.ID != "" {
688675
derr := s.DeleteHost(ctx, ahc.ID)
689676
if derr != nil {
690677
switch derr.(type) {
691678
case *fail.ErrNotFound:
692-
logrus.Errorf(
693-
"Cleaning up on failure, failed to delete host '%s', resource not found: '%v'", ahc.Name, derr,
694-
)
679+
logrus.Errorf("Cleaning up on failure, failed to delete host '%s', resource not found: '%v'", ahc.Name, derr)
695680
case *fail.ErrTimeout:
696681
logrus.Errorf("Cleaning up on failure, failed to delete host '%s', timeout: '%v'", ahc.Name, derr)
697682
default:
@@ -702,6 +687,17 @@ func (s stack) CreateHost(ctx context.Context, request abstract.HostRequest) (ho
702687
}
703688
}()
704689

690+
if retryErr != nil {
691+
switch retryErr.(type) {
692+
case *retry.ErrStopRetry: // here it should never happen
693+
return nil, userData, fail.Wrap(fail.Cause(retryErr), "stopping retries")
694+
case *retry.ErrTimeout:
695+
return nil, userData, fail.Wrap(fail.Cause(retryErr), "timeout")
696+
default:
697+
return nil, userData, retryErr
698+
}
699+
}
700+
705701
host, xerr = s.complementHost(ctx, ahc, server)
706702
if xerr != nil {
707703
return nil, nil, xerr

0 commit comments

Comments
 (0)