1
0
Fork 0
mirror of https://github.com/portainer/portainer.git synced 2025-07-22 14:59:41 +02:00

feat(stacks): simplify WaitForStatus() BE-11505 (#241)

This commit is contained in:
andres-portainer 2024-12-17 16:25:49 -03:00 committed by GitHub
parent 35dcb5ca46
commit 13317ec43c
4 changed files with 52 additions and 61 deletions

View file

@ -59,7 +59,7 @@ services:
require.True(t, containerExists(composeContainerName)) require.True(t, containerExists(composeContainerName))
waitResult := <-w.WaitForStatus(ctx, projectName, libstack.StatusCompleted) waitResult := w.WaitForStatus(ctx, projectName, libstack.StatusCompleted)
require.Empty(t, waitResult.ErrorMsg) require.Empty(t, waitResult.ErrorMsg)
require.Equal(t, libstack.StatusCompleted, waitResult.Status) require.Equal(t, libstack.StatusCompleted, waitResult.Status)

View file

@ -111,17 +111,14 @@ func aggregateStatuses(services []service) (libstack.Status, string) {
} }
func (c *ComposeDeployer) WaitForStatus(ctx context.Context, name string, status libstack.Status) <-chan libstack.WaitResult { func (c *ComposeDeployer) WaitForStatus(ctx context.Context, name string, status libstack.Status) libstack.WaitResult {
waitResultCh := make(chan libstack.WaitResult)
waitResult := libstack.WaitResult{Status: status} waitResult := libstack.WaitResult{Status: status}
go func() {
for { for {
select { if ctx.Err() != nil {
case <-ctx.Done():
waitResult.ErrorMsg = "failed to wait for status: " + ctx.Err().Error() waitResult.ErrorMsg = "failed to wait for status: " + ctx.Err().Error()
waitResultCh <- waitResult
default: return waitResult
} }
time.Sleep(1 * time.Second) time.Sleep(1 * time.Second)
@ -148,26 +145,24 @@ func (c *ComposeDeployer) WaitForStatus(ctx context.Context, name string, status
services := serviceListFromContainerSummary(containerSummaries) services := serviceListFromContainerSummary(containerSummaries)
if len(services) == 0 && status == libstack.StatusRemoved { if len(services) == 0 && status == libstack.StatusRemoved {
waitResultCh <- waitResult return waitResult
return
} }
aggregateStatus, errorMessage := aggregateStatuses(services) aggregateStatus, errorMessage := aggregateStatuses(services)
if aggregateStatus == status { if aggregateStatus == status {
waitResultCh <- waitResult return waitResult
return
} }
if status == libstack.StatusRunning && aggregateStatus == libstack.StatusCompleted { if status == libstack.StatusRunning && aggregateStatus == libstack.StatusCompleted {
waitResult.Status = libstack.StatusCompleted waitResult.Status = libstack.StatusCompleted
waitResultCh <- waitResult
return return waitResult
} }
if errorMessage != "" { if errorMessage != "" {
waitResult.ErrorMsg = errorMessage waitResult.ErrorMsg = errorMessage
waitResultCh <- waitResult
return return waitResult
} }
log.Debug(). log.Debug().
@ -176,9 +171,6 @@ func (c *ComposeDeployer) WaitForStatus(ctx context.Context, name string, status
Str("status", string(aggregateStatus)). Str("status", string(aggregateStatus)).
Msg("waiting for status") Msg("waiting for status")
} }
}()
return waitResultCh
} }
func serviceListFromContainerSummary(containerSummaries []api.ContainerSummary) []service { func serviceListFromContainerSummary(containerSummaries []api.ContainerSummary) []service {

View file

@ -106,8 +106,7 @@ func waitForStatus(deployer libstack.Deployer, ctx context.Context, stackName st
ctx, cancel := context.WithTimeout(ctx, 1*time.Minute) ctx, cancel := context.WithTimeout(ctx, 1*time.Minute)
defer cancel() defer cancel()
statusCh := deployer.WaitForStatus(ctx, stackName, requiredStatus) result := deployer.WaitForStatus(ctx, stackName, requiredStatus)
result := <-statusCh
if result.ErrorMsg == "" { if result.ErrorMsg == "" {
return result.Status, "", nil return result.Status, "", nil
} }

View file

@ -18,7 +18,7 @@ type Deployer interface {
Pull(ctx context.Context, filePaths []string, options Options) error Pull(ctx context.Context, filePaths []string, options Options) error
Run(ctx context.Context, filePaths []string, serviceName string, options RunOptions) error Run(ctx context.Context, filePaths []string, serviceName string, options RunOptions) error
Validate(ctx context.Context, filePaths []string, options Options) error Validate(ctx context.Context, filePaths []string, options Options) error
WaitForStatus(ctx context.Context, name string, status Status) <-chan WaitResult WaitForStatus(ctx context.Context, name string, status Status) WaitResult
Config(ctx context.Context, filePaths []string, options Options) ([]byte, error) Config(ctx context.Context, filePaths []string, options Options) ([]byte, error)
GetExistingEdgeStacks(ctx context.Context) ([]EdgeStack, error) GetExistingEdgeStacks(ctx context.Context) ([]EdgeStack, error)
} }