terraform/builtin/providers/cobbler/resource_cobbler_profile.go

374 lines
9.8 KiB
Go

package cobbler
import (
"fmt"
"log"
"strings"
"github.com/hashicorp/terraform/helper/schema"
cobbler "github.com/jtopjian/cobblerclient"
)
func resourceProfile() *schema.Resource {
return &schema.Resource{
Create: resourceProfileCreate,
Read: resourceProfileRead,
Update: resourceProfileUpdate,
Delete: resourceProfileDelete,
Schema: map[string]*schema.Schema{
"boot_files": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"comment": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"distro": &schema.Schema{
Type: schema.TypeString,
Required: true,
},
"enable_gpxe": &schema.Schema{
Type: schema.TypeBool,
Optional: true,
Computed: true,
},
"enable_menu": &schema.Schema{
Type: schema.TypeBool,
Optional: true,
Computed: true,
},
"fetchable_files": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"kernel_options": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"kernel_options_post": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"kickstart": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"ks_meta": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"mgmt_classes": &schema.Schema{
Type: schema.TypeList,
Optional: true,
Computed: true,
Elem: &schema.Schema{Type: schema.TypeString},
},
"mgmt_parameters": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"name": &schema.Schema{
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
"name_servers_search": &schema.Schema{
Type: schema.TypeList,
Optional: true,
Computed: true,
Elem: &schema.Schema{Type: schema.TypeString},
},
"name_servers": &schema.Schema{
Type: schema.TypeList,
Optional: true,
Computed: true,
Elem: &schema.Schema{Type: schema.TypeString},
},
"owners": &schema.Schema{
Type: schema.TypeList,
Optional: true,
Computed: true,
Elem: &schema.Schema{Type: schema.TypeString},
},
"parent": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"proxy": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"redhat_management_key": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"redhat_management_server": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"repos": &schema.Schema{
Type: schema.TypeList,
Optional: true,
Computed: true,
Elem: &schema.Schema{Type: schema.TypeString},
},
"server": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"template_files": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"template_remote_kickstarts": &schema.Schema{
Type: schema.TypeInt,
Optional: true,
Computed: true,
},
"virt_auto_boot": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"virt_bridge": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"virt_cpus": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"virt_disk_driver": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"virt_file_size": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"virt_path": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"virt_ram": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"virt_type": &schema.Schema{
Type: schema.TypeString,
Optional: true,
Computed: true,
},
},
}
}
func resourceProfileCreate(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
// Create a cobblerclient.Profile struct
profile := buildProfile(d, config)
// Attempt to create the Profile
log.Printf("[DEBUG] Cobbler Profile: Create Options: %#v", profile)
newProfile, err := config.cobblerClient.CreateProfile(profile)
if err != nil {
return fmt.Errorf("Cobbler Profile: Error Creating: %s", err)
}
d.SetId(newProfile.Name)
return resourceProfileRead(d, meta)
}
func resourceProfileRead(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
// Retrieve the profile entry from Cobbler
profile, err := config.cobblerClient.GetProfile(d.Id())
if err != nil {
return fmt.Errorf("Cobbler Profile: Error Reading (%s): %s", d.Id(), err)
}
// Set all fields
d.Set("boot_files", profile.BootFiles)
d.Set("comment", profile.Comment)
d.Set("distro", profile.Distro)
d.Set("enable_gpxe", profile.EnableGPXE)
d.Set("enable_menu", profile.EnableMenu)
d.Set("fetchable_files", profile.FetchableFiles)
d.Set("kernel_options", profile.KernelOptions)
d.Set("kernel_options_post", profile.KernelOptionsPost)
d.Set("kickstart", profile.Kickstart)
d.Set("ks_meta", profile.KSMeta)
d.Set("mgmt_classes", profile.MGMTClasses)
d.Set("mgmt_parameters", profile.MGMTParameters)
d.Set("name_servers_search", profile.NameServersSearch)
d.Set("name_servers", profile.NameServers)
d.Set("owners", profile.Owners)
d.Set("proxy", profile.Proxy)
d.Set("redhat_management_key", profile.RedHatManagementKey)
d.Set("redhat_management_server", profile.RedHatManagementServer)
d.Set("template_files", profile.TemplateFiles)
d.Set("template_remote_kickstarts", profile.TemplateRemoteKickstarts)
d.Set("virt_auto_boot", profile.VirtAutoBoot)
d.Set("virt_bridge", profile.VirtBridge)
d.Set("virt_cpus", profile.VirtCPUs)
d.Set("virt_disk_driver", profile.VirtDiskDriver)
d.Set("virt_file_size", profile.VirtFileSize)
d.Set("virt_path", profile.VirtPath)
d.Set("virt_ram", profile.VirtRam)
d.Set("virt_type", profile.VirtType)
// Split repos into a list
repos := strings.Split(profile.Repos, " ")
d.Set("repos", repos)
return nil
}
func resourceProfileUpdate(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
// Create a cobblerclient.Profile struct
profile := buildProfile(d, config)
// Attempt to update the profile with new information
log.Printf("[DEBUG] Cobbler Profile: Updating Profile (%s) with options: %+v", d.Id(), profile)
err := config.cobblerClient.UpdateProfile(&profile)
if err != nil {
return fmt.Errorf("Cobbler Profile: Error Updating (%s): %s", d.Id(), err)
}
return resourceProfileRead(d, meta)
}
func resourceProfileDelete(d *schema.ResourceData, meta interface{}) error {
config := meta.(*Config)
// Attempt to delete the profile
if err := config.cobblerClient.DeleteProfile(d.Id()); err != nil {
return fmt.Errorf("Cobbler Profile: Error Deleting (%s): %s", d.Id(), err)
}
return nil
}
// buildProfile builds a cobblerclient.Profile out of the Terraform attributes
func buildProfile(d *schema.ResourceData, meta interface{}) cobbler.Profile {
mgmtClasses := []string{}
for _, i := range d.Get("mgmt_classes").([]interface{}) {
mgmtClasses = append(mgmtClasses, i.(string))
}
nameServersSearch := []string{}
for _, i := range d.Get("name_servers_search").([]interface{}) {
nameServersSearch = append(nameServersSearch, i.(string))
}
nameServers := []string{}
for _, i := range d.Get("name_servers").([]interface{}) {
nameServers = append(nameServers, i.(string))
}
owners := []string{}
for _, i := range d.Get("owners").([]interface{}) {
owners = append(owners, i.(string))
}
repos := []string{}
for _, i := range d.Get("repos").([]interface{}) {
repos = append(repos, i.(string))
}
profile := cobbler.Profile{
BootFiles: d.Get("boot_files").(string),
Comment: d.Get("comment").(string),
Distro: d.Get("distro").(string),
EnableGPXE: d.Get("enable_gpxe").(bool),
EnableMenu: d.Get("enable_menu").(bool),
FetchableFiles: d.Get("fetchable_files").(string),
KernelOptions: d.Get("kernel_options").(string),
KernelOptionsPost: d.Get("kernel_options_post").(string),
Kickstart: d.Get("kickstart").(string),
KSMeta: d.Get("ks_meta").(string),
MGMTClasses: mgmtClasses,
MGMTParameters: d.Get("mgmt_parameters").(string),
Name: d.Get("name").(string),
NameServersSearch: nameServersSearch,
NameServers: nameServers,
Owners: owners,
Parent: d.Get("parent").(string),
Proxy: d.Get("proxy").(string),
RedHatManagementKey: d.Get("redhat_management_key").(string),
RedHatManagementServer: d.Get("redhat_management_server").(string),
Repos: strings.Join(repos, " "),
Server: d.Get("server").(string),
TemplateFiles: d.Get("template_files").(string),
TemplateRemoteKickstarts: d.Get("template_remote_kickstarts").(int),
VirtAutoBoot: d.Get("virt_auto_boot").(string),
VirtBridge: d.Get("virt_bridge").(string),
VirtCPUs: d.Get("virt_cpus").(string),
VirtDiskDriver: d.Get("virt_disk_driver").(string),
VirtFileSize: d.Get("virt_file_size").(string),
VirtPath: d.Get("virt_path").(string),
VirtRam: d.Get("virt_ram").(string),
VirtType: d.Get("virt_type").(string),
}
return profile
}