utils.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package docker
  2. import (
  3. "github.com/dotcloud/docker/archive"
  4. "github.com/dotcloud/docker/nat"
  5. "github.com/dotcloud/docker/pkg/namesgenerator"
  6. "github.com/dotcloud/docker/runconfig"
  7. "github.com/dotcloud/docker/utils"
  8. "io"
  9. "sync/atomic"
  10. )
  11. type Change struct {
  12. archive.Change
  13. }
  14. func migratePortMappings(config *runconfig.Config, hostConfig *runconfig.HostConfig) error {
  15. if config.PortSpecs != nil {
  16. ports, bindings, err := nat.ParsePortSpecs(config.PortSpecs)
  17. if err != nil {
  18. return err
  19. }
  20. config.PortSpecs = nil
  21. if len(bindings) > 0 {
  22. if hostConfig == nil {
  23. hostConfig = &runconfig.HostConfig{}
  24. }
  25. hostConfig.PortBindings = bindings
  26. }
  27. if config.ExposedPorts == nil {
  28. config.ExposedPorts = make(nat.PortSet, len(ports))
  29. }
  30. for k, v := range ports {
  31. config.ExposedPorts[k] = v
  32. }
  33. }
  34. return nil
  35. }
  36. // Links come in the format of
  37. // name:alias
  38. func parseLink(rawLink string) (map[string]string, error) {
  39. return utils.PartParser("name:alias", rawLink)
  40. }
  41. type checker struct {
  42. runtime *Runtime
  43. }
  44. func (c *checker) Exists(name string) bool {
  45. return c.runtime.containerGraph.Exists("/" + name)
  46. }
  47. // Generate a random and unique name
  48. func generateRandomName(runtime *Runtime) (string, error) {
  49. return namesgenerator.GenerateRandomName(&checker{runtime})
  50. }
  51. // Read an io.Reader and call a function when it returns EOF
  52. func EofReader(r io.Reader, callback func()) *eofReader {
  53. return &eofReader{
  54. Reader: r,
  55. callback: callback,
  56. }
  57. }
  58. type eofReader struct {
  59. io.Reader
  60. gotEOF int32
  61. callback func()
  62. }
  63. func (r *eofReader) Read(p []byte) (n int, err error) {
  64. n, err = r.Reader.Read(p)
  65. if err == io.EOF {
  66. // Use atomics to make the gotEOF check threadsafe
  67. if atomic.CompareAndSwapInt32(&r.gotEOF, 0, 1) {
  68. r.callback()
  69. }
  70. }
  71. return
  72. }