refactor!: do not set default timeout
Some checks failed
continuous-integration/drone/push Build is failing
Some checks failed
continuous-integration/drone/push Build is failing
See #596 Quite some `i18n.G` additions along the way!
This commit is contained in:
@ -14,6 +14,7 @@ import (
|
||||
tea "github.com/charmbracelet/bubbletea"
|
||||
|
||||
"coopcloud.tech/abra/pkg/config"
|
||||
"coopcloud.tech/abra/pkg/i18n"
|
||||
"coopcloud.tech/abra/pkg/log"
|
||||
"coopcloud.tech/abra/pkg/ui"
|
||||
"coopcloud.tech/abra/pkg/upstream/convert"
|
||||
@ -39,8 +40,9 @@ const (
|
||||
ResolveImageNever = "never"
|
||||
)
|
||||
|
||||
// Timeout to wait until docker services converge, default is 50s (random choice)
|
||||
var WaitTimeout = 50
|
||||
// Timeout to wait until docker services converge. This timeout is disabled by
|
||||
// default but can be configured by passing a TIMEOUT=... in the app .env
|
||||
var WaitTimeout = 0
|
||||
|
||||
type StackStatus struct {
|
||||
Services []swarm.Service
|
||||
@ -152,7 +154,7 @@ func IsDeployed(ctx context.Context, cl *dockerClient.Client, stackName string)
|
||||
if isChaos, ok := service.Spec.Labels[labelKey]; ok {
|
||||
boolVal, err := strconv.ParseBool(isChaos)
|
||||
if err != nil {
|
||||
return deployMeta, fmt.Errorf("unable to parse '%s' value as bool: %s", labelKey, err)
|
||||
return deployMeta, errors.New(i18n.G("unable to parse '%s' value as bool: %s", labelKey, err))
|
||||
}
|
||||
deployMeta.IsChaos = boolVal
|
||||
}
|
||||
@ -164,12 +166,12 @@ func IsDeployed(ctx context.Context, cl *dockerClient.Client, stackName string)
|
||||
}
|
||||
}
|
||||
|
||||
log.Debugf("%s has been detected as deployed: %v", stackName, deployMeta)
|
||||
log.Debug(i18n.G("%s has been detected as deployed: %v", stackName, deployMeta))
|
||||
|
||||
return deployMeta, nil
|
||||
}
|
||||
|
||||
log.Debugf("%s has been detected as not deployed", stackName)
|
||||
log.Debug(i18n.G("%s has been detected as not deployed", stackName))
|
||||
|
||||
return deployMeta, nil
|
||||
}
|
||||
@ -178,7 +180,7 @@ func IsDeployed(ctx context.Context, cl *dockerClient.Client, stackName string)
|
||||
func pruneServices(ctx context.Context, cl *dockerClient.Client, namespace convert.Namespace, services map[string]struct{}) {
|
||||
oldServices, err := GetStackServices(ctx, cl, namespace.Name())
|
||||
if err != nil {
|
||||
log.Warnf("failed to list services: %s", err)
|
||||
log.Warn(i18n.G("failed to list services: %s", err))
|
||||
}
|
||||
|
||||
pruneServices := []swarm.Service{}
|
||||
@ -201,7 +203,11 @@ func RunDeploy(
|
||||
dontWait bool,
|
||||
filters filters.Args,
|
||||
) error {
|
||||
log.Info("initialising deployment")
|
||||
log.Info(i18n.G("initialising deployment"))
|
||||
|
||||
if WaitTimeout != 0 {
|
||||
log.Debug(i18n.G("timeout: set to %d second(s)", WaitTimeout))
|
||||
}
|
||||
|
||||
if err := validateResolveImageFlag(&opts); err != nil {
|
||||
return err
|
||||
@ -230,7 +236,7 @@ func validateResolveImageFlag(opts *Deploy) error {
|
||||
case ResolveImageAlways, ResolveImageChanged, ResolveImageNever:
|
||||
return nil
|
||||
default:
|
||||
return errors.Errorf("invalid option %s for flag --resolve-image", opts.ResolveImage)
|
||||
return errors.New(i18n.G("invalid option %s for flag --resolve-image", opts.ResolveImage))
|
||||
}
|
||||
}
|
||||
|
||||
@ -297,7 +303,7 @@ func deployCompose(
|
||||
}
|
||||
|
||||
if dontWait {
|
||||
log.Warn("skipping converge logic checks")
|
||||
log.Warn(i18n.G("skipping converge logic checks"))
|
||||
return nil
|
||||
}
|
||||
|
||||
@ -339,11 +345,11 @@ func validateExternalNetworks(ctx context.Context, client dockerClient.NetworkAP
|
||||
network, err := client.NetworkInspect(ctx, networkName, networktypes.InspectOptions{})
|
||||
switch {
|
||||
case dockerClient.IsErrNotFound(err):
|
||||
return errors.Errorf("network %q is declared as external, but could not be found. You need to create a swarm-scoped network before the stack is deployed, which you can do by running this on the server: docker network create -d overlay proxy", networkName)
|
||||
return errors.New(i18n.G("network %q is declared as external, but could not be found. You need to create a swarm-scoped network before the stack is deployed, which you can do by running this on the server: docker network create -d overlay proxy", networkName))
|
||||
case err != nil:
|
||||
return err
|
||||
case network.Scope != "swarm":
|
||||
return errors.Errorf("network %q is declared as external, but it is not in the right scope: %q instead of \"swarm\"", networkName, network.Scope)
|
||||
return errors.New(i18n.G("network %q is declared as external, but it is not in the right scope: %q instead of \"swarm\"", networkName, network.Scope))
|
||||
}
|
||||
}
|
||||
return nil
|
||||
@ -356,13 +362,13 @@ func createSecrets(ctx context.Context, cl *dockerClient.Client, secrets []swarm
|
||||
case err == nil:
|
||||
// secret already exists, then we update that
|
||||
if err := cl.SecretUpdate(ctx, secret.ID, secret.Meta.Version, secretSpec); err != nil {
|
||||
return errors.Wrapf(err, "failed to update secret %s", secretSpec.Name)
|
||||
return errors.Wrap(err, i18n.G("failed to update secret %s", secretSpec.Name))
|
||||
}
|
||||
case dockerClient.IsErrNotFound(err):
|
||||
// secret does not exist, then we create a new one.
|
||||
log.Infof("creating secret %s", secretSpec.Name)
|
||||
log.Info(i18n.G("creating secret %s", secretSpec.Name))
|
||||
if _, err := cl.SecretCreate(ctx, secretSpec); err != nil {
|
||||
return errors.Wrapf(err, "failed to create secret %s", secretSpec.Name)
|
||||
return errors.Wrap(err, i18n.G("failed to create secret %s", secretSpec.Name))
|
||||
}
|
||||
default:
|
||||
return err
|
||||
@ -378,13 +384,13 @@ func createConfigs(ctx context.Context, cl *dockerClient.Client, configs []swarm
|
||||
case err == nil:
|
||||
// config already exists, then we update that
|
||||
if err := cl.ConfigUpdate(ctx, config.ID, config.Meta.Version, configSpec); err != nil {
|
||||
return errors.Wrapf(err, "failed to update config %s", configSpec.Name)
|
||||
return errors.Wrap(err, i18n.G("failed to update config %s", configSpec.Name))
|
||||
}
|
||||
case dockerClient.IsErrNotFound(err):
|
||||
// config does not exist, then we create a new one.
|
||||
log.Debugf("creating config %s", configSpec.Name)
|
||||
if _, err := cl.ConfigCreate(ctx, configSpec); err != nil {
|
||||
return errors.Wrapf(err, "failed to create config %s", configSpec.Name)
|
||||
return errors.Wrap(err, i18n.G("failed to create config %s", configSpec.Name))
|
||||
}
|
||||
default:
|
||||
return err
|
||||
@ -413,9 +419,9 @@ func createNetworks(ctx context.Context, cl *dockerClient.Client, namespace conv
|
||||
createOpts.Driver = defaultNetworkDriver
|
||||
}
|
||||
|
||||
log.Debugf("creating network %s", name)
|
||||
log.Debug(i18n.G("creating network %s", name))
|
||||
if _, err := cl.NetworkCreate(ctx, name, createOpts); err != nil {
|
||||
return errors.Wrapf(err, "failed to create network %s", name)
|
||||
return errors.Wrap(err, i18n.G("failed to create network %s", name))
|
||||
}
|
||||
}
|
||||
return nil
|
||||
@ -455,16 +461,16 @@ func deployServices(
|
||||
if sendAuth {
|
||||
dockerCLI, err := command.NewDockerCli()
|
||||
if err != nil {
|
||||
log.Errorf("retrieving docker auth token: failed create docker cli: %s", err)
|
||||
log.Error(i18n.G("retrieving docker auth token: failed create docker cli: %s", err))
|
||||
}
|
||||
encodedAuth, err = command.RetrieveAuthTokenFromImage(dockerCLI.ConfigFile(), image)
|
||||
if err != nil {
|
||||
log.Errorf("failed to retrieve registry auth for image %s: %s", image, err)
|
||||
log.Error(i18n.G("failed to retrieve registry auth for image %s: %s", image, err))
|
||||
}
|
||||
}
|
||||
|
||||
if service, exists := existingServiceMap[name]; exists {
|
||||
log.Debugf("updating %s", name)
|
||||
log.Debug(i18n.G("updating %s", name))
|
||||
|
||||
updateOpts := types.ServiceUpdateOptions{EncodedRegistryAuth: encodedAuth}
|
||||
|
||||
@ -499,7 +505,7 @@ func deployServices(
|
||||
|
||||
response, err := cl.ServiceUpdate(ctx, service.ID, service.Version, serviceSpec, updateOpts)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "failed to update %s", name)
|
||||
return nil, errors.Wrap(err, i18n.G("failed to update %s", name))
|
||||
}
|
||||
|
||||
for _, warning := range response.Warnings {
|
||||
@ -511,7 +517,7 @@ func deployServices(
|
||||
ID: service.ID,
|
||||
})
|
||||
} else {
|
||||
log.Debugf("creating %s", name)
|
||||
log.Debug(i18n.G("creating %s", name))
|
||||
|
||||
createOpts := types.ServiceCreateOptions{EncodedRegistryAuth: encodedAuth}
|
||||
|
||||
@ -522,7 +528,7 @@ func deployServices(
|
||||
|
||||
serviceCreateResponse, err := cl.ServiceCreate(ctx, serviceSpec, createOpts)
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "failed to create %s", name)
|
||||
return nil, errors.Wrap(err, i18n.G("failed to create %s", name))
|
||||
}
|
||||
|
||||
servicesMeta = append(servicesMeta, ui.ServiceMeta{
|
||||
@ -567,7 +573,7 @@ func WaitOnServices(ctx context.Context, cl *dockerClient.Client, opts WaitOpts)
|
||||
tui := tea.NewProgram(model)
|
||||
|
||||
if !opts.Quiet {
|
||||
log.Info("polling deployment status")
|
||||
log.Info(i18n.G("polling deployment status"))
|
||||
}
|
||||
|
||||
m, err := log.Without(
|
||||
@ -576,7 +582,7 @@ func WaitOnServices(ctx context.Context, cl *dockerClient.Client, opts WaitOpts)
|
||||
},
|
||||
)
|
||||
if err != nil {
|
||||
return fmt.Errorf("waitOnServices: error running TUI: %s", err)
|
||||
return errors.New(i18n.G("waitOnServices: error running TUI: %s", err))
|
||||
}
|
||||
|
||||
deployModel := m.(ui.Model)
|
||||
@ -584,16 +590,16 @@ func WaitOnServices(ctx context.Context, cl *dockerClient.Client, opts WaitOpts)
|
||||
var errs []error
|
||||
|
||||
if deployModel.Failed {
|
||||
errs = append(errs, fmt.Errorf("deploy failed 🛑"))
|
||||
errs = append(errs, errors.New(i18n.G("deploy failed 🛑")))
|
||||
} else if deployModel.TimedOut {
|
||||
errs = append(errs, fmt.Errorf("deploy timed out 🟠"))
|
||||
errs = append(errs, errors.New(i18n.G("deploy timed out 🟠")))
|
||||
} else {
|
||||
errs = append(errs, fmt.Errorf("deploy in progress 🟠"))
|
||||
errs = append(errs, errors.New(i18n.G("deploy in progress 🟠")))
|
||||
}
|
||||
|
||||
for _, s := range *deployModel.Streams {
|
||||
if s.Err != nil {
|
||||
errs = append(errs, fmt.Errorf("%s: %s", s.Name, s.Err))
|
||||
errs = append(errs, errors.New(i18n.G("%s: %s", s.Name, s.Err)))
|
||||
}
|
||||
}
|
||||
|
||||
@ -605,28 +611,28 @@ func WaitOnServices(ctx context.Context, cl *dockerClient.Client, opts WaitOpts)
|
||||
)
|
||||
|
||||
if err := os.MkdirAll(filepath.Join(config.LOGS_DIR, opts.ServerName), 0o764); err != nil {
|
||||
return fmt.Errorf("waitOnServices: error creating log dir: %s", err)
|
||||
return errors.New(i18n.G("waitOnServices: error creating log dir: %s", err))
|
||||
}
|
||||
|
||||
file, err := os.Create(logsPath)
|
||||
if err != nil {
|
||||
return fmt.Errorf("waitOnServices: error opening file: %s", err)
|
||||
return errors.New(i18n.G("waitOnServices: error opening file: %s", err))
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
s := strings.Join(*deployModel.Logs, "\n")
|
||||
if _, err := file.WriteString(s); err != nil {
|
||||
return fmt.Errorf("waitOnServices: writeFile: %s", err)
|
||||
return errors.New(i18n.G("waitOnServices: writeFile: %s", err))
|
||||
}
|
||||
|
||||
errs = append(errs, fmt.Errorf("logs: %s", logsPath))
|
||||
errs = append(errs, errors.New(i18n.G("logs: %s", logsPath)))
|
||||
}
|
||||
|
||||
return stdlibErr.Join(errs...)
|
||||
}
|
||||
|
||||
if !opts.Quiet {
|
||||
log.Info("deploy succeeded 🟢")
|
||||
log.Info(i18n.G("deploy succeeded 🟢"))
|
||||
}
|
||||
|
||||
return nil
|
||||
@ -646,8 +652,7 @@ func GetStacks(cl *dockerClient.Client) ([]*formatter.Stack, error) {
|
||||
labels := service.Spec.Labels
|
||||
name, ok := labels[convert.LabelNamespace]
|
||||
if !ok {
|
||||
return nil, errors.Errorf("cannot get label %s for %s",
|
||||
convert.LabelNamespace, service.ID)
|
||||
return nil, errors.New(i18n.G("cannot get label %s for %s", convert.LabelNamespace, service.ID))
|
||||
}
|
||||
ztack, ok := m[name]
|
||||
if !ok {
|
||||
|
Reference in New Issue
Block a user