From 494133484cf36e71b8d0817ebc2d25529e9718ca Mon Sep 17 00:00:00 2001 From: Suraj Narwade Date: Fri, 10 Mar 2017 16:08:00 +0530 Subject: [PATCH] Added support for tmpfs fixes #436 This commit will add support for tmpfs, configEmptyVolumeSource function is being modified as it have to work in two ways now. (For emptyvols and tmpfs) Added unit test for tmpfs too. --- pkg/kobject/kobject.go | 1 + pkg/loader/compose/compose.go | 2 +- pkg/transformer/kubernetes/k8sutils.go | 12 +++++ pkg/transformer/kubernetes/kubernetes.go | 45 ++++++++++++++++++- pkg/transformer/kubernetes/kubernetes_test.go | 12 +++++ 5 files changed, 69 insertions(+), 3 deletions(-) diff --git a/pkg/kobject/kobject.go b/pkg/kobject/kobject.go index 9ff6ed70..6fd1cfb6 100644 --- a/pkg/kobject/kobject.go +++ b/pkg/kobject/kobject.go @@ -83,6 +83,7 @@ type ServiceConfig struct { Stdin bool `compose:"stdin_open" bundle:""` Tty bool `compose:"tty" bundle:""` MemLimit yaml.MemStringorInt `compose:"mem_limit" bundle:""` + TmpFs []string `compose:"tmpfs" bundle:""` } // EnvVar holds the environment variable struct of a container diff --git a/pkg/loader/compose/compose.go b/pkg/loader/compose/compose.go index dd623e37..dec4ae05 100644 --- a/pkg/loader/compose/compose.go +++ b/pkg/loader/compose/compose.go @@ -375,7 +375,7 @@ func (c *Compose) LoadFile(files []string) (kobject.KomposeObject, error) { serviceConfig.Stdin = composeServiceConfig.StdinOpen serviceConfig.Tty = composeServiceConfig.Tty serviceConfig.MemLimit = composeServiceConfig.MemLimit - + serviceConfig.TmpFs = composeServiceConfig.Tmpfs komposeObject.ServiceConfigs[name] = serviceConfig } diff --git a/pkg/transformer/kubernetes/k8sutils.go b/pkg/transformer/kubernetes/k8sutils.go index c01824d2..257c95ae 100644 --- a/pkg/transformer/kubernetes/k8sutils.go +++ b/pkg/transformer/kubernetes/k8sutils.go @@ -336,6 +336,18 @@ func (k *Kubernetes) UpdateKubernetesObjects(name string, service kobject.Servic if err != nil { return errors.Wrap(err, "k.ConfigVolumes failed") } + // Configure Tmpfs + if len(service.TmpFs) > 0 { + TmpVolumesMount, TmpVolumes := k.ConfigTmpfs(name, service) + + for _, volume := range TmpVolumes { + volumes = append(volumes, volume) + } + for _, vMount := range TmpVolumesMount { + volumesMount = append(volumesMount, vMount) + } + + } if pvc != nil { // Looping on the slice pvc instead of `*objects = append(*objects, pvc...)` diff --git a/pkg/transformer/kubernetes/kubernetes.go b/pkg/transformer/kubernetes/kubernetes.go index 11af5070..5d988e14 100644 --- a/pkg/transformer/kubernetes/kubernetes.go +++ b/pkg/transformer/kubernetes/kubernetes.go @@ -324,6 +324,36 @@ func (k *Kubernetes) ConfigServicePorts(name string, service kobject.ServiceConf return servicePorts } +// ConfigTmpfs configure the tmpfs. +func (k *Kubernetes) ConfigTmpfs(name string, service kobject.ServiceConfig) ([]api.VolumeMount, []api.Volume) { + //initializing volumemounts and volumes + volumeMounts := []api.VolumeMount{} + volumes := []api.Volume{} + + for index, volume := range service.TmpFs { + //naming volumes if multiple tmpfs are provided + volumeName := fmt.Sprintf("%s-tmpfs%d", name, index) + + // create a new volume mount object and append to list + volMount := api.VolumeMount{ + Name: volumeName, + MountPath: volume, + } + volumeMounts = append(volumeMounts, volMount) + + //create tmpfs specific empty volumes + volSource := k.ConfigEmptyVolumeSource("tmpfs") + + // create a new volume object using the volsource and add to list + vol := api.Volume{ + Name: volumeName, + VolumeSource: *volSource, + } + volumes = append(volumes, vol) + } + return volumeMounts, volumes +} + // ConfigVolumes configure the container volumes. func (k *Kubernetes) ConfigVolumes(name string, service kobject.ServiceConfig) ([]api.VolumeMount, []api.Volume, []*api.PersistentVolumeClaim, error) { volumeMounts := []api.VolumeMount{} @@ -369,7 +399,7 @@ func (k *Kubernetes) ConfigVolumes(name string, service kobject.ServiceConfig) ( // For PVC we will also create a PVC object and add to list var volsource *api.VolumeSource if useEmptyVolumes { - volsource = k.ConfigEmptyVolumeSource() + volsource = k.ConfigEmptyVolumeSource("volume") } else { volsource = k.ConfigPVCVolumeSource(volumeName, readonly) @@ -396,10 +426,21 @@ func (k *Kubernetes) ConfigVolumes(name string, service kobject.ServiceConfig) ( } // ConfigEmptyVolumeSource is helper function to create an EmptyDir api.VolumeSource -func (k *Kubernetes) ConfigEmptyVolumeSource() *api.VolumeSource { +//either for Tmpfs or for emptyvolumes +func (k *Kubernetes) ConfigEmptyVolumeSource(key string) *api.VolumeSource { + //if key is tmpfs + if key == "tmpfs" { + return &api.VolumeSource{ + EmptyDir: &api.EmptyDirVolumeSource{Medium: api.StorageMediumMemory}, + } + + } + + //if key is volume return &api.VolumeSource{ EmptyDir: &api.EmptyDirVolumeSource{}, } + } // ConfigPVCVolumeSource is helper function to create an api.VolumeSource with a PVC diff --git a/pkg/transformer/kubernetes/kubernetes_test.go b/pkg/transformer/kubernetes/kubernetes_test.go index ec54ae81..e779d314 100644 --- a/pkg/transformer/kubernetes/kubernetes_test.go +++ b/pkg/transformer/kubernetes/kubernetes_test.go @@ -55,6 +55,7 @@ func newServiceConfig() kobject.ServiceConfig { Restart: "always", Stdin: true, Tty: true, + TmpFs: []string{"/tmp"}, } } @@ -499,3 +500,14 @@ func TestInitPodSpec(t *testing.T) { t.Fatalf("Pod object not found") } } + +func TestConfigTmpfs(t *testing.T) { + name := "foo" + k := Kubernetes{} + resultVolumeMount, resultVolume := k.ConfigTmpfs(name, newServiceConfig()) + + if resultVolumeMount[0].Name != "foo-tmpfs0" || resultVolume[0].EmptyDir.Medium != "Memory" { + t.Fatalf("Tmpfs not found") + } + +}