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") + } + +}