github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/builtin/providers/cobbler/resource_cobbler_profile.go (about) 1 package cobbler 2 3 import ( 4 "fmt" 5 "log" 6 "strings" 7 8 "github.com/hashicorp/terraform/helper/schema" 9 cobbler "github.com/jtopjian/cobblerclient" 10 ) 11 12 func resourceProfile() *schema.Resource { 13 return &schema.Resource{ 14 Create: resourceProfileCreate, 15 Read: resourceProfileRead, 16 Update: resourceProfileUpdate, 17 Delete: resourceProfileDelete, 18 19 Schema: map[string]*schema.Schema{ 20 "boot_files": &schema.Schema{ 21 Type: schema.TypeString, 22 Optional: true, 23 Computed: true, 24 }, 25 26 "comment": &schema.Schema{ 27 Type: schema.TypeString, 28 Optional: true, 29 Computed: true, 30 }, 31 32 "distro": &schema.Schema{ 33 Type: schema.TypeString, 34 Required: true, 35 }, 36 37 "enable_gpxe": &schema.Schema{ 38 Type: schema.TypeBool, 39 Optional: true, 40 Computed: true, 41 }, 42 43 "enable_menu": &schema.Schema{ 44 Type: schema.TypeBool, 45 Optional: true, 46 Computed: true, 47 }, 48 49 "fetchable_files": &schema.Schema{ 50 Type: schema.TypeString, 51 Optional: true, 52 Computed: true, 53 }, 54 55 "kernel_options": &schema.Schema{ 56 Type: schema.TypeString, 57 Optional: true, 58 Computed: true, 59 }, 60 61 "kernel_options_post": &schema.Schema{ 62 Type: schema.TypeString, 63 Optional: true, 64 Computed: true, 65 }, 66 67 "kickstart": &schema.Schema{ 68 Type: schema.TypeString, 69 Optional: true, 70 Computed: true, 71 }, 72 73 "ks_meta": &schema.Schema{ 74 Type: schema.TypeString, 75 Optional: true, 76 Computed: true, 77 }, 78 79 "mgmt_classes": &schema.Schema{ 80 Type: schema.TypeList, 81 Optional: true, 82 Computed: true, 83 Elem: &schema.Schema{Type: schema.TypeString}, 84 }, 85 86 "mgmt_parameters": &schema.Schema{ 87 Type: schema.TypeString, 88 Optional: true, 89 Computed: true, 90 }, 91 92 "name": &schema.Schema{ 93 Type: schema.TypeString, 94 Required: true, 95 ForceNew: true, 96 }, 97 98 "name_servers_search": &schema.Schema{ 99 Type: schema.TypeList, 100 Optional: true, 101 Computed: true, 102 Elem: &schema.Schema{Type: schema.TypeString}, 103 }, 104 105 "name_servers": &schema.Schema{ 106 Type: schema.TypeList, 107 Optional: true, 108 Computed: true, 109 Elem: &schema.Schema{Type: schema.TypeString}, 110 }, 111 112 "owners": &schema.Schema{ 113 Type: schema.TypeList, 114 Optional: true, 115 Computed: true, 116 Elem: &schema.Schema{Type: schema.TypeString}, 117 }, 118 119 "parent": &schema.Schema{ 120 Type: schema.TypeString, 121 Optional: true, 122 Computed: true, 123 }, 124 125 "proxy": &schema.Schema{ 126 Type: schema.TypeString, 127 Optional: true, 128 Computed: true, 129 }, 130 131 "redhat_management_key": &schema.Schema{ 132 Type: schema.TypeString, 133 Optional: true, 134 Computed: true, 135 }, 136 137 "redhat_management_server": &schema.Schema{ 138 Type: schema.TypeString, 139 Optional: true, 140 Computed: true, 141 }, 142 143 "repos": &schema.Schema{ 144 Type: schema.TypeList, 145 Optional: true, 146 Computed: true, 147 Elem: &schema.Schema{Type: schema.TypeString}, 148 }, 149 150 "server": &schema.Schema{ 151 Type: schema.TypeString, 152 Optional: true, 153 Computed: true, 154 }, 155 156 "template_files": &schema.Schema{ 157 Type: schema.TypeString, 158 Optional: true, 159 Computed: true, 160 }, 161 162 "template_remote_kickstarts": &schema.Schema{ 163 Type: schema.TypeInt, 164 Optional: true, 165 Computed: true, 166 }, 167 168 "virt_auto_boot": &schema.Schema{ 169 Type: schema.TypeString, 170 Optional: true, 171 Computed: true, 172 }, 173 174 "virt_bridge": &schema.Schema{ 175 Type: schema.TypeString, 176 Optional: true, 177 Computed: true, 178 }, 179 180 "virt_cpus": &schema.Schema{ 181 Type: schema.TypeString, 182 Optional: true, 183 Computed: true, 184 }, 185 186 "virt_disk_driver": &schema.Schema{ 187 Type: schema.TypeString, 188 Optional: true, 189 Computed: true, 190 }, 191 192 "virt_file_size": &schema.Schema{ 193 Type: schema.TypeString, 194 Optional: true, 195 Computed: true, 196 }, 197 198 "virt_path": &schema.Schema{ 199 Type: schema.TypeString, 200 Optional: true, 201 Computed: true, 202 }, 203 204 "virt_ram": &schema.Schema{ 205 Type: schema.TypeString, 206 Optional: true, 207 Computed: true, 208 }, 209 210 "virt_type": &schema.Schema{ 211 Type: schema.TypeString, 212 Optional: true, 213 Computed: true, 214 }, 215 }, 216 } 217 } 218 219 func resourceProfileCreate(d *schema.ResourceData, meta interface{}) error { 220 config := meta.(*Config) 221 222 // Create a cobblerclient.Profile struct 223 profile := buildProfile(d, config) 224 225 // Attempt to create the Profile 226 log.Printf("[DEBUG] Cobbler Profile: Create Options: %#v", profile) 227 newProfile, err := config.cobblerClient.CreateProfile(profile) 228 if err != nil { 229 return fmt.Errorf("Cobbler Profile: Error Creating: %s", err) 230 } 231 232 d.SetId(newProfile.Name) 233 234 return resourceProfileRead(d, meta) 235 } 236 237 func resourceProfileRead(d *schema.ResourceData, meta interface{}) error { 238 config := meta.(*Config) 239 240 // Retrieve the profile entry from Cobbler 241 profile, err := config.cobblerClient.GetProfile(d.Id()) 242 if err != nil { 243 return fmt.Errorf("Cobbler Profile: Error Reading (%s): %s", d.Id(), err) 244 } 245 246 // Set all fields 247 d.Set("boot_files", profile.BootFiles) 248 d.Set("comment", profile.Comment) 249 d.Set("distro", profile.Distro) 250 d.Set("enable_gpxe", profile.EnableGPXE) 251 d.Set("enable_menu", profile.EnableMenu) 252 d.Set("fetchable_files", profile.FetchableFiles) 253 d.Set("kernel_options", profile.KernelOptions) 254 d.Set("kernel_options_post", profile.KernelOptionsPost) 255 d.Set("kickstart", profile.Kickstart) 256 d.Set("ks_meta", profile.KSMeta) 257 d.Set("mgmt_classes", profile.MGMTClasses) 258 d.Set("mgmt_parameters", profile.MGMTParameters) 259 d.Set("name_servers_search", profile.NameServersSearch) 260 d.Set("name_servers", profile.NameServers) 261 d.Set("owners", profile.Owners) 262 d.Set("proxy", profile.Proxy) 263 d.Set("redhat_management_key", profile.RedHatManagementKey) 264 d.Set("redhat_management_server", profile.RedHatManagementServer) 265 d.Set("template_files", profile.TemplateFiles) 266 d.Set("template_remote_kickstarts", profile.TemplateRemoteKickstarts) 267 d.Set("virt_auto_boot", profile.VirtAutoBoot) 268 d.Set("virt_bridge", profile.VirtBridge) 269 d.Set("virt_cpus", profile.VirtCPUs) 270 d.Set("virt_disk_driver", profile.VirtDiskDriver) 271 d.Set("virt_file_size", profile.VirtFileSize) 272 d.Set("virt_path", profile.VirtPath) 273 d.Set("virt_ram", profile.VirtRam) 274 d.Set("virt_type", profile.VirtType) 275 276 // Split repos into a list 277 repos := strings.Split(profile.Repos, " ") 278 d.Set("repos", repos) 279 280 return nil 281 } 282 283 func resourceProfileUpdate(d *schema.ResourceData, meta interface{}) error { 284 config := meta.(*Config) 285 286 // Create a cobblerclient.Profile struct 287 profile := buildProfile(d, config) 288 289 // Attempt to update the profile with new information 290 log.Printf("[DEBUG] Cobbler Profile: Updating Profile (%s) with options: %+v", d.Id(), profile) 291 err := config.cobblerClient.UpdateProfile(&profile) 292 if err != nil { 293 return fmt.Errorf("Cobbler Profile: Error Updating (%s): %s", d.Id(), err) 294 } 295 296 return resourceProfileRead(d, meta) 297 } 298 299 func resourceProfileDelete(d *schema.ResourceData, meta interface{}) error { 300 config := meta.(*Config) 301 302 // Attempt to delete the profile 303 if err := config.cobblerClient.DeleteProfile(d.Id()); err != nil { 304 return fmt.Errorf("Cobbler Profile: Error Deleting (%s): %s", d.Id(), err) 305 } 306 307 return nil 308 } 309 310 // buildProfile builds a cobblerclient.Profile out of the Terraform attributes 311 func buildProfile(d *schema.ResourceData, meta interface{}) cobbler.Profile { 312 mgmtClasses := []string{} 313 for _, i := range d.Get("mgmt_classes").([]interface{}) { 314 mgmtClasses = append(mgmtClasses, i.(string)) 315 } 316 317 nameServersSearch := []string{} 318 for _, i := range d.Get("name_servers_search").([]interface{}) { 319 nameServersSearch = append(nameServersSearch, i.(string)) 320 } 321 322 nameServers := []string{} 323 for _, i := range d.Get("name_servers").([]interface{}) { 324 nameServers = append(nameServers, i.(string)) 325 } 326 327 owners := []string{} 328 for _, i := range d.Get("owners").([]interface{}) { 329 owners = append(owners, i.(string)) 330 } 331 332 repos := []string{} 333 for _, i := range d.Get("repos").([]interface{}) { 334 repos = append(repos, i.(string)) 335 } 336 337 profile := cobbler.Profile{ 338 BootFiles: d.Get("boot_files").(string), 339 Comment: d.Get("comment").(string), 340 Distro: d.Get("distro").(string), 341 EnableGPXE: d.Get("enable_gpxe").(bool), 342 EnableMenu: d.Get("enable_menu").(bool), 343 FetchableFiles: d.Get("fetchable_files").(string), 344 KernelOptions: d.Get("kernel_options").(string), 345 KernelOptionsPost: d.Get("kernel_options_post").(string), 346 Kickstart: d.Get("kickstart").(string), 347 KSMeta: d.Get("ks_meta").(string), 348 MGMTClasses: mgmtClasses, 349 MGMTParameters: d.Get("mgmt_parameters").(string), 350 Name: d.Get("name").(string), 351 NameServersSearch: nameServersSearch, 352 NameServers: nameServers, 353 Owners: owners, 354 Parent: d.Get("parent").(string), 355 Proxy: d.Get("proxy").(string), 356 RedHatManagementKey: d.Get("redhat_management_key").(string), 357 RedHatManagementServer: d.Get("redhat_management_server").(string), 358 Repos: strings.Join(repos, " "), 359 Server: d.Get("server").(string), 360 TemplateFiles: d.Get("template_files").(string), 361 TemplateRemoteKickstarts: d.Get("template_remote_kickstarts").(int), 362 VirtAutoBoot: d.Get("virt_auto_boot").(string), 363 VirtBridge: d.Get("virt_bridge").(string), 364 VirtCPUs: d.Get("virt_cpus").(string), 365 VirtDiskDriver: d.Get("virt_disk_driver").(string), 366 VirtFileSize: d.Get("virt_file_size").(string), 367 VirtPath: d.Get("virt_path").(string), 368 VirtRam: d.Get("virt_ram").(string), 369 VirtType: d.Get("virt_type").(string), 370 } 371 372 return profile 373 }