-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdata_source_openstack_identity_project_v3.go
156 lines (132 loc) · 4.22 KB
/
data_source_openstack_identity_project_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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
package openstack
import (
"context"
"log"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/gophercloud/gophercloud/openstack/identity/v3/projects"
"github.com/gophercloud/gophercloud/openstack/identity/v3/users"
)
func dataSourceIdentityProjectV3() *schema.Resource {
return &schema.Resource{
ReadContext: dataSourceIdentityProjectV3Read,
Schema: map[string]*schema.Schema{
"region": {
Type: schema.TypeString,
Optional: true,
Computed: true,
ForceNew: true,
},
"description": {
Type: schema.TypeString,
Computed: true,
},
"domain_id": {
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"enabled": {
Type: schema.TypeBool,
Optional: true,
Default: true,
},
"is_domain": {
Type: schema.TypeBool,
Optional: true,
Default: false,
},
"name": {
Type: schema.TypeString,
Optional: true,
},
"parent_id": {
Type: schema.TypeString,
Optional: true,
},
"tags": {
Type: schema.TypeSet,
Computed: true,
Elem: &schema.Schema{Type: schema.TypeString},
Set: schema.HashString,
},
},
}
}
func filterProjects(allProjects []projects.Project, listOpts projects.ListOpts) (results []projects.Project) {
for _, p := range allProjects {
// TODO: Test for all fields :)
if p.Name == listOpts.Name {
results = append(results, p)
}
}
return
}
// dataSourceIdentityProjectV3Read performs the project lookup.
func dataSourceIdentityProjectV3Read(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
config := meta.(*Config)
identityClient, err := config.IdentityV3Client(GetRegion(d, config))
if err != nil {
return diag.Errorf("Error creating OpenStack identity client: %s", err)
}
enabled := d.Get("enabled").(bool)
isDomain := d.Get("is_domain").(bool)
listOpts := projects.ListOpts{
DomainID: d.Get("domain_id").(string),
Enabled: &enabled,
IsDomain: &isDomain,
Name: d.Get("name").(string),
ParentID: d.Get("parent_id").(string),
}
var project projects.Project
var allProjects []projects.Project
allPages, err := projects.List(identityClient, listOpts).AllPages()
if err != nil {
userID := config.UserID
log.Printf("[DEBUG] Will try to find project with users.ListProjects as I am unable to query openstack_identity_project_v3: %s. Trying listing userprojects.", err)
if userID == "" {
tokenInfo, tokenErr := getTokenInfo(identityClient)
if tokenErr != nil {
return diag.Errorf("Error when getting token info: %s", err)
}
userID = tokenInfo.userID
}
// Search for all the projects using the users.ListProjects API call and filter them
allPages, err = users.ListProjects(identityClient, userID).AllPages()
if err != nil {
return diag.Errorf("Unable to query openstack_identity_project_v3: %s", err)
}
allProjects, err = projects.ExtractProjects(allPages)
if err != nil {
return diag.Errorf("Unable to retrieve openstack_identity_project_v3: %s", err)
}
allProjects = filterProjects(allProjects, listOpts)
} else {
allProjects, err = projects.ExtractProjects(allPages)
if err != nil {
return diag.Errorf("Unable to retrieve openstack_identity_project_v3: %s", err)
}
}
if len(allProjects) < 1 {
return diag.Errorf("Your openstack_identity_project_v3 query returned no results. " +
"Please change your search criteria and try again")
}
if len(allProjects) > 1 {
return diag.Errorf("Your openstack_identity_project_v3 query returned more than one result %#v", allProjects)
}
project = allProjects[0]
dataSourceIdentityProjectV3Attributes(d, &project)
return nil
}
// dataSourceIdentityProjectV3Attributes populates the fields of an Project resource.
func dataSourceIdentityProjectV3Attributes(d *schema.ResourceData, project *projects.Project) {
log.Printf("[DEBUG] openstack_identity_project_v3 details: %#v", project)
d.SetId(project.ID)
d.Set("is_domain", project.IsDomain)
d.Set("description", project.Description)
d.Set("domain_id", project.DomainID)
d.Set("enabled", project.Enabled)
d.Set("name", project.Name)
d.Set("parent_id", project.ParentID)
d.Set("tags", project.Tags)
}