From 8e1bce8a4c28e69f4c84ae33bec7afd70aa7f7aa Mon Sep 17 00:00:00 2001 From: Duncan Mac-Vicar P Date: Thu, 16 Nov 2017 18:05:01 +0100 Subject: Add support for kernel/initrd/cmdline --- libvirt/resource_libvirt_domain.go | 39 +++++++++++++++++++++ libvirt/resource_libvirt_domain_test.go | 60 +++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+) (limited to 'libvirt') 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) -- cgit v1.2.3