4ae44796be3ffba00626889e15951dc48b84dcfa
[lightning.git] / manhattan.go
1 // Copyright (C) The Lightning Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 package lightning
6
7 import (
8         _ "embed"
9         "flag"
10         "fmt"
11         "io"
12         "os/exec"
13         "strings"
14
15         "git.arvados.org/arvados.git/sdk/go/arvados"
16 )
17
18 type manhattanPlot struct{}
19
20 //go:embed manhattan.py
21 var manhattanPy string
22
23 func (cmd *manhattanPlot) RunCommand(prog string, args []string, stdin io.Reader, stdout, stderr io.Writer) int {
24         var err error
25         defer func() {
26                 if err != nil {
27                         fmt.Fprintf(stderr, "%s\n", err)
28                 }
29         }()
30         flags := flag.NewFlagSet("", flag.ContinueOnError)
31         flags.SetOutput(stderr)
32         projectUUID := flags.String("project", "", "project `UUID` for output data")
33         inputDirectory := flags.String("i", "-", "input `directory` (output of slice-numpy -single-onehot)")
34         outputFilename := flags.String("o", "", "output `filename` (e.g., './plot.png')")
35         priority := flags.Int("priority", 500, "container request priority")
36         runlocal := flags.Bool("local", false, "run on local host (default: run in an arvados container)")
37         err = flags.Parse(args)
38         if err == flag.ErrHelp {
39                 err = nil
40                 return 0
41         } else if err != nil {
42                 return 2
43         } else if flags.NArg() > 0 {
44                 err = fmt.Errorf("errant command line arguments after parsed flags: %v", flags.Args())
45                 return 2
46         }
47
48         runner := arvadosContainerRunner{
49                 Name:        "lightning manhattan",
50                 Client:      arvados.NewClientFromEnv(),
51                 ProjectUUID: *projectUUID,
52                 RAM:         4 << 30,
53                 VCPUs:       1,
54                 Priority:    *priority,
55                 Mounts: map[string]map[string]interface{}{
56                         "/manhattan.py": map[string]interface{}{
57                                 "kind":    "text",
58                                 "content": manhattanPy,
59                         },
60                 },
61         }
62         if !*runlocal {
63                 err = runner.TranslatePaths(inputDirectory)
64                 if err != nil {
65                         return 1
66                 }
67                 *outputFilename = "/mnt/output/plot.png"
68         }
69         args = []string{
70                 *inputDirectory,
71                 *outputFilename,
72         }
73         if *runlocal {
74                 if *outputFilename == "" {
75                         fmt.Fprintln(stderr, "error: must specify -o filename.png in local mode (or try -help)")
76                         return 1
77                 }
78                 cmd := exec.Command("python3", append([]string{"-"}, args...)...)
79                 cmd.Stdin = strings.NewReader(manhattanPy)
80                 cmd.Stdout = stdout
81                 cmd.Stderr = stderr
82                 err = cmd.Run()
83                 if err != nil {
84                         return 1
85                 }
86                 return 0
87         }
88         runner.Prog = "python3"
89         runner.Args = append([]string{"/manhattan.py"}, args...)
90         var output string
91         output, err = runner.Run()
92         if err != nil {
93                 return 1
94         }
95         fmt.Fprintln(stdout, output+"/plot.png")
96         return 0
97 }