Skip to content

Commit e9b2135

Browse files
DrFaust92wyardley
authored andcommitted
container - add hugepages config (GoogleCloudPlatform#11541)
Signed-off-by: drfaust92 <[email protected]> Co-authored-by: Will Yardley <[email protected]>
1 parent 48e4304 commit e9b2135

File tree

3 files changed

+146
-2
lines changed

3 files changed

+146
-2
lines changed

mmv1/third_party/terraform/services/container/node_config.go.erb

+64-2
Original file line numberDiff line numberDiff line change
@@ -647,6 +647,26 @@ func schemaNodeConfig() *schema.Schema {
647647
Description: `cgroupMode specifies the cgroup mode to be used on the node.`,
648648
DiffSuppressFunc: tpgresource.EmptyOrDefaultStringSuppress("CGROUP_MODE_UNSPECIFIED"),
649649
},
650+
"hugepages_config": {
651+
Type: schema.TypeList,
652+
Optional: true,
653+
MaxItems: 1,
654+
Description: `Amounts for 2M and 1G hugepages.`,
655+
Elem: &schema.Resource{
656+
Schema: map[string]*schema.Schema{
657+
"hugepage_size_2m": {
658+
Type: schema.TypeInt,
659+
Optional: true,
660+
Description: `Amount of 2M hugepages.`,
661+
},
662+
"hugepage_size_1g": {
663+
Type: schema.TypeInt,
664+
Optional: true,
665+
Description: `Amount of 1G hugepages.`,
666+
},
667+
},
668+
},
669+
},
650670
},
651671
},
652672
},
@@ -1246,6 +1266,10 @@ func expandLinuxNodeConfig(v interface{}) *container.LinuxNodeConfig {
12461266
linuxNodeConfig.CgroupMode = cgroupMode
12471267
}
12481268

1269+
if v, ok := cfg["hugepages_config"]; ok {
1270+
linuxNodeConfig.Hugepages = expandHugepagesConfig(v)
1271+
}
1272+
12491273
return linuxNodeConfig
12501274
}
12511275

@@ -1270,6 +1294,32 @@ func expandCgroupMode(cfg map[string]interface{}) string {
12701294
return cgroupMode.(string)
12711295
}
12721296

1297+
func expandHugepagesConfig(v interface{}) *container.HugepagesConfig {
1298+
if v == nil {
1299+
return nil
1300+
}
1301+
ls := v.([]interface{})
1302+
if len(ls) == 0 {
1303+
return nil
1304+
}
1305+
if ls[0] == nil {
1306+
return &container.HugepagesConfig{}
1307+
}
1308+
cfg := ls[0].(map[string]interface{})
1309+
1310+
hugepagesConfig := &container.HugepagesConfig{}
1311+
1312+
if v, ok := cfg["hugepage_size_2m"]; ok {
1313+
hugepagesConfig.HugepageSize2m = int64(v.(int))
1314+
}
1315+
1316+
if v, ok := cfg["hugepage_size_1g"]; ok {
1317+
hugepagesConfig.HugepageSize1g = int64(v.(int))
1318+
}
1319+
1320+
return hugepagesConfig
1321+
}
1322+
12731323
func expandContainerdConfig(v interface{}) *container.ContainerdConfig {
12741324
if v == nil {
12751325
return nil
@@ -1800,8 +1850,20 @@ func flattenLinuxNodeConfig(c *container.LinuxNodeConfig) []map[string]interface
18001850
result := []map[string]interface{}{}
18011851
if c != nil {
18021852
result = append(result, map[string]interface{}{
1803-
"sysctls": c.Sysctls,
1804-
"cgroup_mode": c.CgroupMode,
1853+
"sysctls": c.Sysctls,
1854+
"cgroup_mode": c.CgroupMode,
1855+
"hugepages_config": flattenHugepagesConfig(c.Hugepages),
1856+
})
1857+
}
1858+
return result
1859+
}
1860+
1861+
func flattenHugepagesConfig(c *container.HugepagesConfig) []map[string]interface{} {
1862+
result := []map[string]interface{}{}
1863+
if c != nil {
1864+
result = append(result, map[string]interface{}{
1865+
"hugepage_size_2m": c.HugepageSize2m,
1866+
"hugepage_size_1g": c.HugepageSize1g,
18051867
})
18061868
}
18071869
return result

mmv1/third_party/terraform/services/container/resource_container_node_pool_test.go.erb

+74
Original file line numberDiff line numberDiff line change
@@ -671,6 +671,40 @@ func TestAccContainerNodePool_withCgroupMode(t *testing.T) {
671671
})
672672
}
673673

674+
func TestAccContainerNodePool_withHugepageConfig(t *testing.T) {
675+
t.Parallel()
676+
677+
cluster := fmt.Sprintf("tf-test-cluster-%s", acctest.RandString(t, 10))
678+
np := fmt.Sprintf("tf-test-np-%s", acctest.RandString(t, 10))
679+
networkName := acctest.BootstrapSharedTestNetwork(t, "gke-cluster")
680+
subnetworkName := acctest.BootstrapSubnet(t, "gke-cluster", networkName)
681+
682+
acctest.VcrTest(t, resource.TestCase{
683+
PreCheck: func() { acctest.AccTestPreCheck(t) },
684+
ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
685+
CheckDestroy: testAccCheckContainerClusterDestroyProducer(t),
686+
Steps: []resource.TestStep{
687+
{
688+
Config: testAccContainerNodePool_withHugepageConfig(cluster, np, networkName, subnetworkName, 1),
689+
},
690+
{
691+
ResourceName: "google_container_node_pool.np",
692+
ImportState: true,
693+
ImportStateVerify: true,
694+
},
695+
// Perform an update.
696+
{
697+
Config: testAccContainerNodePool_withHugepageConfig(cluster, np, networkName, subnetworkName, 2),
698+
},
699+
{
700+
ResourceName: "google_container_node_pool.np",
701+
ImportState: true,
702+
ImportStateVerify: true,
703+
},
704+
},
705+
})
706+
}
707+
674708
func TestAccContainerNodePool_withNetworkConfig(t *testing.T) {
675709
t.Parallel()
676710

@@ -3391,6 +3425,46 @@ resource "google_container_node_pool" "with_tier1_net" {
33913425
`, network, cluster, np, np, np, np, netTier)
33923426
}
33933427

3428+
3429+
func testAccContainerNodePool_withHugepageConfig(cluster, np, networkName, subnetworkName string, hugepage int) string {
3430+
return fmt.Sprintf(`
3431+
data "google_container_engine_versions" "central1a" {
3432+
location = "us-central1-a"
3433+
}
3434+
3435+
resource "google_container_cluster" "cluster" {
3436+
name = "%s"
3437+
location = "us-central1-a"
3438+
initial_node_count = 1
3439+
min_master_version = data.google_container_engine_versions.central1a.latest_master_version
3440+
deletion_protection = false
3441+
network = "%s"
3442+
subnetwork = "%s"
3443+
}
3444+
3445+
resource "google_container_node_pool" "np" {
3446+
name = "%s"
3447+
location = "us-central1-a"
3448+
cluster = google_container_cluster.cluster.name
3449+
initial_node_count = 1
3450+
node_config {
3451+
image_type = "COS_CONTAINERD"
3452+
machine_type = "c2d-standard-2" # This is required for hugepage_size_1g https://cloud.google.com/kubernetes-engine/docs/how-to/node-system-config#huge-page-options
3453+
linux_node_config {
3454+
hugepages_config {
3455+
hugepage_size_2m = %d
3456+
hugepage_size_1g = %d
3457+
}
3458+
}
3459+
oauth_scopes = [
3460+
"https://www.googleapis.com/auth/logging.write",
3461+
"https://www.googleapis.com/auth/monitoring",
3462+
]
3463+
}
3464+
}
3465+
`, cluster, networkName, subnetworkName, np, hugepage, hugepage)
3466+
}
3467+
33943468
func testAccContainerNodePool_withMultiNicNetworkConfig(cluster, np, network string) string {
33953469
return fmt.Sprintf(`
33963470
resource "google_compute_network" "container_network" {

mmv1/third_party/terraform/website/docs/r/container_cluster.html.markdown

+8
Original file line numberDiff line numberDiff line change
@@ -1328,6 +1328,14 @@ linux_node_config {
13281328
* `CGROUP_MODE_V1`: CGROUP_MODE_V1 specifies to use cgroupv1 for the cgroup configuration on the node image.
13291329
* `CGROUP_MODE_V2`: CGROUP_MODE_V2 specifies to use cgroupv2 for the cgroup configuration on the node image.
13301330

1331+
* `hugepages_config` - (Optional) Amounts for 2M and 1G hugepages. Structure is [documented below](#nested_hugepages_config).
1332+
1333+
<a name="nested_hugepages_config"></a>The `hugepages_config` block supports:
1334+
1335+
* `hugepage_size_2m` - (Optional) Amount of 2M hugepages.
1336+
1337+
* `hugepage_size_1g` - (Optional) Amount of 1G hugepages.
1338+
13311339
<a name="nested_containerd_config"></a>The `containerd_config` block supports:
13321340

13331341
* `private_registry_access_config` (Optional) - Configuration for private container registries. There are two fields in this config:

0 commit comments

Comments
 (0)