/
volumeattach.go
138 lines (129 loc) · 4.55 KB
/
volumeattach.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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package main
import (
"github.com/dynuc/gophercloud/auth/token"
"github.com/dynuc/gophercloud/openstack"
"github.com/dynuc/gophercloud"
"fmt"
"github.com/dynuc/gophercloud/openstack/compute/v2/extensions/volumeattach"
"encoding/json"
)
func main() {
fmt.Println("main start...")
//Set authentication parameters
tokenOpts := token.TokenOptions{
IdentityEndpoint: "https://iam.xxx.yyy.com/v3",
Username: "{Username}",
Password: "{Password}",
DomainID: "{DomainID}",
ProjectID: "{ProjectID}",
}
//Init provider client
provider, authErr := openstack.AuthenticatedClient(tokenOpts)
if authErr != nil {
fmt.Println("Failed to get the AuthenticatedClient: ", authErr)
return
}
//Init service client
client, clientErr := openstack.NewComputeV2(provider, gophercloud.EndpointOpts{})
if clientErr != nil {
fmt.Println("Failed to get the NewComputeV2 client: ", clientErr)
return
}
serverID := "{serverID}"
attachmentID := "{attachmentID}"
deleteFlag := 1
AttachvolumesList(client, serverID)
AttachvolumeCreate(client, serverID)
AttachvolumeGet(client, serverID, attachmentID)
AttachvolumeDelete(client, serverID, attachmentID)
DetachVolumeWithDeleteFlag(client, serverID, attachmentID, deleteFlag)
fmt.Println("main end...")
}
//Query attachvolumes list
func AttachvolumesList(client *gophercloud.ServiceClient, serverID string) {
// Query all volumeattach list information
allPages, allPagesErr := volumeattach.List(client, serverID).AllPages()
if allPagesErr != nil {
fmt.Println("allPagesErr:", allPagesErr)
if ue, ok := allPagesErr.(*gophercloud.UnifiedError); ok {
fmt.Println("ErrCode:", ue.ErrorCode())
fmt.Println("Message:", ue.Message())
}
return
}
// Transform volumeattach structure
allVolumes, allVolumesErr := volumeattach.ExtractVolumeAttachments(allPages)
if allVolumesErr != nil {
fmt.Println("allVolumesErr:", allVolumesErr)
if ue, ok := allVolumesErr.(*gophercloud.UnifiedError); ok {
fmt.Println("ErrCode:", ue.ErrorCode())
fmt.Println("Message:", ue.Message())
}
return
}
fmt.Println("attachvolumes list is :")
for _, volume := range allVolumes {
volumeJson, _ := json.MarshalIndent(volume, "", " ")
fmt.Println(string(volumeJson))
}
}
//Create attachvolume
func AttachvolumeCreate(client *gophercloud.ServiceClient, serverID string) {
volumeAttachOptions := volumeattach.CreateOpts{
Device: "/dev/sdb",
VolumeID: "640c1f2d-69ad-4d8a-9da8-c4b9abf83469",
}
resp, volumeAttachmentErr := volumeattach.Create(client, serverID, volumeAttachOptions).Extract()
if volumeAttachmentErr != nil {
fmt.Println("volumeAttachmentErr:", volumeAttachmentErr)
if ue, ok := volumeAttachmentErr.(*gophercloud.UnifiedError); ok {
fmt.Println("ErrCode:", ue.ErrorCode())
fmt.Println("Message:", ue.Message())
}
return
}
fmt.Println("resp:", resp)
fmt.Println("attachvolume create success!")
}
//Get detail of the specified attachvolume
func AttachvolumeGet(client *gophercloud.ServiceClient, serverID string, attachmentId string) {
volume, attachvolumesGetErr := volumeattach.Get(client, serverID,
attachmentId).Extract()
if attachvolumesGetErr != nil {
fmt.Println("attachvolumesGetErr:", attachvolumesGetErr)
if ue, ok := attachvolumesGetErr.(*gophercloud.UnifiedError); ok {
fmt.Println("ErrCode:", ue.ErrorCode())
fmt.Println("Message:", ue.Message())
}
return
}
volumeJson, _ := json.MarshalIndent(volume, "", " ")
fmt.Println("attachvolume detail is " + string(volumeJson))
}
//AttachvolumeDelete requests detachment of volume on server
func AttachvolumeDelete(client *gophercloud.ServiceClient, serverID string, attachmentID string) {
attachVolumesDetachErr := volumeattach.Delete(client, serverID,
attachmentID).ExtractErr()
if attachVolumesDetachErr != nil {
fmt.Println("attachVolumesDetachErr:", attachVolumesDetachErr)
if ue, ok := attachVolumesDetachErr.(*gophercloud.UnifiedError); ok {
fmt.Println("ErrCode:", ue.ErrorCode())
fmt.Println("Message:", ue.Message())
}
return
}
fmt.Println("Server detach volume success!")
}
//DetachVolumeWithDeleteFlag requests enforce detachment of volume with delete flag 1
func DetachVolumeWithDeleteFlag(sc *gophercloud.ServiceClient, serverID string, volumeID string, deleteFlag int) {
err := volumeattach.DeleteWithFlag(sc, serverID, volumeID, deleteFlag).ExtractErr()
if err != nil {
fmt.Println(err)
if ue, ok := err.(*gophercloud.UnifiedError); ok {
fmt.Println("ErrCode", ue.ErrCode)
fmt.Println("ErrMessage", ue.ErrMessage)
}
return
}
fmt.Println("Server detach volume with delete flag success!")
}