parent
844e773ec4
commit
fb86b4bf2c
3 changed files with 86 additions and 36 deletions
66
test/test_dockerfileparse.py
Normal file
66
test/test_dockerfileparse.py
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
from util.dockerfileparse import parse_dockerfile
|
||||||
|
|
||||||
|
class TestParsedDockerfile(unittest.TestCase):
|
||||||
|
def test_basic_parse(self):
|
||||||
|
parsed = parse_dockerfile("""
|
||||||
|
FROM someimage:latest
|
||||||
|
RUN dosomething
|
||||||
|
""")
|
||||||
|
|
||||||
|
self.assertEquals(("someimage", "latest"), parsed.get_image_and_tag())
|
||||||
|
self.assertEquals("someimage", parsed.get_base_image())
|
||||||
|
|
||||||
|
def test_basic_parse_notag(self):
|
||||||
|
parsed = parse_dockerfile("""
|
||||||
|
FROM someimage
|
||||||
|
RUN dosomething
|
||||||
|
""")
|
||||||
|
|
||||||
|
self.assertEquals(("someimage", "latest"), parsed.get_image_and_tag())
|
||||||
|
self.assertEquals("someimage", parsed.get_base_image())
|
||||||
|
|
||||||
|
def test_two_from_lines(self):
|
||||||
|
parsed = parse_dockerfile("""
|
||||||
|
FROM someimage:latest
|
||||||
|
FROM secondimage:second
|
||||||
|
""")
|
||||||
|
|
||||||
|
self.assertEquals(("secondimage", "second"), parsed.get_image_and_tag())
|
||||||
|
self.assertEquals("secondimage", parsed.get_base_image())
|
||||||
|
|
||||||
|
def test_parse_comments(self):
|
||||||
|
parsed = parse_dockerfile("""
|
||||||
|
# FROM someimage:latest
|
||||||
|
FROM anotherimage:foobar # This is a comment
|
||||||
|
RUN dosomething
|
||||||
|
""")
|
||||||
|
|
||||||
|
self.assertEquals(("anotherimage", "foobar"), parsed.get_image_and_tag())
|
||||||
|
self.assertEquals("anotherimage", parsed.get_base_image())
|
||||||
|
|
||||||
|
def test_unicode_parse_as_ascii(self):
|
||||||
|
parsed = parse_dockerfile("""
|
||||||
|
FROM someimage:latest
|
||||||
|
MAINTAINER José Schorr <jschorr@whatever.com>
|
||||||
|
""")
|
||||||
|
|
||||||
|
self.assertEquals(("someimage", "latest"), parsed.get_image_and_tag())
|
||||||
|
self.assertEquals("someimage", parsed.get_base_image())
|
||||||
|
|
||||||
|
|
||||||
|
def test_unicode_parse_as_unicode(self):
|
||||||
|
parsed = parse_dockerfile("""
|
||||||
|
FROM someimage:latest
|
||||||
|
MAINTAINER José Schorr <jschorr@whatever.com>
|
||||||
|
""".decode('utf-8'))
|
||||||
|
|
||||||
|
self.assertEquals(("someimage", "latest"), parsed.get_image_and_tag())
|
||||||
|
self.assertEquals("someimage", parsed.get_base_image())
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
unittest.main()
|
||||||
|
|
|
@ -1,26 +0,0 @@
|
||||||
from util.dockerfileparse import parse_dockerfile, ParsedDockerfile, serialize_dockerfile
|
|
||||||
|
|
||||||
with open('Dockerfile.test', 'r') as dockerfileobj:
|
|
||||||
parsed_dockerfile = parse_dockerfile(dockerfileobj.read())
|
|
||||||
|
|
||||||
quay_reponame = 'something'
|
|
||||||
env_command = {
|
|
||||||
'command': 'ENV',
|
|
||||||
'parameters': 'QUAY_REPOSITORY %s' % quay_reponame
|
|
||||||
}
|
|
||||||
|
|
||||||
for index, command in reversed(list(enumerate(parsed_dockerfile.commands))):
|
|
||||||
if command['command'] == 'FROM':
|
|
||||||
new_command_index = index + 1
|
|
||||||
parsed_dockerfile.commands.insert(new_command_index, env_command)
|
|
||||||
break
|
|
||||||
|
|
||||||
image_and_tag_tuple = parsed_dockerfile.get_image_and_tag()
|
|
||||||
print image_and_tag_tuple
|
|
||||||
if image_and_tag_tuple is None or image_and_tag_tuple[0] is None:
|
|
||||||
raise Exception('Missing FROM command in Dockerfile')
|
|
||||||
|
|
||||||
print serialize_dockerfile(parsed_dockerfile)
|
|
||||||
|
|
||||||
with open('Dockerfile.test.out', 'w') as dockerfileobj:
|
|
||||||
dockerfileobj.write(serialize_dockerfile(parsed_dockerfile))
|
|
|
@ -63,7 +63,16 @@ class ParsedDockerfile(object):
|
||||||
|
|
||||||
|
|
||||||
def strip_comments(contents):
|
def strip_comments(contents):
|
||||||
lines = [line for line in contents.split('\n') if not line.startswith(COMMENT_CHARACTER)]
|
lines = []
|
||||||
|
for line in contents.split('\n'):
|
||||||
|
index = line.find(COMMENT_CHARACTER)
|
||||||
|
if index < 0:
|
||||||
|
lines.append(line)
|
||||||
|
continue
|
||||||
|
|
||||||
|
line = line[:index]
|
||||||
|
lines.append(line)
|
||||||
|
|
||||||
return '\n'.join(lines)
|
return '\n'.join(lines)
|
||||||
|
|
||||||
|
|
||||||
|
@ -72,15 +81,22 @@ def join_continued_lines(contents):
|
||||||
|
|
||||||
|
|
||||||
def parse_dockerfile(contents):
|
def parse_dockerfile(contents):
|
||||||
|
# If we receive ASCII, translate into unicode.
|
||||||
|
try:
|
||||||
|
contents = contents.decode('utf-8')
|
||||||
|
except ValueError:
|
||||||
|
# Already unicode or unable to convert.
|
||||||
|
pass
|
||||||
|
|
||||||
contents = join_continued_lines(strip_comments(contents))
|
contents = join_continued_lines(strip_comments(contents))
|
||||||
lines = [line for line in contents.split('\n') if len(line) > 0]
|
lines = [line.strip() for line in contents.split('\n') if len(line) > 0]
|
||||||
|
|
||||||
commands = []
|
commands = []
|
||||||
for line in lines:
|
for line in lines:
|
||||||
match_command = COMMAND_REGEX.match(line)
|
match_command = COMMAND_REGEX.match(line)
|
||||||
if match_command:
|
if match_command:
|
||||||
command = match_command.group(1).decode('utf-8').upper()
|
command = match_command.group(1).upper()
|
||||||
parameters = match_command.group(2).decode('utf-8')
|
parameters = match_command.group(2)
|
||||||
|
|
||||||
commands.append({
|
commands.append({
|
||||||
'command': command,
|
'command': command,
|
||||||
|
@ -88,9 +104,3 @@ def parse_dockerfile(contents):
|
||||||
})
|
})
|
||||||
|
|
||||||
return ParsedDockerfile(commands)
|
return ParsedDockerfile(commands)
|
||||||
|
|
||||||
|
|
||||||
def serialize_dockerfile(parsed_dockerfile):
|
|
||||||
return '\n'.join([' '.join([command['command'].encode('utf-8'),
|
|
||||||
command['parameters'].encode('utf-8')])
|
|
||||||
for command in parsed_dockerfile.commands])
|
|
||||||
|
|
Reference in a new issue