Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 70 additions & 20 deletions services/cdn/wait/wait.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,17 @@ import (
)

const (
DistributionStateCreating = "CREATING"
DistributionStateActive = "ACTIVE"
DistributionStateUpdating = "UPDATING"
DistributionStateDeleting = "DELETING"
DistributionStateError = "ERROR"
DistributionStatusCreating = "CREATING"
DistributionStatusActive = "ACTIVE"
DistributionStatusUpdating = "UPDATING"
DistributionStatusDeleting = "DELETING"
DistributionStatusError = "ERROR"
)

// Interfaces needed for tests
type APIClientInterface interface {
GetDistributionExecute(ctx context.Context, projectId string, distributionId string) (*cdn.GetDistributionResponse, error)
GetCustomDomainExecute(ctx context.Context, projectId string, distributionId string, domain string) (*cdn.GetCustomDomainResponse, error)
}

func CreateDistributionPoolWaitHandler(ctx context.Context, api APIClientInterface, projectId, distributionId string) *wait.AsyncActionHandler[cdn.GetDistributionResponse] {
Expand All @@ -39,17 +40,21 @@ func CreateDistributionPoolWaitHandler(ctx context.Context, api APIClientInterfa
}
if *distribution.Distribution.Id == distributionId {
switch *distribution.Distribution.Status {
case DistributionStateActive:
return true, distribution, err
case DistributionStatusActive:
return true, distribution, nil
case DistributionStatusCreating, DistributionStatusUpdating:
return false, nil, nil
case DistributionStatusDeleting:
return true, nil, fmt.Errorf("creating CDN distribution failed")
case DistributionStatusError:
return true, nil, fmt.Errorf("creating CDN distribution failed")
default:
return false, distribution, err
return true, nil, fmt.Errorf("CDNDistributionWaitHandler: unexpected status %s", *distribution.Distribution.Status)
}
}

return false, nil, nil
})

handler.SetTimeout(10 * time.Minute)
handler.SetTimeout(1 * time.Minute)
return handler
}

Expand All @@ -67,7 +72,7 @@ func UpdateDistributionWaitHandler(ctx context.Context, api APIClientInterface,
}
if *distribution.Distribution.Id == distributionId {
switch *distribution.Distribution.Status {
case DistributionStateActive:
case DistributionStatusActive:
return true, distribution, err
default:
return false, distribution, err
Expand All @@ -84,17 +89,62 @@ func UpdateDistributionWaitHandler(ctx context.Context, api APIClientInterface,
func DeleteDistributionWaitHandler(ctx context.Context, api APIClientInterface, projectId, distributionId string) *wait.AsyncActionHandler[cdn.GetDistributionResponse] {
handler := wait.New(func() (waitFinished bool, distribution *cdn.GetDistributionResponse, err error) {
distribution, err = api.GetDistributionExecute(ctx, projectId, distributionId)

// the distribution is still gettable, e.g. not deleted
if err == nil {
return false, nil, nil
}
oapiErr, ok := err.(*oapierror.GenericOpenAPIError) //nolint:errorlint //complaining that error.As should be used to catch wrapped errors, but this error should not be wrapped
if ok && oapiErr.StatusCode == http.StatusNotFound {
return true, nil, nil
}
return false, nil, err
})
handler.SetTimeout(30 * time.Second)
return handler
}

func CreateCDNCustomDomainWaitHandler(ctx context.Context, a APIClientInterface, projectId, distributionId, domain string) *wait.AsyncActionHandler[cdn.CustomDomain] {
handler := wait.New(func() (waitFinished bool, response *cdn.CustomDomain, err error) {
resp, err := a.GetCustomDomainExecute(ctx, projectId, distributionId, domain)
if err != nil {
var oapiError *oapierror.GenericOpenAPIError
if errors.As(err, &oapiError) {
if statusCode := oapiError.StatusCode; statusCode == http.StatusNotFound || statusCode == http.StatusGone {
return true, distribution, nil
}
}
return false, nil, err
}
if resp == nil || resp.CustomDomain == nil || resp.CustomDomain.Status == nil {
return false, nil, errors.New("CDNDistributionWaitHandler: status or custom domain missing in response")
}

switch *resp.CustomDomain.Status {
case cdn.DOMAINSTATUS_ACTIVE:
return true, resp.CustomDomain, nil
case cdn.DOMAINSTATUS_CREATING, cdn.DOMAINSTATUS_UPDATING:
return false, nil, nil
case cdn.DOMAINSTATUS_DELETING:
return true, nil, fmt.Errorf("creating CDN custom domain failed")
case cdn.DOMAINSTATUS_ERROR:
return true, nil, fmt.Errorf("creating CDN custom domain failed")
default:
return true, nil, fmt.Errorf("CDNCustomDomainWaitHandler: unexpected status %s", *resp.CustomDomain.Status)
}
return false, nil, nil
})
handler.SetTimeout(1 * time.Minute)
return handler
}

handler.SetTimeout(10 * time.Minute)
func DeleteCDNCustomDomainWaitHandler(ctx context.Context, a APIClientInterface, projectId, distributionId, domain string) *wait.AsyncActionHandler[cdn.CustomDomain] {
handler := wait.New(func() (waitFinished bool, response *cdn.CustomDomain, err error) {
_, err = a.GetCustomDomainExecute(ctx, projectId, distributionId, domain)

// the custom domain is still gettable, e.g. not deleted
if err == nil {
return false, nil, nil
}
oapiErr, ok := err.(*oapierror.GenericOpenAPIError) //nolint:errorlint //complaining that error.As should be used to catch wrapped errors, but this error should not be wrapped
if ok && oapiErr.StatusCode == http.StatusNotFound {
return true, nil, nil
}
return false, nil, err
})
handler.SetTimeout(30 * time.Second)
return handler
}
Loading
Loading