Skip to content
This repository was archived by the owner on Sep 12, 2018. It is now read-only.

Commit 22ff2e7

Browse files
committed
Merge pull request #588 from visualphoenix/feature/mirror_search
FEATURE: merge search results between local and index route
2 parents 07c7b78 + 5f88008 commit 22ff2e7

File tree

2 files changed

+24
-4
lines changed

2 files changed

+24
-4
lines changed

docker_registry/lib/mirroring.py

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
import functools
44
import logging
55

6+
from docker_registry.core import compat
7+
json = compat.json
8+
69
from .. import storage
710
from .. import toolkit
811
from . import cache
@@ -40,11 +43,12 @@ def lookup_source(path, stream=False, source=None):
4043
for k, v in flask.request.headers.iteritems():
4144
if k.lower() != 'location' and k.lower() != 'host':
4245
headers[k] = v
43-
logger.debug('Request: GET {0}\nHeaders: {1}'.format(
44-
source_url, headers
46+
logger.debug('Request: GET {0}\nHeaders: {1}\nArgs: {2}'.format(
47+
source_url, headers, flask.request.args
4548
))
4649
source_resp = requests.get(
4750
source_url,
51+
params=flask.request.args,
4852
headers=headers,
4953
cookies=flask.request.cookies,
5054
stream=stream
@@ -132,7 +136,8 @@ def wrapper(namespace, repository, *args, **kwargs):
132136
return wrapper
133137

134138

135-
def source_lookup(cache=False, stream=False, index_route=False):
139+
def source_lookup(cache=False, stream=False, index_route=False,
140+
merge_results=False):
136141
def decorator(f):
137142
@functools.wraps(f)
138143
def wrapper(*args, **kwargs):
@@ -144,7 +149,7 @@ def wrapper(*args, **kwargs):
144149
if index_route and mirroring_cfg.source_index:
145150
source = mirroring_cfg.source_index
146151
logger.debug('Source provided, registry acts as mirror')
147-
if resp.status_code != 404:
152+
if resp.status_code != 404 and not merge_results:
148153
logger.debug('Status code is not 404, no source '
149154
'lookup required')
150155
return resp
@@ -163,6 +168,19 @@ def wrapper(*args, **kwargs):
163168
if not stream:
164169
logger.debug('JSON data found on source, writing response')
165170
resp_data = source_resp.content
171+
if merge_results:
172+
mjson = json.loads(resp_data)
173+
pjson = json.loads(resp.data)
174+
for mr in mjson["results"]:
175+
replaced = False
176+
for pi, pr in enumerate(pjson["results"]):
177+
if pr["name"] == mr["name"]:
178+
pjson["results"][pi] = mr
179+
replaced = True
180+
if not replaced:
181+
pjson["results"].extend([mr])
182+
pjson['num_results'] = len(pjson["results"])
183+
resp_data = json.dumps(pjson)
166184
if cache:
167185
store_mirrored_data(
168186
resp_data, flask.request.url_rule.rule, kwargs,

docker_registry/search.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from .app import app
55
from .lib import config
66
from .lib import index
7+
from .lib import mirroring
78
import flask
89

910

@@ -17,6 +18,7 @@
1718

1819

1920
@app.route('/v1/search', methods=['GET'])
21+
@mirroring.source_lookup(index_route=True, merge_results=True)
2022
def get_search():
2123
search_term = flask.request.args.get('q', '')
2224
if INDEX is None:

0 commit comments

Comments
 (0)