Example #1
0
// createMainUnit
func createMainUnit(t *jobs.Task, sidekickUnitNames []string, engine engine.Engine, ctx generatorContext) (*sdunits.Unit, error) {
	unit, err := createDefaultUnit(t,
		unitName(t, unitKindMain, ctx.ScalingGroup),
		unitDescription(t, "Main", ctx.ScalingGroup),
		"service", unitKindMain, ctx)
	if err != nil {
		return nil, maskAny(err)
	}
	cmds, err := engine.CreateMainCmds(t, unit.ExecOptions.Environment, ctx.ScalingGroup)
	if err != nil {
		return nil, maskAny(err)
	}
	setupUnitFromCmds(unit, cmds)
	switch t.Type {
	case "oneshot":
		unit.ExecOptions.IsOneshot = true
		unit.ExecOptions.Restart = "on-failure"
	case "proxy":
		unit.ExecOptions.Restart = "always"
	default:
		unit.ExecOptions.Restart = "always"
	}

	// Additional service dependencies
	unit.ExecOptions.Require(sidekickUnitNames...)
	unit.ExecOptions.After(sidekickUnitNames...)
	for _, name := range t.VolumesFrom {
		other, err := t.Task(name)
		if err != nil {
			return nil, maskAny(err)
		}
		otherName := unitName(other, unitKindMain, ctx.ScalingGroup) + ".service"
		unit.ExecOptions.Require(otherName)
		unit.ExecOptions.After(otherName)
	}

	// Add metrics registration commands
	if err := addMetricsRegistration(t, unit, ctx); err != nil {
		return nil, maskAny(err)
	}

	// Add frontend registration commands
	if err := addFrontEndRegistration(t, unit, ctx); err != nil {
		return nil, maskAny(err)
	}

	return unit, nil
}