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/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)

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 (
"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:

View File

@@ -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 {

View File

@@ -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

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)
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)
}

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");
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)
}