diff options
author | Duncan Mac-Vicar P <dmacvicar@suse.de> | 2017-11-16 18:05:01 +0100 |
---|---|---|
committer | Duncan Mac-Vicar P <dmacvicar@suse.de> | 2017-11-24 17:56:44 +0100 |
commit | 8e1bce8a4c28e69f4c84ae33bec7afd70aa7f7aa (patch) | |
tree | 3f36e19dbf57f2546459078eb6d850cddd80d29e /libvirt | |
parent | 8d80cf73c79c5c4bdd15dc28690bb06dfa364f1b (diff) | |
download | terraform-provider-libvirt-8e1bce8a4c28e69f4c84ae33bec7afd70aa7f7aa.tar terraform-provider-libvirt-8e1bce8a4c28e69f4c84ae33bec7afd70aa7f7aa.tar.gz |
Add support for kernel/initrd/cmdline
Diffstat (limited to 'libvirt')
-rw-r--r-- | libvirt/resource_libvirt_domain.go | 39 | ||||
-rw-r--r-- | libvirt/resource_libvirt_domain_test.go | 60 |
2 files changed, 99 insertions, 0 deletions
diff --git a/libvirt/resource_libvirt_domain.go b/libvirt/resource_libvirt_domain.go index a3b16792..81cc2d70 100644 --- a/libvirt/resource_libvirt_domain.go +++ b/libvirt/resource_libvirt_domain.go @@ -170,6 +170,27 @@ func resourceLibvirtDomain() *schema.Resource { Default: "/usr/bin/qemu-system-x86_64", Optional: true, }, + "kernel": &schema.Schema{ + Type: schema.TypeString, + Required: false, + Optional: true, + ForceNew: false, + }, + "initrd": &schema.Schema{ + Type: schema.TypeString, + Required: false, + Optional: true, + ForceNew: false, + }, + "cmdline": &schema.Schema{ + Type: schema.TypeList, + Optional: true, + Required: false, + ForceNew: true, + Elem: &schema.Schema{ + Type: schema.TypeMap, + }, + }, }, } } @@ -267,6 +288,24 @@ func resourceLibvirtDomainCreate(d *schema.ResourceData, meta interface{}) error } } + if kernel, ok := d.GetOk("kernel"); ok { + domainDef.OS.Kernel = kernel.(string) + } + if initrd, ok := d.GetOk("initrd"); ok { + domainDef.OS.Initrd = initrd.(string) + } + + cmdlinesCount := d.Get("cmdline.#").(int) + cmdlineArgs := make([]string, 0) + for i := 0; i < cmdlinesCount; i++ { + cmdlineKey := fmt.Sprintf("cmdline.%d", i) + cmdlineMap := d.Get(cmdlineKey).(map[string]interface{}) + for k, v := range cmdlineMap { + cmdlineArgs = append(cmdlineArgs, fmt.Sprintf("%s=%v", k, v)) + } + } + domainDef.OS.KernelArgs = strings.Join(cmdlineArgs, " ") + if cpu, ok := d.GetOk("cpu"); ok { cpuMap := cpu.(map[string]interface{}) if cpuMode, ok := cpuMap["mode"]; ok { diff --git a/libvirt/resource_libvirt_domain_test.go b/libvirt/resource_libvirt_domain_test.go index 2c9f1b52..29e01095 100644 --- a/libvirt/resource_libvirt_domain_test.go +++ b/libvirt/resource_libvirt_domain_test.go @@ -235,6 +235,40 @@ func TestAccLibvirtDomainURLDisk(t *testing.T) { } +func TestAccLibvirtDomainKernelInitrdCmdline(t *testing.T) { + var domain libvirt.Domain + + var config = fmt.Sprintf(` + resource "libvirt_domain" "acceptance-test-domain" { + name = "terraform-test-domain" + kernel = "/boot/vmlinuz" + initrd = "/boot/initrd" + cmdline { + foo = 1 + bar = "bye" + } + cmdline { + foo = 2 + } + }`) + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckLibvirtDomainDestroy, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: config, + Check: resource.ComposeTestCheckFunc( + testAccCheckLibvirtDomainExists("libvirt_domain.acceptance-test-domain", &domain), + testAccCheckLibvirtDomainKernelInitrdCmdline(&domain), + ), + }, + }, + }) + +} + func TestAccLibvirtDomain_NetworkInterface(t *testing.T) { var domain libvirt.Domain @@ -658,6 +692,32 @@ func testAccCheckLibvirtURLDisk(u *url.URL, domain *libvirt.Domain) resource.Tes } } +func testAccCheckLibvirtDomainKernelInitrdCmdline(domain *libvirt.Domain) resource.TestCheckFunc { + return func(s *terraform.State) error { + xmlDesc, err := domain.GetXMLDesc(0) + if err != nil { + return fmt.Errorf("Error retrieving libvirt domain XML description: %s", err) + } + + domainDef := newDomainDef() + err = xml.Unmarshal([]byte(xmlDesc), &domainDef) + if err != nil { + return fmt.Errorf("Error reading libvirt domain XML description: %s", err) + } + + if domainDef.OS.Kernel != "/boot/vmlinuz" { + return fmt.Errorf("Kernel is not set correctly") + } + if domainDef.OS.Initrd != "/boot/initrd" { + return fmt.Errorf("Initrd is not set correctly") + } + if domainDef.OS.KernelArgs != "bar=bye foo=1 foo=2" { + return fmt.Errorf("Kernel args not set correctly") + } + return nil + } +} + func createNvramFile() (string, error) { // size of an accepted, valid, nvram backing store NVRAMDummyBuffer := make([]byte, 131072) |