From ed47ac5ea020224f982edcbbcf06f552be5f0a75 Mon Sep 17 00:00:00 2001 From: Lei Xue Date: Sun, 27 Nov 2016 17:02:17 +0800 Subject: [PATCH] move port interface to scsi package --- citd.go | 3 +- pkg/port/interfaces.go | 72 -------------------------------------- pkg/port/iscsit/iscsid.go | 50 ++++++++++++-------------- pkg/port/iscsit/iscsit.go | 4 +-- pkg/port/iscsit/session.go | 2 +- pkg/port/service.go | 48 ------------------------- pkg/scsi/backingstore.go | 6 ++-- pkg/scsi/drivers.go | 32 ++++++++++++++++- 8 files changed, 59 insertions(+), 158 deletions(-) delete mode 100644 pkg/port/interfaces.go delete mode 100644 pkg/port/service.go diff --git a/citd.go b/citd.go index 883c36f..730f9de 100644 --- a/citd.go +++ b/citd.go @@ -29,7 +29,6 @@ import ( "github.com/golang/glog" "github.com/gostor/gotgt/pkg/apiserver" "github.com/gostor/gotgt/pkg/config" - "github.com/gostor/gotgt/pkg/port" _ "github.com/gostor/gotgt/pkg/port/iscsit" "github.com/gostor/gotgt/pkg/scsi" _ "github.com/gostor/gotgt/pkg/scsi/backingstore" @@ -70,7 +69,7 @@ Help Options: } scsiTarget := scsi.NewSCSITargetService() - targetDriver, err := port.NewTargetService(*flDriver, scsiTarget) + targetDriver, err := scsi.NewTargetDriver(*flDriver, scsiTarget) if err != nil { glog.Error(err) os.Exit(1) diff --git a/pkg/port/interfaces.go b/pkg/port/interfaces.go deleted file mode 100644 index 777c77d..0000000 --- a/pkg/port/interfaces.go +++ /dev/null @@ -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 -} diff --git a/pkg/port/iscsit/iscsid.go b/pkg/port/iscsit/iscsid.go index f0081f8..3c156df 100644 --- a/pkg/port/iscsit/iscsid.go +++ b/pkg/port/iscsit/iscsid.go @@ -18,7 +18,6 @@ package iscsit import ( "bytes" - "errors" "fmt" "net" "os" @@ -27,37 +26,36 @@ import ( "github.com/golang/glog" "github.com/gostor/gotgt/pkg/api" "github.com/gostor/gotgt/pkg/config" - "github.com/gostor/gotgt/pkg/port" "github.com/gostor/gotgt/pkg/scsi" "github.com/gostor/gotgt/pkg/util" "github.com/satori/go.uuid" ) -type ISCSITargetService struct { +type ISCSITargetDriver struct { SCSI *scsi.SCSITargetService Name string iSCSITargets map[string]*ISCSITarget } func init() { - port.RegisterTargetService("iscsi", NewISCSITargetService) + scsi.RegisterTargetDriver("iscsi", NewISCSITargetDriver) } -func NewISCSITargetService(base *scsi.SCSITargetService) (port.SCSITargetService, error) { - return &ISCSITargetService{ +func NewISCSITargetDriver(base *scsi.SCSITargetService) (scsi.SCSITargetDriver, error) { + return &ISCSITargetDriver{ Name: "iscsi", iSCSITargets: map[string]*ISCSITarget{}, SCSI: base, }, 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 { - 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) if err != nil { - return nil, err + return err } tgt := newISCSITarget(stgt) s.iSCSITargets[tgtName] = tgt @@ -73,39 +71,35 @@ func (s *ISCSITargetService) NewTarget(tgtName string, configInfo *config.Config 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 ( ok bool - errMsg string target *ISCSITarget tpgtInfo *iSCSITPGT ) if target, ok = s.iSCSITargets[tgtName]; !ok { - errMsg = fmt.Sprintf("no target %s", tgtName) - return errors.New(errMsg) + return fmt.Errorf("no target %s", tgtName) } if tpgtInfo, ok = target.TPGTs[tpgt]; !ok { - errMsg = fmt.Sprintf("no tpgt %d", tpgt) - return errors.New(errMsg) + return fmt.Errorf("no tpgt %d", tpgt) } tgtPortals := tpgtInfo.Portals if _, ok = tgtPortals[portal]; !ok { tgtPortals[portal] = struct{}{} } else { - errMsg := fmt.Sprintf("duplicate portal %s,in %s,%d", portal, tgtName, tpgt) - return errors.New(errMsg) + return fmt.Errorf("duplicate portal %s,in %s,%d", portal, tgtName, tpgt) } 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 ( ok bool 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") if err != nil { glog.Error(err) @@ -155,7 +149,7 @@ func (s *ISCSITargetService) Run() error { return nil } -func (s *ISCSITargetService) handler(events byte, conn *iscsiConnection) { +func (s *ISCSITargetDriver) handler(events byte, conn *iscsiConnection) { if events&DATAIN != 0 { 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 ( hdigest 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 ( target *ISCSITarget cmd = conn.req @@ -412,7 +406,7 @@ func iscsiExecLogout(conn *iscsiConnection) error { return nil } -func (s *ISCSITargetService) iscsiExecText(conn *iscsiConnection) error { +func (s *ISCSITargetDriver) iscsiExecText(conn *iscsiConnection) error { var result = []util.KeyValue{} cmd := conn.req keys := util.ParseKVText(cmd.RawData) @@ -505,7 +499,7 @@ func iscsiExecR2T(conn *iscsiConnection) error { return nil } -func (s *ISCSITargetService) txHandler(conn *iscsiConnection) { +func (s *ISCSITargetDriver) txHandler(conn *iscsiConnection) { var ( hdigest uint = 0 ddigest uint = 0 @@ -592,7 +586,7 @@ func (s *ISCSITargetService) txHandler(conn *iscsiConnection) { glog.Infof("%d", conn.state) } -func (s *ISCSITargetService) scsiCommandHandler(conn *iscsiConnection) (err error) { +func (s *ISCSITargetDriver) scsiCommandHandler(conn *iscsiConnection) (err error) { req := conn.req switch req.OpCode { case OpSCSICmd: @@ -748,7 +742,7 @@ func (s *ISCSITargetService) scsiCommandHandler(conn *iscsiConnection) (err erro return nil } -func (s *ISCSITargetService) iscsiTaskQueueHandler(task *iscsiTask) error { +func (s *ISCSITargetDriver) iscsiTaskQueueHandler(task *iscsiTask) error { conn := task.conn sess := conn.session cmd := task.cmd @@ -794,7 +788,7 @@ func (s *ISCSITargetService) iscsiTaskQueueHandler(task *iscsiTask) error { return nil } -func (s *ISCSITargetService) iscsiExecTask(task *iscsiTask) error { +func (s *ISCSITargetDriver) iscsiExecTask(task *iscsiTask) error { cmd := task.cmd switch cmd.OpCode { case OpSCSICmd, OpSCSIOut: diff --git a/pkg/port/iscsit/iscsit.go b/pkg/port/iscsit/iscsit.go index 8bfb131..de18b35 100644 --- a/pkg/port/iscsit/iscsit.go +++ b/pkg/port/iscsit/iscsit.go @@ -18,7 +18,6 @@ limitations under the License. package iscsit import ( - "errors" "fmt" "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, errors.New(errMsg) + return 0, fmt.Errorf("No TPGT found with IP(%s)", portal) } func newISCSITarget(target *api.SCSITarget) *ISCSITarget { diff --git a/pkg/port/iscsit/session.go b/pkg/port/iscsit/session.go index 8cc2cf2..88a2872 100644 --- a/pkg/port/iscsit/session.go +++ b/pkg/port/iscsit/session.go @@ -218,7 +218,7 @@ type iscsiPdu struct { } // 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 ( target *ISCSITarget tsih uint64 diff --git a/pkg/port/service.go b/pkg/port/service.go deleted file mode 100644 index c1db9ba..0000000 --- a/pkg/port/service.go +++ /dev/null @@ -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) -} diff --git a/pkg/scsi/backingstore.go b/pkg/scsi/backingstore.go index bdc0f11..4286699 100644 --- a/pkg/scsi/backingstore.go +++ b/pkg/scsi/backingstore.go @@ -30,17 +30,17 @@ type BaseBackingStore struct { type BackingStoreFunc func() (api.BackingStore, error) -var registeredPlugins = map[string](BackingStoreFunc){} +var registeredBSPlugins = map[string](BackingStoreFunc){} func RegisterBackingStore(name string, f BackingStoreFunc) { - registeredPlugins[name] = f + registeredBSPlugins[name] = f } func NewBackingStore(name string) (api.BackingStore, error) { if name == "" { return nil, nil } - f, ok := registeredPlugins[name] + f, ok := registeredBSPlugins[name] if !ok { return nil, fmt.Errorf("BackingStore %s is not found.", name) } diff --git a/pkg/scsi/drivers.go b/pkg/scsi/drivers.go index fc5ce9a..5517ad1 100644 --- a/pkg/scsi/drivers.go +++ b/pkg/scsi/drivers.go @@ -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"); you may not use this file except in compliance with the License. @@ -16,3 +16,33 @@ limitations under the License. // Target Driver Interface 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) +}