This repository has been archived by the owner on Jan 17, 2023. It is now read-only.
/
RepositoryService.groovy
155 lines (134 loc) · 5.21 KB
/
RepositoryService.groovy
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
146
147
148
149
150
151
152
153
154
155
package docker.registry.web
import docker.registry.web.support.RegistryAction
import grails.transaction.Transactional
import groovyx.net.http.ContentType
import groovyx.net.http.HTTPBuilder
import groovyx.net.http.Method
import org.apache.http.HttpResponse
import docker.registry.web.support.Image
import docker.registry.web.support.Repository
import docker.registry.web.support.Tag
@Transactional
class RepositoryService {
List<Repository> index(final Registry registry) {
search(registry, null)
}
def detail(final Registry registry, final String repoName) {
def tags = getTags(registry, repoName)
def repo = new Repository()
tags.each { tag ->
log.info("tag is ${tag}")
def imgDetail = getImageDetail(registry, tag.imageId)
imgDetail.displayName = "${repoName}:${tag.name}"
imgDetail.tag = tag.name
imgDetail.name = repoName
imgDetail.pullName = buildPullName(registry, repoName, tag.name)
if (imgDetail) {
repo.images.add(imgDetail)
} else {
repo.images.add(new Image(description: "Failed to retrieve image detail"))
}
}
repo
}
List<Repository> search(final Registry registry, final String query) {
log.info("Searching for images from $registry")
final repoList = []
def url = "${registry.toUrl(RegistryAction.SEARCH).toString()}"
log.info("Query provided for search is ${query}")
if (query) {
url += "?q=${query}"
}
def http = new HTTPBuilder(url)
log.info("Getting repositories from ${http.getUri()}")
http.request(Method.GET, groovyx.net.http.ContentType.JSON) {
response.success = { resp, search ->
log.info("response data for repo list $search $resp")
search.results.each { repo ->
final repository = new Repository(name: repo.name.toString(), tags: getTags(registry, repo.name.toString()))
repoList.add(repository)
}
}
}
repoList
}
List<Tag> getTags(final Registry registry, final repoName) {
def tagList = []
log.info("Getting tags for $repoName")
def url = "${registry.toUrl()}/repositories/${repoName}/tags"
log.info("tags url $url")
def http = new HTTPBuilder(url)
http.request(Method.GET, ContentType.JSON) {
response.failure = { HttpResponse resp ->
log.error("Could not retrieve tags: ${resp.statusLine}")
}
response.success = { resp, tags ->
log.info("Got tags $tags")
tagList = tags.collect { k, v ->
new Tag(name: k.toString(), imageId: v.toString())
}
}
}
tagList
}
Image getImageDetail(final Registry registry, final String imgId) {
log.info("getting image $imgId")
def img = null
def http = new HTTPBuilder("${registry.toUrl()}/images/${imgId}/json")
http.request (Method.GET, ContentType.JSON) {
response.success = { imgResp, Map imgData ->
log.info("Image data (${imgData.getClass()}) is $imgData")
img = new Image(imgData)
}
response.failure = { resp ->
log.info("Failed to get img $imgId: $resp")
img = null
}
}
img
}
boolean delete(final Registry registry, final String repoName, final String tag) {
final uri = "${registry.toUrl()}/repositories/$repoName/tags/$tag"
log.info("Deleting repo at $uri")
def http = new HTTPBuilder(uri)
def result = true
http.request(Method.DELETE, groovyx.net.http.ContentType.JSON) {
response.success = { resp, json ->
log.info("Repo $repoName deleted: $json")
}
response.failure = { resp ->
log.error("Failed to delete $uri: $resp")
result = false
}
}
result
}
String buildPullName(Registry registry, String repoName, String tag) {
def url = registry.toUrl().toURL()
"${url.authority}/${repoName}:${tag}"
}
boolean ping(Registry registry) {
def url = registry.toUrl(RegistryAction.PING)
def http = new HTTPBuilder(url)
def result = true
try {
http.getClient().getParams().setParameter("http.connection.timeout", new Integer(10000))
http.getClient().getParams().setParameter("http.socket.timeout", new Integer(10000))
http.request(Method.GET, groovyx.net.http.ContentType.JSON) {
response.success = { resp, json ->
log.info("Ping of $registry succeeded")
}
response.failure = { resp ->
log.error("Failed to ping $url: ${resp.statusLine.statusCode} : ${resp.statusLine.reasonPhrase}")
result = false
}
}
} catch (final IOException e) {
log.info("Ping failed: $e")
result = false
} finally {
http.shutdown()
}
result
}
}