From b2fb7e31167d8b7507b67484bd24977d9791d041 Mon Sep 17 00:00:00 2001 From: Egbert Eich Date: Fri, 8 Jul 2022 17:58:50 +0200 Subject: [PATCH 1/2] Make 'option_value' for dnsmasq optional There are a number of dnsmasq options - like 'no-hosts' that do not require a value. This change will make sure that an entry: resource "libvirt_network" "my_net" { ... dnsmasq_options { options { option_name = "no-hosts" } } } will become: no-hosts in the corresponding dnsmasq.conf file. Signed-off-by: Egbert Eich --- libvirt/data_source_libvirt_network.go | 2 +- libvirt/data_source_libvirt_network_test.go | 9 ++++++++- libvirt/network.go | 10 ++++++++-- libvirt/resource_libvirt_network_test.go | 5 +++++ 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/libvirt/data_source_libvirt_network.go b/libvirt/data_source_libvirt_network.go index 2b3e2b23c..030b0ff0e 100644 --- a/libvirt/data_source_libvirt_network.go +++ b/libvirt/data_source_libvirt_network.go @@ -185,7 +185,7 @@ func datasourceLibvirtNetworkDnsmasqOptionsTemplate() *schema.Resource { }, "option_value": { Type: schema.TypeString, - Required: true, + Optional: true, }, "rendered": { Type: schema.TypeMap, diff --git a/libvirt/data_source_libvirt_network_test.go b/libvirt/data_source_libvirt_network_test.go index 51bfbe11b..33aa75d34 100644 --- a/libvirt/data_source_libvirt_network_test.go +++ b/libvirt/data_source_libvirt_network_test.go @@ -80,7 +80,6 @@ func TestAccLibvirtNetworkDataSource_DNSDnsmasqTemplate(t *testing.T) { PreCheck: func() { testAccPreCheck(t) }, Providers: testAccProviders, Steps: []resource.TestStep{ - { Config: `data "libvirt_network_dnsmasq_options_template" "options" { count = 2 @@ -94,6 +93,14 @@ func TestAccLibvirtNetworkDataSource_DNSDnsmasqTemplate(t *testing.T) { checkTemplate("data.libvirt_network_dnsmasq_options_template.options.1", "option_value", "/.apps.tt1.testing/1.1.1.2"), ), }, + { + Config: `data "libvirt_network_dnsmasq_options_template" "noval_options" { + option_name = "no-hosts" +}`, + Check: resource.ComposeTestCheckFunc( + checkTemplate("data.libvirt_network_dnsmasq_options_template.noval_options", "option_name", "no-hosts"), + ), + }, }, }) } diff --git a/libvirt/network.go b/libvirt/network.go index 7b945f70f..a87a8f078 100644 --- a/libvirt/network.go +++ b/libvirt/network.go @@ -184,12 +184,18 @@ func getDNSMasqOptionFromResource(d *schema.ResourceData) ([]libvirtxml.NetworkD dnsmasqOptionPrefix := "dnsmasq_options.0" if dnsmasqOptionCount, ok := d.GetOk(dnsmasqOptionPrefix + ".options.#"); ok { for i := 0; i < dnsmasqOptionCount.(int); i++ { + var optionString string dnsmasqOptionsPrefix := fmt.Sprintf(dnsmasqOptionPrefix+".options.%d", i) optionName := d.Get(dnsmasqOptionsPrefix + ".option_name").(string) - optionValue := d.Get(dnsmasqOptionsPrefix + ".option_value").(string) + optionValue, ok := d.GetOk(dnsmasqOptionsPrefix + ".option_value") + if ok { + optionString = optionName + "=" + optionValue.(string) + } else { + optionString = optionName + } dnsmasqOption = append(dnsmasqOption, libvirtxml.NetworkDnsmasqOption{ - Value: optionName + "=" + optionValue, + Value: optionString, }) } } diff --git a/libvirt/resource_libvirt_network_test.go b/libvirt/resource_libvirt_network_test.go index 78d269186..51145e283 100644 --- a/libvirt/resource_libvirt_network_test.go +++ b/libvirt/resource_libvirt_network_test.go @@ -653,6 +653,9 @@ func TestAccLibvirtNetwork_DnsmasqOptions(t *testing.T) { option_name = "address" option_value = "/.apps.tt.testing/1.1.1.2" } + options { + option_name = "no-hosts" + } } }`, randomNetworkResource, randomNetworkName), Check: resource.ComposeTestCheckFunc( @@ -660,9 +663,11 @@ func TestAccLibvirtNetwork_DnsmasqOptions(t *testing.T) { resource.TestCheckResourceAttr("libvirt_network."+randomNetworkResource, "dnsmasq_options.0.options.0.option_value", "/tt.testing/1.1.1.1"), resource.TestCheckResourceAttr("libvirt_network."+randomNetworkResource, "dnsmasq_options.0.options.1.option_name", "address"), resource.TestCheckResourceAttr("libvirt_network."+randomNetworkResource, "dnsmasq_options.0.options.1.option_value", "/.apps.tt.testing/1.1.1.2"), + resource.TestCheckResourceAttr("libvirt_network."+randomNetworkResource, "dnsmasq_options.0.options.2.option_name", "no-hosts"), testAccCheckDnsmasqOptions("libvirt_network."+randomNetworkResource, []libvirtxml.NetworkDnsmasqOption{ {Value: "server=/tt.testing/1.1.1.1"}, {Value: "address=/.apps.tt.testing/1.1.1.2"}, + {Value: "no-hosts"}, }), ), }, From 986a1989533e38f9b82c296678acefef519c6572 Mon Sep 17 00:00:00 2001 From: Egbert Eich Date: Sat, 9 Jul 2022 20:03:35 +0200 Subject: [PATCH 2/2] Update documentation to reflect change in dnsmasq options handling --- website/docs/r/network.markdown | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/website/docs/r/network.markdown b/website/docs/r/network.markdown index ecadce40f..43301a6ca 100644 --- a/website/docs/r/network.markdown +++ b/website/docs/r/network.markdown @@ -82,12 +82,16 @@ resource "libvirt_network" "kube_network" { # (Optional) Dnsmasq options configuration dnsmasq_options { - # (Optional) one or more option entries. Both of - # "option_name" and "option_value" must be specified. The format is: + # (Optional) one or more option entries. + # "option_name" muast be specified while "option_value" is + # optional to also support value-less options. The format is: # options { # option_name = "server" # option_value = "/base.domain/my.ip.address.1" # } + # options { + # option_name = "no-hosts" + # } # options { # option_name = "address" # ip = "/.api.base.domain/my.ip.address.2" @@ -205,7 +209,8 @@ resource "libvirt_network" "k8snet" { You need to provide a list of option name and value pairs. * `options` - (Optional) a Dnsmasq option entry block. You can have one or more of these - blocks in your definition. You must specify both `option_name` and `option_value`. + blocks in your definition. You must specify `option_name` while `option_value` is + optional to support value-less options. An example of setting Dnsmasq options (using Dnsmasq option templates) follows: