Skip to content

Commit 0dd0708

Browse files
committed
support spdk tgt
Signed-off-by: YLShiJustFly <youseeicanfly@126.com>
1 parent 3b6b0a1 commit 0dd0708

File tree

21 files changed

+1054
-51
lines changed

21 files changed

+1054
-51
lines changed

Makefile

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,4 +73,3 @@ upload:
7373
lint:
7474
go install github.com/golangci/golangci-lint/cmd/golangci-lint@$(GOLANGCILINT_VERSION)
7575
$(GOBIN_GOLANGCILINT) run -v
76-

cli/command/client/map.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,14 @@ func ParseSize(size string) (int, error) {
110110
return n, nil
111111
}
112112

113+
func ParseDevno(size string) (int, error) {
114+
n, err := strconv.Atoi(size)
115+
if err != nil || n < 0 {
116+
return 0, errno.ERR_SPDK_TARGET_DEVNO_IS_ABNORMAL
117+
}
118+
return n, nil
119+
}
120+
113121
func ParseBlockSize(blocksize string) (uint64, error) {
114122
if !strings.HasSuffix(blocksize, "B") {
115123
return 0, errno.ERR_VOLUME_BLOCKSIZE_MUST_END_WITH_BYTE_SUFFIX.

cli/command/target/add.go

Lines changed: 71 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,23 @@ var (
4444
}
4545
)
4646

47+
var (
48+
ADD_SPDK_PLAYBOOK_STEPS = []int{
49+
//playbook.CREATE_VOLUME,
50+
playbook.ADD_SPDK_TARGET,
51+
}
52+
)
53+
4754
type addOptions struct {
48-
image string
49-
host string
50-
size string
51-
create bool
52-
filename string
53-
blocksize string
55+
image string
56+
host string
57+
size string
58+
create bool
59+
filename string
60+
blocksize string
61+
devno string
62+
originbdevname string
63+
spdk bool
5464
}
5565

5666
func checkAddOptions(curveadm *cli.CurveAdm, options addOptions) error {
@@ -60,6 +70,17 @@ func checkAddOptions(curveadm *cli.CurveAdm, options addOptions) error {
6070
return err
6171
} else if _, err = client.ParseBlockSize(options.blocksize); err != nil {
6272
return err
73+
} else if options.spdk {
74+
if len(options.devno) != 0 {
75+
if _, err = client.ParseDevno(options.size); err != nil {
76+
return err
77+
}
78+
}
79+
if len(options.originbdevname) != 0 {
80+
if err = client.ParseOriginDevname(options.size); err != nil {
81+
return err
82+
}
83+
}
6384
} else if !utils.PathExist(options.filename) {
6485
return errno.ERR_CLIENT_CONFIGURE_FILE_NOT_EXIST.
6586
F("file path: %s", utils.AbsPath(options.filename))
@@ -91,9 +112,41 @@ func NewAddCommand(curveadm *cli.CurveAdm) *cobra.Command {
91112
flags.StringVar(&options.size, "size", "10GiB", "Specify volume size")
92113
flags.StringVarP(&options.filename, "conf", "c", "client.yaml", "Specify client configuration file")
93114
flags.StringVar(&options.blocksize, "blocksize", "4096B", "Specify volume blocksize")
115+
flags.BoolVar(&options.spdk, "spdk", false, "create iscsi spdk target")
116+
flags.StringVar(&options.devno, "devno", "0", "Specify bdev num(when set --spdk flag)")
117+
flags.StringVar(&options.originbdevname, "originbdevname", "/dev/cbd0", "Specify cbd dev(when set --spdk flag)")
94118
return cmd
95119
}
96120

121+
func genAddSpdkPlaybook(curveadm *cli.CurveAdm,
122+
ccs []*configure.ClientConfig,
123+
options addOptions) (*playbook.Playbook, error) {
124+
user, name, _ := client.ParseImage(options.image)
125+
size, _ := client.ParseSize(options.size)
126+
blocksize, _ := client.ParseBlockSize(options.blocksize)
127+
steps := ADD_SPDK_PLAYBOOK_STEPS
128+
pb := playbook.NewPlaybook(curveadm)
129+
for _, step := range steps {
130+
pb.AddStep(&playbook.PlaybookStep{
131+
Type: step,
132+
Configs: ccs,
133+
Options: map[string]interface{}{
134+
comm.KEY_SPDK_TARGET_OPTIONS: bs.SpdkTargetOption{
135+
Host: options.host,
136+
User: user,
137+
Volume: name,
138+
Size: size,
139+
Blocksize: blocksize,
140+
Create: options.create,
141+
Devno: options.devno,
142+
OriginBdevname: options.originbdevname,
143+
},
144+
},
145+
})
146+
}
147+
return pb, nil
148+
}
149+
97150
func genAddPlaybook(curveadm *cli.CurveAdm,
98151
ccs []*configure.ClientConfig,
99152
options addOptions) (*playbook.Playbook, error) {
@@ -130,11 +183,19 @@ func runAdd(curveadm *cli.CurveAdm, options addOptions) error {
130183
return errno.ERR_REQUIRE_CURVEBS_KIND_CLIENT_CONFIGURE_FILE.
131184
F("kind: %s", cc.GetKind())
132185
}
133-
186+
var pb *playbook.Playbook
134187
// 2) generate map playbook
135-
pb, err := genAddPlaybook(curveadm, []*configure.ClientConfig{cc}, options)
136-
if err != nil {
137-
return err
188+
if options.spdk {
189+
pb, err = genAddSpdkPlaybook(curveadm, []*configure.ClientConfig{cc}, options)
190+
if err != nil {
191+
return err
192+
}
193+
194+
} else {
195+
pb, err = genAddPlaybook(curveadm, []*configure.ClientConfig{cc}, options)
196+
if err != nil {
197+
return err
198+
}
138199
}
139200

140201
// 3) run playground

cli/command/target/cmd.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ func NewTargetCommand(curveadm *cli.CurveAdm) *cobra.Command {
3232
cmd := &cobra.Command{
3333
Use: "target",
3434
Short: "Manage SCSI target of CurveBS",
35-
Args: cliutil.NoArgs,
35+
Args: cliutil.ExactArgs(1),
3636
RunE: cliutil.ShowHelp(curveadm.Err()),
3737
}
3838

cli/command/target/delete.go

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,17 @@ var (
3838
}
3939
)
4040

41+
var (
42+
DELETE_SPDK_PLAYBOOK_STEPS = []int{
43+
playbook.DELETE_SPDK_TARGET,
44+
}
45+
)
46+
4147
type deleteOptions struct {
42-
host string
43-
tid string
48+
host string
49+
tid string
50+
devno string
51+
spdk bool
4452
}
4553

4654
func NewDeleteCommand(curveadm *cli.CurveAdm) *cobra.Command {
@@ -60,6 +68,7 @@ func NewDeleteCommand(curveadm *cli.CurveAdm) *cobra.Command {
6068

6169
flags := cmd.Flags()
6270
flags.StringVar(&options.host, "host", "localhost", "Specify target host")
71+
flags.BoolVar(&options.spdk, "spdk", false, "delete iscsi spdk target")
6372

6473
return cmd
6574
}
@@ -82,9 +91,41 @@ func genDeletePlaybook(curveadm *cli.CurveAdm, options deleteOptions) (*playbook
8291
return pb, nil
8392
}
8493

94+
func genDeleteSpdkPlaybook(curveadm *cli.CurveAdm, options deleteOptions) (*playbook.Playbook, error) {
95+
steps := DELETE_SPDK_PLAYBOOK_STEPS
96+
pb := playbook.NewPlaybook(curveadm)
97+
for _, step := range steps {
98+
pb.AddStep(&playbook.PlaybookStep{
99+
Type: step,
100+
Configs: nil,
101+
Options: map[string]interface{}{
102+
comm.KEY_SPDK_TARGET_OPTIONS: bs.SpdkTargetOption{
103+
Host: options.host,
104+
Tid: options.tid,
105+
Devno: options.devno,
106+
},
107+
},
108+
})
109+
}
110+
return pb, nil
111+
}
112+
85113
func runDelete(curveadm *cli.CurveAdm, options deleteOptions) error {
86114
// 1) generate list playbook
87-
pb, err := genDeletePlaybook(curveadm, options)
115+
var pb *playbook.Playbook
116+
var err error
117+
if options.spdk {
118+
pb, err = genDeleteSpdkPlaybook(curveadm, options)
119+
if err != nil {
120+
return err
121+
}
122+
} else {
123+
pb, err = genDeletePlaybook(curveadm, options)
124+
if err != nil {
125+
return err
126+
}
127+
}
128+
88129
if err != nil {
89130
return err
90131
}

cli/command/target/list.go

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,15 @@ var (
3939
}
4040
)
4141

42+
var (
43+
LIST_SPDK_PLAYBOOK_STEPS = []int{
44+
playbook.LIST_SPDK_TARGETS,
45+
}
46+
)
47+
4248
type listOptions struct {
4349
host string
50+
spdk bool
4451
}
4552

4653
func NewListCommand(curveadm *cli.CurveAdm) *cobra.Command {
@@ -59,6 +66,7 @@ func NewListCommand(curveadm *cli.CurveAdm) *cobra.Command {
5966

6067
flags := cmd.Flags()
6168
flags.StringVar(&options.host, "host", "localhost", "Specify target host")
69+
flags.BoolVar(&options.spdk, "spdk", false, "list iscsi spdk target")
6270

6371
return cmd
6472
}
@@ -80,9 +88,31 @@ func genListPlaybook(curveadm *cli.CurveAdm, options listOptions) (*playbook.Pla
8088
return pb, nil
8189
}
8290

83-
func displayTargets(curveadm *cli.CurveAdm) {
91+
func genListSpdkPlaybook(curveadm *cli.CurveAdm, options listOptions) (*playbook.Playbook, error) {
92+
steps := LIST_SPDK_PLAYBOOK_STEPS
93+
pb := playbook.NewPlaybook(curveadm)
94+
for _, step := range steps {
95+
pb.AddStep(&playbook.PlaybookStep{
96+
Type: step,
97+
Configs: nil,
98+
Options: map[string]interface{}{
99+
comm.KEY_SPDK_TARGET_OPTIONS: bs.SpdkTargetOption{
100+
Host: options.host,
101+
},
102+
},
103+
})
104+
}
105+
return pb, nil
106+
}
107+
108+
func displayTargets(curveadm *cli.CurveAdm, spdk bool) {
84109
targets := []step.Target{}
85-
value := curveadm.MemStorage().Get(comm.KEY_ALL_TARGETS)
110+
var value interface{}
111+
if spdk {
112+
value = curveadm.MemStorage().Get(comm.KEY_ALL_SPDK_TARGETS)
113+
} else {
114+
value = curveadm.MemStorage().Get(comm.KEY_ALL_TARGETS)
115+
}
86116
if value != nil {
87117
m := value.(map[string]*step.Target)
88118
for _, target := range m {
@@ -97,9 +127,18 @@ func displayTargets(curveadm *cli.CurveAdm) {
97127

98128
func runList(curveadm *cli.CurveAdm, options listOptions) error {
99129
// 1) generate list playbook
100-
pb, err := genListPlaybook(curveadm, options)
101-
if err != nil {
102-
return err
130+
var pb *playbook.Playbook
131+
var err error
132+
if options.spdk {
133+
pb, err = genListSpdkPlaybook(curveadm, options)
134+
if err != nil {
135+
return err
136+
}
137+
} else {
138+
pb, err = genListPlaybook(curveadm, options)
139+
if err != nil {
140+
return err
141+
}
103142
}
104143

105144
// 2) run playground
@@ -109,6 +148,6 @@ func runList(curveadm *cli.CurveAdm, options listOptions) error {
109148
}
110149

111150
// 3) print targets
112-
displayTargets(curveadm)
151+
displayTargets(curveadm, options.spdk)
113152
return nil
114153
}

cli/command/target/start.go

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,16 @@ var (
4141
}
4242
)
4343

44+
var (
45+
START_SPDK_PLAYBOOK_STEPS = []int{
46+
playbook.START_SPDK_TARGET_DAEMON,
47+
}
48+
)
49+
4450
type startOptions struct {
4551
host string
4652
filename string
53+
spdk bool
4754
}
4855

4956
func NewStartCommand(curveadm *cli.CurveAdm) *cobra.Command {
@@ -62,6 +69,7 @@ func NewStartCommand(curveadm *cli.CurveAdm) *cobra.Command {
6269
flags := cmd.Flags()
6370
flags.StringVar(&options.host, "host", "localhost", "Specify target host")
6471
flags.StringVarP(&options.filename, "conf", "c", "client.yaml", "Specify client configuration file")
72+
flags.BoolVar(&options.spdk, "spdk", false, "start iscsi spdk target")
6573

6674
return cmd
6775
}
@@ -85,6 +93,25 @@ func genStartPlaybook(curveadm *cli.CurveAdm,
8593
return pb, nil
8694
}
8795

96+
func genStartSpdkPlaybook(curveadm *cli.CurveAdm,
97+
ccs []*configure.ClientConfig,
98+
options startOptions) (*playbook.Playbook, error) {
99+
steps := START_SPDK_PLAYBOOK_STEPS
100+
pb := playbook.NewPlaybook(curveadm)
101+
for _, step := range steps {
102+
pb.AddStep(&playbook.PlaybookStep{
103+
Type: step,
104+
Configs: ccs,
105+
Options: map[string]interface{}{
106+
comm.KEY_SPDK_TARGET_OPTIONS: bs.SpdkTargetOption{
107+
Host: options.host,
108+
},
109+
},
110+
})
111+
}
112+
return pb, nil
113+
}
114+
88115
func runStart(curveadm *cli.CurveAdm, options startOptions) error {
89116
// 1) parse client configure
90117
cc, err := configure.ParseClientConfig(options.filename)
@@ -96,9 +123,18 @@ func runStart(curveadm *cli.CurveAdm, options startOptions) error {
96123
}
97124

98125
// 2) generate map playbook
99-
pb, err := genStartPlaybook(curveadm, []*configure.ClientConfig{cc}, options)
100-
if err != nil {
101-
return err
126+
var pb *playbook.Playbook
127+
if options.spdk {
128+
pb, err = genStartSpdkPlaybook(curveadm, []*configure.ClientConfig{cc}, options)
129+
if err != nil {
130+
return err
131+
}
132+
} else {
133+
pb, err = genStartPlaybook(curveadm, []*configure.ClientConfig{cc}, options)
134+
if err != nil {
135+
return err
136+
}
137+
102138
}
103139

104140
// 3) run playground

0 commit comments

Comments
 (0)