/
data_source_google_organization.go
137 lines (123 loc) · 3.74 KB
/
data_source_google_organization.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
package google
import (
"fmt"
"strings"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"google.golang.org/api/cloudresourcemanager/v1"
)
func dataSourceGoogleOrganization() *schema.Resource {
return &schema.Resource{
Read: dataSourceOrganizationRead,
Schema: map[string]*schema.Schema{
"domain": {
Type: schema.TypeString,
Optional: true,
Computed: true,
ConflictsWith: []string{"organization"},
},
"organization": {
Type: schema.TypeString,
Optional: true,
ConflictsWith: []string{"domain"},
},
"org_id": {
Type: schema.TypeString,
Computed: true,
},
"name": {
Type: schema.TypeString,
Computed: true,
},
"directory_customer_id": {
Type: schema.TypeString,
Computed: true,
},
"create_time": {
Type: schema.TypeString,
Computed: true,
},
"lifecycle_state": {
Type: schema.TypeString,
Computed: true,
},
},
}
}
func dataSourceOrganizationRead(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
userAgent, err := generateUserAgentString(d, config.userAgent)
if err != nil {
return err
}
var organization *cloudresourcemanager.Organization
if v, ok := d.GetOk("domain"); ok {
filter := fmt.Sprintf("domain=%s", v.(string))
var resp *cloudresourcemanager.SearchOrganizationsResponse
err := retryTimeDuration(func() (err error) {
resp, err = config.NewResourceManagerClient(userAgent).Organizations.Search(&cloudresourcemanager.SearchOrganizationsRequest{
Filter: filter,
}).Do()
return err
}, d.Timeout(schema.TimeoutRead))
if err != nil {
return fmt.Errorf("Error reading organization: %s", err)
}
if len(resp.Organizations) == 0 {
return fmt.Errorf("Organization not found: %s", v)
}
if len(resp.Organizations) > 1 {
// Attempt to find an exact domain match
for _, org := range resp.Organizations {
if org.DisplayName == v.(string) {
organization = org
break
}
}
if organization == nil {
return fmt.Errorf("Received multiple organizations in the response, but could not find an exact domain match.")
}
} else {
organization = resp.Organizations[0]
}
} else if v, ok := d.GetOk("organization"); ok {
var resp *cloudresourcemanager.Organization
err := retryTimeDuration(func() (err error) {
resp, err = config.NewResourceManagerClient(userAgent).Organizations.Get(canonicalOrganizationName(v.(string))).Do()
return err
}, d.Timeout(schema.TimeoutRead))
if err != nil {
return handleNotFoundError(err, d, fmt.Sprintf("Organization Not Found : %s", v))
}
organization = resp
} else {
return fmt.Errorf("one of domain or organization must be set")
}
d.SetId(organization.Name)
if err := d.Set("name", organization.Name); err != nil {
return fmt.Errorf("Error setting name: %s", err)
}
if err := d.Set("org_id", GetResourceNameFromSelfLink(organization.Name)); err != nil {
return fmt.Errorf("Error setting org_id: %s", err)
}
if err := d.Set("domain", organization.DisplayName); err != nil {
return fmt.Errorf("Error setting domain: %s", err)
}
if err := d.Set("create_time", organization.CreationTime); err != nil {
return fmt.Errorf("Error setting create_time: %s", err)
}
if err := d.Set("lifecycle_state", organization.LifecycleState); err != nil {
return fmt.Errorf("Error setting lifecycle_state: %s", err)
}
if organization.Owner != nil {
if err := d.Set("directory_customer_id", organization.Owner.DirectoryCustomerId); err != nil {
return fmt.Errorf("Error setting directory_customer_id: %s", err)
}
}
return nil
}
func canonicalOrganizationName(ba string) string {
if strings.HasPrefix(ba, "organizations/") {
return ba
}
return "organizations/" + ba
}