374 lines
9.8 KiB
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
|
|
}
|