forked from toolshed/abra
		
	feat(deploy): set timeout via label (!290)
Solves coop-cloud/organising#437 A timeout can be specified globally for a recipe using this label: `coop-cloud.${STACK_NAME}.timeout=${TIMEOUT:-120}`. This sets the default timeout to 120s. An app specific timeout can be set using the env `TIMEOUT`. Co-authored-by: Moritz <moritz.m@local-it.org> Reviewed-on: coop-cloud/abra#290
This commit is contained in:
		| @ -201,6 +201,12 @@ recipes. | |||||||
| 			logrus.Fatal(err) | 			logrus.Fatal(err) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | 		stack.WaitTimeout, err = config.GetTimeoutFromLabel(compose, stackName) | ||||||
|  | 		if err != nil { | ||||||
|  | 			logrus.Fatal(err) | ||||||
|  | 		} | ||||||
|  | 		logrus.Debugf("set waiting timeout to %d s", stack.WaitTimeout) | ||||||
|  |  | ||||||
| 		if err := stack.RunDeploy(cl, deployOpts, compose, stackName, internal.DontWaitConverge); err != nil { | 		if err := stack.RunDeploy(cl, deployOpts, compose, stackName, internal.DontWaitConverge); err != nil { | ||||||
| 			logrus.Fatal(err) | 			logrus.Fatal(err) | ||||||
| 		} | 		} | ||||||
|  | |||||||
| @ -161,6 +161,12 @@ func DeployAction(c *cli.Context) error { | |||||||
| 		logrus.Warn("skipping domain checks as requested") | 		logrus.Warn("skipping domain checks as requested") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	stack.WaitTimeout, err = config.GetTimeoutFromLabel(compose, stackName) | ||||||
|  | 	if err != nil { | ||||||
|  | 		logrus.Fatal(err) | ||||||
|  | 	} | ||||||
|  | 	logrus.Debugf("set waiting timeout to %d s", stack.WaitTimeout) | ||||||
|  |  | ||||||
| 	if err := stack.RunDeploy(cl, deployOpts, compose, app.Name, DontWaitConverge); err != nil { | 	if err := stack.RunDeploy(cl, deployOpts, compose, app.Name, DontWaitConverge); err != nil { | ||||||
| 		logrus.Fatal(err) | 		logrus.Fatal(err) | ||||||
| 	} | 	} | ||||||
|  | |||||||
| @ -149,7 +149,7 @@ update chaos deployments use the "--chaos" flag. Use it with care. | |||||||
| 	}, | 	}, | ||||||
| } | } | ||||||
|  |  | ||||||
| // getLabel reads docker labels in the format of "coop-cloud.${STACK_NAME}.${LABEL}". | // getLabel reads docker labels from running services in the format of "coop-cloud.${STACK_NAME}.${LABEL}". | ||||||
| func getLabel(cl *dockerclient.Client, stackName string, label string) (string, error) { | func getLabel(cl *dockerclient.Client, stackName string, label string) (string, error) { | ||||||
| 	filter := filters.NewArgs() | 	filter := filters.NewArgs() | ||||||
| 	filter.Add("label", fmt.Sprintf("%s=%s", convert.LabelNamespace, stackName)) | 	filter.Add("label", fmt.Sprintf("%s=%s", convert.LabelNamespace, stackName)) | ||||||
| @ -171,7 +171,7 @@ func getLabel(cl *dockerclient.Client, stackName string, label string) (string, | |||||||
| 	return "", nil | 	return "", nil | ||||||
| } | } | ||||||
|  |  | ||||||
| // getBoolLabel reads a boolean docker label. | // getBoolLabel reads a boolean docker label from running services | ||||||
| func getBoolLabel(cl *dockerclient.Client, stackName string, label string) (bool, error) { | func getBoolLabel(cl *dockerclient.Client, stackName string, label string) (bool, error) { | ||||||
| 	lableValue, err := getLabel(cl, stackName, label) | 	lableValue, err := getLabel(cl, stackName, label) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| @ -409,7 +409,7 @@ func tryUpgrade(cl *dockerclient.Client, stackName, recipeName string, conf *run | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if !updatesEnabled { | 	if !updatesEnabled { | ||||||
| 		logrus.Debugf("Don't update %s due to disabling auto updates or missing ENABLE_AUTO_UPDATE env.", stackName) | 		logrus.Debugf("Don't update %s due to disabled auto updates or missing ENABLE_AUTO_UPDATE env.", stackName) | ||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | |||||||
| @ -544,3 +544,29 @@ func SetUpdateLabel(compose *composetypes.Config, stackName string, appEnv AppEn | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // GetLabel reads docker labels in the format of "coop-cloud.${STACK_NAME}.${LABEL}" from the local compose files | ||||||
|  | func GetLabel(compose *composetypes.Config, stackName string, label string) string { | ||||||
|  | 	for _, service := range compose.Services { | ||||||
|  | 		if service.Name == "app" { | ||||||
|  | 			labelKey := fmt.Sprintf("coop-cloud.%s.%s", stackName, label) | ||||||
|  | 			logrus.Debugf("get label '%s'", labelKey) | ||||||
|  | 			if labelValue, ok := service.Deploy.Labels[labelKey]; ok { | ||||||
|  | 				return labelValue | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	logrus.Debugf("no %s label found for %s", label, stackName) | ||||||
|  | 	return "" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetTimeoutFromLabel reads the timeout value from docker label "coop-cloud.${STACK_NAME}.TIMEOUT" and returns 50 as default value | ||||||
|  | func GetTimeoutFromLabel(compose *composetypes.Config, stackName string) (int, error) { | ||||||
|  | 	var timeout = 50 // Default Timeout | ||||||
|  | 	var err error = nil | ||||||
|  | 	if timeoutLabel := GetLabel(compose, stackName, "timeout"); timeoutLabel != "" { | ||||||
|  | 		logrus.Debugf("timeout label: %s", timeoutLabel) | ||||||
|  | 		timeout, err = strconv.Atoi(timeoutLabel) | ||||||
|  | 	} | ||||||
|  | 	return timeout, err | ||||||
|  | } | ||||||
|  | |||||||
| @ -31,6 +31,9 @@ const ( | |||||||
| 	ResolveImageNever    = "never" | 	ResolveImageNever    = "never" | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | // Timeout to wait until docker services converge, default is 50s (random choice) | ||||||
|  | var WaitTimeout int = 50 | ||||||
|  |  | ||||||
| type StackStatus struct { | type StackStatus struct { | ||||||
| 	Services []swarm.Service | 	Services []swarm.Service | ||||||
| 	Err      error | 	Err      error | ||||||
| @ -457,7 +460,7 @@ func WaitOnService(ctx context.Context, cl *dockerClient.Client, serviceID, appN | |||||||
|  |  | ||||||
| 	go io.Copy(ioutil.Discard, pipeReader) | 	go io.Copy(ioutil.Discard, pipeReader) | ||||||
|  |  | ||||||
| 	timeout := 50 * time.Second | 	timeout := time.Duration(WaitTimeout) * time.Second | ||||||
|  |  | ||||||
| 	select { | 	select { | ||||||
| 	case err := <-errChan: | 	case err := <-errChan: | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user