From 3faaf4cee706f4b7e594c17c0c41dc716126e075 Mon Sep 17 00:00:00 2001 From: James Rasell Date: Mon, 2 Nov 2020 10:18:29 +0100 Subject: [PATCH 1/6] datasource: add Nomad scheduler config data source. --- go.mod | 1 + nomad/data_source_scheduler_config.go | 54 +++++++++++++++++++++++++++ nomad/provider.go | 1 + 3 files changed, 56 insertions(+) create mode 100644 nomad/data_source_scheduler_config.go diff --git a/go.mod b/go.mod index 433c6ae4..2b797af3 100644 --- a/go.mod +++ b/go.mod @@ -13,6 +13,7 @@ exclude ( require ( github.com/google/go-cmp v0.5.0 + github.com/hashicorp/go-multierror v1.1.0 github.com/hashicorp/go-version v1.2.1 github.com/hashicorp/nomad v0.12.5-0.20201029140339-d6255129a300 github.com/hashicorp/nomad/api v0.0.0-20201028165800-38e23b62a770 diff --git a/nomad/data_source_scheduler_config.go b/nomad/data_source_scheduler_config.go new file mode 100644 index 00000000..7bce9c02 --- /dev/null +++ b/nomad/data_source_scheduler_config.go @@ -0,0 +1,54 @@ +package nomad + +import ( + "fmt" + + "github.com/hashicorp/terraform-plugin-sdk/helper/resource" + "github.com/hashicorp/terraform-plugin-sdk/helper/schema" +) + +func dataSourceSchedulerConfig() *schema.Resource { + return &schema.Resource{ + Read: dataSourceSchedulerConfigRead, + + Schema: map[string]*schema.Schema{ + "scheduler_algorithm": { + Description: "Specifies whether scheduler binpacks or spreads allocations on available nodes.", + Type: schema.TypeString, + Computed: true, + }, + "preemption_config": { + Description: "Options to enable preemption for various schedulers.", + Computed: true, + Type: schema.TypeMap, + Elem: &schema.Schema{Type: schema.TypeBool}, + }, + }, + } +} + +func dataSourceSchedulerConfigRead(d *schema.ResourceData, meta interface{}) error { + + client := meta.(ProviderConfig).client + + schedCfg, _, err := client.Operator().SchedulerGetConfiguration(nil) + if err != nil { + return fmt.Errorf("failed to query scheduler config: %v", err) + } + + // Set a unique ID, as we have nothing else to go on. + d.SetId(resource.UniqueId()) + + if err := d.Set("scheduler_algorithm", schedCfg.SchedulerConfig.SchedulerAlgorithm); err != nil { + return fmt.Errorf("failed to set scheduler_algorithm: %v", err) + } + premptMap := map[string]bool{ + "batch_scheduler_enabled": schedCfg.SchedulerConfig.PreemptionConfig.BatchSchedulerEnabled, + "service_scheduler_enabled": schedCfg.SchedulerConfig.PreemptionConfig.ServiceSchedulerEnabled, + "system_scheduler_enabled": schedCfg.SchedulerConfig.PreemptionConfig.SystemSchedulerEnabled, + } + if err := d.Set("preemption_config", premptMap); err != nil { + return fmt.Errorf("failed to set preemption_config: %v", err) + } + return nil +} diff --git a/nomad/provider.go b/nomad/provider.go index 481c5a37..cdabf147 100644 --- a/nomad/provider.go +++ b/nomad/provider.go @@ -79,6 +79,7 @@ func Provider() terraform.ResourceProvider { "nomad_plugins": dataSourcePlugins(), "nomad_scaling_policies": dataSourceScalingPolicies(), "nomad_scaling_policy": dataSourceScalingPolicy(), + "nomad_scheduler_config": dataSourceSchedulerConfig(), "nomad_regions": dataSourceRegions(), "nomad_volumes": dataSourceVolumes(), }, From df928e8ce2b95ce7547fca04a567e10cf065e6f7 Mon Sep 17 00:00:00 2001 From: James Rasell Date: Mon, 2 Nov 2020 10:18:54 +0100 Subject: [PATCH 2/6] docs: add scheduler_config datasource docs. --- website/docs/d/scheduler_config.html.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 website/docs/d/scheduler_config.html.md diff --git a/website/docs/d/scheduler_config.html.md b/website/docs/d/scheduler_config.html.md new file mode 100644 index 00000000..dc7c6a26 --- /dev/null +++ b/website/docs/d/scheduler_config.html.md @@ -0,0 +1,24 @@ +--- +layout: "nomad" +page_title: "Nomad: nomad_scheduler_config" +sidebar_current: "docs-nomad-datasource-scheduler-config" +description: |- + Retrieve the cluster's scheduler configuration. +--- + +# nomad_scheduler_config + +Retrieve the cluster's scheduler configuration. + +## Example Usage + +```hcl +data "nomad_scheduler_config" "global" {} +``` + +## Attribute Reference + +The following attributes are exported: + +* `scheduler_algorithm` `(string)` - Specifies whether scheduler binpacks or spreads allocations on available nodes. +* `preemption_config` `(map[string]bool)` - TOptions to enable preemption for various schedulers. From 22d7bd02d7c32139d2a80ec9b3e5eb3c440df7a9 Mon Sep 17 00:00:00 2001 From: James Rasell Date: Mon, 2 Nov 2020 14:37:05 +0100 Subject: [PATCH 3/6] Apply suggestions from code review Co-authored-by: Chris Baker <1675087+cgbaker@users.noreply.github.com> --- website/docs/d/scheduler_config.html.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/docs/d/scheduler_config.html.md b/website/docs/d/scheduler_config.html.md index dc7c6a26..b4c6394b 100644 --- a/website/docs/d/scheduler_config.html.md +++ b/website/docs/d/scheduler_config.html.md @@ -8,7 +8,7 @@ description: |- # nomad_scheduler_config -Retrieve the cluster's scheduler configuration. +Retrieve the cluster's [scheduler configuration](https://www.nomadproject.io/api-docs/operator#sample-response-3). ## Example Usage @@ -21,4 +21,4 @@ data "nomad_scheduler_config" "global" {} The following attributes are exported: * `scheduler_algorithm` `(string)` - Specifies whether scheduler binpacks or spreads allocations on available nodes. -* `preemption_config` `(map[string]bool)` - TOptions to enable preemption for various schedulers. +* `preemption_config` `(map[string]bool)` - Options to enable preemption for various schedulers. From 2329de839c148ca910f31254eda927a88e64900d Mon Sep 17 00:00:00 2001 From: James Rasell Date: Mon, 2 Nov 2020 15:04:46 +0100 Subject: [PATCH 4/6] data/scheduler_config: add basic test. --- nomad/data_source_scheduler_config_test.go | 55 ++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 nomad/data_source_scheduler_config_test.go diff --git a/nomad/data_source_scheduler_config_test.go b/nomad/data_source_scheduler_config_test.go new file mode 100644 index 00000000..51d8d494 --- /dev/null +++ b/nomad/data_source_scheduler_config_test.go @@ -0,0 +1,55 @@ +package nomad + +import ( + "testing" + + "github.com/hashicorp/terraform-plugin-sdk/helper/resource" +) + +func TestAccDataSourceSchedulerConfig_basic(t *testing.T) { + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testProviders, + CheckDestroy: testFinalConfiguration, + Steps: []resource.TestStep{ + { + Config: testAccNomadSchedulerConfigSpread, + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr( + "nomad_scheduler_config.config", + "scheduler_algorithm", + "spread", + ), + resource.TestCheckResourceAttr( + "nomad_scheduler_config.config", + "preemption_config.batch_scheduler_enabled", + "true", + ), + resource.TestCheckResourceAttr( + "nomad_scheduler_config.config", + "preemption_config.service_scheduler_enabled", + "true", + ), + resource.TestCheckResourceAttr( + "nomad_scheduler_config.config", + "preemption_config.system_scheduler_enabled", + "true", + ), + ), + }, + }, + }) +} + +const testAccNomadDataSourceSchedulerConfigS = ` +resource "nomad_scheduler_config" "config" { + scheduler_algorithm = "spread" + preemption_config = { + system_scheduler_enabled = true + batch_scheduler_enabled = true + service_scheduler_enabled = true + } +} + +data "nomad_scheduler_config" "config" {} +` From 1003ec512b95e95f4f1d648f9971edf9361d0331 Mon Sep 17 00:00:00 2001 From: James Rasell Date: Mon, 2 Nov 2020 15:16:48 +0100 Subject: [PATCH 5/6] datasource/scheduler_config: use state writer helper. --- nomad/data_source_scheduler_config.go | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/nomad/data_source_scheduler_config.go b/nomad/data_source_scheduler_config.go index 7bce9c02..2c0993f1 100644 --- a/nomad/data_source_scheduler_config.go +++ b/nomad/data_source_scheduler_config.go @@ -5,6 +5,7 @@ import ( "github.com/hashicorp/terraform-plugin-sdk/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/hashicorp/terraform-provider-nomad/nomad/helper" ) func dataSourceSchedulerConfig() *schema.Resource { @@ -39,16 +40,14 @@ func dataSourceSchedulerConfigRead(d *schema.ResourceData, meta interface{}) err // Set a unique ID, as we have nothing else to go on. d.SetId(resource.UniqueId()) - if err := d.Set("scheduler_algorithm", schedCfg.SchedulerConfig.SchedulerAlgorithm); err != nil { - return fmt.Errorf("failed to set scheduler_algorithm: %v", err) - } premptMap := map[string]bool{ "batch_scheduler_enabled": schedCfg.SchedulerConfig.PreemptionConfig.BatchSchedulerEnabled, "service_scheduler_enabled": schedCfg.SchedulerConfig.PreemptionConfig.ServiceSchedulerEnabled, "system_scheduler_enabled": schedCfg.SchedulerConfig.PreemptionConfig.SystemSchedulerEnabled, } - if err := d.Set("preemption_config", premptMap); err != nil { - return fmt.Errorf("failed to set preemption_config: %v", err) - } - return nil + + sw := helper.NewStateWriter(d) + sw.Set("scheduler_algorithm", schedCfg.SchedulerConfig.SchedulerAlgorithm) + sw.Set("preemption_config", premptMap) + return sw.Error() } From 49ae96483d2fd5885982cab6a2c663a8f3fe3df6 Mon Sep 17 00:00:00 2001 From: Luiz Aoqui Date: Fri, 6 Nov 2020 14:44:40 -0500 Subject: [PATCH 6/6] add sidebar menu item for datasource_scheduler_config --- website/nomad.erb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/website/nomad.erb b/website/nomad.erb index ac1af4cf..516cd026 100644 --- a/website/nomad.erb +++ b/website/nomad.erb @@ -58,6 +58,9 @@ > nomad_regions + > + nomad_scheduler_config + > nomad_volumes