func (pod *Pod) getLaunchable(launchableID launch.LaunchableID, launchableStanza launch.LaunchableStanza, runAsUser string) (launch.Launchable, error) { launchableRootDir := filepath.Join(pod.home, launchableID.String()) serviceId := strings.Join( []string{ pod.UniqueName(), "__", launchableID.String(), }, "") restartTimeout := pod.DefaultTimeout if launchableStanza.RestartTimeout != "" { possibleTimeout, err := time.ParseDuration(launchableStanza.RestartTimeout) if err != nil { pod.logger.WithError(err).Errorf("%v is not a valid restart timeout - must be parseable by time.ParseDuration(). Using default time %v", launchableStanza.RestartTimeout, restartTimeout) } else { restartTimeout = possibleTimeout } } version, err := launchableStanza.LaunchableVersion() if err != nil { pod.logger.WithError(err).Warnf("Could not parse version from launchable %s.", launchableID) } if launchableStanza.LaunchableType == "hoist" { entryPoints := launchableStanza.EntryPoints if len(entryPoints) == 0 { entryPoints = append(entryPoints, path.Join("bin", "launch")) } cgroupName := serviceId if *NestedCgroups { cgroupName = filepath.Join( "p2", pod.node.String(), pod.UniqueName(), launchableID.String(), ) } ret := &hoist.Launchable{ Version: version, Id: launchableID, ServiceId: serviceId, RunAs: runAsUser, PodEnvDir: pod.EnvDir(), RootDir: launchableRootDir, P2Exec: pod.P2Exec, ExecNoLimit: true, RestartTimeout: restartTimeout, RestartPolicy_: launchableStanza.RestartPolicy(), CgroupConfig: launchableStanza.CgroupConfig, CgroupConfigName: launchableID.String(), CgroupName: cgroupName, SuppliedEnvVars: launchableStanza.Env, EntryPoints: entryPoints, } ret.CgroupConfig.Name = ret.ServiceId return ret.If(), nil } else if *ExperimentalOpencontainer && launchableStanza.LaunchableType == "opencontainer" { ret := &opencontainer.Launchable{ ID_: launchableID, ServiceID_: serviceId, RunAs: runAsUser, RootDir: launchableRootDir, P2Exec: pod.P2Exec, RestartTimeout: restartTimeout, RestartPolicy_: launchableStanza.RestartPolicy(), CgroupConfig: launchableStanza.CgroupConfig, SuppliedEnvVars: launchableStanza.Env, } ret.CgroupConfig.Name = serviceId return ret, nil } else { err := fmt.Errorf("launchable type '%s' is not supported", launchableStanza.LaunchableType) pod.logLaunchableError(launchableID.String(), err, "Unknown launchable type") return nil, err } }