Example #1
0
File: pod.go Project: petertseng/p2
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
	}
}