forked from hpe-storage/common-host-libs
/
remove_iscsi_persistent_target.go
67 lines (54 loc) · 2.76 KB
/
remove_iscsi_persistent_target.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
// (c) Copyright 2019 Hewlett Packard Enterprise Development LP
// +build windows
// Package iscsidsc wraps the Windows iSCSI Discovery Library API
package iscsidsc
import (
"strings"
"syscall"
"unsafe"
log "github.com/hpe-storage/common-host-libs/logger"
)
// RemoveIScsiPersistentTarget - Go wrapped Win32 API - RemoveIScsiPersistentTargetW()
// https://docs.microsoft.com/is-is/windows/desktop/api/iscsidsc/nf-iscsidsc-removeiscsipersistenttargetw
func RemoveIScsiPersistentTarget(initiatorInstance string, initiatorPortNumber uint32, targetName string, targetPortal ISCSI_TARGET_PORTAL) (err error) {
log.Tracef(">>>>> RemoveIScsiPersistentTarget, initiatorInstance=%v, initiatorPortNumber=%v, targetName=%v", initiatorInstance, initiatorPortNumber, targetName)
defer log.Trace("<<<<< RemoveIScsiPersistentTarget")
// Convert initiatorInstance, targetName, and targetPortal into raw equivalents so that we can
// send them to the iSCSI API.
initiatorNameUTF16 := syscall.StringToUTF16(initiatorInstance)
targetNameUTF16 := syscall.StringToUTF16(targetName)
targetPortalRaw := iscsiTargetPortalToRaw(&targetPortal)
// Call the Win32 RemoveIScsiPersistentTargetW API
iscsiErr, _, _ := procRemoveIScsiPersistentTargetW.Call(uintptr(unsafe.Pointer(&initiatorNameUTF16[0])), uintptr(initiatorPortNumber), uintptr(unsafe.Pointer(&targetNameUTF16[0])), uintptr(unsafe.Pointer(targetPortalRaw)))
if iscsiErr != ERROR_SUCCESS {
// If an unexpected error occurs, initialize error object and log failure
err = syscall.Errno(iscsiErr)
log.Error(logIscsiFailure, err.Error())
}
return err
}
// RemoveIScsiPersistentTargetAll is a extended wrapper around the RemoveIScsiPersistentTarget API.
// What it does is remove *all* persistent logins for the specified target.
func RemoveIScsiPersistentTargetAll(targetName string) (err error) {
log.Tracef(">>>>> RemoveIScsiPersistentTargetAll, targetName=%v", targetName)
defer log.Trace("<<<<< RemoveIScsiPersistentTargetAll")
// Start by querying all the iSCSI persistent logins on this host
persistentLogins, err := ReportIScsiPersistentLogins()
if err == nil {
// Loop through the enumerated persistent logins
for _, persistentLogin := range persistentLogins {
// If it isn't a target match (case insensitive comparison), skip it
if !strings.EqualFold(persistentLogin.TargetName, targetName) {
continue
}
// Remove this persistent login
errTemp := RemoveIScsiPersistentTarget(persistentLogin.InitiatorInstance, persistentLogin.InitiatorPortNumber, persistentLogin.TargetName, persistentLogin.TargetPortal)
// We keep trying to remove all persistent logins for our target but only return
// the first failure (if any) to the caller.
if (err == nil) && (errTemp != nil) {
err = errTemp
}
}
}
return err
}