diff --git a/pkg/image/dockerv1client/client.go b/pkg/image/dockerv1client/client.go index fd8f0dbaab..cd15cd2794 100644 --- a/pkg/image/dockerv1client/client.go +++ b/pkg/image/dockerv1client/client.go @@ -35,10 +35,13 @@ var ( // convertImageToDockerImage converts an object of type *godockerclient.Image to *docker10.DockerImage func convertImageToDockerImage(in *godockerclient.Image, out *docker10.DockerImage, s conversion.Scope) error { - if err := s.Convert(&in.Config, &out.Config, conversion.AllowDifferentFieldTypeNames); err != nil { + if out.Config == nil { + out.Config = new(docker10.DockerConfig) + } + if err := convertConfigToDockerConfig(in.Config, out.Config); err != nil { return err } - if err := s.Convert(&in.ContainerConfig, &out.ContainerConfig, conversion.AllowDifferentFieldTypeNames); err != nil { + if err := convertConfigToDockerConfig(&in.ContainerConfig, &out.ContainerConfig); err != nil { return err } out.ID = in.ID @@ -53,12 +56,55 @@ func convertImageToDockerImage(in *godockerclient.Image, out *docker10.DockerIma return nil } +// convertConfigToDockerConfig converts an object of type *godockerclient.Config to *docker10.DockerConfig +func convertConfigToDockerConfig(in *godockerclient.Config, out *docker10.DockerConfig) error { + if in == nil { + return nil + } + out.Hostname = in.Hostname + out.Domainname = in.Domainname + out.User = in.User + out.Memory = in.Memory + out.MemorySwap = in.MemorySwap + out.CPUShares = in.CPUShares + out.CPUSet = in.CPUSet + out.AttachStdin = in.AttachStdin + out.AttachStdout = in.AttachStdout + out.AttachStderr = in.AttachStderr + out.PortSpecs = in.PortSpecs + if out.ExposedPorts == nil { + out.ExposedPorts = make(map[string]struct{}) + } + for k, v := range in.ExposedPorts { + out.ExposedPorts[string(k)] = v + } + out.Tty = in.Tty + out.OpenStdin = in.OpenStdin + out.StdinOnce = in.StdinOnce + out.Env = in.Env + out.Cmd = in.Cmd + out.DNS = in.DNS + out.Image = in.Image + out.Volumes = in.Volumes + out.VolumesFrom = in.VolumesFrom + out.WorkingDir = in.WorkingDir + out.Entrypoint = in.Entrypoint + out.NetworkDisabled = in.NetworkDisabled + out.SecurityOpts = in.SecurityOpts + out.OnBuild = in.OnBuild + out.Labels = in.Labels + return nil +} + // convertDockerImageToImage converts an object of type *docker10.DockerImage to *godockerclient.Image func convertDockerImageToImage(in *docker10.DockerImage, out *godockerclient.Image, s conversion.Scope) error { - if err := s.Convert(&in.Config, &out.Config, conversion.AllowDifferentFieldTypeNames); err != nil { + if out.Config == nil { + out.Config = new(godockerclient.Config) + } + if err := convertDockerConfigToConfig(in.Config, out.Config); err != nil { return err } - if err := s.Convert(&in.ContainerConfig, &out.ContainerConfig, conversion.AllowDifferentFieldTypeNames); err != nil { + if err := convertDockerConfigToConfig(&in.ContainerConfig, &out.ContainerConfig); err != nil { return err } out.ID = in.ID @@ -73,6 +119,46 @@ func convertDockerImageToImage(in *docker10.DockerImage, out *godockerclient.Ima return nil } +// convertDockerConfigToConfig converts an object of type *docker10.DockerConfig to *godockerclient.Config +func convertDockerConfigToConfig(in *docker10.DockerConfig, out *godockerclient.Config) error { + if in == nil { + return nil + } + out.Hostname = in.Hostname + out.Domainname = in.Domainname + out.User = in.User + out.Memory = in.Memory + out.MemorySwap = in.MemorySwap + out.CPUShares = in.CPUShares + out.CPUSet = in.CPUSet + out.AttachStdin = in.AttachStdin + out.AttachStdout = in.AttachStdout + out.AttachStderr = in.AttachStderr + out.PortSpecs = in.PortSpecs + if out.ExposedPorts == nil { + out.ExposedPorts = make(map[godockerclient.Port]struct{}) + } + for k, v := range in.ExposedPorts { + out.ExposedPorts[godockerclient.Port(k)] = v + } + out.Tty = in.Tty + out.OpenStdin = in.OpenStdin + out.StdinOnce = in.StdinOnce + out.Env = in.Env + out.Cmd = in.Cmd + out.DNS = in.DNS + out.Image = in.Image + out.Volumes = in.Volumes + out.VolumesFrom = in.VolumesFrom + out.WorkingDir = in.WorkingDir + out.Entrypoint = in.Entrypoint + out.NetworkDisabled = in.NetworkDisabled + out.SecurityOpts = in.SecurityOpts + out.OnBuild = in.OnBuild + out.Labels = in.Labels + return nil +} + func init() { ImageScheme.AddConversionFunc((*godockerclient.Image)(nil), (*docker10.DockerImage)(nil), func(a, b interface{}, scope conversion.Scope) error { return convertImageToDockerImage(a.(*godockerclient.Image), b.(*docker10.DockerImage), scope) diff --git a/pkg/image/dockerv1client/client_test.go b/pkg/image/dockerv1client/client_test.go index d0de6b263c..20b430c5b7 100644 --- a/pkg/image/dockerv1client/client_test.go +++ b/pkg/image/dockerv1client/client_test.go @@ -9,10 +9,22 @@ import ( "strings" "testing" "time" + + "github.com/fsouza/go-dockerclient" + dockerv10 "github.com/openshift/api/image/docker10" ) // tests of running registries are done in the integration client test +func TestImageConversion(t *testing.T) { + if err := ImageScheme.Convert(&docker.Image{}, &dockerv10.DockerImage{}, nil); err != nil { + t.Errorf("Unexpected error when converting Image to DockerImage: %v", err) + } + if err := ImageScheme.Convert(&dockerv10.DockerImage{}, &docker.Image{}, nil); err != nil { + t.Errorf("Unexpected error when converting DockerImage to Image: %v", err) + } +} + func TestHTTPFallback(t *testing.T) { called := make(chan struct{}, 2) var uri *url.URL