container.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package convert
  2. import (
  3. "fmt"
  4. "strings"
  5. types "github.com/docker/engine-api/types/swarm"
  6. swarmapi "github.com/docker/swarmkit/api"
  7. "github.com/docker/swarmkit/protobuf/ptypes"
  8. )
  9. func containerSpecFromGRPC(c *swarmapi.ContainerSpec) types.ContainerSpec {
  10. containerSpec := types.ContainerSpec{
  11. Image: c.Image,
  12. Labels: c.Labels,
  13. Command: c.Command,
  14. Args: c.Args,
  15. Env: c.Env,
  16. Dir: c.Dir,
  17. User: c.User,
  18. }
  19. // Mounts
  20. for _, m := range c.Mounts {
  21. mount := types.Mount{
  22. Target: m.Target,
  23. Source: m.Source,
  24. Type: types.MountType(strings.ToLower(swarmapi.Mount_MountType_name[int32(m.Type)])),
  25. ReadOnly: m.ReadOnly,
  26. }
  27. if m.BindOptions != nil {
  28. mount.BindOptions = &types.BindOptions{
  29. Propagation: types.MountPropagation(strings.ToLower(swarmapi.Mount_BindOptions_MountPropagation_name[int32(m.BindOptions.Propagation)])),
  30. }
  31. }
  32. if m.VolumeOptions != nil {
  33. mount.VolumeOptions = &types.VolumeOptions{
  34. NoCopy: m.VolumeOptions.NoCopy,
  35. Labels: m.VolumeOptions.Labels,
  36. }
  37. if m.VolumeOptions.DriverConfig != nil {
  38. mount.VolumeOptions.DriverConfig = &types.Driver{
  39. Name: m.VolumeOptions.DriverConfig.Name,
  40. Options: m.VolumeOptions.DriverConfig.Options,
  41. }
  42. }
  43. }
  44. containerSpec.Mounts = append(containerSpec.Mounts, mount)
  45. }
  46. if c.StopGracePeriod != nil {
  47. grace, _ := ptypes.Duration(c.StopGracePeriod)
  48. containerSpec.StopGracePeriod = &grace
  49. }
  50. return containerSpec
  51. }
  52. func containerToGRPC(c types.ContainerSpec) (*swarmapi.ContainerSpec, error) {
  53. containerSpec := &swarmapi.ContainerSpec{
  54. Image: c.Image,
  55. Labels: c.Labels,
  56. Command: c.Command,
  57. Args: c.Args,
  58. Env: c.Env,
  59. Dir: c.Dir,
  60. User: c.User,
  61. }
  62. if c.StopGracePeriod != nil {
  63. containerSpec.StopGracePeriod = ptypes.DurationProto(*c.StopGracePeriod)
  64. }
  65. // Mounts
  66. for _, m := range c.Mounts {
  67. mount := swarmapi.Mount{
  68. Target: m.Target,
  69. Source: m.Source,
  70. ReadOnly: m.ReadOnly,
  71. }
  72. if mountType, ok := swarmapi.Mount_MountType_value[strings.ToUpper(string(m.Type))]; ok {
  73. mount.Type = swarmapi.Mount_MountType(mountType)
  74. } else if string(m.Type) != "" {
  75. return nil, fmt.Errorf("invalid MountType: %q", m.Type)
  76. }
  77. if m.BindOptions != nil {
  78. if mountPropagation, ok := swarmapi.Mount_BindOptions_MountPropagation_value[strings.ToUpper(string(m.BindOptions.Propagation))]; ok {
  79. mount.BindOptions = &swarmapi.Mount_BindOptions{Propagation: swarmapi.Mount_BindOptions_MountPropagation(mountPropagation)}
  80. } else if string(m.BindOptions.Propagation) != "" {
  81. return nil, fmt.Errorf("invalid MountPropagation: %q", m.BindOptions.Propagation)
  82. }
  83. }
  84. if m.VolumeOptions != nil {
  85. mount.VolumeOptions = &swarmapi.Mount_VolumeOptions{
  86. NoCopy: m.VolumeOptions.NoCopy,
  87. Labels: m.VolumeOptions.Labels,
  88. }
  89. if m.VolumeOptions.DriverConfig != nil {
  90. mount.VolumeOptions.DriverConfig = &swarmapi.Driver{
  91. Name: m.VolumeOptions.DriverConfig.Name,
  92. Options: m.VolumeOptions.DriverConfig.Options,
  93. }
  94. }
  95. }
  96. containerSpec.Mounts = append(containerSpec.Mounts, mount)
  97. }
  98. return containerSpec, nil
  99. }