Skip to content
This repository has been archived by the owner on Jan 17, 2023. It is now read-only.

Commit

Permalink
Milestone/0.99.0 (#165)
Browse files Browse the repository at this point in the history
* Issue #162 bump versions & begin supporting registry v2 API

* Issue #162 revert version change for grails

* Issue #162 bump jdk version

* Issue #162 improve v2 support; ensure pingable; refactory for reg->url->string based on actions

* Issue #162 bump grails wrapper

* Issue #162 fix broken Dockerfile :D

* Issue #162 add gradle wrapper

* Issue #162 remove gradle. Travis playing up

* Issue #162 add wrapper jar

* Issue #162 add wrapper jar

* Issue #162 add wrapper jar
  • Loading branch information
atcol committed Mar 3, 2018
1 parent e902c8e commit 9fde93b
Show file tree
Hide file tree
Showing 18 changed files with 230 additions and 171 deletions.
2 changes: 1 addition & 1 deletion .travis.yml
@@ -1,6 +1,6 @@
language: groovy

jdk:
- oraclejdk7
- oraclejdk8

script: ./grailsw war docker-registry-web.war
25 changes: 14 additions & 11 deletions Dockerfile
@@ -1,10 +1,10 @@
FROM ubuntu:14.04
FROM ubuntu

# Install java and tomcat
RUN apt-get update && apt-get install -y tomcat7 openjdk-7-jdk
RUN apt-get update && apt-get install -y tomcat8 openjdk-8-jdk curl
RUN mkdir /var/lib/h2 && chmod a+rw /var/lib/h2
RUN rm -rf /var/lib/tomcat7/webapps/*
ENV JAVA_HOME /usr/lib/jvm/java-7-openjdk-amd64/
RUN rm -rf /var/lib/tomcat8/webapps/*
ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/

# Install grails and project dependencies
WORKDIR /work
Expand All @@ -17,15 +17,18 @@ RUN ./grailsw help
# Add project files and build a war
ADD . /work
RUN ./grailsw war
RUN cp target/docker-registry-ui-*.war /var/lib/tomcat7/webapps/ROOT.war
RUN cp target/docker-registry-ui-*.war /var/lib/tomcat8/webapps/ROOT.war

# Update catalina configuration
WORKDIR /usr/share/tomcat7/bin/
ADD startup.sh /usr/share/tomcat7/bin/custom-startup.sh
RUN chmod +x /usr/share/tomcat7/bin/custom-startup.sh
WORKDIR /usr/share/tomcat8/bin/
ADD startup.sh /usr/share/tomcat8/bin/custom-startup.sh
RUN chmod +x /usr/share/tomcat8/bin/custom-startup.sh

# Clean up the installation
RUN apt-get purge -y curl

EXPOSE 8080
VOLUME ["/var/lib/h2/", "/var/lib/tomcat7"]
ENV CATALINA_BASE /var/lib/tomcat7
CMD /usr/share/tomcat7/bin/custom-startup.sh
VOLUME ["/var/lib/h2/", "/var/lib/tomcat8"]
ENV CATALINA_BASE /var/lib/tomcat8
CMD /usr/share/tomcat8/bin/custom-startup.sh

4 changes: 2 additions & 2 deletions application.properties
@@ -1,5 +1,5 @@
#Grails Metadata file
#Wed Jul 09 18:55:10 BST 2014
#Sat Jan 06 14:46:27 GMT 2018
app.grails.version=2.4.4
app.name=docker-registry-ui
app.version=0.98.0
app.version=0.99.0
3 changes: 2 additions & 1 deletion build-deploy.sh
@@ -1,4 +1,5 @@
#!/bin/bash
./grailsw war docker-registry-ui.war && \
./grailsw clean && \
./grailsw war docker-registry-ui.war && \
docker build .

4 changes: 2 additions & 2 deletions grails-app/conf/BootStrap.groovy
Expand Up @@ -35,7 +35,8 @@ public class BootStrap {
log.info("Found registry $val. Creating...")
def reg = Registry.fromUrl(val)

if (reg) {
if (reg.isPresent()) {
reg = reg.get()
if (Registry.findByHostAndApiVersion(reg.host, reg.apiVersion)) {
log.info("Not creating registry ${val} as it already exists")
} else {
Expand All @@ -46,7 +47,6 @@ public class BootStrap {
if (!reg.ping()) {
log.warn("Registry '${reg.toUrl()}' ping failed! Check it's up!")
}

} else {
log.error("Couldn't parse valid registry URL from $val")
}
Expand Down
2 changes: 1 addition & 1 deletion grails-app/conf/DataSource.groovy
Expand Up @@ -24,7 +24,7 @@ environments {
test {
dataSource {
dbCreate = "update"
url = "jdbc:h2:file:/var/lib/h2/testDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE;FILE_LOCK=SOCKET"
url = "jdbc:h2:file:/tmp/docker-registry-ui/h2/testDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE;FILE_LOCK=SOCKET"
}
}
production {
Expand Down
Expand Up @@ -16,7 +16,8 @@ class RegistryController {
}

def show(Registry registryInstance) {
boolean isUp = registryInstance?.ping()
//FIXME this is really inefficient
boolean isUp = registryInstance != null && registryInstance.ping()
respond registryInstance, model: [registryIsUp: isUp]
}

Expand Down
24 changes: 18 additions & 6 deletions grails-app/domain/docker/registry/web/Registry.groovy
@@ -1,5 +1,9 @@
package docker.registry.web

import docker.registry.web.support.RegistryAction

import javax.swing.text.html.Option

class Registry {
String host = "localhost"
int port
Expand All @@ -17,7 +21,7 @@ class Registry {

static transients = ['toUrl', 'repositories', 'ping', 'fromUrl']

def String toUrl() {
String toUrl() {
def resolvedPort = this.port == 80 || this.port <= 0 ? "" : ":" + this.port;
def urlString = "${this.protocol}://${this.host}${resolvedPort}/${this.apiVersion}"
if (username) {
Expand All @@ -27,6 +31,14 @@ class Registry {
urlString
}

URL toUrl(RegistryAction registryAction) {
switch (registryAction) {
case RegistryAction.PING: return new URL(this.apiVersion == "v1" ? "${this.toUrl()}/_ping" : "${this.toUrl()}/_catalog")
case RegistryAction.SEARCH: return new URL(this.apiVersion == "v1" ? "${this.toUrl()}/search" : "${this.toUrl()}/_catalog")
default: return null;
}
}

def getRepositories() {
repositoryService.index(this)
}
Expand All @@ -39,22 +51,22 @@ class Registry {
* Static factory method for creating an instance from a URL.
* @param urlStr a url in the format: http://hostOrIP:OptionalPort/v1/
**/
static def fromUrl(final String urlStr) {
if (urlStr?.endsWith("/v1/")) { //FIXME this won't work for new api versions
static Optional<Registry> fromUrl(final String urlStr) {
if (urlStr?.endsWith("/v1/") || urlStr?.endsWith("/v2/")) {
def url = urlStr.toURL()
if (url) {
def auth = url.userInfo?.split(":")
return new Registry(
return Optional.of(new Registry(
protocol: url.protocol,
host: url.host,
port: url.port == -1 ? 80 : url.port,
apiVersion: url.path.replaceAll("\\p{Punct}", ""),
username: auth?.length > 0 ? auth[0] : null,
password: auth?.length > 1 ? auth[1] : null
)
))
}
}
null
Optional.empty()
}

@Override
Expand Down
21 changes: 11 additions & 10 deletions grails-app/services/docker/registry/web/RepositoryService.groovy
@@ -1,5 +1,6 @@
package docker.registry.web

import docker.registry.web.support.RegistryAction
import grails.transaction.Transactional
import groovyx.net.http.ContentType
import groovyx.net.http.HTTPBuilder
Expand All @@ -14,7 +15,7 @@ import docker.registry.web.support.Tag
@Transactional
class RepositoryService {

def List<Repository> index(final Registry registry) {
List<Repository> index(final Registry registry) {
search(registry, null)
}

Expand All @@ -37,10 +38,10 @@ class RepositoryService {
repo
}

def List<Repository> search(final Registry registry, final String query) {
List<Repository> search(final Registry registry, final String query) {
log.info("Searching for images from $registry")
final repoList = []
def url = "${registry.toUrl()}/search"
def url = "${registry.toUrl(RegistryAction.SEARCH).toString()}"

log.info("Query provided for search is ${query}")
if (query) {
Expand All @@ -63,7 +64,7 @@ class RepositoryService {
repoList
}

def List<Tag> getTags(final Registry registry, final repoName) {
List<Tag> getTags(final Registry registry, final repoName) {
def tagList = []
log.info("Getting tags for $repoName")
def url = "${registry.toUrl()}/repositories/${repoName}/tags"
Expand All @@ -83,7 +84,7 @@ class RepositoryService {
tagList
}

def Image getImageDetail(final Registry registry, final String imgId) {
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")
Expand All @@ -101,7 +102,7 @@ class RepositoryService {
img
}

def boolean delete(final Registry registry, final String repoName, final String tag) {
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)
Expand All @@ -119,13 +120,13 @@ class RepositoryService {
result
}

def String buildPullName(Registry registry, String repoName, String tag) {
String buildPullName(Registry registry, String repoName, String tag) {
def url = registry.toUrl().toURL()
"${url.authority}/${repoName}:${tag}"
}

def boolean ping(Registry registry) {
def url = registry.apiVersion == "v1" ? "${registry.toUrl()}/_ping" : registry.toUrl()
boolean ping(Registry registry) {
def url = registry.toUrl(RegistryAction.PING)
def http = new HTTPBuilder(url)
def result = true
try {
Expand All @@ -143,7 +144,7 @@ class RepositoryService {
result = false
}
}
} catch (final ConnectException|IOException e) {
} catch (final IOException e) {
log.info("Ping failed: $e")
result = false
} finally {
Expand Down
8 changes: 4 additions & 4 deletions grailsw
Expand Up @@ -132,7 +132,7 @@ fi
if [ -z "$STARTER_CONF" ]; then
STARTER_CONF="$GRAILS_HOME/conf/groovy-starter.conf"
fi
STARTER_CLASSPATH="wrapper/grails-wrapper-runtime-2.4.0.jar:wrapper:."
STARTER_CLASSPATH="wrapper/grails-wrapper-runtime-2.4.4.jar:wrapper:."

# Allow access to Cocoa classes on OS X
if $darwin; then
Expand Down Expand Up @@ -200,15 +200,15 @@ if $mingw ; then
fi

if [ -z "$GRAILS_AGENT_CACHE_DIR" ]; then
GRAILS_AGENT_CACHE_DIR=~/.grails/2.4.0/
GRAILS_AGENT_CACHE_DIR=~/.grails/2.4.4/
fi
SPRINGLOADED_PARAMS=profile=grails\;cacheDir=$GRAILS_AGENT_CACHE_DIR
if [ ! -d "$GRAILS_AGENT_CACHE_DIR" ]; then
mkdir -p "$GRAILS_AGENT_CACHE_DIR"
fi

# Process JVM args
AGENT_STRING="-javaagent:wrapper/springloaded-1.2.0.RELEASE.jar -noverify -Dspringloaded.synchronize=true -Djdk.reflect.allowGetCallerClass=true -Dspringloaded=$SPRINGLOADED_PARAMS"
AGENT_STRING="-javaagent:wrapper/springloaded-1.2.1.RELEASE.jar -Xverify:none -Dspringloaded.synchronize=true -Djdk.reflect.allowGetCallerClass=true -Dspringloaded=$SPRINGLOADED_PARAMS"
CMD_LINE_ARGS=""
DISABLE_RELOADING=true

Expand Down Expand Up @@ -306,7 +306,7 @@ if $cygwin; then
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
if [ $CHECK -ne 0 ] ; then
convArg=`cygpath --path --ignore --mixed "$arg"`
convArg=`cygpath --path --ignore --mixed -- "$arg"`
else
convArg=$arg
fi
Expand Down
14 changes: 7 additions & 7 deletions grailsw.bat
Expand Up @@ -59,22 +59,22 @@ if "%GRAILS_HOME:~-1%"=="\" SET GRAILS_HOME=%GRAILS_HOME:~0,-1%

:init

for %%x in ("%HOMEPATH%") do set SHORTHOME=%%~fsx
if "x%GRAILS_AGENT_CACHE_DIR%" == "x" set GRAILS_AGENT_CACHE_DIR=%SHORTHOME%/.grails/2.4.0/
for %%x in ("%USERPROFILE%") do set SHORTHOME=%%~fsx
if "x%GRAILS_AGENT_CACHE_DIR%" == "x" set GRAILS_AGENT_CACHE_DIR=%SHORTHOME%/.grails/2.4.4/
set SPRINGLOADED_PARAMS="profile=grails;cacheDir=%GRAILS_AGENT_CACHE_DIR%"
if not exist "%GRAILS_AGENT_CACHE_DIR%" mkdir "%GRAILS_AGENT_CACHE_DIR%"

if "%GRAILS_NO_PERMGEN%" == "" (
type %JAVA_HOME%\include\classfile_constants.h 2>nul | findstr /R /C:"#define JVM_CLASSFILE_MAJOR_VERSION 5[23]" >nul
type "%JAVA_HOME%\include\classfile_constants.h" 2>nul | findstr /R /C:"#define JVM_CLASSFILE_MAJOR_VERSION 5[23]" >nul
if not errorlevel 1 set GRAILS_NO_PERMGEN=1
)

set AGENT_STRING=-javaagent:wrapper/springloaded-1.2.0.RELEASE.jar -noverify -Dspringloaded.synchronize=true -Djdk.reflect.allowGetCallerClass=true -Dspringloaded=\"%SPRINGLOADED_PARAMS%\"
set AGENT_STRING=-javaagent:wrapper/springloaded-1.2.1.RELEASE.jar -Xverify:none -Dspringloaded.synchronize=true -Djdk.reflect.allowGetCallerClass=true -Dspringloaded=\"%SPRINGLOADED_PARAMS%\"
set DISABLE_RELOADING=
if "%GRAILS_OPTS%" == "" (
set GRAILS_OPTS=-server -Xmx768M -Xms64M -Dfile.encoding=UTF-8
if not "%GRAILS_NO_PERMGEN%" == "1" (
set GRAILS_OPTS=%GRAILS_OPTS% -XX:PermSize=32m -XX:MaxPermSize=256m
set GRAILS_OPTS=-server -Xmx768M -Xms64M -XX:PermSize=32m -XX:MaxPermSize=256m -Dfile.encoding=UTF-8
)
)

Expand Down Expand Up @@ -140,7 +140,7 @@ set CMD_LINE_ARGS=%$

:execute
@rem Setup the command line
set STARTER_CLASSPATH=wrapper/grails-wrapper-runtime-2.4.0.jar;wrapper;.
set STARTER_CLASSPATH=wrapper/grails-wrapper-runtime-2.4.4.jar;wrapper;.

if exist "%USERPROFILE%/.groovy/init.bat" call "%USERPROFILE%/.groovy/init.bat"

Expand Down Expand Up @@ -169,7 +169,7 @@ set JAVA_OPTS=%GRAILS_OPTS% %JAVA_OPTS% %AGENT%

set JAVA_OPTS=%JAVA_OPTS% -Dprogram.name="%PROGNAME%"
set JAVA_OPTS=%JAVA_OPTS% -Dgrails.home="%GRAILS_HOME%"
set JAVA_OPTS=%JAVA_OPTS% -Dgrails.version=2.4.0
set JAVA_OPTS=%JAVA_OPTS% -Dgrails.version=2.4.4
set JAVA_OPTS=%JAVA_OPTS% -Dbase.dir=.
set JAVA_OPTS=%JAVA_OPTS% -Dtools.jar="%TOOLS_JAR%"
set JAVA_OPTS=%JAVA_OPTS% -Dgroovy.starter.conf="%STARTER_CONF%"
Expand Down
5 changes: 5 additions & 0 deletions src/groovy/docker/registry/web/support/RegistryAction.groovy
@@ -0,0 +1,5 @@
package docker.registry.web.support

enum RegistryAction {
PING, SEARCH
}
Expand Up @@ -3,15 +3,16 @@ package docker.registry.ui
import docker.registry.web.Registry
import docker.registry.web.RepositoryService
import grails.test.mixin.TestFor
import org.apache.tools.ant.taskdefs.optional.extension.Specification
import spock.lang.Specification

@TestFor(RepositoryService)
class RepositoryServiceIntegrationTestSpec extends Specification {

final VALID_REGISTRY_URL = "http://localhost:5000/v1/"
final NO_SUCH_REGISTRY = "http://bad.registry/v1/"
final VALID_REGISTRY = Registry.fromUrl(VALID_REGISTRY_URL)
final BAD_REGISTRY = Registry.fromUrl(NO_SUCH_REGISTRY)
final VALID_REGISTRY = Registry.fromUrl(VALID_REGISTRY_URL).orElseThrow { new AssertionError("No registry instance") }
final BAD_REGISTRY = Registry.fromUrl(NO_SUCH_REGISTRY).orElseThrow { new AssertionError("No registry instance") }

def repositoryService

Expand All @@ -25,7 +26,7 @@ class RepositoryServiceIntegrationTestSpec extends Specification {
when:
def pingResult = repositoryService.ping(VALID_REGISTRY)
then:
pingResult == true
pingResult
}

void "test ping false on invalid registry url"() {
Expand Down

0 comments on commit 9fde93b

Please sign in to comment.