iscsi.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. package iscsi
  2. import (
  3. "fmt"
  4. "strings"
  5. // Vendors
  6. "util"
  7. "github.com/Sirupsen/logrus"
  8. )
  9. type iscsiLUNInfo struct {
  10. host string
  11. fqdn string
  12. }
  13. type ISCSIPlugin struct {
  14. lunInfo []iscsiLUNInfo
  15. }
  16. func NewISCSIPlugin() ISCSIPlugin {
  17. var lun []iscsiLUNInfo
  18. iscsiPlugin := ISCSIPlugin{lun}
  19. return iscsiPlugin
  20. }
  21. func (plugin *ISCSIPlugin) CheckIscsiSupport() bool {
  22. //Check if "iscsiadm" is installed
  23. _, err := util.ExecuteCommand("iscsiadm")
  24. if strings.Contains(err, util.CmdNotFound) {
  25. return false
  26. }
  27. return true
  28. }
  29. // iscsiadm -m discovery -t sendtargets -p <IP | Target>
  30. func (plugin *ISCSIPlugin) DiscoverLUNs(host string) error {
  31. if len(host) == 0 {
  32. err := fmt.Errorf("IP or Hostname is expected")
  33. return err
  34. }
  35. out, errMsg := util.ExecuteCommand("iscsiadm",
  36. "-m",
  37. "discovery",
  38. "-t",
  39. "sendtargets",
  40. "-p",
  41. host)
  42. if len(out) > 0 {
  43. lineArray := strings.Split(out, "\n")
  44. for _, line := range lineArray {
  45. if len(line) == 0 {
  46. break
  47. }
  48. token := strings.Split(line, ",")
  49. var lun iscsiLUNInfo
  50. lun.host = strings.TrimSpace(token[0])
  51. // Split again to get only fqdn name.
  52. fqdn := strings.Split(token[1], " ")
  53. lun.fqdn = strings.TrimSpace(fqdn[1])
  54. logrus.Infof("%s: %s", lun.host, lun.fqdn)
  55. plugin.lunInfo = append(plugin.lunInfo, lun)
  56. }
  57. }
  58. if len(errMsg) > 0 {
  59. err := fmt.Errorf("Unable to Discover: %s", errMsg)
  60. return err
  61. }
  62. return nil
  63. }
  64. // iscsiadm -m node -o show (Shows discovered list)
  65. func (plugin *ISCSIPlugin) ListVolumes() error {
  66. out, errMsg := util.ExecuteCommand("iscsiadm",
  67. "-m",
  68. "node",
  69. "-o",
  70. "show")
  71. logrus.Info(out)
  72. if len(errMsg) > 0 {
  73. err := fmt.Errorf("Unable to fetch List: %s", errMsg)
  74. return err
  75. }
  76. return nil
  77. }
  78. func (plugin *ISCSIPlugin) ListSessions() error {
  79. out, errMsg := util.ExecuteCommand("iscsiadm",
  80. "-m",
  81. "session")
  82. logrus.Info(out)
  83. if len(errMsg) > 0 {
  84. err := fmt.Errorf("Unable to fetch List: %s", errMsg)
  85. return err
  86. }
  87. return nil
  88. }
  89. // Login: iscsiadm -m node --login (login on all discovered nodes.)
  90. // iscsiadm -m node -T <Complete Target Name> -l -p <Group IP>:3260
  91. func (plugin *ISCSIPlugin) LoginTarget(target string, group string) error {
  92. var out, errMsg string
  93. if len(target) == 0 {
  94. out, errMsg = util.ExecuteCommand("iscsiadm",
  95. "-m",
  96. "node",
  97. "-l")
  98. } else {
  99. if len(group) == 0 {
  100. err := fmt.Errorf("group IP for target is missing!!")
  101. return err
  102. }
  103. out, errMsg = util.ExecuteCommand("iscsiadm",
  104. "-m",
  105. "node",
  106. "-T",
  107. target,
  108. "-l",
  109. "-p",
  110. group)
  111. }
  112. logrus.Info(out)
  113. if len(errMsg) > 0 {
  114. err := fmt.Errorf("Unable to Login: %s", errMsg)
  115. return err
  116. }
  117. return nil
  118. }
  119. // iscsiadm -m node -u
  120. // iscsiadm -m node -u -T <Complete Target Name>-p <Group IP address>:3260
  121. func (plugin *ISCSIPlugin) LogoutTarget(target string, group string) error {
  122. var out, errMsg string
  123. if len(target) == 0 {
  124. out, errMsg = util.ExecuteCommand("iscsiadm",
  125. "-m",
  126. "node",
  127. "-u")
  128. } else {
  129. out, errMsg = util.ExecuteCommand("iscsiadm",
  130. "-m",
  131. "node",
  132. "-u",
  133. "-T",
  134. target,
  135. "-p",
  136. group)
  137. }
  138. logrus.Info(out)
  139. if len(errMsg) > 0 {
  140. err := fmt.Errorf("Unable to Logout: %s", errMsg)
  141. return err
  142. }
  143. return nil
  144. }