init target and luns from config file

This commit is contained in:
Lei Xue
2016-10-01 20:59:30 +08:00
parent 80ff4930e8
commit 3512ab66f5
15 changed files with 1351 additions and 17 deletions

View File

@@ -22,6 +22,7 @@ import (
"net"
"os"
"runtime/debug"
"strings"
"github.com/golang/glog"
"github.com/gostor/gotgt/pkg/api"
@@ -34,6 +35,7 @@ type ISCSITargetService struct {
SCSI *scsi.SCSITargetService
Name string
Targets map[string]*ISCSITarget
Portals map[string]struct{}
}
func init() {
@@ -44,15 +46,16 @@ func NewISCSITargetService(base *scsi.SCSITargetService) (port.SCSITargetService
return &ISCSITargetService{
Name: "iscsi",
Targets: map[string]*ISCSITarget{},
Portals: map[string]struct{}{},
SCSI: base,
}, nil
}
func (s *ISCSITargetService) NewTarget(target string) (port.SCSITargetDriver, error) {
func (s *ISCSITargetService) NewTarget(target string, luns []string) (port.SCSITargetDriver, error) {
if _, ok := s.Targets[target]; ok {
return nil, fmt.Errorf("target name has been existed")
}
stgt, err := s.SCSI.NewSCSITarget(len(s.Targets), "iscsi", target)
stgt, err := s.SCSI.NewSCSITarget(len(s.Targets), "iscsi", target, luns)
if err != nil {
return nil, err
}
@@ -62,6 +65,24 @@ func (s *ISCSITargetService) NewTarget(target string) (port.SCSITargetDriver, er
return tgt, nil
}
func (s *ISCSITargetService) AddNewPortal(portals []string) error {
for _, p := range portals {
if !strings.Contains(p, ":") {
p = p + ":3260"
}
s.Portals[p] = struct{}{}
}
return nil
}
func (s *ISCSITargetService) HasPortal(portal string) bool {
if len(s.Portals) == 0 {
return true
}
_, ok := s.Portals[portal]
return ok
}
func (s *ISCSITargetService) Run() error {
l, err := net.Listen("tcp", ":3260")
if err != nil {
@@ -75,6 +96,11 @@ func (s *ISCSITargetService) Run() error {
conn, err := l.Accept()
if err != nil {
glog.Error(err)
continue
}
if !s.HasPortal(conn.LocalAddr().String()) {
glog.Errorf("unexpected portal")
continue
}
glog.Info("Accepting ...")
iscsiConn := &iscsiConnection{conn: conn}

View File

@@ -24,7 +24,8 @@ import (
type SCSITargetService interface {
Run() error
NewTarget(string) (SCSITargetDriver, error)
NewTarget(string, []string) (SCSITargetDriver, error)
AddNewPortal([]string) error
}
type TargetServiceFunc func(*scsi.SCSITargetService) (SCSITargetService, error)