func()

in scheduler/client/cli/run_job.go [57:136]


func (c *runJobCmd) Run(cl *client.SimpleClient, cmd *cobra.Command, args []string) error {
	log.Info("Running on scoot, args:", args)
	jobDef := scoot.NewJobDefinition()
	jobDef.Tag = &c.tag
	switch {
	case len(args) > 0 && c.jobFilePath != "":
		return errors.New("You must provide either args or a job definition")
	case len(args) > 0:
		if c.snapshotId == "" {
			log.Info("No snapshotID provided - cmd will be run in an empty tmpdir.")
		} else if !strings.Contains(c.snapshotId, "-") {
			//this is not a bundleID, assume it's a sha that's available upstream. Cf. snapshot/git/gitdb/README.md
			streamId := fmt.Sprintf("stream-gc-%s-%s", c.streamName, c.snapshotId)
			log.Infof("Converting sha to a stream-based snapshot_id: %s -> %s", c.snapshotId, streamId)
			c.snapshotId = streamId
		}
		task := scoot.NewTaskDefinition()
		taskId := "task1"
		task.Command = scoot.NewCommand()
		task.Command.Argv = args
		task.SnapshotId = &c.snapshotId
		task.TaskId = &taskId
		jobDef.Tasks = []*scoot.TaskDefinition{task}
	case c.jobFilePath != "":
		f, err := os.Open(c.jobFilePath)
		if err != nil {
			return err
		}
		asBytes, err := ioutil.ReadAll(f)
		if err != nil {
			return err
		}
		var jsonJob CLIJobDef
		err = json.Unmarshal(asBytes, &jsonJob)
		if err != nil {
			return err
		}

		if jsonJob.DefaultTaskTimeoutMs > 0 {
			jobDef.DefaultTaskTimeoutMs = &jsonJob.DefaultTaskTimeoutMs
		}
		jobDef.Tag = &jsonJob.Tag
		jobDef.Basis = &jsonJob.Basis
		jobDef.JobType = &jsonJob.JobType
		jobDef.Requestor = &jsonJob.Requestor
		jobDef.Priority = &jsonJob.Priority
		jobDef.Tasks = []*scoot.TaskDefinition{}
		for _, jsonTask := range jsonJob.Tasks {
			jt := jsonTask
			taskDef := scoot.NewTaskDefinition()
			taskDef.Command = scoot.NewCommand()
			taskDef.Command.Argv = jt.Args
			taskDef.Command.EnvVars = make(map[string]string)
			for k, v := range jt.EnvVars {
				taskDef.Command.EnvVars[k] = v
			}
			taskDef.SnapshotId = &jt.SnapshotID
			taskDef.TaskId = &jt.TaskID
			jobDef.Tasks = append(jobDef.Tasks, taskDef)
			if jt.TimeoutMs > 0 {
				taskDef.TimeoutMs = &jt.TimeoutMs
			}
		}
	}

	jobId, err := cl.ScootClient.RunJob(jobDef)
	if err != nil {
		switch err := err.(type) {
		case *scoot.InvalidRequest:
			return fmt.Errorf("Invalid Request: %v", err.GetMessage())
		default:
			return fmt.Errorf("Error running job: %v %T", err, err)
		}
	}

	fmt.Println(jobId.ID) // must go to std out in case caller looking in stdout for the results
	log.Infof("JobID: %s", jobId.ID)

	return nil
}