-
Notifications
You must be signed in to change notification settings - Fork 8
/
accountgroups_object.go
105 lines (90 loc) · 3.69 KB
/
accountgroups_object.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
// accountgroups_object.go
package accountgroups
import (
"encoding/xml"
"fmt"
"log"
"github.com/deploymenttheory/go-api-sdk-jamfpro/sdk/jamfpro"
"github.com/deploymenttheory/terraform-provider-jamfpro/internal/endpoints/common/constructobject"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
// constructJamfProAccountGroup constructs an AccountGroup object from the provided schema data.
func constructJamfProAccountGroup(d *schema.ResourceData) (*jamfpro.ResourceAccountGroup, error) {
accountGroup := &jamfpro.ResourceAccountGroup{
Name: d.Get("name").(string),
AccessLevel: d.Get("access_level").(string),
PrivilegeSet: d.Get("privilege_set").(string),
}
// Handle Site
if v, ok := d.GetOk("site"); ok {
accountGroup.Site = constructobject.ConstructSharedResourceSite(v.([]interface{}))
} else {
// Set default values if 'site' data is not provided
accountGroup.Site = constructobject.ConstructSharedResourceSite([]interface{}{})
}
// Handle Privileges
accountGroup.Privileges = constructAccountSubsetPrivileges(d)
// Handle Members
if v, ok := d.GetOk("members"); ok {
memberList := v.([]interface{})
accountGroup.Members = make(jamfpro.AccountGroupSubsetMembers, len(memberList))
for i, member := range memberList {
memberData := member.(map[string]interface{})
accountGroup.Members[i].User = jamfpro.MemberUser{
ID: memberData["id"].(int),
Name: memberData["name"].(string),
}
}
}
// Handle Identity Server (LDAP Server). Fields are used for both LDAP and IdP configuration
if v, ok := d.GetOk("identity_server"); ok && len(v.([]interface{})) > 0 {
identityServerData := v.([]interface{})[0].(map[string]interface{})
accountGroup.LDAPServer = jamfpro.AccountGroupSubsetLDAPServer{
ID: identityServerData["id"].(int),
}
}
// Serialize and pretty-print the accountGroup object as XML for logging
resourceXML, err := xml.MarshalIndent(accountGroup, "", " ")
if err != nil {
return nil, fmt.Errorf("failed to marshal Jamf Pro Account Group '%s' to XML: %v", accountGroup.Name, err)
}
// Use log.Printf instead of fmt.Printf for logging within the Terraform provider context
log.Printf("[DEBUG] Constructed Jamf Pro Account Group XML:\n%s\n", string(resourceXML))
return accountGroup, nil
}
// Helper functions for nested structures
// constructAccountSubsetPrivileges constructs AccountSubsetPrivileges from schema data.
func constructAccountSubsetPrivileges(d *schema.ResourceData) jamfpro.AccountSubsetPrivileges {
privileges := jamfpro.AccountSubsetPrivileges{}
if v, ok := d.GetOk("jss_objects_privileges"); ok {
privileges.JSSObjects = getStringSliceFromSet(v.(*schema.Set))
}
if v, ok := d.GetOk("jss_settings_privileges"); ok {
privileges.JSSSettings = getStringSliceFromSet(v.(*schema.Set))
}
if v, ok := d.GetOk("jss_actions_privileges"); ok {
privileges.JSSActions = getStringSliceFromSet(v.(*schema.Set))
}
if v, ok := d.GetOk("casper_admin_privileges"); ok {
privileges.CasperAdmin = getStringSliceFromSet(v.(*schema.Set))
}
if v, ok := d.GetOk("casper_remote_privileges"); ok {
privileges.CasperRemote = getStringSliceFromSet(v.(*schema.Set))
}
if v, ok := d.GetOk("casper_imaging_privileges"); ok {
privileges.CasperImaging = getStringSliceFromSet(v.(*schema.Set))
}
if v, ok := d.GetOk("recon_privileges"); ok {
privileges.Recon = getStringSliceFromSet(v.(*schema.Set))
}
return privileges
}
// getStringSliceFromSet converts a *schema.Set to a slice of strings.
func getStringSliceFromSet(set *schema.Set) []string {
list := set.List()
slice := make([]string, len(list))
for i, item := range list {
slice[i] = item.(string) // Direct assertion to string, assuming all items are strings.
}
return slice
}