Skip to content

Commit 0ff51e9

Browse files
Antoine Grondinalexsomesan
andauthored
add projected volumes in pod_spec (#907)
* add projected volumes in pod_spec fixes #818 * Add 'projected' attribute to Pod docs Co-authored-by: Alex Somesan <[email protected]>
1 parent ac03987 commit 0ff51e9

File tree

8 files changed

+817
-2
lines changed

8 files changed

+817
-2
lines changed

kubernetes/resource_kubernetes_pod_test.go

Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -547,6 +547,53 @@ func TestAccKubernetesPod_with_cfg_map_volume_mount(t *testing.T) {
547547
})
548548
}
549549

550+
func TestAccKubernetesPod_with_projected_volume(t *testing.T) {
551+
var conf api.Pod
552+
553+
cfgMapName := fmt.Sprintf("tf-acc-test-%s", acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum))
554+
cfgMap2Name := fmt.Sprintf("tf-acc-test-%s", acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum))
555+
secretName := fmt.Sprintf("tf-acc-test-%s", acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum))
556+
podName := fmt.Sprintf("tf-acc-test-%s", acctest.RandStringFromCharSet(10, acctest.CharSetAlphaNum))
557+
imageName := "busybox:1.32"
558+
559+
resource.Test(t, resource.TestCase{
560+
PreCheck: func() { testAccPreCheck(t) },
561+
Providers: testAccProviders,
562+
CheckDestroy: testAccCheckKubernetesPodDestroy,
563+
Steps: []resource.TestStep{
564+
{
565+
ExpectNonEmptyPlan: true,
566+
Config: testAccKubernetesPodProjectedVolume(cfgMapName, cfgMap2Name, secretName, podName, imageName),
567+
Check: resource.ComposeAggregateTestCheckFunc(
568+
testAccCheckKubernetesPodExists("kubernetes_pod.test", &conf),
569+
resource.TestCheckResourceAttr("kubernetes_pod.test", "spec.0.container.0.image", imageName),
570+
571+
resource.TestCheckResourceAttr("kubernetes_pod.test", "spec.0.volume.#", "1"),
572+
resource.TestCheckResourceAttr("kubernetes_pod.test", "spec.0.volume.0.name", "projected-vol"),
573+
resource.TestCheckResourceAttr("kubernetes_pod.test", "spec.0.volume.0.projected.#", "1"),
574+
resource.TestCheckResourceAttr("kubernetes_pod.test", "spec.0.volume.0.projected.0.default_mode", "0777"),
575+
resource.TestCheckResourceAttr("kubernetes_pod.test", "spec.0.volume.0.projected.0.sources.#", "4"),
576+
resource.TestCheckResourceAttr("kubernetes_pod.test", "spec.0.volume.0.projected.0.sources.0.config_map.#", "1"),
577+
resource.TestCheckResourceAttr("kubernetes_pod.test", "spec.0.volume.0.projected.0.sources.0.config_map.0.name", cfgMapName),
578+
resource.TestCheckResourceAttr("kubernetes_pod.test", "spec.0.volume.0.projected.0.sources.1.config_map.#", "1"),
579+
resource.TestCheckResourceAttr("kubernetes_pod.test", "spec.0.volume.0.projected.0.sources.1.config_map.0.name", cfgMap2Name),
580+
resource.TestCheckResourceAttr("kubernetes_pod.test", "spec.0.volume.0.projected.0.sources.2.secret.#", "1"),
581+
resource.TestCheckResourceAttr("kubernetes_pod.test", "spec.0.volume.0.projected.0.sources.2.secret.0.name", secretName),
582+
resource.TestCheckResourceAttr("kubernetes_pod.test", "spec.0.volume.0.projected.0.sources.3.downward_api.#", "1"),
583+
resource.TestCheckResourceAttr("kubernetes_pod.test", "spec.0.volume.0.projected.0.sources.3.downward_api.0.items.#", "2"),
584+
resource.TestCheckResourceAttr("kubernetes_pod.test", "spec.0.volume.0.projected.0.sources.3.downward_api.0.items.0.path", "labels"),
585+
resource.TestCheckResourceAttr("kubernetes_pod.test", "spec.0.volume.0.projected.0.sources.3.downward_api.0.items.0.field_ref.#", "1"),
586+
resource.TestCheckResourceAttr("kubernetes_pod.test", "spec.0.volume.0.projected.0.sources.3.downward_api.0.items.0.field_ref.0.field_path", "metadata.labels"),
587+
resource.TestCheckResourceAttr("kubernetes_pod.test", "spec.0.volume.0.projected.0.sources.3.downward_api.0.items.1.path", "cpu_limit"),
588+
resource.TestCheckResourceAttr("kubernetes_pod.test", "spec.0.volume.0.projected.0.sources.3.downward_api.0.items.1.resource_field_ref.#", "1"),
589+
resource.TestCheckResourceAttr("kubernetes_pod.test", "spec.0.volume.0.projected.0.sources.3.downward_api.0.items.1.resource_field_ref.0.container_name", "containername"),
590+
resource.TestCheckResourceAttr("kubernetes_pod.test", "spec.0.volume.0.projected.0.sources.3.downward_api.0.items.1.resource_field_ref.0.resource", "limits.cpu"),
591+
),
592+
},
593+
},
594+
})
595+
}
596+
550597
func TestAccKubernetesPod_with_resource_requirements(t *testing.T) {
551598
var conf api.Pod
552599

@@ -1511,6 +1558,133 @@ resource "kubernetes_pod" "test" {
15111558
`, secretName, podName, imageName)
15121559
}
15131560

1561+
func testAccKubernetesPodProjectedVolume(cfgMapName, cfgMap2Name, secretName, podName, imageName string) string {
1562+
return fmt.Sprintf(`
1563+
resource "kubernetes_config_map" "test" {
1564+
metadata {
1565+
name = "%s"
1566+
}
1567+
1568+
binary_data = {
1569+
raw = "${base64encode("Raw data should come back as is in the pod")}"
1570+
}
1571+
1572+
data = {
1573+
one = "first"
1574+
}
1575+
}
1576+
1577+
resource "kubernetes_config_map" "test2" {
1578+
metadata {
1579+
name = "%s"
1580+
}
1581+
1582+
binary_data = {
1583+
raw = "${base64encode("Raw data should come back as is in the pod")}"
1584+
}
1585+
1586+
data = {
1587+
one = "first"
1588+
}
1589+
}
1590+
1591+
resource "kubernetes_secret" "test" {
1592+
metadata {
1593+
name = "%s"
1594+
}
1595+
1596+
data = {
1597+
one = "first"
1598+
}
1599+
}
1600+
1601+
resource "kubernetes_pod" "test" {
1602+
metadata {
1603+
labels = {
1604+
app = "pod_label"
1605+
}
1606+
1607+
name = "%s"
1608+
}
1609+
1610+
spec {
1611+
restart_policy = "Never"
1612+
1613+
container {
1614+
image = "%s"
1615+
name = "containername"
1616+
1617+
command = ["sleep", "3600"]
1618+
1619+
lifecycle {
1620+
post_start {
1621+
exec {
1622+
command = ["/bin/sh", "-xc", "grep 'Raw data should come back as is in the pod' /tmp/my-projected-volume/raw.txt"]
1623+
}
1624+
}
1625+
}
1626+
1627+
volume_mount {
1628+
mount_path = "/tmp/my-projected-volume"
1629+
name = "projected-vol"
1630+
}
1631+
}
1632+
1633+
volume {
1634+
name = "projected-vol"
1635+
projected {
1636+
default_mode = "0777"
1637+
sources {
1638+
config_map {
1639+
name = "${kubernetes_config_map.test.metadata.0.name}"
1640+
items {
1641+
key = "raw"
1642+
path = "raw.txt"
1643+
}
1644+
}
1645+
}
1646+
sources {
1647+
config_map {
1648+
name = "${kubernetes_config_map.test2.metadata.0.name}"
1649+
items {
1650+
key = "raw"
1651+
path = "raw-again.txt"
1652+
}
1653+
}
1654+
}
1655+
sources {
1656+
secret {
1657+
name = "${kubernetes_secret.test.metadata.0.name}"
1658+
items {
1659+
key = "one"
1660+
path = "secret.txt"
1661+
}
1662+
}
1663+
}
1664+
sources {
1665+
downward_api {
1666+
items {
1667+
path = "labels"
1668+
field_ref {
1669+
field_path = "metadata.labels"
1670+
}
1671+
}
1672+
items {
1673+
path = "cpu_limit"
1674+
resource_field_ref {
1675+
container_name = "containername"
1676+
resource = "limits.cpu"
1677+
}
1678+
}
1679+
}
1680+
}
1681+
}
1682+
}
1683+
}
1684+
}
1685+
`, cfgMapName, cfgMap2Name, secretName, podName, imageName)
1686+
}
1687+
15141688
func testAccKubernetesPodConfigWithResourceRequirements(podName, imageName string) string {
15151689
return fmt.Sprintf(`
15161690
resource "kubernetes_pod" "test" {

0 commit comments

Comments
 (0)