diff --git a/Dockerfile.dapper b/Dockerfile.dapper index b446888f..64b4a989 100644 --- a/Dockerfile.dapper +++ b/Dockerfile.dapper @@ -33,7 +33,7 @@ RUN curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/i # Build SPDK ENV SPDK_DIR /usr/src/spdk -ENV SPDK_COMMIT_ID 7a25c3c5a102dfb2d8715f9bf090691176de5ef7 +ENV SPDK_COMMIT_ID 7a6125fda83e0b8ad0ca22d99f6f3b0e96302691 RUN git clone https://github.com/longhorn/spdk.git ${SPDK_DIR} --recursive && \ cd ${SPDK_DIR} && \ git checkout ${SPDK_COMMIT_ID} && \ diff --git a/app/cmd/basic/bdev_nvme.go b/app/cmd/basic/bdev_nvme.go index ccd29fe3..a5df0b8d 100644 --- a/app/cmd/basic/bdev_nvme.go +++ b/app/cmd/basic/bdev_nvme.go @@ -37,9 +37,8 @@ func BdevNvmeAttachControllerCmd() cli.Command { Required: true, }, cli.StringFlag{ - Name: "subnqn", - Usage: "NVMe-oF target subnqn. It can be the nvmf subsystem nqn", - Required: true, + Name: "subnqn", + Usage: "NVMe-oF target subnqn. It can be the nvmf subsystem nqn", }, cli.StringFlag{ Name: "traddr", @@ -47,9 +46,8 @@ func BdevNvmeAttachControllerCmd() cli.Command { Required: true, }, cli.StringFlag{ - Name: "trsvcid", - Usage: "NVMe-oF target trsvcid: a port number", - Required: true, + Name: "trsvcid", + Usage: "NVMe-oF target trsvcid: a port number", }, cli.StringFlag{ Name: "trtype", diff --git a/app/cmd/basic/bdev_virtio.go b/app/cmd/basic/bdev_virtio.go new file mode 100644 index 00000000..8568b7f8 --- /dev/null +++ b/app/cmd/basic/bdev_virtio.go @@ -0,0 +1,94 @@ +package basic + +import ( + "context" + + "github.com/sirupsen/logrus" + "github.com/urfave/cli" + + "github.com/longhorn/go-spdk-helper/pkg/spdk/client" + "github.com/longhorn/go-spdk-helper/pkg/util" +) + +func BdevVirtioCmd() cli.Command { + return cli.Command{ + Name: "bdev-virtio", + ShortName: "virtio", + Subcommands: []cli.Command{ + BdevVirtioAttachControllerCmd(), + BdevVirtioDetachControllerCmd(), + // BdevVirtioGetCmd(), + }, + } +} + +func BdevVirtioAttachControllerCmd() cli.Command { + return cli.Command{ + Name: "attach", + Usage: "attach a bdev virtio based on a block device: attach --name --trtype --traddr --dev-type ", + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "trtype", + Usage: "Virtio target trtype: pci or user", + Required: true, + }, + cli.StringFlag{ + Name: "traddr", + Usage: "Target address: BDF or UNIX socket file path", + Required: true, + }, + cli.StringFlag{ + Name: "dev-type", + Usage: "Virtio device type: blk or scsi", + Required: true, + }, + }, + Action: func(c *cli.Context) { + if err := bdevVirtioAttachController(c); err != nil { + logrus.WithError(err).Fatalf("Failed to run attach bdev virtio command") + } + }, + } +} + +func bdevVirtioAttachController(c *cli.Context) error { + spdkCli, err := client.NewClient(context.Background()) + if err != nil { + return err + } + + name := c.Args().First() + + bdevNameList, err := spdkCli.BdevVirtioAttachController(name, c.String("trtype"), c.String("traddr"), c.String("dev-type")) + if err != nil { + return err + } + + return util.PrintObject(bdevNameList) +} + +func BdevVirtioDetachControllerCmd() cli.Command { + return cli.Command{ + Name: "detach", + Usage: "detach a bdev virtio using a block device: detach ", + Action: func(c *cli.Context) { + if err := bdevVirtioDetachControllerCmd(c); err != nil { + logrus.WithError(err).Fatalf("Failed to run detach bdev virtio command") + } + }, + } +} + +func bdevVirtioDetachControllerCmd(c *cli.Context) error { + spdkCli, err := client.NewClient(context.Background()) + if err != nil { + return err + } + + detached, err := spdkCli.BdevVirtioDetachController(c.Args().First()) + if err != nil { + return err + } + + return util.PrintObject(detached) +} diff --git a/app/cmd/nvmecli/nvmecli.go b/app/cmd/nvmecli/nvmecli.go index 346cfc40..5adb9589 100644 --- a/app/cmd/nvmecli/nvmecli.go +++ b/app/cmd/nvmecli/nvmecli.go @@ -60,7 +60,7 @@ func DiscoverCmd() cli.Command { } func discover(c *cli.Context) error { - executor, err := util.NewExecutor(c.String("host-proc")) + executor, err := util.NewExecutor(c.GlobalString("host-proc")) if err != nil { return err } diff --git a/app/cmd/spdksetup/spdksetup.go b/app/cmd/spdksetup/spdksetup.go new file mode 100644 index 00000000..85d10ff9 --- /dev/null +++ b/app/cmd/spdksetup/spdksetup.go @@ -0,0 +1,150 @@ +package spdksetup + +import ( + "fmt" + + "github.com/sirupsen/logrus" + "github.com/urfave/cli" + + commonTypes "github.com/longhorn/go-common-libs/types" + spdksetup "github.com/longhorn/go-spdk-helper/pkg/spdk/setup" + "github.com/longhorn/go-spdk-helper/pkg/util" +) + +func Cmd() cli.Command { + return cli.Command{ + Name: "spdk-setup", + ShortName: "setup", + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "host-proc", + Usage: fmt.Sprintf("The host proc path of namespace executor. By default %v", commonTypes.ProcDirectory), + Value: commonTypes.ProcDirectory, + }, + }, + Subcommands: []cli.Command{ + BindCmd(), + UnbindCmd(), + DiskDriverCmd(), + DiskStatusCmd(), + }, + } +} + +func BindCmd() cli.Command { + return cli.Command{ + Name: "bind", + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "device-driver", + Usage: "The userspace I/O driver to bind to", + Required: true, + }, + }, + Usage: "Bind the device to the specified userspace I/O driver: bind --device-driver ", + Action: func(c *cli.Context) { + if err := bind(c); err != nil { + logrus.WithError(err).Fatalf("Failed to bind device %v to driver %v", c.Args().First(), c.String("device-driver")) + } + }, + } +} + +func bind(c *cli.Context) error { + executor, err := util.NewExecutor(c.GlobalString("host-proc")) + if err != nil { + return err + } + + deviceAddr := c.Args().First() + + _, err = spdksetup.Bind(deviceAddr, c.String("device-driver"), executor) + return err +} + +func UnbindCmd() cli.Command { + return cli.Command{ + Name: "unbind", + Flags: []cli.Flag{}, + Usage: "Unbind the device from the userspace I/O driver: unbind ", + Action: func(c *cli.Context) { + if err := unbind(c); err != nil { + logrus.WithError(err).Fatalf("Failed to unbind device %v", c.Args().First()) + } + }, + } +} + +func unbind(c *cli.Context) error { + executor, err := util.NewExecutor(c.GlobalString("host-proc")) + if err != nil { + return err + } + + deviceAddr := c.Args().First() + + _, err = spdksetup.Unbind(deviceAddr, executor) + return err +} + +func DiskDriverCmd() cli.Command { + return cli.Command{ + Name: "disk-driver", + Flags: []cli.Flag{}, + Usage: "Get the driver name associated with a given PCI device's BDF address: disk-driver ", + Action: func(c *cli.Context) { + if err := diskDriverCmd(c); err != nil { + logrus.WithError(err).Fatalf("Failed to get disk driver of device %v", c.Args().First()) + } + }, + } +} + +func diskDriverCmd(c *cli.Context) error { + executor, err := util.NewExecutor(c.GlobalString("host-proc")) + if err != nil { + return err + } + + deviceAddr := c.Args().First() + + output, err := spdksetup.GetDiskDriver(deviceAddr, executor) + if err != nil { + return err + } + + fmt.Println(output) + + return nil +} + +func DiskStatusCmd() cli.Command { + return cli.Command{ + Name: "disk-status", + Flags: []cli.Flag{}, + Usage: "Get the disk status of the device: disk-status ", + Action: func(c *cli.Context) { + if err := diskStatusCmd(c); err != nil { + logrus.WithError(err).Fatalf("Failed to get disk status of device %v", c.Args().First()) + } + }, + } +} + +func diskStatusCmd(c *cli.Context) error { + executor, err := util.NewExecutor(c.GlobalString("host-proc")) + if err != nil { + return err + } + + deviceAddr := c.Args().First() + + output, err := spdksetup.GetDiskStatus(deviceAddr, executor) + if err != nil { + return err + } + + fmt.Println(output) + + return nil +} diff --git a/go.mod b/go.mod index 72cf210e..95a5b595 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,6 @@ require ( github.com/rogpeppe/go-internal v1.10.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/shirou/gopsutil/v3 v3.24.2 // indirect - github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect k8s.io/klog/v2 v2.110.1 // indirect k8s.io/mount-utils v0.29.3 // indirect diff --git a/go.sum b/go.sum index 3fce3efc..54b6b4ae 100644 --- a/go.sum +++ b/go.sum @@ -1,9 +1,6 @@ -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/c9s/goprocinfo v0.0.0-20210130143923-c95fcf8c64a8 h1:SjZ2GvvOononHOpK84APFuMvxqsk3tEIaKH/z4Rpu3g= github.com/c9s/goprocinfo v0.0.0-20210130143923-c95fcf8c64a8/go.mod h1:uEyr4WpAH4hio6LFriaPkL938XnrvLpNPmQHBdrmbIE= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -17,27 +14,15 @@ github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiU github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/longhorn/go-common-libs v0.0.0-20240219094750-e7176c332156 h1:Jv1+UlfrzSodyIobaioQn8Vh4RQ+23FpN2Q60iFdqCU= -github.com/longhorn/go-common-libs v0.0.0-20240219094750-e7176c332156/go.mod h1:nIECQARppamt2zwFSdzADRTVKo/7izFwWIS3VWi7D/s= -github.com/longhorn/go-common-libs v0.0.0-20240306152159-2ef7d0100fd1 h1:QV/hEZ2zxmUlxS1ssNBn7Sy7dRQl+D8c0tZAgwYTNMk= -github.com/longhorn/go-common-libs v0.0.0-20240306152159-2ef7d0100fd1/go.mod h1:ePLGb2r/PJBUIVoVhLOt4bLOeu0S72ZB+fWDWwC8H28= -github.com/longhorn/go-common-libs v0.0.0-20240307063052-6e77996eda29 h1:tyzIDCMjQGQzhqAtdJaeEMAaNUZJD/sHERXp+tYc+ms= -github.com/longhorn/go-common-libs v0.0.0-20240307063052-6e77996eda29/go.mod h1:ePLGb2r/PJBUIVoVhLOt4bLOeu0S72ZB+fWDWwC8H28= -github.com/longhorn/go-common-libs v0.0.0-20240315062830-5aa0ac1dac62 h1:ovotrq4HvaSRFgLozlNyUAvJp2eykdOwfpz4VIYZGIY= -github.com/longhorn/go-common-libs v0.0.0-20240315062830-5aa0ac1dac62/go.mod h1:ePLGb2r/PJBUIVoVhLOt4bLOeu0S72ZB+fWDWwC8H28= github.com/longhorn/go-common-libs v0.0.0-20240319112414-b75404dc7fbc h1:Eh9Npc5yBcVD8E4zVQIGUtC62HcfqevrHjQ2kh7fJ/E= github.com/longhorn/go-common-libs v0.0.0-20240319112414-b75404dc7fbc/go.mod h1:ESTw7LYBF+dB5VndQNKXKrD6B9s/hF94lotGKXLovlM= github.com/longhorn/nsfilelock v0.0.0-20200723175406-fa7c83ad0003 h1:Jw9uANsGcHTxp6HcC++/vN17LfeuDmozHI2j6DoZf5E= @@ -57,18 +42,12 @@ github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:Om github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/shirou/gopsutil/v3 v3.23.7 h1:C+fHO8hfIppoJ1WdsVm1RoI0RwXoNdfTK7yWXV0wVj4= -github.com/shirou/gopsutil/v3 v3.23.7/go.mod h1:c4gnmoRC0hQuaLqvxnx1//VXQ0Ms/X9UnJF8pddY5z4= github.com/shirou/gopsutil/v3 v3.24.2 h1:kcR0erMbLg5/3LcInpw0X/rrPSqq4CDPyI6A6ZRC18Y= github.com/shirou/gopsutil/v3 v3.24.2/go.mod h1:tSg/594BcA+8UdQU2XcW803GWYgdtauFFPgJCJKZlVk= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= -github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -79,29 +58,18 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= -github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= -github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.14 h1:ebbhrRiGK2i4naQJr+1Xj92HXZCrK7MsyTS/ob3HnAk= github.com/urfave/cli v1.22.14/go.mod h1:X0eDS6pD6Exaclxm99NJ3FiCDRED7vIHpx2mDOHLvkA= -github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= -github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= @@ -109,15 +77,12 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= k8s.io/klog/v2 v2.110.1 h1:U/Af64HJf7FcwMcXyKm2RPM22WZzyR7OSpYj5tg3cL0= k8s.io/klog/v2 v2.110.1/go.mod h1:YGtd1984u+GgbuZ7e08/yBuAfKLSO0+uR1Fhi6ExXjo= -k8s.io/mount-utils v0.29.2 h1:FrUfgvOo63nqJRPXKoqN/DW1lMnR/y0pzpFErKh6p2o= -k8s.io/mount-utils v0.29.2/go.mod h1:9IWJTMe8tG0MYMLEp60xK9GYVeCdA3g4LowmnVi+t9Y= k8s.io/mount-utils v0.29.3 h1:iEcqPP7Vv8UClH8nnMfovtmy/04fIloRW9JuSXykoZ0= k8s.io/mount-utils v0.29.3/go.mod h1:9IWJTMe8tG0MYMLEp60xK9GYVeCdA3g4LowmnVi+t9Y= k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= diff --git a/main.go b/main.go index 20663d53..7cfe5d6e 100644 --- a/main.go +++ b/main.go @@ -3,14 +3,14 @@ package main import ( "os" - "github.com/longhorn/go-spdk-helper/app/cmd/spdktgt" - "github.com/sirupsen/logrus" "github.com/urfave/cli" "github.com/longhorn/go-spdk-helper/app/cmd/advanced" "github.com/longhorn/go-spdk-helper/app/cmd/basic" "github.com/longhorn/go-spdk-helper/app/cmd/nvmecli" + "github.com/longhorn/go-spdk-helper/app/cmd/spdksetup" + "github.com/longhorn/go-spdk-helper/app/cmd/spdktgt" ) func main() { @@ -30,6 +30,7 @@ func main() { a.Commands = []cli.Command{ basic.BdevCmd(), basic.BdevAioCmd(), + basic.BdevVirtioCmd(), basic.BdevLvstoreCmd(), basic.BdevLvolCmd(), basic.BdevNvmeCmd(), @@ -43,6 +44,7 @@ func main() { nvmecli.Cmd(), spdktgt.Cmd(), + spdksetup.Cmd(), } if err := a.Run(os.Args); err != nil { logrus.WithError(err).Fatal("Failed to execute command") diff --git a/pkg/spdk/client/basic.go b/pkg/spdk/client/basic.go index 038162f1..6b4ee962 100644 --- a/pkg/spdk/client/basic.go +++ b/pkg/spdk/client/basic.go @@ -4,6 +4,8 @@ import ( "encoding/json" "strings" + "github.com/pkg/errors" + spdktypes "github.com/longhorn/go-spdk-helper/pkg/spdk/types" ) @@ -1045,3 +1047,50 @@ func (c *Client) LogGetPrintLevel() (string, error) { return strings.Trim(string(level), "\"\n"), nil } + +// BdevVirtioAttachController creates new initiator Virtio SCSI or Virtio Block and expose all found bdevs. +// +// "name": Required. Use this name as base for new created bdevs. +// +// "trtype": Required. Transport type, "user" or "pci". +// +// "traddr": Required. Transport type specific target address: e.g. UNIX domain socket path or BDF. +// +// "devType": Required. Device type, "scsi" or "blk". +func (c *Client) BdevVirtioAttachController(name, trtype, traddr, devType string) ([]string, error) { + req := spdktypes.BdevVirtioAttachControllerRequest{ + Name: name, + Trtype: trtype, + Traddr: traddr, + DevType: devType, + } + + cmdOutput, err := c.jsonCli.SendCommand("bdev_virtio_attach_controller", req) + if err != nil { + return nil, err + } + + var disks []string + err = json.Unmarshal([]byte(cmdOutput), &disks) + if err != nil { + return nil, errors.Wrapf(err, "failed to unmarshal disks: %s", cmdOutput) + } + + return disks, nil +} + +// BdevVirtioDetachController removes a Virtio device. +// +// "name": Required. Use this name as base for new created bdevs. +func (c *Client) BdevVirtioDetachController(name string) (deleted bool, err error) { + req := spdktypes.BdevVirtioDetachControllerRequest{ + Name: name, + } + + cmdOutput, err := c.jsonCli.SendCommand("bdev_virtio_detach_controller", req) + if err != nil { + return false, err + } + + return deleted, json.Unmarshal(cmdOutput, &deleted) +} diff --git a/pkg/spdk/setup/setup.go b/pkg/spdk/setup/setup.go new file mode 100644 index 00000000..e22c55c1 --- /dev/null +++ b/pkg/spdk/setup/setup.go @@ -0,0 +1,104 @@ +package setup + +import ( + "fmt" + "strings" + + commonNs "github.com/longhorn/go-common-libs/ns" + + "github.com/longhorn/go-spdk-helper/pkg/types" +) + +const ( + spdkSetupPath = "/usr/src/spdk/scripts/setup.sh" +) + +func Bind(deviceAddr, deviceDriver string, executor *commonNs.Executor) (string, error) { + if deviceAddr == "" { + return "", fmt.Errorf("device address is empty") + } + + envs := []string{ + fmt.Sprintf("%s=%s", "PCI_ALLOWED", deviceAddr), + fmt.Sprintf("%s=%s", "DRIVER_OVERRIDE", deviceDriver), + } + + cmdArgs := []string{ + spdkSetupPath, + "bind", + } + + outputStr, err := executor.Execute(envs, "bash", cmdArgs, types.ExecuteTimeout) + if err != nil { + return "", err + } + + return outputStr, nil +} + +func Unbind(deviceAddr string, executor *commonNs.Executor) (string, error) { + if deviceAddr == "" { + return "", fmt.Errorf("device address is empty") + } + + cmdArgs := []string{ + spdkSetupPath, + "unbind", + deviceAddr, + } + + outputStr, err := executor.Execute(nil, "bash", cmdArgs, types.ExecuteTimeout) + if err != nil { + return "", err + } + + return outputStr, nil +} + +func GetDiskDriver(deviceAddr string, executor *commonNs.Executor) (string, error) { + if deviceAddr == "" { + return "", fmt.Errorf("device address is empty") + } + + cmdArgs := []string{ + spdkSetupPath, + "disk-driver", + deviceAddr, + } + + outputStr, err := executor.Execute(nil, "bash", cmdArgs, types.ExecuteTimeout) + if err != nil { + return "", err + } + + return extractJSON(outputStr) +} + +func GetDiskStatus(deviceAddr string, executor *commonNs.Executor) (string, error) { + if deviceAddr == "" { + return "", fmt.Errorf("device address is empty") + } + + cmdArgs := []string{ + spdkSetupPath, + "disk-status", + deviceAddr, + } + + outputStr, err := executor.Execute(nil, "bash", cmdArgs, types.ExecuteTimeout) + if err != nil { + return "", err + } + + return extractJSON(outputStr) +} + +func extractJSON(outputStr string) (string, error) { + // Find the first '{' and last '}' characters, assuming valid JSON format + start := strings.Index(outputStr, "{") + end := strings.LastIndex(outputStr, "}") + if start != -1 && end != -1 { + return outputStr[start : end+1], nil + } + return "", fmt.Errorf("failed to extract JSON from output: %s", outputStr) +} diff --git a/pkg/spdk/types/aio.go b/pkg/spdk/types/aio.go index 015ade31..404e305c 100644 --- a/pkg/spdk/types/aio.go +++ b/pkg/spdk/types/aio.go @@ -15,7 +15,7 @@ type BdevAioDriverSpecificInfo struct { type BdevAioCreateRequest struct { Name string `json:"name"` Filename string `json:"filename"` - BlockSize uint64 `json:"block_size"` + BlockSize uint64 `json:"block_size,omitzero"` } type BdevAioDeleteRequest struct { diff --git a/pkg/spdk/types/bdev.go b/pkg/spdk/types/bdev.go index 27c40da8..3ae95f72 100644 --- a/pkg/spdk/types/bdev.go +++ b/pkg/spdk/types/bdev.go @@ -3,10 +3,12 @@ package types type BdevProductName string const ( - BdevProductNameAio = BdevProductName("AIO disk") - BdevProductNameLvol = BdevProductName("Logical Volume") - BdevProductNameRaid = BdevProductName("Raid Volume") - BdevProductNameNvme = BdevProductName("NVMe disk") + BdevProductNameAio = BdevProductName("AIO disk") + BdevProductNameLvol = BdevProductName("Logical Volume") + BdevProductNameRaid = BdevProductName("Raid Volume") + BdevProductNameNvme = BdevProductName("NVMe disk") + BdevProductNameVirtioBlk = BdevProductName("VirtioBlk Disk") + BdevProductNameVirtioScsi = BdevProductName("Virtio SCSI Disk") ) type BdevType string diff --git a/pkg/spdk/types/nvme.go b/pkg/spdk/types/nvme.go index 76afe25d..b7fe4691 100644 --- a/pkg/spdk/types/nvme.go +++ b/pkg/spdk/types/nvme.go @@ -21,10 +21,11 @@ const ( type BdevDriverSpecificNvme []NvmeNamespaceInfo type NvmeNamespaceInfo struct { - CtrlrData NvmeCtrlrData `json:"ctrlr_data"` - NsData NvmeNsData `json:"ns_data"` - Trid NvmeTransportID `json:"trid"` - VS NvmeVendorSpecific `json:"vs"` + PciAddress string `json:"pci_address,omitempty"` + CtrlrData NvmeCtrlrData `json:"ctrlr_data"` + NsData NvmeNsData `json:"ns_data"` + Trid NvmeTransportID `json:"trid"` + VS NvmeVendorSpecific `json:"vs"` } type NvmeCtrlrData struct { diff --git a/pkg/spdk/types/virtio.go b/pkg/spdk/types/virtio.go new file mode 100644 index 00000000..2d240aac --- /dev/null +++ b/pkg/spdk/types/virtio.go @@ -0,0 +1,12 @@ +package types + +type BdevVirtioAttachControllerRequest struct { + Name string `json:"name"` + Trtype string `json:"trtype"` + Traddr string `json:"traddr"` + DevType string `json:"dev_type"` +} + +type BdevVirtioDetachControllerRequest struct { + Name string `json:"name"` +} diff --git a/vendor/modules.txt b/vendor/modules.txt index 423bb35a..89b4fcc5 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -57,8 +57,6 @@ github.com/russross/blackfriday/v2 github.com/shirou/gopsutil/v3/common github.com/shirou/gopsutil/v3/disk github.com/shirou/gopsutil/v3/internal/common -# github.com/shurcooL/sanitized_anchor_name v1.0.0 -## explicit # github.com/sirupsen/logrus v1.9.3 ## explicit; go 1.13 github.com/sirupsen/logrus