move port interface to scsi package

This commit is contained in:
Lei Xue
2016-11-27 17:02:17 +08:00
parent bd7193880e
commit ed47ac5ea0
8 changed files with 59 additions and 158 deletions

View File

@@ -29,7 +29,6 @@ import (
"github.com/golang/glog" "github.com/golang/glog"
"github.com/gostor/gotgt/pkg/apiserver" "github.com/gostor/gotgt/pkg/apiserver"
"github.com/gostor/gotgt/pkg/config" "github.com/gostor/gotgt/pkg/config"
"github.com/gostor/gotgt/pkg/port"
_ "github.com/gostor/gotgt/pkg/port/iscsit" _ "github.com/gostor/gotgt/pkg/port/iscsit"
"github.com/gostor/gotgt/pkg/scsi" "github.com/gostor/gotgt/pkg/scsi"
_ "github.com/gostor/gotgt/pkg/scsi/backingstore" _ "github.com/gostor/gotgt/pkg/scsi/backingstore"
@@ -70,7 +69,7 @@ Help Options:
} }
scsiTarget := scsi.NewSCSITargetService() scsiTarget := scsi.NewSCSITargetService()
targetDriver, err := port.NewTargetService(*flDriver, scsiTarget) targetDriver, err := scsi.NewTargetDriver(*flDriver, scsiTarget)
if err != nil { if err != nil {
glog.Error(err) glog.Error(err)
os.Exit(1) os.Exit(1)

View File

@@ -1,72 +0,0 @@
/*
Copyright 2016 The GoStor Authors All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package port
import "github.com/gostor/gotgt/pkg/api"
type SCSITargetDriver interface {
Init() error
Exit() error
CreateTarget(target *api.SCSITarget) error
DestroyTarget(target *api.SCSITarget) error
CreatePortal(name string) error
DestroyPortal(name string) error
CreateLu(lu *api.SCSILu) error
GetLu(lun uint8) (uint64, error)
CommandNotify(nid uint64, result int, cmd *api.SCSICommand) error
}
type fakeSCSITargetDriver struct {
api.SCSITargetDriverCommon
}
func (fake *fakeSCSITargetDriver) Init() error {
return nil
}
func (fake *fakeSCSITargetDriver) Exit() error {
return nil
}
func (fake *fakeSCSITargetDriver) CreateTarget(target *api.SCSITarget) error {
return nil
}
func (fake *fakeSCSITargetDriver) DestroyTarget(target *api.SCSITarget) error {
return nil
}
func (fake *fakeSCSITargetDriver) CreatePortal(name string) error {
return nil
}
func (fake *fakeSCSITargetDriver) DestroyPortal(name string) error {
return nil
}
func (fake *fakeSCSITargetDriver) CreateLu(lu *api.SCSILu) error {
return nil
}
func (fake *fakeSCSITargetDriver) GetLun(lun uint8) (uint64, error) {
return 0, nil
}
func (fake *fakeSCSITargetDriver) CommandNotify(nid uint64, result int, cmd *api.SCSICommand) error {
return nil
}

View File

@@ -18,7 +18,6 @@ package iscsit
import ( import (
"bytes" "bytes"
"errors"
"fmt" "fmt"
"net" "net"
"os" "os"
@@ -27,37 +26,36 @@ import (
"github.com/golang/glog" "github.com/golang/glog"
"github.com/gostor/gotgt/pkg/api" "github.com/gostor/gotgt/pkg/api"
"github.com/gostor/gotgt/pkg/config" "github.com/gostor/gotgt/pkg/config"
"github.com/gostor/gotgt/pkg/port"
"github.com/gostor/gotgt/pkg/scsi" "github.com/gostor/gotgt/pkg/scsi"
"github.com/gostor/gotgt/pkg/util" "github.com/gostor/gotgt/pkg/util"
"github.com/satori/go.uuid" "github.com/satori/go.uuid"
) )
type ISCSITargetService struct { type ISCSITargetDriver struct {
SCSI *scsi.SCSITargetService SCSI *scsi.SCSITargetService
Name string Name string
iSCSITargets map[string]*ISCSITarget iSCSITargets map[string]*ISCSITarget
} }
func init() { func init() {
port.RegisterTargetService("iscsi", NewISCSITargetService) scsi.RegisterTargetDriver("iscsi", NewISCSITargetDriver)
} }
func NewISCSITargetService(base *scsi.SCSITargetService) (port.SCSITargetService, error) { func NewISCSITargetDriver(base *scsi.SCSITargetService) (scsi.SCSITargetDriver, error) {
return &ISCSITargetService{ return &ISCSITargetDriver{
Name: "iscsi", Name: "iscsi",
iSCSITargets: map[string]*ISCSITarget{}, iSCSITargets: map[string]*ISCSITarget{},
SCSI: base, SCSI: base,
}, nil }, nil
} }
func (s *ISCSITargetService) NewTarget(tgtName string, configInfo *config.Config) (port.SCSITargetDriver, error) { func (s *ISCSITargetDriver) NewTarget(tgtName string, configInfo *config.Config) error {
if _, ok := s.iSCSITargets[tgtName]; ok { if _, ok := s.iSCSITargets[tgtName]; ok {
return nil, fmt.Errorf("target name has been existed") return fmt.Errorf("target name has been existed")
} }
stgt, err := s.SCSI.NewSCSITarget(len(s.iSCSITargets), "iscsi", tgtName) stgt, err := s.SCSI.NewSCSITarget(len(s.iSCSITargets), "iscsi", tgtName)
if err != nil { if err != nil {
return nil, err return err
} }
tgt := newISCSITarget(stgt) tgt := newISCSITarget(stgt)
s.iSCSITargets[tgtName] = tgt s.iSCSITargets[tgtName] = tgt
@@ -73,39 +71,35 @@ func (s *ISCSITargetService) NewTarget(tgtName string, configInfo *config.Config
s.AddiSCSIPortal(tgtName, uint16(tpgtNumber), portal.Portal) s.AddiSCSIPortal(tgtName, uint16(tpgtNumber), portal.Portal)
} }
} }
return tgt, nil return nil
} }
func (s *ISCSITargetService) AddiSCSIPortal(tgtName string, tpgt uint16, portal string) error { func (s *ISCSITargetDriver) AddiSCSIPortal(tgtName string, tpgt uint16, portal string) error {
var ( var (
ok bool ok bool
errMsg string
target *ISCSITarget target *ISCSITarget
tpgtInfo *iSCSITPGT tpgtInfo *iSCSITPGT
) )
if target, ok = s.iSCSITargets[tgtName]; !ok { if target, ok = s.iSCSITargets[tgtName]; !ok {
errMsg = fmt.Sprintf("no target %s", tgtName) return fmt.Errorf("no target %s", tgtName)
return errors.New(errMsg)
} }
if tpgtInfo, ok = target.TPGTs[tpgt]; !ok { if tpgtInfo, ok = target.TPGTs[tpgt]; !ok {
errMsg = fmt.Sprintf("no tpgt %d", tpgt) return fmt.Errorf("no tpgt %d", tpgt)
return errors.New(errMsg)
} }
tgtPortals := tpgtInfo.Portals tgtPortals := tpgtInfo.Portals
if _, ok = tgtPortals[portal]; !ok { if _, ok = tgtPortals[portal]; !ok {
tgtPortals[portal] = struct{}{} tgtPortals[portal] = struct{}{}
} else { } else {
errMsg := fmt.Sprintf("duplicate portal %s,in %s,%d", portal, tgtName, tpgt) return fmt.Errorf("duplicate portal %s,in %s,%d", portal, tgtName, tpgt)
return errors.New(errMsg)
} }
return nil return nil
} }
func (s *ISCSITargetService) HasPortal(tgtName string, tpgt uint16, portal string) bool { func (s *ISCSITargetDriver) HasPortal(tgtName string, tpgt uint16, portal string) bool {
var ( var (
ok bool ok bool
target *ISCSITarget target *ISCSITarget
@@ -127,7 +121,7 @@ func (s *ISCSITargetService) HasPortal(tgtName string, tpgt uint16, portal strin
} }
} }
func (s *ISCSITargetService) Run() error { func (s *ISCSITargetDriver) Run() error {
l, err := net.Listen("tcp", ":3260") l, err := net.Listen("tcp", ":3260")
if err != nil { if err != nil {
glog.Error(err) glog.Error(err)
@@ -155,7 +149,7 @@ func (s *ISCSITargetService) Run() error {
return nil return nil
} }
func (s *ISCSITargetService) handler(events byte, conn *iscsiConnection) { func (s *ISCSITargetDriver) handler(events byte, conn *iscsiConnection) {
if events&DATAIN != 0 { if events&DATAIN != 0 {
glog.V(1).Infof("rx handler processing...") glog.V(1).Infof("rx handler processing...")
@@ -171,7 +165,7 @@ func (s *ISCSITargetService) handler(events byte, conn *iscsiConnection) {
} }
} }
func (s *ISCSITargetService) rxHandler(conn *iscsiConnection) { func (s *ISCSITargetDriver) rxHandler(conn *iscsiConnection) {
var ( var (
hdigest uint = 0 hdigest uint = 0
ddigest uint = 0 ddigest uint = 0
@@ -293,7 +287,7 @@ func (s *ISCSITargetService) rxHandler(conn *iscsiConnection) {
} }
} }
func (s *ISCSITargetService) iscsiExecLogin(conn *iscsiConnection) error { func (s *ISCSITargetDriver) iscsiExecLogin(conn *iscsiConnection) error {
var ( var (
target *ISCSITarget target *ISCSITarget
cmd = conn.req cmd = conn.req
@@ -412,7 +406,7 @@ func iscsiExecLogout(conn *iscsiConnection) error {
return nil return nil
} }
func (s *ISCSITargetService) iscsiExecText(conn *iscsiConnection) error { func (s *ISCSITargetDriver) iscsiExecText(conn *iscsiConnection) error {
var result = []util.KeyValue{} var result = []util.KeyValue{}
cmd := conn.req cmd := conn.req
keys := util.ParseKVText(cmd.RawData) keys := util.ParseKVText(cmd.RawData)
@@ -505,7 +499,7 @@ func iscsiExecR2T(conn *iscsiConnection) error {
return nil return nil
} }
func (s *ISCSITargetService) txHandler(conn *iscsiConnection) { func (s *ISCSITargetDriver) txHandler(conn *iscsiConnection) {
var ( var (
hdigest uint = 0 hdigest uint = 0
ddigest uint = 0 ddigest uint = 0
@@ -592,7 +586,7 @@ func (s *ISCSITargetService) txHandler(conn *iscsiConnection) {
glog.Infof("%d", conn.state) glog.Infof("%d", conn.state)
} }
func (s *ISCSITargetService) scsiCommandHandler(conn *iscsiConnection) (err error) { func (s *ISCSITargetDriver) scsiCommandHandler(conn *iscsiConnection) (err error) {
req := conn.req req := conn.req
switch req.OpCode { switch req.OpCode {
case OpSCSICmd: case OpSCSICmd:
@@ -748,7 +742,7 @@ func (s *ISCSITargetService) scsiCommandHandler(conn *iscsiConnection) (err erro
return nil return nil
} }
func (s *ISCSITargetService) iscsiTaskQueueHandler(task *iscsiTask) error { func (s *ISCSITargetDriver) iscsiTaskQueueHandler(task *iscsiTask) error {
conn := task.conn conn := task.conn
sess := conn.session sess := conn.session
cmd := task.cmd cmd := task.cmd
@@ -794,7 +788,7 @@ func (s *ISCSITargetService) iscsiTaskQueueHandler(task *iscsiTask) error {
return nil return nil
} }
func (s *ISCSITargetService) iscsiExecTask(task *iscsiTask) error { func (s *ISCSITargetDriver) iscsiExecTask(task *iscsiTask) error {
cmd := task.cmd cmd := task.cmd
switch cmd.OpCode { switch cmd.OpCode {
case OpSCSICmd, OpSCSIOut: case OpSCSICmd, OpSCSIOut:

View File

@@ -18,7 +18,6 @@ limitations under the License.
package iscsit package iscsit
import ( import (
"errors"
"fmt" "fmt"
"strings" "strings"
@@ -114,8 +113,7 @@ func (tgt *ISCSITarget) FindTPG(portal string) (uint16, error) {
} }
} }
} }
errMsg := fmt.Sprintf("No TPGT found with IP(%s)", portal) return 0, fmt.Errorf("No TPGT found with IP(%s)", portal)
return 0, errors.New(errMsg)
} }
func newISCSITarget(target *api.SCSITarget) *ISCSITarget { func newISCSITarget(target *api.SCSITarget) *ISCSITarget {

View File

@@ -218,7 +218,7 @@ type iscsiPdu struct {
} }
// New creates a new session. // New creates a new session.
func (s *ISCSITargetService) NewISCSISession(conn *iscsiConnection, isid uint64) (*ISCSISession, error) { func (s *ISCSITargetDriver) NewISCSISession(conn *iscsiConnection, isid uint64) (*ISCSISession, error) {
var ( var (
target *ISCSITarget target *ISCSITarget
tsih uint64 tsih uint64

View File

@@ -1,48 +0,0 @@
/*
Copyright 2015 The GoStor Authors All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package port
import (
"fmt"
"github.com/gostor/gotgt/pkg/config"
"github.com/gostor/gotgt/pkg/scsi"
)
type SCSITargetService interface {
Run() error
NewTarget(string, *config.Config) (SCSITargetDriver, error)
}
type TargetServiceFunc func(*scsi.SCSITargetService) (SCSITargetService, error)
var registeredPlugins = map[string](TargetServiceFunc){}
func RegisterTargetService(name string, f TargetServiceFunc) {
registeredPlugins[name] = f
}
func NewTargetService(targetDriverName string, s *scsi.SCSITargetService) (SCSITargetService, error) {
if targetDriverName == "" {
return nil, nil
}
targetInitFunc, ok := registeredPlugins[targetDriverName]
if !ok {
return nil, fmt.Errorf("SCSI target driver %s is not found.", targetDriverName)
}
return targetInitFunc(s)
}

View File

@@ -30,17 +30,17 @@ type BaseBackingStore struct {
type BackingStoreFunc func() (api.BackingStore, error) type BackingStoreFunc func() (api.BackingStore, error)
var registeredPlugins = map[string](BackingStoreFunc){} var registeredBSPlugins = map[string](BackingStoreFunc){}
func RegisterBackingStore(name string, f BackingStoreFunc) { func RegisterBackingStore(name string, f BackingStoreFunc) {
registeredPlugins[name] = f registeredBSPlugins[name] = f
} }
func NewBackingStore(name string) (api.BackingStore, error) { func NewBackingStore(name string) (api.BackingStore, error) {
if name == "" { if name == "" {
return nil, nil return nil, nil
} }
f, ok := registeredPlugins[name] f, ok := registeredBSPlugins[name]
if !ok { if !ok {
return nil, fmt.Errorf("BackingStore %s is not found.", name) return nil, fmt.Errorf("BackingStore %s is not found.", name)
} }

View File

@@ -1,5 +1,5 @@
/* /*
Copyright 2015 The GoStor Authors All rights reserved. Copyright 2016 The GoStor Authors All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
@@ -16,3 +16,33 @@ limitations under the License.
// Target Driver Interface // Target Driver Interface
package scsi package scsi
import (
"fmt"
"github.com/gostor/gotgt/pkg/config"
)
type SCSITargetDriver interface {
Run() error
NewTarget(string, *config.Config) error
}
type TargetDriverFunc func(*SCSITargetService) (SCSITargetDriver, error)
var registeredPlugins = map[string](TargetDriverFunc){}
func RegisterTargetDriver(name string, f TargetDriverFunc) {
registeredPlugins[name] = f
}
func NewTargetDriver(tgtDriver string, s *SCSITargetService) (SCSITargetDriver, error) {
if tgtDriver == "" {
return nil, nil
}
targetInitFunc, ok := registeredPlugins[tgtDriver]
if !ok {
return nil, fmt.Errorf("SCSI target driver %s is not found.", tgtDriver)
}
return targetInitFunc(s)
}