From 95f934071d99ecbee29d7f21f033bd7240cfd34c Mon Sep 17 00:00:00 2001 From: Nick Schuch Date: Tue, 30 Jan 2018 15:43:52 +1000 Subject: [PATCH] Adds hostaliases --- cronjob/cronjob.go | 8 +++- cronjob/read.go | 2 + daemonset/daemonset.go | 4 ++ daemonset/read.go | 2 + deployment/deployment.go | 10 +++-- deployment/read.go | 2 + hostaliases/hostaliases.go | 70 ++++++++++++++++++++++++++++++ hostaliases/hostnames/hostnames.go | 26 +++++++++++ 8 files changed, 119 insertions(+), 5 deletions(-) create mode 100644 hostaliases/hostaliases.go create mode 100644 hostaliases/hostnames/hostnames.go diff --git a/cronjob/cronjob.go b/cronjob/cronjob.go index 6d790d9f..736ab07e 100644 --- a/cronjob/cronjob.go +++ b/cronjob/cronjob.go @@ -9,6 +9,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "github.com/previousnext/terraform-provider-k8s/container" + "github.com/previousnext/terraform-provider-k8s/hostaliases" "github.com/previousnext/terraform-provider-k8s/label" "github.com/previousnext/terraform-provider-k8s/volume" ) @@ -43,8 +44,9 @@ func Resource() *schema.Resource { Description: "ServiceAccount to associate with this CronJob.", Optional: true, }, - "container": container.Fields(), - "volume": volume.Fields(), + "hostaliases": hostaliases.Fields(), + "container": container.Fields(), + "volume": volume.Fields(), }, } } @@ -57,6 +59,7 @@ func generateCronJob(d *schema.ResourceData) (batchv1beta1.CronJob, error) { labels = d.Get("labels").(map[string]interface{}) schedule = d.Get("schedule").(string) serviceaccount = d.Get("service_account").(string) + aliases = d.Get("hostaliases").([]interface{}) containers = d.Get("container").([]interface{}) volumes = d.Get("volume").([]interface{}) ) @@ -90,6 +93,7 @@ func generateCronJob(d *schema.ResourceData) (batchv1beta1.CronJob, error) { Containers: containerList, Volumes: volumeList, ServiceAccountName: serviceaccount, + HostAliases: hostaliases.Expand(aliases), }, }, }, diff --git a/cronjob/read.go b/cronjob/read.go index daf52b26..97a2aba0 100644 --- a/cronjob/read.go +++ b/cronjob/read.go @@ -7,6 +7,7 @@ import ( "k8s.io/client-go/kubernetes" "github.com/previousnext/terraform-provider-k8s/container" + "github.com/previousnext/terraform-provider-k8s/hostaliases" "github.com/previousnext/terraform-provider-k8s/utils/id" "github.com/previousnext/terraform-provider-k8s/volume" ) @@ -34,6 +35,7 @@ func resourceRead(d *schema.ResourceData, m interface{}) error { d.Set("schedule", cronJob.Spec.Schedule) d.Set("service_account", cronJob.Spec.JobTemplate.Spec.Template.Spec.ServiceAccountName) d.Set("container", container.Flatten(cronJob.Spec.JobTemplate.Spec.Template.Spec.Containers)) + d.Set("hostaliases", hostaliases.Flatten(cronJob.Spec.JobTemplate.Spec.Template.Spec.HostAliases)) d.Set("volume", volume.Flatten(cronJob.Spec.JobTemplate.Spec.Template.Spec.Volumes)) return nil diff --git a/daemonset/daemonset.go b/daemonset/daemonset.go index cfad48a7..fcdc5d81 100644 --- a/daemonset/daemonset.go +++ b/daemonset/daemonset.go @@ -8,6 +8,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "github.com/previousnext/terraform-provider-k8s/container" + "github.com/previousnext/terraform-provider-k8s/hostaliases" "github.com/previousnext/terraform-provider-k8s/label" "github.com/previousnext/terraform-provider-k8s/volume" ) @@ -44,6 +45,7 @@ func Resource() *schema.Resource { Optional: true, }, "init_container": container.Fields(), + "hostaliases": hostaliases.Fields(), "container": container.Fields(), "volume": volume.Fields(), }, @@ -59,6 +61,7 @@ func generateDaemonSet(d *schema.ResourceData) (appsv1beta2.DaemonSet, error) { hostNetwork = d.Get("host_network").(bool) serviceAccount = d.Get("service_account").(string) initContainer = d.Get("init_container").([]interface{}) + aliases = d.Get("hostaliases").([]interface{}) containers = d.Get("container").([]interface{}) volumes = d.Get("volume").([]interface{}) ) @@ -98,6 +101,7 @@ func generateDaemonSet(d *schema.ResourceData) (appsv1beta2.DaemonSet, error) { InitContainers: initContainerList, Containers: containerList, Volumes: volumeList, + HostAliases: hostaliases.Expand(aliases), }, }, }, diff --git a/daemonset/read.go b/daemonset/read.go index 3fd15939..56023962 100644 --- a/daemonset/read.go +++ b/daemonset/read.go @@ -7,6 +7,7 @@ import ( "k8s.io/client-go/kubernetes" "github.com/previousnext/terraform-provider-k8s/container" + "github.com/previousnext/terraform-provider-k8s/hostaliases" "github.com/previousnext/terraform-provider-k8s/utils/id" "github.com/previousnext/terraform-provider-k8s/volume" ) @@ -32,6 +33,7 @@ func resourceRead(d *schema.ResourceData, m interface{}) error { d.Set("namespace", daemonset.ObjectMeta.Namespace) d.Set("service_account", daemonset.Spec.Template.Spec.ServiceAccountName) d.Set("labels", daemonset.ObjectMeta.Labels) + d.Set("hostaliases", hostaliases.Flatten(daemonset.Spec.Template.Spec.HostAliases)) d.Set("container", container.Flatten(daemonset.Spec.Template.Spec.Containers)) d.Set("volume", volume.Flatten(daemonset.Spec.Template.Spec.Volumes)) diff --git a/deployment/deployment.go b/deployment/deployment.go index eaa01b0c..41da5cf8 100644 --- a/deployment/deployment.go +++ b/deployment/deployment.go @@ -8,6 +8,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "github.com/previousnext/terraform-provider-k8s/container" + "github.com/previousnext/terraform-provider-k8s/hostaliases" "github.com/previousnext/terraform-provider-k8s/label" "github.com/previousnext/terraform-provider-k8s/volume" ) @@ -36,9 +37,10 @@ func Resource() *schema.Resource { Description: "ServiceAccount to associate with this Deployment.", Optional: true, }, - "labels": label.Fields(), - "container": container.Fields(), - "volume": volume.Fields(), + "labels": label.Fields(), + "container": container.Fields(), + "hostaliases": hostaliases.Fields(), + "volume": volume.Fields(), }, } } @@ -49,6 +51,7 @@ func generateDeployment(d *schema.ResourceData) (appsv1beta2.Deployment, error) namespace = d.Get("namespace").(string) serviceaccount = d.Get("service_account").(string) labels = d.Get("labels").(map[string]interface{}) + aliases = d.Get("hostaliases").([]interface{}) containers = d.Get("container").([]interface{}) volumes = d.Get("volume").([]interface{}) ) @@ -81,6 +84,7 @@ func generateDeployment(d *schema.ResourceData) (appsv1beta2.Deployment, error) ServiceAccountName: serviceaccount, Containers: containerList, Volumes: volumeList, + HostAliases: hostaliases.Expand(aliases), }, }, }, diff --git a/deployment/read.go b/deployment/read.go index b70d36d4..62bf8fd0 100644 --- a/deployment/read.go +++ b/deployment/read.go @@ -9,6 +9,7 @@ import ( "k8s.io/client-go/kubernetes" "github.com/previousnext/terraform-provider-k8s/container" + "github.com/previousnext/terraform-provider-k8s/hostaliases" "github.com/previousnext/terraform-provider-k8s/utils/id" "github.com/previousnext/terraform-provider-k8s/volume" ) @@ -39,6 +40,7 @@ func resourceRead(d *schema.ResourceData, m interface{}) error { d.Set("service_account", deployment.Spec.Template.Spec.ServiceAccountName) d.Set("labels", deployment.ObjectMeta.Labels) d.Set("image", deployment.Spec.Template.Spec.Containers[0].Image) + d.Set("hostaliases", hostaliases.Flatten(deployment.Spec.Template.Spec.HostAliases)) d.Set("container", container.Flatten(deployment.Spec.Template.Spec.Containers)) d.Set("volume", volume.Flatten(deployment.Spec.Template.Spec.Volumes)) diff --git a/hostaliases/hostaliases.go b/hostaliases/hostaliases.go new file mode 100644 index 00000000..e6cf7e17 --- /dev/null +++ b/hostaliases/hostaliases.go @@ -0,0 +1,70 @@ +package hostaliases + +import ( + "github.com/hashicorp/terraform/helper/schema" + "github.com/previousnext/terraform-provider-k8s/hostaliases/hostnames" + corev1 "k8s.io/api/core/v1" +) + +// Fields returns the fields for this package. +func Fields() *schema.Schema { + return &schema.Schema{ + Type: schema.TypeList, + Description: "Environment variables which can be set for a container", + Optional: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "ip": { + Type: schema.TypeString, + Required: true, + Description: "IP Address of the host.", + }, + "hostnames": hostnames.Fields(), + }, + }, + } +} + +// Expand will return a structured object. +func Expand(in []interface{}) []corev1.HostAlias { + if len(in) == 0 { + return []corev1.HostAlias{} + } + + aliases := make([]corev1.HostAlias, len(in)) + + for key, v := range in { + value := v.(map[string]interface{}) + + if ip, ok := value["ip"]; ok && ip != "" { + aliases[key].IP = ip.(string) + } + + if hosts, ok := value["hostnames"]; ok { + aliases[key].Hostnames = hostnames.Expand(hosts.([]interface{})) + } + } + + return aliases +} + +// Flatten structured object into unstructured. +func Flatten(in []corev1.HostAlias) []interface{} { + flattened := make([]interface{}, len(in)) + + for key, value := range in { + row := map[string]interface{}{} + + if value.IP != "" { + row["ip"] = value.IP + } + + if len(value.Hostnames) > 0 { + row["hostnames"] = value.Hostnames + } + + flattened[key] = row + } + + return flattened +} diff --git a/hostaliases/hostnames/hostnames.go b/hostaliases/hostnames/hostnames.go new file mode 100644 index 00000000..27af4407 --- /dev/null +++ b/hostaliases/hostnames/hostnames.go @@ -0,0 +1,26 @@ +package hostnames + +import ( + "github.com/hashicorp/terraform/helper/schema" +) + +// Fields returns the fields for this package. +func Fields() *schema.Schema { + return &schema.Schema{ + Type: schema.TypeList, + Description: "Hostnames to assign to an IP.", + Optional: true, + Elem: &schema.Schema{Type: schema.TypeString}, + } +} + +// Expand will return a structured object. +func Expand(s []interface{}) []string { + result := make([]string, len(s), len(s)) + + for k, v := range s { + result[k] = v.(string) + } + + return result +}