From b08b88b019e04908c9a78ae0324a421e571aee30 Mon Sep 17 00:00:00 2001 From: Marc Abramowitz Date: Fri, 18 Dec 2015 10:25:55 -0800 Subject: [PATCH 1/2] openstack: Add maxNumErrors for WaitForImage This partly addresses comment at https://github.com/mitchellh/packer/issues/1415#issuecomment-165739549 --- builder/openstack/step_create_image.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/builder/openstack/step_create_image.go b/builder/openstack/step_create_image.go index 61607b2f2..425e88bb6 100644 --- a/builder/openstack/step_create_image.go +++ b/builder/openstack/step_create_image.go @@ -62,11 +62,19 @@ func (s *stepCreateImage) Cleanup(multistep.StateBag) { // WaitForImage waits for the given Image ID to become ready. func WaitForImage(client *gophercloud.ServiceClient, imageId string) error { + maxNumErrors := 10 + numErrors := 0 + for { image, err := images.Get(client, imageId).Extract() if err != nil { errCode, ok := err.(*gophercloud.UnexpectedResponseCodeError) if ok && errCode.Actual == 500 { + numErrors++ + if numErrors >= maxNumErrors { + log.Printf("[ERROR] Maximum number of errors (%d) reached; failing with: %s", numErrors, err) + return err + } log.Printf("[ERROR] 500 error received, will ignore and retry: %s", err) time.Sleep(2 * time.Second) continue From 4b9c4cc3e6ec4f949b1747a89f6905db42ecf12c Mon Sep 17 00:00:00 2001 From: Marc Abramowitz Date: Fri, 18 Dec 2015 10:37:31 -0800 Subject: [PATCH 2/2] openstack: WaitForImage: treat 404 as retryable Addresses comment at https://github.com/mitchellh/packer/issues/1415#issuecomment-165739549 --- builder/openstack/step_create_image.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/builder/openstack/step_create_image.go b/builder/openstack/step_create_image.go index 425e88bb6..5c39b0ffc 100644 --- a/builder/openstack/step_create_image.go +++ b/builder/openstack/step_create_image.go @@ -69,13 +69,13 @@ func WaitForImage(client *gophercloud.ServiceClient, imageId string) error { image, err := images.Get(client, imageId).Extract() if err != nil { errCode, ok := err.(*gophercloud.UnexpectedResponseCodeError) - if ok && errCode.Actual == 500 { + if ok && (errCode.Actual == 500 || errCode.Actual == 404) { numErrors++ if numErrors >= maxNumErrors { log.Printf("[ERROR] Maximum number of errors (%d) reached; failing with: %s", numErrors, err) return err } - log.Printf("[ERROR] 500 error received, will ignore and retry: %s", err) + log.Printf("[ERROR] %d error received, will ignore and retry: %s", errCode.Actual, err) time.Sleep(2 * time.Second) continue }