/
resource_openstack_blockstorage_volume_type_access_v3.go
139 lines (113 loc) · 4.11 KB
/
resource_openstack_blockstorage_volume_type_access_v3.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
139
package openstack
import (
"context"
"fmt"
"strings"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumetypes"
)
func resourceBlockstorageVolumeTypeAccessV3() *schema.Resource {
return &schema.Resource{
CreateContext: resourceBlockstorageVolumeTypeAccessV3Create,
ReadContext: resourceBlockstorageVolumeTypeAccessV3Read,
DeleteContext: resourceBlockstorageVolumeTypeAccessV3Delete,
Importer: &schema.ResourceImporter{
StateContext: schema.ImportStatePassthroughContext,
},
Schema: map[string]*schema.Schema{
"region": {
Type: schema.TypeString,
Optional: true,
Computed: true,
ForceNew: true,
},
"project_id": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
"volume_type_id": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
},
}
}
func resourceBlockstorageVolumeTypeAccessV3Create(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
config := meta.(*Config)
blockStorageClient, err := config.BlockStorageV3Client(GetRegion(d, config))
if err != nil {
return diag.Errorf("Error creating OpenStack block storage client: %s", err)
}
projectID := d.Get("project_id").(string)
vtID := d.Get("volume_type_id").(string)
accessOpts := volumetypes.AddAccessOpts{
Project: projectID,
}
if err := volumetypes.AddAccess(blockStorageClient, vtID, accessOpts).ExtractErr(); err != nil {
return diag.Errorf("Error creating openstack_blockstorage_volume_type_access_v3: %s", err)
}
id := fmt.Sprintf("%s/%s", vtID, projectID)
d.SetId(id)
return resourceBlockstorageVolumeTypeAccessV3Read(ctx, d, meta)
}
func resourceBlockstorageVolumeTypeAccessV3Read(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
config := meta.(*Config)
blockStorageClient, err := config.BlockStorageV3Client(GetRegion(d, config))
if err != nil {
return diag.Errorf("Error creating OpenStack block storage client: %s", err)
}
vtID, projectID, err := parseVolumeTypeAccessID(d.Id())
if err != nil {
return diag.FromErr(CheckDeleted(d, err, "Error parsing ID of openstack_blockstorage_volume_type_access_v3"))
}
allPages, err := volumetypes.ListAccesses(blockStorageClient, vtID).AllPages()
if err != nil {
return diag.Errorf("Error retrieving accesses openstack_blockstorage_volume_type_access_v3 for vt: %s", vtID)
}
allAccesses, err := volumetypes.ExtractAccesses(allPages)
if err != nil {
return diag.Errorf("Error extracting accesses openstack_blockstorage_volume_type_access_v3 for vt: %s", vtID)
}
found := false
for _, access := range allAccesses {
if access.VolumeTypeID == vtID && access.ProjectID == projectID {
found = true
break
}
}
if !found {
return diag.Errorf("Error getting volume type access openstack_blockstorage_volume_type_access_v3 for vt: %s", vtID)
}
d.Set("region", GetRegion(d, config))
d.Set("project_id", projectID)
d.Set("volume_type_id", vtID)
return nil
}
func resourceBlockstorageVolumeTypeAccessV3Delete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
config := meta.(*Config)
blockStorageClient, err := config.BlockStorageV3Client(GetRegion(d, config))
if err != nil {
return diag.Errorf("Error creating OpenStack block storage client: %s", err)
}
vtID, projectID, err := parseVolumeTypeAccessID(d.Id())
if err != nil {
return diag.Errorf("Error parsing ID of openstack_blockstorage_volume_type_access_v3 %s: %s", d.Id(), err)
}
removeOpts := volumetypes.RemoveAccessOpts{
Project: projectID,
}
if err := volumetypes.RemoveAccess(blockStorageClient, vtID, removeOpts).ExtractErr(); err != nil {
return diag.Errorf("Error removing openstack_blockstorage_volume_type_access_v3 %s: %s", d.Id(), err)
}
return nil
}
func parseVolumeTypeAccessID(id string) (string, string, error) {
idParts := strings.Split(id, "/")
if len(idParts) < 2 {
return "", "", fmt.Errorf("Unable to determine volume type access ID %s", id)
}
return idParts[0], idParts[1], nil
}