Skip to content

Commit 71a2bd3

Browse files
YujiOshimak8s-ci-robot
authored andcommitted
Cobra cli (#69)
* add cobra to cli Signed-off-by: YujiOshima <[email protected]> * add doc Signed-off-by: YujiOshima <[email protected]> * fix Signed-off-by: YujiOshima <[email protected]> * fix comment Signed-off-by: YujiOshima <[email protected]> * fix Signed-off-by: YujiOshima <[email protected]>
1 parent 3157a7a commit 71a2bd3

File tree

21 files changed

+980
-273
lines changed

21 files changed

+980
-273
lines changed

cmd/cli/create-study.go

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"io/ioutil"
7+
"log"
8+
9+
"github.com/kubeflow/katib/pkg/api"
10+
"github.com/spf13/cobra"
11+
"google.golang.org/grpc"
12+
yaml "gopkg.in/yaml.v2"
13+
)
14+
15+
type createStudyOpt struct {
16+
conf string
17+
args []string
18+
}
19+
20+
//NewCommandCreateStudy generate create study cmd
21+
func NewCommandCreateStudy() *cobra.Command {
22+
var opt createStudyOpt
23+
cmd := &cobra.Command{
24+
Use: "study",
25+
Args: cobra.NoArgs,
26+
Short: "Create a study from a file",
27+
Long: "YAML formats are accepted.",
28+
Aliases: []string{"st"},
29+
Run: func(cmd *cobra.Command, args []string) {
30+
opt.args = args
31+
createStudy(cmd, &opt)
32+
},
33+
}
34+
cmd.Flags().StringVarP(&opt.conf, "config", "f", "", "File path of study config(required)")
35+
cmd.MarkFlagRequired("config")
36+
return cmd
37+
}
38+
39+
func createStudy(cmd *cobra.Command, opt *createStudyOpt) {
40+
//check and get persistent flag volume
41+
var pf *PersistentFlags
42+
pf, err := CheckPersistentFlags()
43+
if err != nil {
44+
log.Fatalf("Fail to Check Flags: %v", err)
45+
return
46+
}
47+
48+
var sc api.StudyConfig
49+
buf, _ := ioutil.ReadFile(opt.conf)
50+
err = yaml.Unmarshal(buf, &sc)
51+
52+
conn, err := grpc.Dial(pf.server, grpc.WithInsecure())
53+
if err != nil {
54+
log.Fatalf("could not connect: %v", err)
55+
return
56+
}
57+
defer conn.Close()
58+
req := &api.CreateStudyRequest{StudyConfig: &sc}
59+
c := api.NewManagerClient(conn)
60+
r, err := c.CreateStudy(context.Background(), req)
61+
if err != nil {
62+
log.Fatalf("CreateStudy failed: %v", err)
63+
}
64+
fmt.Printf("Study %v is created.", r.StudyId)
65+
}

cmd/cli/create.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package main
2+
3+
import (
4+
"github.com/spf13/cobra"
5+
)
6+
7+
//NewCommandCreate generate create cmd
8+
func NewCommandCreate() *cobra.Command {
9+
cmd := &cobra.Command{
10+
Use: "create",
11+
Short: "Create a resource from a file",
12+
Long: `YAML formats are accepted.`,
13+
}
14+
15+
cmd.AddCommand(NewCommandCreateStudy())
16+
17+
return cmd
18+
}

cmd/cli/get-model.go

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"log"
7+
"os"
8+
"strings"
9+
"text/tabwriter"
10+
"unicode/utf8"
11+
12+
"github.com/kubeflow/katib/pkg/api"
13+
"github.com/spf13/cobra"
14+
"google.golang.org/grpc"
15+
)
16+
17+
type getModelOpt struct {
18+
detail bool
19+
args []string
20+
}
21+
22+
//NewCommandGetModel generate get model cmd
23+
func NewCommandGetModel() *cobra.Command {
24+
var opt getModelOpt
25+
cmd := &cobra.Command{
26+
Use: "model",
27+
Args: cobra.MaximumNArgs(2),
28+
Short: "Display Model Info",
29+
Long: `Display Information of saved model`,
30+
Aliases: []string{"md"},
31+
Run: func(cmd *cobra.Command, args []string) {
32+
opt.args = args
33+
getModel(cmd, &opt)
34+
},
35+
}
36+
cmd.Flags().BoolVarP(&opt.detail, "detail", "d", false, "Display detail information of Model")
37+
return cmd
38+
}
39+
40+
func getModel(cmd *cobra.Command, opt *getModelOpt) {
41+
//check and get persistent flag volume
42+
var pf *PersistentFlags
43+
pf, err := CheckPersistentFlags()
44+
if err != nil {
45+
log.Fatalf("Fail to Check Flags: %v", err)
46+
return
47+
}
48+
49+
conn, err := grpc.Dial(pf.server, grpc.WithInsecure())
50+
if err != nil {
51+
log.Fatalf("could not connect: %v", err)
52+
return
53+
}
54+
defer conn.Close()
55+
var soverviews []*api.StudyOverview
56+
c := api.NewManagerClient(conn)
57+
// Search study if Study ID or name is set
58+
if len(opt.args) > 0 {
59+
// Search specified study in running studies
60+
req := &api.GetStudiesRequest{}
61+
r, err := c.GetStudies(context.Background(), req)
62+
if err != nil {
63+
log.Fatalf("GetStudy failed: %v", err)
64+
return
65+
}
66+
if len(r.StudyInfos) > 0 {
67+
for _, si := range r.StudyInfos {
68+
if len(opt.args) > 0 {
69+
if utf8.RuneCountInString(opt.args[0]) >= 7 {
70+
if strings.HasPrefix(si.StudyId, opt.args[0]) {
71+
soverviews = append(soverviews, &api.StudyOverview{
72+
Name: si.Name,
73+
Owner: si.Owner,
74+
})
75+
break
76+
}
77+
}
78+
if si.Name == opt.args[0] {
79+
soverviews = append(soverviews, &api.StudyOverview{
80+
Name: si.Name,
81+
Owner: si.Owner,
82+
})
83+
break
84+
}
85+
} else {
86+
soverviews = append(soverviews, &api.StudyOverview{
87+
Name: si.Name,
88+
Owner: si.Owner,
89+
})
90+
}
91+
}
92+
}
93+
}
94+
if len(soverviews) == 0 {
95+
// Search specified study from ModelDB
96+
sreq := &api.GetSavedStudiesRequest{}
97+
sr, err := c.GetSavedStudies(context.Background(), sreq)
98+
if err != nil {
99+
log.Fatalf("GetStudy failed: %v", err)
100+
return
101+
}
102+
if len(sr.Studies) == 0 {
103+
log.Fatalf("No Studies are saved.")
104+
return
105+
}
106+
for _, s := range sr.Studies {
107+
if len(opt.args) > 0 {
108+
if opt.args[0] == s.Name {
109+
soverviews = append(soverviews, s)
110+
}
111+
} else {
112+
soverviews = append(soverviews, s)
113+
}
114+
}
115+
}
116+
for _, si := range soverviews {
117+
// Search Models from ModelDB
118+
mreq := &api.GetSavedModelsRequest{StudyName: si.Name}
119+
mr, err := c.GetSavedModels(context.Background(), mreq)
120+
if err != nil {
121+
log.Fatalf("GetModels failed: %v", err)
122+
return
123+
}
124+
w := new(tabwriter.Writer)
125+
w.Init(os.Stdout, 0, 8, 0, '\t', tabwriter.TabIndent)
126+
fmt.Printf("Study %v Owner %v Saved Model Num %v:\n", si.Name, si.Owner, len(mr.Models))
127+
if opt.detail {
128+
for _, m := range mr.Models {
129+
if len(opt.args) > 1 {
130+
if !strings.HasPrefix(m.TrialId, opt.args[1]) {
131+
continue
132+
}
133+
}
134+
fmt.Printf("TrialID :%v\n", m.TrialId)
135+
fmt.Printf("Model Path: %s\n", m.ModelPath)
136+
fmt.Println("Parameters:")
137+
for _, p := range m.Parameters {
138+
fmt.Fprintf(w, " %s:\t%v\n", p.Name, p.Value)
139+
}
140+
w.Flush()
141+
fmt.Println("Metrics:")
142+
for _, m := range m.Metrics {
143+
fmt.Fprintf(w, " %s:\t%v\n", m.Name, m.Value)
144+
}
145+
w.Flush()
146+
}
147+
} else {
148+
fmt.Fprintln(w, "TrialID\tParamNum\tMetricsNum")
149+
for _, m := range mr.Models {
150+
if len(opt.args) > 1 {
151+
if !strings.HasPrefix(m.TrialId, opt.args[1]) {
152+
continue
153+
}
154+
}
155+
fmt.Fprintf(w, "%s\t%d\t%d\n",
156+
string([]rune(m.TrialId)[:7]),
157+
len(m.Parameters),
158+
len(m.Metrics),
159+
)
160+
}
161+
w.Flush()
162+
}
163+
}
164+
}

cmd/cli/get-study.go

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"log"
7+
"os"
8+
"strings"
9+
"text/tabwriter"
10+
"unicode/utf8"
11+
12+
"github.com/kubeflow/katib/pkg/api"
13+
"github.com/spf13/cobra"
14+
"google.golang.org/grpc"
15+
)
16+
17+
//NewCommandGetStudy generate get studies cmd
18+
func NewCommandGetStudy() *cobra.Command {
19+
cmd := &cobra.Command{
20+
Use: "studies",
21+
Args: cobra.MaximumNArgs(1),
22+
Short: "Display Study lnfo",
23+
Long: `Display Information of a studies`,
24+
Aliases: []string{"st"},
25+
Run: getStudy,
26+
}
27+
return cmd
28+
}
29+
30+
func getStudy(cmd *cobra.Command, args []string) {
31+
//check and get persistent flag volume
32+
var pf *PersistentFlags
33+
pf, err := CheckPersistentFlags()
34+
if err != nil {
35+
log.Fatalf("Fail to Check Flags: %v", err)
36+
return
37+
}
38+
39+
conn, err := grpc.Dial(pf.server, grpc.WithInsecure())
40+
if err != nil {
41+
log.Fatalf("could not connect: %v", err)
42+
return
43+
}
44+
defer conn.Close()
45+
46+
c := api.NewManagerClient(conn)
47+
req := &api.GetStudiesRequest{}
48+
r, err := c.GetStudies(context.Background(), req)
49+
if err != nil {
50+
log.Fatalf("GetStudy failed: %v", err)
51+
return
52+
}
53+
var sis []*api.StudyInfo
54+
// Search study if Study ID or name is set
55+
if len(args) > 0 {
56+
for _, si := range r.StudyInfos {
57+
if utf8.RuneCountInString(args[0]) >= 7 {
58+
if strings.HasPrefix(si.StudyId, args[0]) {
59+
sis = append(sis, si)
60+
break
61+
}
62+
}
63+
if si.Name == args[0] {
64+
sis = append(sis, si)
65+
break
66+
}
67+
}
68+
} else {
69+
sis = r.StudyInfos
70+
}
71+
w := new(tabwriter.Writer)
72+
w.Init(os.Stdout, 0, 8, 0, '\t', tabwriter.TabIndent)
73+
fmt.Fprintln(w, "StudyID\tName\tOwner\tRunning\tCompleted")
74+
for _, si := range sis {
75+
fmt.Fprintf(w, "%s\t%s\t%s\t%d\t%d\n",
76+
string([]rune(si.StudyId)[:7]),
77+
si.Name,
78+
si.Owner,
79+
si.RunningTrialNum,
80+
si.CompletedTrialNum)
81+
}
82+
w.Flush()
83+
}

cmd/cli/get.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package main
2+
3+
import (
4+
"github.com/spf13/cobra"
5+
)
6+
7+
//NewCommandGet generate get cmd
8+
func NewCommandGet() *cobra.Command {
9+
cmd := &cobra.Command{
10+
Use: "get",
11+
Short: "Display one or many resources",
12+
Long: `list of resorces comannd can display includes: studies, study, trials, trial, models, model`,
13+
}
14+
15+
//set local flag
16+
17+
//add subcommand
18+
cmd.AddCommand(NewCommandGetStudy())
19+
// cmd.AddCommand(NewCommandGetTrial())
20+
cmd.AddCommand(NewCommandGetModel())
21+
22+
return cmd
23+
}

cmd/cli/katibctl.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"os"
6+
)
7+
8+
//Entry point
9+
func main() {
10+
//init command
11+
katibctl := NewRootCommand()
12+
if err := katibctl.Execute(); err != nil {
13+
fmt.Println(err)
14+
os.Exit(1)
15+
}
16+
17+
}

0 commit comments

Comments
 (0)