This repository has been archived by the owner on Mar 22, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 19
/
imageref.go
145 lines (127 loc) · 3.59 KB
/
imageref.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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package generator
import (
"fmt"
"os"
"path/filepath"
"strings"
"github.com/openshift/origin/pkg/generate/app"
"github.com/openshift/origin/pkg/generate/dockerfile"
imageapi "github.com/openshift/origin/pkg/image/api"
)
// Generators for ImageRef
// - Name -> ImageRef
// - ImageRepo + tag -> ImageRef
// ImageRefGenerator generates ImageRefs
type ImageRefGenerator interface {
FromName(name string) (*app.ImageRef, error)
FromNameAndPorts(name string, ports []string) (*app.ImageRef, error)
FromNameAndResolver(name string, resolver app.Resolver) (*app.ImageRef, error)
FromRepository(repo *imageapi.ImageRepository, tag string) (*app.ImageRef, error)
FromDockerfile(name string, dir string, context string) (*app.ImageRef, error)
}
type imageRefGenerator struct {
dockerParser dockerfile.Parser
}
// NewImageRefGenerator creates a new ImageRefGenerator
func NewImageRefGenerator() ImageRefGenerator {
return &imageRefGenerator{
dockerParser: dockerfile.NewParser(),
}
}
// FromName generates an ImageRef from a given name
func (g *imageRefGenerator) FromName(name string) (*app.ImageRef, error) {
registry, namespace, name, tag, err := imageapi.SplitDockerPullSpec(name)
if err != nil {
return nil, err
}
return &app.ImageRef{
Registry: registry,
Namespace: namespace,
Name: name,
Tag: tag,
AsImageRepository: true,
}, nil
}
func (g *imageRefGenerator) FromNameAndResolver(name string, resolver app.Resolver) (*app.ImageRef, error) {
imageRef, err := g.FromName(name)
if err != nil {
return nil, err
}
imageMatch, err := resolver.Resolve(imageRef.RepoName())
if multiple, ok := err.(app.ErrMultipleMatches); ok {
for _, m := range multiple.Matches {
if m.Image != nil {
imageMatch = m
break
}
}
}
if imageMatch != nil {
imageRef.Info = imageMatch.Image
}
return imageRef, nil
}
func (g *imageRefGenerator) FromNameAndPorts(name string, ports []string) (*app.ImageRef, error) {
present := struct{}{}
imageRef, err := g.FromName(name)
if err != nil {
return nil, err
}
exposedPorts := map[string]struct{}{}
for _, p := range ports {
exposedPorts[p] = present
}
imageRef.Info = &imageapi.DockerImage{
Config: imageapi.DockerConfig{
ExposedPorts: exposedPorts,
},
}
return imageRef, nil
}
func (g *imageRefGenerator) FromDockerfile(name string, dir string, context string) (*app.ImageRef, error) {
// Look for Dockerfile in repository
file, err := os.Open(filepath.Join(dir, context, "Dockerfile"))
if err != nil {
return nil, err
}
dockerFile, err := g.dockerParser.Parse(file)
if err != nil {
return nil, err
}
expose, ok := dockerFile.GetDirective("EXPOSE")
if !ok {
return nil, err
}
ports := []string{}
for _, e := range expose {
ps := strings.Split(e, " ")
ports = append(ports, ps...)
}
return g.FromNameAndPorts(name, ports)
}
// FromRepository generates an ImageRef from an OpenShift ImageRepository
func (g *imageRefGenerator) FromRepository(repo *imageapi.ImageRepository, tag string) (*app.ImageRef, error) {
pullSpec := repo.Status.DockerImageRepository
if len(pullSpec) == 0 {
// need to know the default OpenShift registry
return nil, fmt.Errorf("the repository does not resolve to a pullable Docker repository")
}
registry, namespace, name, repoTag, err := imageapi.SplitDockerPullSpec(pullSpec)
if err != nil {
return nil, err
}
if len(tag) == 0 {
if len(repoTag) != 0 {
tag = repoTag
} else {
tag = "latest"
}
}
return &app.ImageRef{
Registry: registry,
Namespace: namespace,
Name: name,
Tag: tag,
Repository: repo,
}, nil
}