Browse code

Refactor pkg/common, Fixes #11599

Signed-off-by: Antonio Murdaca <me@runcom.ninja>

Antonio Murdaca authored on 2015/03/24 20:25:26
Showing 34 changed files
... ...
@@ -33,7 +33,6 @@ import (
33 33
 	"github.com/docker/docker/nat"
34 34
 	"github.com/docker/docker/opts"
35 35
 	"github.com/docker/docker/pkg/archive"
36
-	"github.com/docker/docker/pkg/common"
37 36
 	"github.com/docker/docker/pkg/fileutils"
38 37
 	"github.com/docker/docker/pkg/homedir"
39 38
 	flag "github.com/docker/docker/pkg/mflag"
... ...
@@ -43,6 +42,7 @@ import (
43 43
 	"github.com/docker/docker/pkg/promise"
44 44
 	"github.com/docker/docker/pkg/resolvconf"
45 45
 	"github.com/docker/docker/pkg/signal"
46
+	"github.com/docker/docker/pkg/stringid"
46 47
 	"github.com/docker/docker/pkg/symlink"
47 48
 	"github.com/docker/docker/pkg/term"
48 49
 	"github.com/docker/docker/pkg/timeutils"
... ...
@@ -1165,7 +1165,7 @@ func (cli *DockerCli) CmdHistory(args ...string) error {
1165 1165
 			if *noTrunc {
1166 1166
 				fmt.Fprintf(w, "%s\t", outID)
1167 1167
 			} else {
1168
-				fmt.Fprintf(w, "%s\t", common.TruncateID(outID))
1168
+				fmt.Fprintf(w, "%s\t", stringid.TruncateID(outID))
1169 1169
 			}
1170 1170
 
1171 1171
 			fmt.Fprintf(w, "%s ago\t", units.HumanDuration(time.Now().UTC().Sub(time.Unix(out.GetInt64("Created"), 0))))
... ...
@@ -1180,7 +1180,7 @@ func (cli *DockerCli) CmdHistory(args ...string) error {
1180 1180
 			if *noTrunc {
1181 1181
 				fmt.Fprintln(w, outID)
1182 1182
 			} else {
1183
-				fmt.Fprintln(w, common.TruncateID(outID))
1183
+				fmt.Fprintln(w, stringid.TruncateID(outID))
1184 1184
 			}
1185 1185
 		}
1186 1186
 	}
... ...
@@ -1479,7 +1479,7 @@ func (cli *DockerCli) CmdImages(args ...string) error {
1479 1479
 			}
1480 1480
 
1481 1481
 			if matchName != "" {
1482
-				if matchName == image.Get("Id") || matchName == common.TruncateID(image.Get("Id")) {
1482
+				if matchName == image.Get("Id") || matchName == stringid.TruncateID(image.Get("Id")) {
1483 1483
 					startImage = image
1484 1484
 				}
1485 1485
 
... ...
@@ -1549,7 +1549,7 @@ func (cli *DockerCli) CmdImages(args ...string) error {
1549 1549
 		for _, out := range outs.Data {
1550 1550
 			outID := out.Get("Id")
1551 1551
 			if !*noTrunc {
1552
-				outID = common.TruncateID(outID)
1552
+				outID = stringid.TruncateID(outID)
1553 1553
 			}
1554 1554
 
1555 1555
 			repoTags := out.GetList("RepoTags")
... ...
@@ -1629,8 +1629,8 @@ func (cli *DockerCli) printVizNode(noTrunc bool, image *engine.Env, prefix strin
1629 1629
 		imageID = image.Get("Id")
1630 1630
 		parentID = image.Get("ParentId")
1631 1631
 	} else {
1632
-		imageID = common.TruncateID(image.Get("Id"))
1633
-		parentID = common.TruncateID(image.Get("ParentId"))
1632
+		imageID = stringid.TruncateID(image.Get("Id"))
1633
+		parentID = stringid.TruncateID(image.Get("ParentId"))
1634 1634
 	}
1635 1635
 	if parentID == "" {
1636 1636
 		fmt.Fprintf(cli.out, " base -> \"%s\" [style=invis]\n", imageID)
... ...
@@ -1649,7 +1649,7 @@ func (cli *DockerCli) printTreeNode(noTrunc bool, image *engine.Env, prefix stri
1649 1649
 	if noTrunc {
1650 1650
 		imageID = image.Get("Id")
1651 1651
 	} else {
1652
-		imageID = common.TruncateID(image.Get("Id"))
1652
+		imageID = stringid.TruncateID(image.Get("Id"))
1653 1653
 	}
1654 1654
 
1655 1655
 	fmt.Fprintf(cli.out, "%s%s Virtual Size: %s", prefix, imageID, units.HumanSize(float64(image.GetInt64("VirtualSize"))))
... ...
@@ -1757,7 +1757,7 @@ func (cli *DockerCli) CmdPs(args ...string) error {
1757 1757
 		outID := out.Get("Id")
1758 1758
 
1759 1759
 		if !*noTrunc {
1760
-			outID = common.TruncateID(outID)
1760
+			outID = stringid.TruncateID(outID)
1761 1761
 		}
1762 1762
 
1763 1763
 		if *quiet {
... ...
@@ -32,8 +32,8 @@ import (
32 32
 	"github.com/docker/docker/builder/parser"
33 33
 	"github.com/docker/docker/daemon"
34 34
 	"github.com/docker/docker/engine"
35
-	"github.com/docker/docker/pkg/common"
36 35
 	"github.com/docker/docker/pkg/fileutils"
36
+	"github.com/docker/docker/pkg/stringid"
37 37
 	"github.com/docker/docker/pkg/symlink"
38 38
 	"github.com/docker/docker/pkg/tarsum"
39 39
 	"github.com/docker/docker/registry"
... ...
@@ -177,7 +177,7 @@ func (b *Builder) Run(context io.Reader) (string, error) {
177 177
 			}
178 178
 			return "", err
179 179
 		}
180
-		fmt.Fprintf(b.OutStream, " ---> %s\n", common.TruncateID(b.image))
180
+		fmt.Fprintf(b.OutStream, " ---> %s\n", stringid.TruncateID(b.image))
181 181
 		if b.Remove {
182 182
 			b.clearTmp()
183 183
 		}
... ...
@@ -187,7 +187,7 @@ func (b *Builder) Run(context io.Reader) (string, error) {
187 187
 		return "", fmt.Errorf("No image was generated. Is your Dockerfile empty?")
188 188
 	}
189 189
 
190
-	fmt.Fprintf(b.OutStream, "Successfully built %s\n", common.TruncateID(b.image))
190
+	fmt.Fprintf(b.OutStream, "Successfully built %s\n", stringid.TruncateID(b.image))
191 191
 	return b.image, nil
192 192
 }
193 193
 
... ...
@@ -25,10 +25,10 @@ import (
25 25
 	imagepkg "github.com/docker/docker/image"
26 26
 	"github.com/docker/docker/pkg/archive"
27 27
 	"github.com/docker/docker/pkg/chrootarchive"
28
-	"github.com/docker/docker/pkg/common"
29 28
 	"github.com/docker/docker/pkg/ioutils"
30 29
 	"github.com/docker/docker/pkg/parsers"
31 30
 	"github.com/docker/docker/pkg/progressreader"
31
+	"github.com/docker/docker/pkg/stringid"
32 32
 	"github.com/docker/docker/pkg/symlink"
33 33
 	"github.com/docker/docker/pkg/system"
34 34
 	"github.com/docker/docker/pkg/tarsum"
... ...
@@ -557,7 +557,7 @@ func (b *Builder) create() (*daemon.Container, error) {
557 557
 	}
558 558
 
559 559
 	b.TmpContainers[c.ID] = struct{}{}
560
-	fmt.Fprintf(b.OutStream, " ---> Running in %s\n", common.TruncateID(c.ID))
560
+	fmt.Fprintf(b.OutStream, " ---> Running in %s\n", stringid.TruncateID(c.ID))
561 561
 
562 562
 	if len(config.Cmd) > 0 {
563 563
 		// override the entry point that may have been picked up from the base image
... ...
@@ -753,11 +753,11 @@ func (b *Builder) clearTmp() {
753 753
 		}
754 754
 
755 755
 		if err := b.Daemon.Rm(tmp); err != nil {
756
-			fmt.Fprintf(b.OutStream, "Error removing intermediate container %s: %v\n", common.TruncateID(c), err)
756
+			fmt.Fprintf(b.OutStream, "Error removing intermediate container %s: %v\n", stringid.TruncateID(c), err)
757 757
 			return
758 758
 		}
759 759
 		b.Daemon.DeleteVolumes(tmp.VolumePaths())
760 760
 		delete(b.TmpContainers, c)
761
-		fmt.Fprintf(b.OutStream, "Removing intermediate container %s\n", common.TruncateID(c))
761
+		fmt.Fprintf(b.OutStream, "Removing intermediate container %s\n", stringid.TruncateID(c))
762 762
 	}
763 763
 }
... ...
@@ -30,12 +30,12 @@ import (
30 30
 	"github.com/docker/docker/nat"
31 31
 	"github.com/docker/docker/pkg/archive"
32 32
 	"github.com/docker/docker/pkg/broadcastwriter"
33
-	"github.com/docker/docker/pkg/common"
34 33
 	"github.com/docker/docker/pkg/directory"
35 34
 	"github.com/docker/docker/pkg/etchosts"
36 35
 	"github.com/docker/docker/pkg/ioutils"
37 36
 	"github.com/docker/docker/pkg/promise"
38 37
 	"github.com/docker/docker/pkg/resolvconf"
38
+	"github.com/docker/docker/pkg/stringid"
39 39
 	"github.com/docker/docker/pkg/symlink"
40 40
 	"github.com/docker/docker/pkg/ulimit"
41 41
 	"github.com/docker/docker/runconfig"
... ...
@@ -739,7 +739,7 @@ func (container *Container) Kill() error {
739 739
 	if _, err := container.WaitStop(10 * time.Second); err != nil {
740 740
 		// Ensure that we don't kill ourselves
741 741
 		if pid := container.GetPid(); pid != 0 {
742
-			log.Infof("Container %s failed to exit within 10 seconds of kill - trying direct SIGKILL", common.TruncateID(container.ID))
742
+			log.Infof("Container %s failed to exit within 10 seconds of kill - trying direct SIGKILL", stringid.TruncateID(container.ID))
743 743
 			if err := syscall.Kill(pid, 9); err != nil {
744 744
 				if err != syscall.ESRCH {
745 745
 					return err
... ...
@@ -31,13 +31,13 @@ import (
31 31
 	"github.com/docker/docker/image"
32 32
 	"github.com/docker/docker/pkg/archive"
33 33
 	"github.com/docker/docker/pkg/broadcastwriter"
34
-	"github.com/docker/docker/pkg/common"
35 34
 	"github.com/docker/docker/pkg/graphdb"
36 35
 	"github.com/docker/docker/pkg/ioutils"
37 36
 	"github.com/docker/docker/pkg/namesgenerator"
38 37
 	"github.com/docker/docker/pkg/parsers"
39 38
 	"github.com/docker/docker/pkg/parsers/kernel"
40 39
 	"github.com/docker/docker/pkg/resolvconf"
40
+	"github.com/docker/docker/pkg/stringid"
41 41
 	"github.com/docker/docker/pkg/sysinfo"
42 42
 	"github.com/docker/docker/pkg/truncindex"
43 43
 	"github.com/docker/docker/runconfig"
... ...
@@ -517,7 +517,7 @@ func (daemon *Daemon) mergeAndVerifyConfig(config *runconfig.Config, img *image.
517 517
 func (daemon *Daemon) generateIdAndName(name string) (string, string, error) {
518 518
 	var (
519 519
 		err error
520
-		id  = common.GenerateRandomID()
520
+		id  = stringid.GenerateRandomID()
521 521
 	)
522 522
 
523 523
 	if name == "" {
... ...
@@ -562,7 +562,7 @@ func (daemon *Daemon) reserveName(id, name string) (string, error) {
562 562
 			nameAsKnownByUser := strings.TrimPrefix(name, "/")
563 563
 			return "", fmt.Errorf(
564 564
 				"Conflict. The name %q is already in use by container %s. You have to delete (or rename) that container to be able to reuse that name.", nameAsKnownByUser,
565
-				common.TruncateID(conflictingContainer.ID))
565
+				stringid.TruncateID(conflictingContainer.ID))
566 566
 		}
567 567
 	}
568 568
 	return name, nil
... ...
@@ -585,7 +585,7 @@ func (daemon *Daemon) generateNewName(id string) (string, error) {
585 585
 		return name, nil
586 586
 	}
587 587
 
588
-	name = "/" + common.TruncateID(id)
588
+	name = "/" + stringid.TruncateID(id)
589 589
 	if _, err := daemon.containerGraph.Set(name, id); err != nil {
590 590
 		return "", err
591 591
 	}
... ...
@@ -12,9 +12,9 @@ import (
12 12
 	"github.com/docker/docker/daemon/execdriver/lxc"
13 13
 	"github.com/docker/docker/engine"
14 14
 	"github.com/docker/docker/pkg/broadcastwriter"
15
-	"github.com/docker/docker/pkg/common"
16 15
 	"github.com/docker/docker/pkg/ioutils"
17 16
 	"github.com/docker/docker/pkg/promise"
17
+	"github.com/docker/docker/pkg/stringid"
18 18
 	"github.com/docker/docker/runconfig"
19 19
 )
20 20
 
... ...
@@ -141,7 +141,7 @@ func (d *Daemon) ContainerExecCreate(job *engine.Job) engine.Status {
141 141
 	}
142 142
 
143 143
 	execConfig := &execConfig{
144
-		ID:            common.GenerateRandomID(),
144
+		ID:            stringid.GenerateRandomID(),
145 145
 		OpenStdin:     config.AttachStdin,
146 146
 		OpenStdout:    config.AttachStdout,
147 147
 		OpenStderr:    config.AttachStderr,
... ...
@@ -34,9 +34,9 @@ import (
34 34
 	"github.com/docker/docker/daemon/graphdriver"
35 35
 	"github.com/docker/docker/pkg/archive"
36 36
 	"github.com/docker/docker/pkg/chrootarchive"
37
-	"github.com/docker/docker/pkg/common"
38 37
 	"github.com/docker/docker/pkg/directory"
39 38
 	mountpk "github.com/docker/docker/pkg/mount"
39
+	"github.com/docker/docker/pkg/stringid"
40 40
 	"github.com/docker/libcontainer/label"
41 41
 )
42 42
 
... ...
@@ -405,7 +405,7 @@ func (a *Driver) Cleanup() error {
405 405
 
406 406
 	for _, id := range ids {
407 407
 		if err := a.unmount(id); err != nil {
408
-			log.Errorf("Unmounting %s: %s", common.TruncateID(id), err)
408
+			log.Errorf("Unmounting %s: %s", stringid.TruncateID(id), err)
409 409
 		}
410 410
 	}
411 411
 
... ...
@@ -7,8 +7,8 @@ import (
7 7
 	"github.com/docker/docker/engine"
8 8
 	"github.com/docker/docker/graph"
9 9
 	"github.com/docker/docker/image"
10
-	"github.com/docker/docker/pkg/common"
11 10
 	"github.com/docker/docker/pkg/parsers"
11
+	"github.com/docker/docker/pkg/stringid"
12 12
 	"github.com/docker/docker/utils"
13 13
 )
14 14
 
... ...
@@ -148,11 +148,11 @@ func (daemon *Daemon) canDeleteImage(imgID string, force bool) error {
148 148
 			if imgID == p.ID {
149 149
 				if container.IsRunning() {
150 150
 					if force {
151
-						return fmt.Errorf("Conflict, cannot force delete %s because the running container %s is using it, stop it and retry", common.TruncateID(imgID), common.TruncateID(container.ID))
151
+						return fmt.Errorf("Conflict, cannot force delete %s because the running container %s is using it, stop it and retry", stringid.TruncateID(imgID), stringid.TruncateID(container.ID))
152 152
 					}
153
-					return fmt.Errorf("Conflict, cannot delete %s because the running container %s is using it, stop it and use -f to force", common.TruncateID(imgID), common.TruncateID(container.ID))
153
+					return fmt.Errorf("Conflict, cannot delete %s because the running container %s is using it, stop it and use -f to force", stringid.TruncateID(imgID), stringid.TruncateID(container.ID))
154 154
 				} else if !force {
155
-					return fmt.Errorf("Conflict, cannot delete %s because the container %s is using it, use -f to force", common.TruncateID(imgID), common.TruncateID(container.ID))
155
+					return fmt.Errorf("Conflict, cannot delete %s because the container %s is using it, use -f to force", stringid.TruncateID(imgID), stringid.TruncateID(container.ID))
156 156
 				}
157 157
 			}
158 158
 			return nil
... ...
@@ -8,7 +8,7 @@ import (
8 8
 
9 9
 	log "github.com/Sirupsen/logrus"
10 10
 	"github.com/docker/docker/daemon/execdriver"
11
-	"github.com/docker/docker/pkg/common"
11
+	"github.com/docker/docker/pkg/stringid"
12 12
 	"github.com/docker/docker/runconfig"
13 13
 )
14 14
 
... ...
@@ -230,7 +230,7 @@ func (m *containerMonitor) shouldRestart(exitCode int) bool {
230 230
 		// the default value of 0 for MaximumRetryCount means that we will not enforce a maximum count
231 231
 		if max := m.restartPolicy.MaximumRetryCount; max != 0 && m.failureCount > max {
232 232
 			log.Debugf("stopping restart of container %s because maximum failure could of %d has been reached",
233
-				common.TruncateID(m.container.ID), max)
233
+				stringid.TruncateID(m.container.ID), max)
234 234
 			return false
235 235
 		}
236 236
 
... ...
@@ -10,8 +10,8 @@ import (
10 10
 	"sync"
11 11
 	"time"
12 12
 
13
-	"github.com/docker/docker/pkg/common"
14 13
 	"github.com/docker/docker/pkg/ioutils"
14
+	"github.com/docker/docker/pkg/stringutils"
15 15
 )
16 16
 
17 17
 // Installer is a standard interface for objects which can "install" themselves
... ...
@@ -78,7 +78,7 @@ func (eng *Engine) RegisterCatchall(catchall Handler) {
78 78
 func New() *Engine {
79 79
 	eng := &Engine{
80 80
 		handlers: make(map[string]Handler),
81
-		id:       common.RandomString(),
81
+		id:       stringutils.GenerateRandomString(),
82 82
 		Stdout:   os.Stdout,
83 83
 		Stderr:   os.Stderr,
84 84
 		Stdin:    os.Stdin,
... ...
@@ -3,23 +3,11 @@ package engine
3 3
 import (
4 4
 	"bytes"
5 5
 	"encoding/json"
6
-	"math/rand"
7 6
 	"testing"
8 7
 	"time"
9
-)
10
-
11
-const chars = "abcdefghijklmnopqrstuvwxyz" +
12
-	"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
13
-	"~!@#$%^&*()-_+={}[]\\|<,>.?/\"';:` "
14 8
 
15
-// RandomString returns random string of specified length
16
-func RandomString(length int) string {
17
-	res := make([]byte, length)
18
-	for i := 0; i < length; i++ {
19
-		res[i] = chars[rand.Intn(len(chars))]
20
-	}
21
-	return string(res)
22
-}
9
+	"github.com/docker/docker/pkg/stringutils"
10
+)
23 11
 
24 12
 func TestEnvLenZero(t *testing.T) {
25 13
 	env := &Env{}
... ...
@@ -197,7 +185,7 @@ func TestMultiMap(t *testing.T) {
197 197
 func testMap(l int) [][2]string {
198 198
 	res := make([][2]string, l)
199 199
 	for i := 0; i < l; i++ {
200
-		t := [2]string{RandomString(5), RandomString(20)}
200
+		t := [2]string{stringutils.GenerateRandomAsciiString(5), stringutils.GenerateRandomAsciiString(20)}
201 201
 		res[i] = t
202 202
 	}
203 203
 	return res
... ...
@@ -17,8 +17,8 @@ import (
17 17
 	"github.com/docker/docker/daemon/graphdriver"
18 18
 	"github.com/docker/docker/image"
19 19
 	"github.com/docker/docker/pkg/archive"
20
-	"github.com/docker/docker/pkg/common"
21 20
 	"github.com/docker/docker/pkg/progressreader"
21
+	"github.com/docker/docker/pkg/stringid"
22 22
 	"github.com/docker/docker/pkg/truncindex"
23 23
 	"github.com/docker/docker/runconfig"
24 24
 	"github.com/docker/docker/utils"
... ...
@@ -118,7 +118,7 @@ func (graph *Graph) Get(name string) (*image.Image, error) {
118 118
 // Create creates a new image and registers it in the graph.
119 119
 func (graph *Graph) Create(layerData archive.ArchiveReader, containerID, containerImage, comment, author string, containerConfig, config *runconfig.Config) (*image.Image, error) {
120 120
 	img := &image.Image{
121
-		ID:            common.GenerateRandomID(),
121
+		ID:            stringid.GenerateRandomID(),
122 122
 		Comment:       comment,
123 123
 		Created:       time.Now().UTC(),
124 124
 		DockerVersion: dockerversion.VERSION,
... ...
@@ -217,7 +217,7 @@ func (graph *Graph) TempLayerArchive(id string, sf *utils.StreamFormatter, outpu
217 217
 		Formatter: sf,
218 218
 		Size:      0,
219 219
 		NewLines:  false,
220
-		ID:        common.TruncateID(id),
220
+		ID:        stringid.TruncateID(id),
221 221
 		Action:    "Buffering to disk",
222 222
 	})
223 223
 	defer progressReader.Close()
... ...
@@ -226,7 +226,7 @@ func (graph *Graph) TempLayerArchive(id string, sf *utils.StreamFormatter, outpu
226 226
 
227 227
 // Mktemp creates a temporary sub-directory inside the graph's filesystem.
228 228
 func (graph *Graph) Mktemp(id string) (string, error) {
229
-	dir := path.Join(graph.Root, "_tmp", common.GenerateRandomID())
229
+	dir := path.Join(graph.Root, "_tmp", stringid.GenerateRandomID())
230 230
 	if err := os.MkdirAll(dir, 0700); err != nil {
231 231
 		return "", err
232 232
 	}
... ...
@@ -14,8 +14,8 @@ import (
14 14
 	"github.com/docker/distribution/digest"
15 15
 	"github.com/docker/docker/engine"
16 16
 	"github.com/docker/docker/image"
17
-	"github.com/docker/docker/pkg/common"
18 17
 	"github.com/docker/docker/pkg/progressreader"
18
+	"github.com/docker/docker/pkg/stringid"
19 19
 	"github.com/docker/docker/registry"
20 20
 	"github.com/docker/docker/utils"
21 21
 )
... ...
@@ -172,9 +172,9 @@ func (s *TagStore) pullRepository(r *registry.Session, out io.Writer, repoInfo *
172 172
 			// ensure no two downloads of the same image happen at the same time
173 173
 			if c, err := s.poolAdd("pull", "img:"+img.ID); err != nil {
174 174
 				if c != nil {
175
-					out.Write(sf.FormatProgress(common.TruncateID(img.ID), "Layer already being pulled by another client. Waiting.", nil))
175
+					out.Write(sf.FormatProgress(stringid.TruncateID(img.ID), "Layer already being pulled by another client. Waiting.", nil))
176 176
 					<-c
177
-					out.Write(sf.FormatProgress(common.TruncateID(img.ID), "Download complete", nil))
177
+					out.Write(sf.FormatProgress(stringid.TruncateID(img.ID), "Download complete", nil))
178 178
 				} else {
179 179
 					log.Debugf("Image (id: %s) pull is already running, skipping: %v", img.ID, err)
180 180
 				}
... ...
@@ -185,12 +185,12 @@ func (s *TagStore) pullRepository(r *registry.Session, out io.Writer, repoInfo *
185 185
 			}
186 186
 			defer s.poolRemove("pull", "img:"+img.ID)
187 187
 
188
-			out.Write(sf.FormatProgress(common.TruncateID(img.ID), fmt.Sprintf("Pulling image (%s) from %s", img.Tag, repoInfo.CanonicalName), nil))
188
+			out.Write(sf.FormatProgress(stringid.TruncateID(img.ID), fmt.Sprintf("Pulling image (%s) from %s", img.Tag, repoInfo.CanonicalName), nil))
189 189
 			success := false
190 190
 			var lastErr, err error
191 191
 			var is_downloaded bool
192 192
 			for _, ep := range repoInfo.Index.Mirrors {
193
-				out.Write(sf.FormatProgress(common.TruncateID(img.ID), fmt.Sprintf("Pulling image (%s) from %s, mirror: %s", img.Tag, repoInfo.CanonicalName, ep), nil))
193
+				out.Write(sf.FormatProgress(stringid.TruncateID(img.ID), fmt.Sprintf("Pulling image (%s) from %s, mirror: %s", img.Tag, repoInfo.CanonicalName, ep), nil))
194 194
 				if is_downloaded, err = s.pullImage(r, out, img.ID, ep, repoData.Tokens, sf); err != nil {
195 195
 					// Don't report errors when pulling from mirrors.
196 196
 					log.Debugf("Error pulling image (%s) from %s, mirror: %s, %s", img.Tag, repoInfo.CanonicalName, ep, err)
... ...
@@ -202,12 +202,12 @@ func (s *TagStore) pullRepository(r *registry.Session, out io.Writer, repoInfo *
202 202
 			}
203 203
 			if !success {
204 204
 				for _, ep := range repoData.Endpoints {
205
-					out.Write(sf.FormatProgress(common.TruncateID(img.ID), fmt.Sprintf("Pulling image (%s) from %s, endpoint: %s", img.Tag, repoInfo.CanonicalName, ep), nil))
205
+					out.Write(sf.FormatProgress(stringid.TruncateID(img.ID), fmt.Sprintf("Pulling image (%s) from %s, endpoint: %s", img.Tag, repoInfo.CanonicalName, ep), nil))
206 206
 					if is_downloaded, err = s.pullImage(r, out, img.ID, ep, repoData.Tokens, sf); err != nil {
207 207
 						// It's not ideal that only the last error is returned, it would be better to concatenate the errors.
208 208
 						// As the error is also given to the output stream the user will see the error.
209 209
 						lastErr = err
210
-						out.Write(sf.FormatProgress(common.TruncateID(img.ID), fmt.Sprintf("Error pulling image (%s) from %s, endpoint: %s, %s", img.Tag, repoInfo.CanonicalName, ep, err), nil))
210
+						out.Write(sf.FormatProgress(stringid.TruncateID(img.ID), fmt.Sprintf("Error pulling image (%s) from %s, endpoint: %s, %s", img.Tag, repoInfo.CanonicalName, ep, err), nil))
211 211
 						continue
212 212
 					}
213 213
 					layers_downloaded = layers_downloaded || is_downloaded
... ...
@@ -217,13 +217,13 @@ func (s *TagStore) pullRepository(r *registry.Session, out io.Writer, repoInfo *
217 217
 			}
218 218
 			if !success {
219 219
 				err := fmt.Errorf("Error pulling image (%s) from %s, %v", img.Tag, repoInfo.CanonicalName, lastErr)
220
-				out.Write(sf.FormatProgress(common.TruncateID(img.ID), err.Error(), nil))
220
+				out.Write(sf.FormatProgress(stringid.TruncateID(img.ID), err.Error(), nil))
221 221
 				if parallel {
222 222
 					errors <- err
223 223
 					return
224 224
 				}
225 225
 			}
226
-			out.Write(sf.FormatProgress(common.TruncateID(img.ID), "Download complete", nil))
226
+			out.Write(sf.FormatProgress(stringid.TruncateID(img.ID), "Download complete", nil))
227 227
 
228 228
 			if parallel {
229 229
 				errors <- nil
... ...
@@ -270,7 +270,7 @@ func (s *TagStore) pullImage(r *registry.Session, out io.Writer, imgID, endpoint
270 270
 	if err != nil {
271 271
 		return false, err
272 272
 	}
273
-	out.Write(sf.FormatProgress(common.TruncateID(imgID), "Pulling dependent layers", nil))
273
+	out.Write(sf.FormatProgress(stringid.TruncateID(imgID), "Pulling dependent layers", nil))
274 274
 	// FIXME: Try to stream the images?
275 275
 	// FIXME: Launch the getRemoteImage() in goroutines
276 276
 
... ...
@@ -286,7 +286,7 @@ func (s *TagStore) pullImage(r *registry.Session, out io.Writer, imgID, endpoint
286 286
 		defer s.poolRemove("pull", "layer:"+id)
287 287
 
288 288
 		if !s.graph.Exists(id) {
289
-			out.Write(sf.FormatProgress(common.TruncateID(id), "Pulling metadata", nil))
289
+			out.Write(sf.FormatProgress(stringid.TruncateID(id), "Pulling metadata", nil))
290 290
 			var (
291 291
 				imgJSON []byte
292 292
 				imgSize int
... ...
@@ -297,7 +297,7 @@ func (s *TagStore) pullImage(r *registry.Session, out io.Writer, imgID, endpoint
297 297
 			for j := 1; j <= retries; j++ {
298 298
 				imgJSON, imgSize, err = r.GetRemoteImageJSON(id, endpoint, token)
299 299
 				if err != nil && j == retries {
300
-					out.Write(sf.FormatProgress(common.TruncateID(id), "Error pulling dependent layers", nil))
300
+					out.Write(sf.FormatProgress(stringid.TruncateID(id), "Error pulling dependent layers", nil))
301 301
 					return layers_downloaded, err
302 302
 				} else if err != nil {
303 303
 					time.Sleep(time.Duration(j) * 500 * time.Millisecond)
... ...
@@ -306,7 +306,7 @@ func (s *TagStore) pullImage(r *registry.Session, out io.Writer, imgID, endpoint
306 306
 				img, err = image.NewImgJSON(imgJSON)
307 307
 				layers_downloaded = true
308 308
 				if err != nil && j == retries {
309
-					out.Write(sf.FormatProgress(common.TruncateID(id), "Error pulling dependent layers", nil))
309
+					out.Write(sf.FormatProgress(stringid.TruncateID(id), "Error pulling dependent layers", nil))
310 310
 					return layers_downloaded, fmt.Errorf("Failed to parse json: %s", err)
311 311
 				} else if err != nil {
312 312
 					time.Sleep(time.Duration(j) * 500 * time.Millisecond)
... ...
@@ -322,7 +322,7 @@ func (s *TagStore) pullImage(r *registry.Session, out io.Writer, imgID, endpoint
322 322
 				if j > 1 {
323 323
 					status = fmt.Sprintf("Pulling fs layer [retries: %d]", j)
324 324
 				}
325
-				out.Write(sf.FormatProgress(common.TruncateID(id), status, nil))
325
+				out.Write(sf.FormatProgress(stringid.TruncateID(id), status, nil))
326 326
 				layer, err := r.GetRemoteImageLayer(img.ID, endpoint, token, int64(imgSize))
327 327
 				if uerr, ok := err.(*url.Error); ok {
328 328
 					err = uerr.Err
... ...
@@ -331,7 +331,7 @@ func (s *TagStore) pullImage(r *registry.Session, out io.Writer, imgID, endpoint
331 331
 					time.Sleep(time.Duration(j) * 500 * time.Millisecond)
332 332
 					continue
333 333
 				} else if err != nil {
334
-					out.Write(sf.FormatProgress(common.TruncateID(id), "Error pulling dependent layers", nil))
334
+					out.Write(sf.FormatProgress(stringid.TruncateID(id), "Error pulling dependent layers", nil))
335 335
 					return layers_downloaded, err
336 336
 				}
337 337
 				layers_downloaded = true
... ...
@@ -344,21 +344,21 @@ func (s *TagStore) pullImage(r *registry.Session, out io.Writer, imgID, endpoint
344 344
 						Formatter: sf,
345 345
 						Size:      imgSize,
346 346
 						NewLines:  false,
347
-						ID:        common.TruncateID(id),
347
+						ID:        stringid.TruncateID(id),
348 348
 						Action:    "Downloading",
349 349
 					}))
350 350
 				if terr, ok := err.(net.Error); ok && terr.Timeout() && j < retries {
351 351
 					time.Sleep(time.Duration(j) * 500 * time.Millisecond)
352 352
 					continue
353 353
 				} else if err != nil {
354
-					out.Write(sf.FormatProgress(common.TruncateID(id), "Error downloading dependent layers", nil))
354
+					out.Write(sf.FormatProgress(stringid.TruncateID(id), "Error downloading dependent layers", nil))
355 355
 					return layers_downloaded, err
356 356
 				} else {
357 357
 					break
358 358
 				}
359 359
 			}
360 360
 		}
361
-		out.Write(sf.FormatProgress(common.TruncateID(id), "Download complete", nil))
361
+		out.Write(sf.FormatProgress(stringid.TruncateID(id), "Download complete", nil))
362 362
 	}
363 363
 	return layers_downloaded, nil
364 364
 }
... ...
@@ -478,16 +478,16 @@ func (s *TagStore) pullV2Tag(eng *engine.Engine, r *registry.Session, out io.Wri
478 478
 		}
479 479
 		downloads[i].digest = dgst
480 480
 
481
-		out.Write(sf.FormatProgress(common.TruncateID(img.ID), "Pulling fs layer", nil))
481
+		out.Write(sf.FormatProgress(stringid.TruncateID(img.ID), "Pulling fs layer", nil))
482 482
 
483 483
 		downloadFunc := func(di *downloadInfo) error {
484 484
 			log.Debugf("pulling blob %q to V1 img %s", sumStr, img.ID)
485 485
 
486 486
 			if c, err := s.poolAdd("pull", "img:"+img.ID); err != nil {
487 487
 				if c != nil {
488
-					out.Write(sf.FormatProgress(common.TruncateID(img.ID), "Layer already being pulled by another client. Waiting.", nil))
488
+					out.Write(sf.FormatProgress(stringid.TruncateID(img.ID), "Layer already being pulled by another client. Waiting.", nil))
489 489
 					<-c
490
-					out.Write(sf.FormatProgress(common.TruncateID(img.ID), "Download complete", nil))
490
+					out.Write(sf.FormatProgress(stringid.TruncateID(img.ID), "Download complete", nil))
491 491
 				} else {
492 492
 					log.Debugf("Image (id: %s) pull is already running, skipping: %v", img.ID, err)
493 493
 				}
... ...
@@ -515,20 +515,20 @@ func (s *TagStore) pullV2Tag(eng *engine.Engine, r *registry.Session, out io.Wri
515 515
 					Formatter: sf,
516 516
 					Size:      int(l),
517 517
 					NewLines:  false,
518
-					ID:        common.TruncateID(img.ID),
518
+					ID:        stringid.TruncateID(img.ID),
519 519
 					Action:    "Downloading",
520 520
 				})); err != nil {
521 521
 					return fmt.Errorf("unable to copy v2 image blob data: %s", err)
522 522
 				}
523 523
 
524
-				out.Write(sf.FormatProgress(common.TruncateID(img.ID), "Verifying Checksum", nil))
524
+				out.Write(sf.FormatProgress(stringid.TruncateID(img.ID), "Verifying Checksum", nil))
525 525
 
526 526
 				if !verifier.Verified() {
527 527
 					log.Infof("Image verification failed: checksum mismatch for %q", di.digest.String())
528 528
 					verified = false
529 529
 				}
530 530
 
531
-				out.Write(sf.FormatProgress(common.TruncateID(img.ID), "Download complete", nil))
531
+				out.Write(sf.FormatProgress(stringid.TruncateID(img.ID), "Download complete", nil))
532 532
 
533 533
 				log.Debugf("Downloaded %s to tempfile %s", img.ID, tmpFile.Name())
534 534
 				di.tmpFile = tmpFile
... ...
@@ -574,7 +574,7 @@ func (s *TagStore) pullV2Tag(eng *engine.Engine, r *registry.Session, out io.Wri
574 574
 						Out:       out,
575 575
 						Formatter: sf,
576 576
 						Size:      int(d.length),
577
-						ID:        common.TruncateID(d.img.ID),
577
+						ID:        stringid.TruncateID(d.img.ID),
578 578
 						Action:    "Extracting",
579 579
 					}))
580 580
 				if err != nil {
... ...
@@ -583,10 +583,10 @@ func (s *TagStore) pullV2Tag(eng *engine.Engine, r *registry.Session, out io.Wri
583 583
 
584 584
 				// FIXME: Pool release here for parallel tag pull (ensures any downloads block until fully extracted)
585 585
 			}
586
-			out.Write(sf.FormatProgress(common.TruncateID(d.img.ID), "Pull complete", nil))
586
+			out.Write(sf.FormatProgress(stringid.TruncateID(d.img.ID), "Pull complete", nil))
587 587
 			tagUpdated = true
588 588
 		} else {
589
-			out.Write(sf.FormatProgress(common.TruncateID(d.img.ID), "Already exists", nil))
589
+			out.Write(sf.FormatProgress(stringid.TruncateID(d.img.ID), "Already exists", nil))
590 590
 		}
591 591
 
592 592
 	}
... ...
@@ -16,8 +16,8 @@ import (
16 16
 	"github.com/docker/distribution/digest"
17 17
 	"github.com/docker/docker/engine"
18 18
 	"github.com/docker/docker/image"
19
-	"github.com/docker/docker/pkg/common"
20 19
 	"github.com/docker/docker/pkg/progressreader"
20
+	"github.com/docker/docker/pkg/stringid"
21 21
 	"github.com/docker/docker/registry"
22 22
 	"github.com/docker/docker/runconfig"
23 23
 	"github.com/docker/docker/utils"
... ...
@@ -139,7 +139,7 @@ func lookupImageOnEndpoint(wg *sync.WaitGroup, r *registry.Session, out io.Write
139 139
 			imagesToPush <- image.id
140 140
 			continue
141 141
 		}
142
-		out.Write(sf.FormatStatus("", "Image %s already pushed, skipping", common.TruncateID(image.id)))
142
+		out.Write(sf.FormatStatus("", "Image %s already pushed, skipping", stringid.TruncateID(image.id)))
143 143
 	}
144 144
 }
145 145
 
... ...
@@ -191,7 +191,7 @@ func (s *TagStore) pushImageToEndpoint(endpoint string, out io.Writer, remoteNam
191 191
 			}
192 192
 		}
193 193
 		for _, tag := range tags[id] {
194
-			out.Write(sf.FormatStatus("", "Pushing tag for rev [%s] on {%s}", common.TruncateID(id), endpoint+"repositories/"+remoteName+"/tags/"+tag))
194
+			out.Write(sf.FormatStatus("", "Pushing tag for rev [%s] on {%s}", stringid.TruncateID(id), endpoint+"repositories/"+remoteName+"/tags/"+tag))
195 195
 			if err := r.PushRegistryTag(remoteName, id, tag, endpoint, repo.Tokens); err != nil {
196 196
 				return err
197 197
 			}
... ...
@@ -244,7 +244,7 @@ func (s *TagStore) pushImage(r *registry.Session, out io.Writer, imgID, ep strin
244 244
 	if err != nil {
245 245
 		return "", fmt.Errorf("Cannot retrieve the path for {%s}: %s", imgID, err)
246 246
 	}
247
-	out.Write(sf.FormatProgress(common.TruncateID(imgID), "Pushing", nil))
247
+	out.Write(sf.FormatProgress(stringid.TruncateID(imgID), "Pushing", nil))
248 248
 
249 249
 	imgData := &registry.ImgData{
250 250
 		ID: imgID,
... ...
@@ -253,7 +253,7 @@ func (s *TagStore) pushImage(r *registry.Session, out io.Writer, imgID, ep strin
253 253
 	// Send the json
254 254
 	if err := r.PushImageJSONRegistry(imgData, jsonRaw, ep, token); err != nil {
255 255
 		if err == registry.ErrAlreadyExists {
256
-			out.Write(sf.FormatProgress(common.TruncateID(imgData.ID), "Image already pushed, skipping", nil))
256
+			out.Write(sf.FormatProgress(stringid.TruncateID(imgData.ID), "Image already pushed, skipping", nil))
257 257
 			return "", nil
258 258
 		}
259 259
 		return "", err
... ...
@@ -275,7 +275,7 @@ func (s *TagStore) pushImage(r *registry.Session, out io.Writer, imgID, ep strin
275 275
 			Formatter: sf,
276 276
 			Size:      int(layerData.Size),
277 277
 			NewLines:  false,
278
-			ID:        common.TruncateID(imgData.ID),
278
+			ID:        stringid.TruncateID(imgData.ID),
279 279
 			Action:    "Pushing",
280 280
 		}), ep, token, jsonRaw)
281 281
 	if err != nil {
... ...
@@ -288,7 +288,7 @@ func (s *TagStore) pushImage(r *registry.Session, out io.Writer, imgID, ep strin
288 288
 		return "", err
289 289
 	}
290 290
 
291
-	out.Write(sf.FormatProgress(common.TruncateID(imgData.ID), "Image successfully pushed", nil))
291
+	out.Write(sf.FormatProgress(stringid.TruncateID(imgData.ID), "Image successfully pushed", nil))
292 292
 	return imgData.Checksum, nil
293 293
 }
294 294
 
... ...
@@ -385,7 +385,7 @@ func (s *TagStore) pushV2Repository(r *registry.Session, localRepo Repository, o
385 385
 				// Call mount blob
386 386
 				exists, err = r.HeadV2ImageBlob(endpoint, repoInfo.RemoteName, sumParts[0], sumParts[1], auth)
387 387
 				if err != nil {
388
-					out.Write(sf.FormatProgress(common.TruncateID(layer.ID), "Image push failed", nil))
388
+					out.Write(sf.FormatProgress(stringid.TruncateID(layer.ID), "Image push failed", nil))
389 389
 					return err
390 390
 				}
391 391
 			}
... ...
@@ -400,7 +400,7 @@ func (s *TagStore) pushV2Repository(r *registry.Session, localRepo Repository, o
400 400
 					checksum = cs
401 401
 				}
402 402
 			} else {
403
-				out.Write(sf.FormatProgress(common.TruncateID(layer.ID), "Image already exists", nil))
403
+				out.Write(sf.FormatProgress(stringid.TruncateID(layer.ID), "Image already exists", nil))
404 404
 			}
405 405
 			m.FSLayers[i] = &registry.FSLayer{BlobSum: checksum}
406 406
 			m.History[i] = &registry.ManifestHistory{V1Compatibility: string(jsonData)}
... ...
@@ -443,7 +443,7 @@ func (s *TagStore) pushV2Repository(r *registry.Session, localRepo Repository, o
443 443
 
444 444
 // PushV2Image pushes the image content to the v2 registry, first buffering the contents to disk
445 445
 func (s *TagStore) pushV2Image(r *registry.Session, img *image.Image, endpoint *registry.Endpoint, imageName string, sf *utils.StreamFormatter, out io.Writer, auth *registry.RequestAuthorization) (string, error) {
446
-	out.Write(sf.FormatProgress(common.TruncateID(img.ID), "Buffering to Disk", nil))
446
+	out.Write(sf.FormatProgress(stringid.TruncateID(img.ID), "Buffering to Disk", nil))
447 447
 
448 448
 	image, err := s.graph.Get(img.ID)
449 449
 	if err != nil {
... ...
@@ -481,13 +481,13 @@ func (s *TagStore) pushV2Image(r *registry.Session, img *image.Image, endpoint *
481 481
 			Formatter: sf,
482 482
 			Size:      int(size),
483 483
 			NewLines:  false,
484
-			ID:        common.TruncateID(img.ID),
484
+			ID:        stringid.TruncateID(img.ID),
485 485
 			Action:    "Pushing",
486 486
 		}), auth); err != nil {
487
-		out.Write(sf.FormatProgress(common.TruncateID(img.ID), "Image push failed", nil))
487
+		out.Write(sf.FormatProgress(stringid.TruncateID(img.ID), "Image push failed", nil))
488 488
 		return "", err
489 489
 	}
490
-	out.Write(sf.FormatProgress(common.TruncateID(img.ID), "Image successfully pushed", nil))
490
+	out.Write(sf.FormatProgress(stringid.TruncateID(img.ID), "Image successfully pushed", nil))
491 491
 	return dgst.String(), nil
492 492
 }
493 493
 
... ...
@@ -13,8 +13,8 @@ import (
13 13
 	"sync"
14 14
 
15 15
 	"github.com/docker/docker/image"
16
-	"github.com/docker/docker/pkg/common"
17 16
 	"github.com/docker/docker/pkg/parsers"
17
+	"github.com/docker/docker/pkg/stringid"
18 18
 	"github.com/docker/docker/registry"
19 19
 	"github.com/docker/docker/utils"
20 20
 	"github.com/docker/libtrust"
... ...
@@ -163,7 +163,7 @@ func (store *TagStore) ImageName(id string) string {
163 163
 	if names, exists := store.ByID()[id]; exists && len(names) > 0 {
164 164
 		return names[0]
165 165
 	}
166
-	return common.TruncateID(id)
166
+	return stringid.TruncateID(id)
167 167
 }
168 168
 
169 169
 func (store *TagStore) DeleteAll(id string) error {
... ...
@@ -331,7 +331,7 @@ func (store *TagStore) GetRepoRefs() map[string][]string {
331 331
 
332 332
 	for name, repository := range store.Repositories {
333 333
 		for tag, id := range repository {
334
-			shortID := common.TruncateID(id)
334
+			shortID := stringid.TruncateID(id)
335 335
 			reporefs[shortID] = append(reporefs[shortID], utils.ImageReference(name, tag))
336 336
 		}
337 337
 	}
... ...
@@ -22,6 +22,7 @@ import (
22 22
 
23 23
 	"github.com/docker/docker/builder/command"
24 24
 	"github.com/docker/docker/pkg/archive"
25
+	"github.com/docker/docker/pkg/stringutils"
25 26
 )
26 27
 
27 28
 func TestBuildJSONEmptyRun(t *testing.T) {
... ...
@@ -4420,7 +4421,7 @@ func TestBuildOnBuildOutput(t *testing.T) {
4420 4420
 }
4421 4421
 
4422 4422
 func TestBuildInvalidTag(t *testing.T) {
4423
-	name := "abcd:" + makeRandomString(200)
4423
+	name := "abcd:" + stringutils.GenerateRandomAlphaOnlyString(200)
4424 4424
 	defer deleteImages(name)
4425 4425
 	_, out, err := buildImageWithOut(name, "FROM scratch\nMAINTAINER quux\n", true)
4426 4426
 	// if the error doesnt check for illegal tag name, or the image is built
... ...
@@ -9,7 +9,7 @@ import (
9 9
 	"testing"
10 10
 	"time"
11 11
 
12
-	"github.com/docker/docker/pkg/common"
12
+	"github.com/docker/docker/pkg/stringid"
13 13
 )
14 14
 
15 15
 func TestImagesEnsureImageIsListed(t *testing.T) {
... ...
@@ -196,7 +196,7 @@ func TestImagesEnsureDanglingImageOnlyListedOnce(t *testing.T) {
196 196
 	if err != nil {
197 197
 		t.Fatalf("error tagging foobox: %s", err)
198 198
 	}
199
-	imageId := common.TruncateID(strings.TrimSpace(out))
199
+	imageId := stringid.TruncateID(strings.TrimSpace(out))
200 200
 	defer deleteImages(imageId)
201 201
 
202 202
 	// overwrite the tag, making the previous image dangling
... ...
@@ -5,6 +5,8 @@ import (
5 5
 	"os/exec"
6 6
 	"strings"
7 7
 	"testing"
8
+
9
+	"github.com/docker/docker/pkg/stringutils"
8 10
 )
9 11
 
10 12
 // tagging a named image in a new unprefixed repo should work
... ...
@@ -59,7 +61,7 @@ func TestTagInvalidUnprefixedRepo(t *testing.T) {
59 59
 
60 60
 // ensure we don't allow the use of invalid tags; these tag operations should fail
61 61
 func TestTagInvalidPrefixedRepo(t *testing.T) {
62
-	long_tag := makeRandomString(121)
62
+	long_tag := stringutils.GenerateRandomAlphaOnlyString(121)
63 63
 
64 64
 	invalidTags := []string{"repo:fo$z$", "repo:Foo@3cc", "repo:Foo$3", "repo:Foo*3", "repo:Fo^3", "repo:Foo!3", "repo:%goodbye", "repo:#hashtagit", "repo:F)xcz(", "repo:-foo", "repo:..", long_tag}
65 65
 
... ...
@@ -22,6 +22,7 @@ import (
22 22
 	"time"
23 23
 
24 24
 	"github.com/docker/docker/api"
25
+	"github.com/docker/docker/pkg/stringutils"
25 26
 )
26 27
 
27 28
 // Daemon represents a Docker daemon for the testing framework.
... ...
@@ -695,8 +696,8 @@ func (f *remoteFileServer) Close() error {
695 695
 
696 696
 func newRemoteFileServer(ctx *FakeContext) (*remoteFileServer, error) {
697 697
 	var (
698
-		image     = fmt.Sprintf("fileserver-img-%s", strings.ToLower(makeRandomString(10)))
699
-		container = fmt.Sprintf("fileserver-cnt-%s", strings.ToLower(makeRandomString(10)))
698
+		image     = fmt.Sprintf("fileserver-img-%s", strings.ToLower(stringutils.GenerateRandomAlphaOnlyString(10)))
699
+		container = fmt.Sprintf("fileserver-cnt-%s", strings.ToLower(stringutils.GenerateRandomAlphaOnlyString(10)))
700 700
 	)
701 701
 
702 702
 	// Build the image
... ...
@@ -6,7 +6,6 @@ import (
6 6
 	"errors"
7 7
 	"fmt"
8 8
 	"io"
9
-	"math/rand"
10 9
 	"net/http"
11 10
 	"net/http/httptest"
12 11
 	"os"
... ...
@@ -17,6 +16,7 @@ import (
17 17
 	"syscall"
18 18
 	"time"
19 19
 
20
+	"github.com/docker/docker/pkg/stringutils"
20 21
 	"github.com/docker/docker/vendor/src/code.google.com/p/go/src/pkg/archive/tar"
21 22
 )
22 23
 
... ...
@@ -301,21 +301,10 @@ func copyWithCP(source, target string) error {
301 301
 	return nil
302 302
 }
303 303
 
304
-func makeRandomString(n int) string {
305
-	// make a really long string
306
-	letters := []byte("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
307
-	b := make([]byte, n)
308
-	r := rand.New(rand.NewSource(time.Now().UTC().UnixNano()))
309
-	for i := range b {
310
-		b[i] = letters[r.Intn(len(letters))]
311
-	}
312
-	return string(b)
313
-}
314
-
315 304
 // randomUnixTmpDirPath provides a temporary unix path with rand string appended.
316 305
 // does not create or checks if it exists.
317 306
 func randomUnixTmpDirPath(s string) string {
318
-	return path.Join("/tmp", fmt.Sprintf("%s.%s", s, makeRandomString(10)))
307
+	return path.Join("/tmp", fmt.Sprintf("%s.%s", s, stringutils.GenerateRandomAlphaOnlyString(10)))
319 308
 }
320 309
 
321 310
 // Reads chunkSize bytes from reader after every interval.
... ...
@@ -12,7 +12,7 @@ import (
12 12
 	log "github.com/Sirupsen/logrus"
13 13
 	"github.com/docker/docker/api/client"
14 14
 	"github.com/docker/docker/daemon"
15
-	"github.com/docker/docker/pkg/common"
15
+	"github.com/docker/docker/pkg/stringid"
16 16
 	"github.com/docker/docker/pkg/term"
17 17
 	"github.com/kr/pty"
18 18
 )
... ...
@@ -286,7 +286,7 @@ func TestAttachDetachTruncatedID(t *testing.T) {
286 286
 	ch := make(chan struct{})
287 287
 	go func() {
288 288
 		defer close(ch)
289
-		if err := cli.CmdAttach(common.TruncateID(container.ID)); err != nil {
289
+		if err := cli.CmdAttach(stringid.TruncateID(container.ID)); err != nil {
290 290
 			if err != io.ErrClosedPipe {
291 291
 				t.Fatal(err)
292 292
 			}
... ...
@@ -2,19 +2,20 @@ package docker
2 2
 
3 3
 import (
4 4
 	"errors"
5
-	"github.com/docker/docker/autogen/dockerversion"
6
-	"github.com/docker/docker/daemon/graphdriver"
7
-	"github.com/docker/docker/graph"
8
-	"github.com/docker/docker/image"
9
-	"github.com/docker/docker/pkg/archive"
10
-	"github.com/docker/docker/pkg/common"
11
-	"github.com/docker/docker/utils"
12 5
 	"io"
13 6
 	"io/ioutil"
14 7
 	"os"
15 8
 	"path"
16 9
 	"testing"
17 10
 	"time"
11
+
12
+	"github.com/docker/docker/autogen/dockerversion"
13
+	"github.com/docker/docker/daemon/graphdriver"
14
+	"github.com/docker/docker/graph"
15
+	"github.com/docker/docker/image"
16
+	"github.com/docker/docker/pkg/archive"
17
+	"github.com/docker/docker/pkg/stringid"
18
+	"github.com/docker/docker/utils"
18 19
 )
19 20
 
20 21
 func TestMount(t *testing.T) {
... ...
@@ -70,7 +71,7 @@ func TestInterruptedRegister(t *testing.T) {
70 70
 	defer nukeGraph(graph)
71 71
 	badArchive, w := io.Pipe() // Use a pipe reader as a fake archive which never yields data
72 72
 	image := &image.Image{
73
-		ID:      common.GenerateRandomID(),
73
+		ID:      stringid.GenerateRandomID(),
74 74
 		Comment: "testing",
75 75
 		Created: time.Now(),
76 76
 	}
... ...
@@ -130,7 +131,7 @@ func TestRegister(t *testing.T) {
130 130
 		t.Fatal(err)
131 131
 	}
132 132
 	image := &image.Image{
133
-		ID:      common.GenerateRandomID(),
133
+		ID:      stringid.GenerateRandomID(),
134 134
 		Comment: "testing",
135 135
 		Created: time.Now(),
136 136
 	}
... ...
@@ -160,7 +161,7 @@ func TestDeletePrefix(t *testing.T) {
160 160
 	graph, _ := tempGraph(t)
161 161
 	defer nukeGraph(graph)
162 162
 	img := createTestImage(graph, t)
163
-	if err := graph.Delete(common.TruncateID(img.ID)); err != nil {
163
+	if err := graph.Delete(stringid.TruncateID(img.ID)); err != nil {
164 164
 		t.Fatal(err)
165 165
 	}
166 166
 	assertNImages(graph, t, 0)
... ...
@@ -246,19 +247,19 @@ func TestByParent(t *testing.T) {
246 246
 	graph, _ := tempGraph(t)
247 247
 	defer nukeGraph(graph)
248 248
 	parentImage := &image.Image{
249
-		ID:      common.GenerateRandomID(),
249
+		ID:      stringid.GenerateRandomID(),
250 250
 		Comment: "parent",
251 251
 		Created: time.Now(),
252 252
 		Parent:  "",
253 253
 	}
254 254
 	childImage1 := &image.Image{
255
-		ID:      common.GenerateRandomID(),
255
+		ID:      stringid.GenerateRandomID(),
256 256
 		Comment: "child1",
257 257
 		Created: time.Now(),
258 258
 		Parent:  parentImage.ID,
259 259
 	}
260 260
 	childImage2 := &image.Image{
261
-		ID:      common.GenerateRandomID(),
261
+		ID:      stringid.GenerateRandomID(),
262 262
 		Comment: "child2",
263 263
 		Created: time.Now(),
264 264
 		Parent:  parentImage.ID,
... ...
@@ -22,9 +22,9 @@ import (
22 22
 	"github.com/docker/docker/engine"
23 23
 	"github.com/docker/docker/image"
24 24
 	"github.com/docker/docker/nat"
25
-	"github.com/docker/docker/pkg/common"
26 25
 	"github.com/docker/docker/pkg/ioutils"
27 26
 	"github.com/docker/docker/pkg/reexec"
27
+	"github.com/docker/docker/pkg/stringid"
28 28
 	"github.com/docker/docker/runconfig"
29 29
 	"github.com/docker/docker/utils"
30 30
 )
... ...
@@ -306,7 +306,7 @@ func TestDaemonCreate(t *testing.T) {
306 306
 		&runconfig.HostConfig{},
307 307
 		"conflictname",
308 308
 	)
309
-	if _, _, err := daemon.Create(&runconfig.Config{Image: GetTestImage(daemon).ID, Cmd: []string{"ls", "-al"}}, &runconfig.HostConfig{}, testContainer.Name); err == nil || !strings.Contains(err.Error(), common.TruncateID(testContainer.ID)) {
309
+	if _, _, err := daemon.Create(&runconfig.Config{Image: GetTestImage(daemon).ID, Cmd: []string{"ls", "-al"}}, &runconfig.HostConfig{}, testContainer.Name); err == nil || !strings.Contains(err.Error(), stringid.TruncateID(testContainer.ID)) {
310 310
 		t.Fatalf("Name conflict error doesn't include the correct short id. Message was: %v", err)
311 311
 	}
312 312
 
313 313
deleted file mode 100644
... ...
@@ -1,47 +0,0 @@
1
-package common
2
-
3
-import (
4
-	"crypto/rand"
5
-	"encoding/hex"
6
-	"io"
7
-	"strconv"
8
-)
9
-
10
-// TruncateID returns a shorthand version of a string identifier for convenience.
11
-// A collision with other shorthands is very unlikely, but possible.
12
-// In case of a collision a lookup with TruncIndex.Get() will fail, and the caller
13
-// will need to use a langer prefix, or the full-length Id.
14
-func TruncateID(id string) string {
15
-	shortLen := 12
16
-	if len(id) < shortLen {
17
-		shortLen = len(id)
18
-	}
19
-	return id[:shortLen]
20
-}
21
-
22
-// GenerateRandomID returns an unique id
23
-func GenerateRandomID() string {
24
-	for {
25
-		id := make([]byte, 32)
26
-		if _, err := io.ReadFull(rand.Reader, id); err != nil {
27
-			panic(err) // This shouldn't happen
28
-		}
29
-		value := hex.EncodeToString(id)
30
-		// if we try to parse the truncated for as an int and we don't have
31
-		// an error then the value is all numberic and causes issues when
32
-		// used as a hostname. ref #3869
33
-		if _, err := strconv.ParseInt(TruncateID(value), 10, 64); err == nil {
34
-			continue
35
-		}
36
-		return value
37
-	}
38
-}
39
-
40
-func RandomString() string {
41
-	id := make([]byte, 32)
42
-
43
-	if _, err := io.ReadFull(rand.Reader, id); err != nil {
44
-		panic(err) // This shouldn't happen
45
-	}
46
-	return hex.EncodeToString(id)
47
-}
48 1
deleted file mode 100644
... ...
@@ -1,59 +0,0 @@
1
-package common
2
-
3
-import (
4
-	"testing"
5
-)
6
-
7
-func TestShortenId(t *testing.T) {
8
-	id := GenerateRandomID()
9
-	truncID := TruncateID(id)
10
-	if len(truncID) != 12 {
11
-		t.Fatalf("Id returned is incorrect: truncate on %s returned %s", id, truncID)
12
-	}
13
-}
14
-
15
-func TestShortenIdEmpty(t *testing.T) {
16
-	id := ""
17
-	truncID := TruncateID(id)
18
-	if len(truncID) > len(id) {
19
-		t.Fatalf("Id returned is incorrect: truncate on %s returned %s", id, truncID)
20
-	}
21
-}
22
-
23
-func TestShortenIdInvalid(t *testing.T) {
24
-	id := "1234"
25
-	truncID := TruncateID(id)
26
-	if len(truncID) != len(id) {
27
-		t.Fatalf("Id returned is incorrect: truncate on %s returned %s", id, truncID)
28
-	}
29
-}
30
-
31
-func TestGenerateRandomID(t *testing.T) {
32
-	id := GenerateRandomID()
33
-
34
-	if len(id) != 64 {
35
-		t.Fatalf("Id returned is incorrect: %s", id)
36
-	}
37
-}
38
-
39
-func TestRandomString(t *testing.T) {
40
-	id := RandomString()
41
-	if len(id) != 64 {
42
-		t.Fatalf("Id returned is incorrect: %s", id)
43
-	}
44
-}
45
-
46
-func TestRandomStringUniqueness(t *testing.T) {
47
-	repeats := 25
48
-	set := make(map[string]struct{}, repeats)
49
-	for i := 0; i < repeats; i = i + 1 {
50
-		id := RandomString()
51
-		if len(id) != 64 {
52
-			t.Fatalf("Id returned is incorrect: %s", id)
53
-		}
54
-		if _, ok := set[id]; ok {
55
-			t.Fatalf("Random number is repeated")
56
-		}
57
-		set[id] = struct{}{}
58
-	}
59
-}
60 1
new file mode 100644
... ...
@@ -0,0 +1 @@
0
+This package provides helper functions for dealing with string identifiers
0 1
new file mode 100644
... ...
@@ -0,0 +1,38 @@
0
+package stringid
1
+
2
+import (
3
+	"crypto/rand"
4
+	"encoding/hex"
5
+	"io"
6
+	"strconv"
7
+)
8
+
9
+// TruncateID returns a shorthand version of a string identifier for convenience.
10
+// A collision with other shorthands is very unlikely, but possible.
11
+// In case of a collision a lookup with TruncIndex.Get() will fail, and the caller
12
+// will need to use a langer prefix, or the full-length Id.
13
+func TruncateID(id string) string {
14
+	shortLen := 12
15
+	if len(id) < shortLen {
16
+		shortLen = len(id)
17
+	}
18
+	return id[:shortLen]
19
+}
20
+
21
+// GenerateRandomID returns an unique id
22
+func GenerateRandomID() string {
23
+	for {
24
+		id := make([]byte, 32)
25
+		if _, err := io.ReadFull(rand.Reader, id); err != nil {
26
+			panic(err) // This shouldn't happen
27
+		}
28
+		value := hex.EncodeToString(id)
29
+		// if we try to parse the truncated for as an int and we don't have
30
+		// an error then the value is all numberic and causes issues when
31
+		// used as a hostname. ref #3869
32
+		if _, err := strconv.ParseInt(TruncateID(value), 10, 64); err == nil {
33
+			continue
34
+		}
35
+		return value
36
+	}
37
+}
0 38
new file mode 100644
... ...
@@ -0,0 +1,35 @@
0
+package stringid
1
+
2
+import "testing"
3
+
4
+func TestGenerateRandomID(t *testing.T) {
5
+	id := GenerateRandomID()
6
+
7
+	if len(id) != 64 {
8
+		t.Fatalf("Id returned is incorrect: %s", id)
9
+	}
10
+}
11
+
12
+func TestShortenId(t *testing.T) {
13
+	id := GenerateRandomID()
14
+	truncID := TruncateID(id)
15
+	if len(truncID) != 12 {
16
+		t.Fatalf("Id returned is incorrect: truncate on %s returned %s", id, truncID)
17
+	}
18
+}
19
+
20
+func TestShortenIdEmpty(t *testing.T) {
21
+	id := ""
22
+	truncID := TruncateID(id)
23
+	if len(truncID) > len(id) {
24
+		t.Fatalf("Id returned is incorrect: truncate on %s returned %s", id, truncID)
25
+	}
26
+}
27
+
28
+func TestShortenIdInvalid(t *testing.T) {
29
+	id := "1234"
30
+	truncID := TruncateID(id)
31
+	if len(truncID) != len(id) {
32
+		t.Fatalf("Id returned is incorrect: truncate on %s returned %s", id, truncID)
33
+	}
34
+}
0 35
new file mode 100644
... ...
@@ -0,0 +1 @@
0
+This package provides helper functions for dealing with strings
0 1
new file mode 100644
... ...
@@ -0,0 +1,43 @@
0
+package stringutils
1
+
2
+import (
3
+	"crypto/rand"
4
+	"encoding/hex"
5
+	"io"
6
+	mathrand "math/rand"
7
+	"time"
8
+)
9
+
10
+// Generate 32 chars random string
11
+func GenerateRandomString() string {
12
+	id := make([]byte, 32)
13
+
14
+	if _, err := io.ReadFull(rand.Reader, id); err != nil {
15
+		panic(err) // This shouldn't happen
16
+	}
17
+	return hex.EncodeToString(id)
18
+}
19
+
20
+// Generate alpha only random stirng with length n
21
+func GenerateRandomAlphaOnlyString(n int) string {
22
+	// make a really long string
23
+	letters := []byte("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
24
+	b := make([]byte, n)
25
+	r := mathrand.New(mathrand.NewSource(time.Now().UTC().UnixNano()))
26
+	for i := range b {
27
+		b[i] = letters[r.Intn(len(letters))]
28
+	}
29
+	return string(b)
30
+}
31
+
32
+// Generate Ascii random stirng with length n
33
+func GenerateRandomAsciiString(n int) string {
34
+	chars := "abcdefghijklmnopqrstuvwxyz" +
35
+		"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
36
+		"~!@#$%^&*()-_+={}[]\\|<,>.?/\"';:` "
37
+	res := make([]byte, n)
38
+	for i := 0; i < n; i++ {
39
+		res[i] = chars[mathrand.Intn(len(chars))]
40
+	}
41
+	return string(res)
42
+}
0 43
new file mode 100644
... ...
@@ -0,0 +1,25 @@
0
+package stringutils
1
+
2
+import "testing"
3
+
4
+func TestRandomString(t *testing.T) {
5
+	str := GenerateRandomString()
6
+	if len(str) != 64 {
7
+		t.Fatalf("Id returned is incorrect: %s", str)
8
+	}
9
+}
10
+
11
+func TestRandomStringUniqueness(t *testing.T) {
12
+	repeats := 25
13
+	set := make(map[string]struct{}, repeats)
14
+	for i := 0; i < repeats; i = i + 1 {
15
+		str := GenerateRandomString()
16
+		if len(str) != 64 {
17
+			t.Fatalf("Id returned is incorrect: %s", str)
18
+		}
19
+		if _, ok := set[str]; ok {
20
+			t.Fatalf("Random number is repeated")
21
+		}
22
+		set[str] = struct{}{}
23
+	}
24
+}
... ...
@@ -4,7 +4,7 @@ import (
4 4
 	"math/rand"
5 5
 	"testing"
6 6
 
7
-	"github.com/docker/docker/pkg/common"
7
+	"github.com/docker/docker/pkg/stringid"
8 8
 )
9 9
 
10 10
 // Test the behavior of TruncIndex, an index for querying IDs from a non-conflicting prefix.
... ...
@@ -111,7 +111,7 @@ func assertIndexGet(t *testing.T, index *TruncIndex, input, expectedResult strin
111 111
 func BenchmarkTruncIndexAdd100(b *testing.B) {
112 112
 	var testSet []string
113 113
 	for i := 0; i < 100; i++ {
114
-		testSet = append(testSet, common.GenerateRandomID())
114
+		testSet = append(testSet, stringid.GenerateRandomID())
115 115
 	}
116 116
 	b.ResetTimer()
117 117
 	for i := 0; i < b.N; i++ {
... ...
@@ -127,7 +127,7 @@ func BenchmarkTruncIndexAdd100(b *testing.B) {
127 127
 func BenchmarkTruncIndexAdd250(b *testing.B) {
128 128
 	var testSet []string
129 129
 	for i := 0; i < 250; i++ {
130
-		testSet = append(testSet, common.GenerateRandomID())
130
+		testSet = append(testSet, stringid.GenerateRandomID())
131 131
 	}
132 132
 	b.ResetTimer()
133 133
 	for i := 0; i < b.N; i++ {
... ...
@@ -143,7 +143,7 @@ func BenchmarkTruncIndexAdd250(b *testing.B) {
143 143
 func BenchmarkTruncIndexAdd500(b *testing.B) {
144 144
 	var testSet []string
145 145
 	for i := 0; i < 500; i++ {
146
-		testSet = append(testSet, common.GenerateRandomID())
146
+		testSet = append(testSet, stringid.GenerateRandomID())
147 147
 	}
148 148
 	b.ResetTimer()
149 149
 	for i := 0; i < b.N; i++ {
... ...
@@ -160,7 +160,7 @@ func BenchmarkTruncIndexGet100(b *testing.B) {
160 160
 	var testSet []string
161 161
 	var testKeys []string
162 162
 	for i := 0; i < 100; i++ {
163
-		testSet = append(testSet, common.GenerateRandomID())
163
+		testSet = append(testSet, stringid.GenerateRandomID())
164 164
 	}
165 165
 	index := NewTruncIndex([]string{})
166 166
 	for _, id := range testSet {
... ...
@@ -184,7 +184,7 @@ func BenchmarkTruncIndexGet250(b *testing.B) {
184 184
 	var testSet []string
185 185
 	var testKeys []string
186 186
 	for i := 0; i < 250; i++ {
187
-		testSet = append(testSet, common.GenerateRandomID())
187
+		testSet = append(testSet, stringid.GenerateRandomID())
188 188
 	}
189 189
 	index := NewTruncIndex([]string{})
190 190
 	for _, id := range testSet {
... ...
@@ -208,7 +208,7 @@ func BenchmarkTruncIndexGet500(b *testing.B) {
208 208
 	var testSet []string
209 209
 	var testKeys []string
210 210
 	for i := 0; i < 500; i++ {
211
-		testSet = append(testSet, common.GenerateRandomID())
211
+		testSet = append(testSet, stringid.GenerateRandomID())
212 212
 	}
213 213
 	index := NewTruncIndex([]string{})
214 214
 	for _, id := range testSet {
... ...
@@ -231,7 +231,7 @@ func BenchmarkTruncIndexGet500(b *testing.B) {
231 231
 func BenchmarkTruncIndexDelete100(b *testing.B) {
232 232
 	var testSet []string
233 233
 	for i := 0; i < 100; i++ {
234
-		testSet = append(testSet, common.GenerateRandomID())
234
+		testSet = append(testSet, stringid.GenerateRandomID())
235 235
 	}
236 236
 	b.ResetTimer()
237 237
 	for i := 0; i < b.N; i++ {
... ...
@@ -254,7 +254,7 @@ func BenchmarkTruncIndexDelete100(b *testing.B) {
254 254
 func BenchmarkTruncIndexDelete250(b *testing.B) {
255 255
 	var testSet []string
256 256
 	for i := 0; i < 250; i++ {
257
-		testSet = append(testSet, common.GenerateRandomID())
257
+		testSet = append(testSet, stringid.GenerateRandomID())
258 258
 	}
259 259
 	b.ResetTimer()
260 260
 	for i := 0; i < b.N; i++ {
... ...
@@ -277,7 +277,7 @@ func BenchmarkTruncIndexDelete250(b *testing.B) {
277 277
 func BenchmarkTruncIndexDelete500(b *testing.B) {
278 278
 	var testSet []string
279 279
 	for i := 0; i < 500; i++ {
280
-		testSet = append(testSet, common.GenerateRandomID())
280
+		testSet = append(testSet, stringid.GenerateRandomID())
281 281
 	}
282 282
 	b.ResetTimer()
283 283
 	for i := 0; i < b.N; i++ {
... ...
@@ -300,7 +300,7 @@ func BenchmarkTruncIndexDelete500(b *testing.B) {
300 300
 func BenchmarkTruncIndexNew100(b *testing.B) {
301 301
 	var testSet []string
302 302
 	for i := 0; i < 100; i++ {
303
-		testSet = append(testSet, common.GenerateRandomID())
303
+		testSet = append(testSet, stringid.GenerateRandomID())
304 304
 	}
305 305
 	b.ResetTimer()
306 306
 	for i := 0; i < b.N; i++ {
... ...
@@ -311,7 +311,7 @@ func BenchmarkTruncIndexNew100(b *testing.B) {
311 311
 func BenchmarkTruncIndexNew250(b *testing.B) {
312 312
 	var testSet []string
313 313
 	for i := 0; i < 250; i++ {
314
-		testSet = append(testSet, common.GenerateRandomID())
314
+		testSet = append(testSet, stringid.GenerateRandomID())
315 315
 	}
316 316
 	b.ResetTimer()
317 317
 	for i := 0; i < b.N; i++ {
... ...
@@ -322,7 +322,7 @@ func BenchmarkTruncIndexNew250(b *testing.B) {
322 322
 func BenchmarkTruncIndexNew500(b *testing.B) {
323 323
 	var testSet []string
324 324
 	for i := 0; i < 500; i++ {
325
-		testSet = append(testSet, common.GenerateRandomID())
325
+		testSet = append(testSet, stringid.GenerateRandomID())
326 326
 	}
327 327
 	b.ResetTimer()
328 328
 	for i := 0; i < b.N; i++ {
... ...
@@ -334,7 +334,7 @@ func BenchmarkTruncIndexAddGet100(b *testing.B) {
334 334
 	var testSet []string
335 335
 	var testKeys []string
336 336
 	for i := 0; i < 500; i++ {
337
-		id := common.GenerateRandomID()
337
+		id := stringid.GenerateRandomID()
338 338
 		testSet = append(testSet, id)
339 339
 		l := rand.Intn(12) + 12
340 340
 		testKeys = append(testKeys, id[:l])
... ...
@@ -359,7 +359,7 @@ func BenchmarkTruncIndexAddGet250(b *testing.B) {
359 359
 	var testSet []string
360 360
 	var testKeys []string
361 361
 	for i := 0; i < 500; i++ {
362
-		id := common.GenerateRandomID()
362
+		id := stringid.GenerateRandomID()
363 363
 		testSet = append(testSet, id)
364 364
 		l := rand.Intn(12) + 12
365 365
 		testKeys = append(testKeys, id[:l])
... ...
@@ -384,7 +384,7 @@ func BenchmarkTruncIndexAddGet500(b *testing.B) {
384 384
 	var testSet []string
385 385
 	var testKeys []string
386 386
 	for i := 0; i < 500; i++ {
387
-		id := common.GenerateRandomID()
387
+		id := stringid.GenerateRandomID()
388 388
 		testSet = append(testSet, id)
389 389
 		l := rand.Intn(12) + 12
390 390
 		testKeys = append(testKeys, id[:l])
... ...
@@ -21,9 +21,9 @@ import (
21 21
 	log "github.com/Sirupsen/logrus"
22 22
 	"github.com/docker/docker/autogen/dockerversion"
23 23
 	"github.com/docker/docker/pkg/archive"
24
-	"github.com/docker/docker/pkg/common"
25 24
 	"github.com/docker/docker/pkg/fileutils"
26 25
 	"github.com/docker/docker/pkg/ioutils"
26
+	"github.com/docker/docker/pkg/stringutils"
27 27
 )
28 28
 
29 29
 type KeyValuePair struct {
... ...
@@ -312,7 +312,7 @@ var globalTestID string
312 312
 // new directory.
313 313
 func TestDirectory(templateDir string) (dir string, err error) {
314 314
 	if globalTestID == "" {
315
-		globalTestID = common.RandomString()[:4]
315
+		globalTestID = stringutils.GenerateRandomString()[:4]
316 316
 	}
317 317
 	prefix := fmt.Sprintf("docker-test%s-%s-", globalTestID, GetCallerName(2))
318 318
 	if prefix == "" {
... ...
@@ -9,7 +9,7 @@ import (
9 9
 
10 10
 	log "github.com/Sirupsen/logrus"
11 11
 	"github.com/docker/docker/daemon/graphdriver"
12
-	"github.com/docker/docker/pkg/common"
12
+	"github.com/docker/docker/pkg/stringid"
13 13
 )
14 14
 
15 15
 type Repository struct {
... ...
@@ -43,7 +43,7 @@ func (r *Repository) newVolume(path string, writable bool) (*Volume, error) {
43 43
 	var (
44 44
 		isBindMount bool
45 45
 		err         error
46
-		id          = common.GenerateRandomID()
46
+		id          = stringid.GenerateRandomID()
47 47
 	)
48 48
 	if path != "" {
49 49
 		isBindMount = true