forked from tsuru/tsuru
-
Notifications
You must be signed in to change notification settings - Fork 0
/
image.go
75 lines (71 loc) · 2.12 KB
/
image.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// Copyright 2014 tsuru authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package docker
import (
docker "github.com/fsouza/go-dockerclient"
"github.com/globalsign/mgo/bson"
"github.com/tsuru/config"
"github.com/tsuru/docker-cluster/cluster"
"github.com/tsuru/docker-cluster/storage"
"github.com/tsuru/tsuru/app"
"github.com/tsuru/tsuru/net"
"github.com/tsuru/tsuru/provision/dockercommon"
)
func MigrateImages() error {
registry, _ := config.GetString("docker:registry")
if registry != "" {
registry += "/"
}
repoNamespace, _ := config.GetString("docker:repository-namespace")
if repoNamespace == "" {
repoNamespace = "tsuru"
}
apps, err := app.List(nil)
if err != nil {
return err
}
dcluster := mainDockerProvisioner.Cluster()
for _, app := range apps {
oldImage := registry + repoNamespace + "/" + app.GetName()
newImage := registry + repoNamespace + "/app-" + app.GetName()
containers, _ := mainDockerProvisioner.ListContainers(bson.M{"image": newImage, "appname": app.GetName()})
if len(containers) > 0 {
continue
}
opts := docker.TagImageOptions{Repo: newImage, Force: true}
err = dcluster.TagImage(oldImage, opts)
var baseErr error
if nodeErr, ok := err.(cluster.DockerNodeError); ok {
baseErr = nodeErr.BaseError()
}
if err != nil {
if err == storage.ErrNoSuchImage || baseErr == docker.ErrNoSuchImage {
continue
}
return err
}
if registry != "" {
pushOpts := docker.PushImageOptions{
Name: newImage,
InactivityTimeout: net.StreamInactivityTimeout,
}
err = dcluster.PushImage(pushOpts, dockercommon.RegistryAuthConfig(newImage))
if err != nil {
return err
}
}
err = mainDockerProvisioner.updateContainers(bson.M{"appname": app.GetName()}, bson.M{"$set": bson.M{"image": newImage}})
if err != nil {
return err
}
}
return nil
}
func (p *dockerProvisioner) CleanImage(appName, imgName string) error {
err := p.Cluster().RemoveImage(imgName)
if err != nil && err != docker.ErrNoSuchImage && err != storage.ErrNoSuchImage {
return err
}
return nil
}