iscsi.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  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. func (plugin *ISCSIPlugin) TargetLoggedIn(target string) bool {
  90. out, errMsg := util.ExecuteCommand("iscsiadm",
  91. "-m",
  92. "session")
  93. _ = errMsg
  94. if strings.Contains(out, target) {
  95. return true
  96. }
  97. return false
  98. }
  99. // Login: iscsiadm -m node --login (login on all discovered nodes.)
  100. // iscsiadm -m node -T <Complete Target Name> -l -p <Group IP>:3260
  101. func (plugin *ISCSIPlugin) LoginTarget(target string, group string) error {
  102. var out, errMsg string
  103. if len(target) == 0 {
  104. out, errMsg = util.ExecuteCommand("iscsiadm",
  105. "-m",
  106. "node",
  107. "-l")
  108. } else {
  109. if len(group) == 0 {
  110. err := fmt.Errorf("group IP for target is missing!!")
  111. return err
  112. }
  113. out, errMsg = util.ExecuteCommand("iscsiadm",
  114. "-m",
  115. "node",
  116. "-T",
  117. target,
  118. "-l",
  119. "-p",
  120. group)
  121. }
  122. logrus.Info(out)
  123. if len(errMsg) > 0 {
  124. err := fmt.Errorf("Unable to Login: %s", errMsg)
  125. return err
  126. }
  127. return nil
  128. }
  129. // iscsiadm -m node -u
  130. // iscsiadm -m node -u -T <Complete Target Name>-p <Group IP address>:3260
  131. func (plugin *ISCSIPlugin) LogoutTarget(target string, group string) error {
  132. var out, errMsg string
  133. if len(target) == 0 {
  134. out, errMsg = util.ExecuteCommand("iscsiadm",
  135. "-m",
  136. "node",
  137. "-u")
  138. } else {
  139. out, errMsg = util.ExecuteCommand("iscsiadm",
  140. "-m",
  141. "node",
  142. "-u",
  143. "-T",
  144. target,
  145. "-p",
  146. group)
  147. }
  148. logrus.Info(out)
  149. if len(errMsg) > 0 {
  150. err := fmt.Errorf("Unable to Logout: %s", errMsg)
  151. return err
  152. }
  153. return nil
  154. }